当前位置: 首页 > news >正文

DIY QMK量子键盘

        最近放假了,趁这个空余在做一个分支项目,一款机械键盘,量子键盘取自固件名称QMK(Quantum Mechanical Keyboard)。

        键盘作为计算机或其他电子设备的重要输入设备之一,通过将按键的物理动作转换为数字信号,实现用户与设备的交互。

        键盘的工作原理可以分为几个关键部分,包括按键矩阵、扫描电路、信号传输和固件控制等。下面将详细介绍这些基本原理。

1. 键盘按键矩阵

        大多数键盘采用按键矩阵结构来实现多个按键的检测。按键矩阵是一种通过行列交叉的方式连接多个按键的电路布局,这样可以减少所需的电线数量。

  • 行(Rows)和列(Columns):键盘的每个按键通常通过一个行和一个列来标识。当按下某个键时,它连接了一个特定的行和列,这样可以通过电路检测出该按键的位置。

  • 矩阵布局:假设有一个4x4的矩阵布局,代表16个按键。每个按键都由一行和一列组成。按下某个按键时,电路中对应的行和列之间会闭合,从而让控制器可以确定是哪个按键被按下。

    /*

     * ┌───┬───┬───┬───┐

     * │ 7 │ 8 │ 9 │   │

     * ├───┼───┼───┤ + │

     * │ 4 │ 5 │ 6 │   │

     * ├───┼───┼───┼───┤

     * │ 1 │ 2 │ 3 │   │

     * ├───┴───┼───┤Ent│

     * │   0   │ . │   │

     * └───────┴───┴───┘

     */

例如,如果你按下位于第2行和第3列的按键,电路会通过扫描检测到该按键位置,输出6这个数字。

2. 键盘扫描与信号检测

        键盘的扫描是通过控制器(通常是微控制器或专用的键盘芯片)完成的。扫描过程可以分为以下步骤:

  1. 行激活:控制器逐一激活键盘的每一行,并读取与之连接的所有列。

  2. 列检测:在某一行激活时,控制器会读取所有列的信号。如果某个列的信号改变(通常是由按键按下引起的电流流动),说明该行列交点上的按键被按下。

  3. 去抖动:按键的物理开关会在按下和松开时发生微小的震动,这会导致信号的不稳定。为了避免错误的按键输入,控制器会进行去抖动处理,即在按键被按下后,控制器会等待短暂时间再确认按键状态。

  4. 重复检测:当用户按住某个按键时,键盘通常会以一定的速度重复发送按键信号,直到按键松开。这是为了在长时间按住某个按键时能够持续输入。

        提起键盘定制,QMK(Quantum Mechanical Keyboard)固件无疑是其中的佼佼者。作为一个开源项目,QMK固件已经成为了键盘爱好者和DIY者的标配工具。它不仅提供了高度的定制能力,还支持各种复杂的功能和设置,使得用户能够根据自己的需求,打造出个性化的键盘布局和操作体验。QMK固件是一款针对机械键盘的开源固件,基于C语言编写,允许用户自由修改和配置键盘的各项功能。QMK原本是基于一个叫做TMK的开源固件开发的,后来因为功能强大和灵活性高,逐渐成为了社区的主流选择。

        QMK的最大亮点在于它的高度可定制性,它不仅支持常见的按键映射和宏命令,还支持更多复杂的功能,如多层布局、特殊键位、RGB灯效等。用户可以通过修改QMK固件中的代码,轻松实现个人化需求。

QMK固件的强大之处还在于它可以对键盘的各个方面进行深入的定制。以下是QMK固件的一些核心功能:
  • 按键映射(Keymap):QMK允许用户自定义每个按键的功能,包括普通键位、功能键、组合键、宏命令等。通过QMK的配置文件,用户可以为每个按键分配不同的任务,使得每个按键的功能都可以根据需要进行调整。

  • 多层(Layers)支持:QMK固件支持多层布局功能,允许用户通过按下特定的修饰键(如Shift、Ctrl等)来切换不同的键位布局。这使得键盘的功能得到极大的扩展。例如,你可以将一层映射为数字键盘,另一层用于控制媒体播放,或者将一层配置为游戏快捷键。

  • 宏命令(Macros):QMK支持宏命令功能,允许用户定义一组按键序列,并将其绑定到某个单独的按键上。通过按下这个特定的按键,QMK会自动执行这组按键序列。宏命令功能非常适合需要频繁输入复杂命令的用户,比如程序员、游戏玩家等。

  • RGB灯效:QMK还支持RGB背光的控制,可以根据需要调整灯效的颜色、亮度以及动态效果。用户可以通过固件代码自定义灯效模式,例如设置呼吸灯、波浪灯、渐变色等效果,或者根据按键的状态变化调整灯光。

  • 定制功能:QMK固件还支持一些特殊的功能,如按键防抖、长按触发、按键禁用、音效反馈等。这些功能可以进一步提升用户体验,使得键盘更加智能和人性化。

QMK固件的配置和编程过程是有一定的学习曲线,但一旦掌握了,就可以进行极其灵活和深入的定制。以下是QMK固件配置的基本步骤:

安装QMK MSYS

打开QMK MSYS在shell里面输入qmk setup

        下载QMK固件源代码:会通过git 去QMK官方GitHub仓库下载固件源代码。QMK的源代码中包含了许多已经预定义好的配置文件和示例代码,用户可以根据自己的需求进行修改。本着国内GitHub访问的不稳定性,科学上网是必要的,因为在sub-routine这块很容易失败      

这个最好设置一下git的代理

 如果想取消代理  

 在shell里面输入qmk new-keyboard

输入一个键盘的名称和Github用户名称

选择键盘和布局:在QMK固件中,每个键盘都有一个对应的配置文件,用户需要选择适合自己键盘的文件。如果是自定义键盘,用户需要根据自己的硬件设计来编写新的配置文件。

选择你想要的键盘布局,然后选择开发板,这里手里因为有块树莓派的RP2040的开发板,所以选择了15

这里的RP2040有足够的IO口关键还很便宜10-20RMB,还包邮

修改按键映射和功能:在QMK的配置文件中,用户可以根据自己的需求修改每个按键的功能。可以是单一的字符,也可以是复杂的宏命令。QMK允许用户通过修改C语言代码来自定义每个按键的行为,例如设置某个按键为切换多层、触发宏命令等。

设计好引脚和键盘扫描电路的mapping

一些个性化的定制也可以通过QMK Configurator进行修改,生成的文件替换文件夹里的文件

在编译之前一定修改matrix_pins的对应,因为我用了RP2040

编译并烧录固件:修改完配置后,用户需要使用QMK的编译工具将固件编译成可供键盘使用的二进制文件。然后,使用适当的工具(如QMK Toolbox)将固件烧录到键盘的微控制器中。

输入:qmk compile -kb demo_keyboard -km default

开始编译固件

编译成功

烧录固件,qmk flash -kb demo_keyboard -km default   注意RP2040按住boot键然后松开

调试与测试:烧录完成后,用户需要通过测试确保每个按键的功能都正常工作。如果有任何问题,可以重新调整配置文件并编译新的固件版本。

这个是4*4矩阵键盘打印出的

7++++++7744566456123

相关文章:

DIY QMK量子键盘

最近放假了,趁这个空余在做一个分支项目,一款机械键盘,量子键盘取自固件名称QMK(Quantum Mechanical Keyboard)。 键盘作为计算机或其他电子设备的重要输入设备之一,通过将按键的物理动作转换为数字信号&am…...

C++ 堆栈分配的区别

这两种声明方式有什么区别 1.使用 new 关键字动态分配内存 动态分配:使用 new 关键字会在堆(heap)上分配内存,并返回一个指向该内存位置的指针。生命周期:对象的生命周期不会随着声明它的作用域结束而结束&#xff0…...

范冰冰担任第75届柏林电影节主竞赛单元评委 共鉴电影佳作

近日,备受瞩目的柏林电影节迎来了新一届盛事,而华人演员范冰冰将以主竞赛单元评委身份亮相,引发了广泛关注。此前她已担任过戛纳国际电影节、东京国际电影节、圣塞巴斯蒂安国际电影节等众多电影节主竞赛单元评委。作为国际影坛的知名人物&…...

Pandas进行MongoDB数据库CRUD

在数据处理的领域,MongoDB作为一款NoSQL数据库,以其灵活的文档存储结构和高扩展性广泛应用于大规模数据处理场景。Pandas作为Python的核心数据处理库,能够高效处理结构化数据。在MongoDB中,数据以JSON格式存储,这与Pandas的DataFrame结构可以很方便地互相转换。通过这篇教…...

《DeepSeek 实用集成:大模型能力接入各类软件》

DeepSeek 实用集成 awesome-deepseek-integration/README_cn.md at main deepseek-ai/awesome-deepseek-integration 将 DeepSeek 大模型能力轻松接入各类软件。访问 DeepSeek 开放平台来获取您的 API key。 English/简体中文 应用程序 Chatbox一个支持多种流行LLM模型的桌…...

适配Android16

Android16新特性 Android 16带来了许多新特性和改进,提升了系统的流畅度、用户体验和安全性。对于应用开发者来说,适配Android 16可以确保应用在该版本上的兼容性和性能,同时也可以利用其新特性为用户提供更好的服务。以下是Android 16的一些…...

如何用 Groq API 免费使用 DeepSeek-R1 70B,并通过 Deno 实现国内访问

这几天都被Deepseek刷屏了,而且Deepseek由于异常访问量,这几天都不能愉快的和它玩耍了, 我发现Groq新增了一个Deepseek的70b参数的模型, DeepSeek-R1 70B 作为一款强大的开源模型,提供了卓越的推理能力,而 …...

iperf 测 TCP 和 UDP 网络吞吐量

注:本文为 “iperf 测网络吞吐量” 相关文章合辑。 未整理去重。 使用 iperf3 监测网络吞吐量 Tom 王 2019-12-21 22:23:52 一 iperf3 介绍 (1.1) iperf3 是一个网络带宽测试工具,iperf3 可以擦拭 TCP 和 UDP 带宽质量。iperf3 可以测量最大 TCP 带宽…...

Autogen_core: Model Context

目录 示例代码代码解释另一个例子 示例代码 from dataclasses import dataclassfrom autogen_core import AgentId, MessageContext, RoutedAgent, SingleThreadedAgentRuntime, message_handler from autogen_core.model_context import BufferedChatCompletionContext from …...

SpringBoot AOP 和 事务

SpringBoot 整合 AOP 动态代理技术 JDK 动态代理 JDK 动态代理是 Java 自带的一种代理方式。它要求目标类必须有接口,基于这个接口,JDK 在运行时会动态生成一个代理对象。这个代理对象和目标对象就像 “拜把子” 的兄弟,因为它们都实现了相同…...

Ubuntu全面卸载mysql

如果你已经看到whereis mysql输出了与MySQL相关的路径,说明MySQL仍然存在于系统中。要卸载MySQL,可以按照以下步骤操作,确保完全删除所有相关的文件和配置: 1. 停止MySQL服务 首先,停止MySQL服务: sudo …...

android的gradle

资料: GitHub - ChenSWD/CopyGradleInAction: 备份《Gradle IN Action》书中的源码,添加了部分注释 //github上一个开源项目,外加pdf书 Gradle User Manual gradle官网 讲的挺好的博客 Gradle之重新认识Gradle(项目结构、命令行、tas…...

前端开发之jsencrypt加密解密的使用方法和使用示例

目录 RSA密钥生成选项简介 jsencrypt 使用教程 一、安装 jsencrypt 二、使用 jsencrypt 进行加密和解密 1. 创建密钥对 2. 加密数据 3. 解密数据 三、实际应用示例 加密数据并存储到 localStorage 中: 从 localStorage 中读取加密数据并解密: …...

电路研究9.2.5——合宙Air780EP中GPS 相关命令使用方法研究

注:本命令仅适用于合宙 4G CAT1 模块(Air780EG 系列)。 正好,我们使用的Air780EP好像也有4G CAT1模块,好像也属于Air780EG系列吧。 这个例子好像比较少就个。 18.9 使用方法举例 18.1GPS 开关:ATCGNSPWR 这…...

Python标准库 - os (3) 调度策略、系统信息

文章目录 6 调度策略6.1 调度策略常量6.2 访问和设置进程的调度策略 7 系统信息7.1 系统信息7.2 系统配置信息7.3 系统负载7.4 路径相关常量7.5 生成随机字节 os模块提供了各种操作系统接口。包括环境变量、进程管理、进程调度、文件操作等方面。 这里整理了进程调度和查看系统…...

【NLP251】NLP RNN 系列网络

NLP251 系列主要记录从NLP基础网络结构到知识图谱的学习 1.原理及网络结构 1.1RNN 在Yoshua Bengio论文中( http://proceedings.mlr.press/v28/pascanu13.pdf )证明了梯度求导的一部分环节是一个指数模型…...

【漫话机器学习系列】067.希腊字母(greek letters)-写法、名称、读法和常见用途

希腊字母(Greek Letters) 希腊字母在数学、科学、工程学和编程中广泛使用,常用于表示变量、常量、参数、角度等。以下是希腊字母的完整列表及其常见用途。 大写与小写希腊字母表 大写小写名称(英文)名称(…...

2.文件IO

2.文件IO **1. 文件I/O概述****2. 文件I/O函数接口****3. 文件定位****4. 文件描述符与文件流指针的转换****5. 文件I/O与标准I/O的比较****6. 练习与作业****7. 文件I/O与标准I/O的对应关系****8. 其他注意事项****9. 总结** 1. 文件I/O概述 文件I/O:操作系统为了…...

毕业设计--具有车流量检测功能的智能交通灯设计

摘要: 随着21世纪机动车保有量的持续增加,城市交通拥堵已成为一个日益严重的问题。传统的固定绿灯时长方案导致了大量的时间浪费和交通拥堵。为解决这一问题,本文设计了一款智能交通灯系统,利用车流量检测功能和先进的算法实现了…...

【SpringBoot教程】Spring Boot + MySQL + HikariCP 连接池整合教程

🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 在前面一篇文章中毛毛张介绍了SpringBoot中数据源与数据库连接池相关概念,今天毛毛张要分享的是关于SpringBoot整合HicariCP连接池相关知识点以及底层源码…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

Java编程之桥接模式

定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...