STM32硬核DIY机械键盘[蓝牙USB双模|灯控]

——创世一号 WorldEdit_1.0
本项目已开源至Github:点我传送
项目制作全过程视频BiliBili:点我传送

文章目录

  • STM32硬核DIY机械键盘[蓝牙USB双模|灯控]
      • 项目起因: "想"
      • 项目简介:
    • 一、准备材料阶段
      • 1.键盘配列
      • 2. 元器件、模块、电池、轴体、键帽等采购
    • 二、组装调试
    • 三、优化程序代码

项目起因: “想”

项目简介:

为什么叫创世一号(WorldEdit)呢?
     因为想着以后用这把键盘,闯荡天下,制造更多东西,就像一个创世神一样,
所以就叫创世一号WorldEdit

创世一号采用STM32F103RCT6主控,整合有锂电池充放电管理,稳压,蓝牙串口HID,USB-HID,LED灯阵列驱动,按键检测电路。
     可实现蓝牙连接模式(支持IOS、Android等平台),和USB连接模式。蓝牙连接时响应时间约15ms,USB连接模式主控响应时间约为0.3Ms。

靓照如下:

一、准备材料阶段

1.键盘配列

首先做机械键盘,需要了解键盘的配列。制作配列有很多工具可以用,我们在这一步需要把定位板的CAD图生成,用到以下两个网站:
配列编辑网站: http://www.keyboard-layout-editor.com/
定位板CAD生成网站: http://builder.swillkb.com/
     如果要做的配列和我的一样,可以直接使用我的配列CAD文件
我要做的配列如下:(这个网站可以很方便的修改配列,网上教程已经很多了,我就不详细介绍了)

     然后将你的配列的Raw data复制到CAD生成网站。生成CAD定位板文件
(该文件在画PCB和键盘外壳都需要用到)
     然后底下的这些是和轴体有关的,一般来说默认就行了。

点击

生成文件,然后点击右上DXF并将文件下载保存。
     到这里,键盘配列就完成了。然后去网上冲浪 淘一淘 , 买键帽、蓝牙HID模块、主控啊、一些电容电阻啊、锂电池啊、等等需要用到的东西。

2. 元器件、模块、电池、轴体、键帽等采购

我的整个键盘需要的物品清单如下:
     元器件购买完毕后,就可以开始画电路了(不会的可以用我的PCB去加工,我100元做了5张PCB)由于整个项目都已开源,这里就不介绍具体电路了。
     然后是设计外壳。由于没有加工条件,只能网上订制,所以就简单的设计了一个不包底的钢板做框架。最后成品也还可以。

二、组装调试

以上都准备完成后,就是焊电路,装轴,上键帽了。具体步骤,可以看我的制作视频。

三、优化程序代码

代码部分的思路就是检查键盘消息是否更新,更新了就生成按键数据包,然后串口传输给蓝牙模块。如果是USB模式的话就直接USB发送给电脑主机。
    按键物理上如何快速与程序代码链接起来呢,这里有一个思路,如果有更好的方法或建议请留言或私信,谢谢啦。
    这里将按键的位置与数组的顺序对应了起来,在后面处理按键消息的时候用起来很方便。

#define xxCK myKeyBoard_ControlKey
#define xxSK    myKeyBoard_SpecialKey const char * myKeyBoard_KeyMap_Name[6][16] =
{"Esc","F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12","PrtSc","ScrollLock","PauseBreak","~","!","@","#","$","%","^","&","*","(",")","-","+","BackSpace","Insert","Home","Tab","Q","W","E","R","T","Y","U","I","O","P","{","}","|","Delete","End","CapsLock","A","S","D","F","G","H","J","K","L",";","'","Enter","","","PageUp","LShift","Z","X","C","V","B","N","M",",",".","/","RShift","Up","","","PageDown","LCtrl","Win","LAlt","Space","RAlt","FN","Menu","RCtrl","Left","Down","Right","","","","",""
};const unsigned char myKeyBoard_KeyMap_ATValue[6][16] =
{0x29,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x35,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x2D,0x2E,0x2A,0x49,0x4A,0x2B,0x14,0x1A,0x08,0x15,0x17,0x1C,0x18,0x0C,0x12,0x13,0x2F,0x30,0x31,0x4C,0x4D,0x39,0x04,0x16,0x07,0x09,0x0A,0x0B,0x0D,0x0E,0x0F,0x33,0x34,0x28,0x00,0x00,0x4B,xxCK,0x1D,0x1B,0x06,0x19,0x05,0x11,0x10,0x36,0x37,0x38,xxCK,0x52,0x00,0x00,0x4E,xxCK,xxCK,xxCK,0x2C,xxCK,xxSK,xxSK,xxCK,0x50,0x51,0x4F,0x00,0x00,0x00,0x00,0x00,
};

main 函数如下:(具体代码已开源至GitHub)

int main()
{sysInit();//BTK05_Wake();//唤醒BTK05while(1){ if(g_USBModeFlag)//USB模式下{if(sleepTime1SCounter <= 1000){myKeyBoard_ScanKeyAndUpdataATBuffer();//键盘事件更新if(g_myKeyBoard_DataWaitForUploadFlag == 1){g_myKeyBoard_DataWaitForUploadFlag = 0;if(bDeviceState == CONFIGURED)//如果连接上了 USBKeyboard_Send(BTK05_ATKeyDataPack+4);GPIO_SetBits(LED_LOGO_GPIOPort,LED_LOGO_GPIOPin);}}else if(system_Status == 0){myKeyBoard_ScanKeyAndUpdataATBuffer();//键盘事件更新if(g_myKeyBoard_DataWaitForUploadFlag == 1){g_myKeyBoard_DataWaitForUploadFlag = 0;if(bDeviceState == CONFIGURED)//如果连接上了 USBKeyboard_Send(BTK05_ATKeyDataPack+4);GPIO_SetBits(LED_LOGO_GPIOPort,LED_LOGO_GPIOPin);system_Status = 1;TIM_Cmd(TIM2, ENABLE);  //使能TIMx sleepTime1SCounter = 0;if(LED_Status)  LED_WakeUp();   }}else if(sleepTime1SCounter > 1000){TIM_Cmd(TIM2, DISABLE);  //失能TIMx       system_Status = 0;LED_GoToSleep();}}else//蓝牙模块模式{//如果键盘休眠计时器小于400并且键盘处于醒着的状态if(sleepTime1SCounter <= 400 && BTK05_Status == BTK_WAKE){myKeyBoard_ScanKeyAndUpdataATBuffer();//键盘事件更新if(g_myKeyBoard_DataWaitForUploadFlag == 1){g_myKeyBoard_DataWaitForUploadFlag = 0;//GPIO_ResetBits(LED_LOGO_GPIOPort,LED_LOGO_GPIOPin);BTK05_UART_SendKeyData(BTK05_ATKeyDataPack,12);sleepTime1SCounter = 0;if(ATKeyControlByte5 != 0){GPIO_SetBits(LED_LOGO_GPIOPort,LED_LOGO_GPIOPin);}else{GPIO_ResetBits(LED_LOGO_GPIOPort,LED_LOGO_GPIOPin);}}}//如果蓝牙处于休眠状态else if(BTK05_Status == BTK_SLEEP){myKeyBoard_ScanKeyAndUpdataATBuffer();if(g_myKeyBoard_DataWaitForUploadFlag == 1){system_Status = 1;BTK05_Wake();//唤醒BTK05TIM_Cmd(TIM2, ENABLE);  //使能TIMx    sleepTime1SCounter = 0;g_myKeyBoard_DataWaitForUploadFlag = 0;if(LED_Status)  LED_WakeUp();BTK05_UART_SendKeyData(BTK05_ATKeyDataPack,12);}}//如果 键盘休眠计时器大于600   即600S没有按下任何按键则然键盘进入休眠状态else if(sleepTime1SCounter > 400){//进入休眠模式...BTK05_Sleep();//休眠BTK05TIM_Cmd(TIM2, DISABLE);  //失能TIMx       system_Status = 0;LED_GoToSleep(); }}if(LED_BreathEfectFlag && LED_breath_Flag){LED_BreathProcess();LED_breath_Flag = 0;}}

STM32硬核DIY机械键盘|蓝牙USB双模|灯控相关推荐

  1. 关于STM32的USB设备库DIY机械键盘

    前言 为什么想写这个呢,首先一方面是因为自己喜欢DIY一些小玩意,另一方面关于USB-HID的东西断断续续的学习了不少东西,想总结整理一下.其次就是网络上关于STM32制作USB-HID的案例很多,我 ...

  2. CK6855M1蓝牙离线语音识别灯控模组使用说明书

    CK6855M1蓝牙离线语音识别灯控模组使用说明书        一.功能说明  CK6855M1模块是一款专为灯具照明产品设计的离线蓝牙语音识别模组.模组支持红外遥控接收,支持RGB+W+Y灯控制, ...

  3. 蓝牙模块智能灯控应用方案

    当今是信息高速发展的时代,经济.文化的流行与传播都离不开信息.信息的传递直接影响着人们生活的方方面面,信息的传递方式又各有不同,如有线传输.无线传输等:而无线传输还可按协议不同分为:蓝牙.WIFI.z ...

  4. 伦茨科技蓝牙BLE5.2灯控方案

    随着物联网在人们日常生活中的广泛应用和日益成熟,智能家居已然呈星星之火之势,智能照明作为智能家居的重要组成部分,现在市场上的智能照明产品也随处可见,如蓝牙LED灯.接下来就讲讲伦茨科技的蓝牙BLE5. ...

  5. stm32 薄膜键盘原理_stm32 diy 机械键盘

    但是HHKB的空格键很长,Fn组合键不好按,上下左右与vim不统一.受minila的启发,我决定自己做一个机械键盘. minila键盘图片: 自制机械键盘使用59键布局,以小为美(便宜)采用短空格,充 ...

  6. stm32 diy 机械键盘

    程序员对机械键盘的需求不止于情怀,当然,对于算法工程师.逻辑复杂而代码量小的软件工程师来说,平时对键盘的操作并没有那么多,可能对机械键盘并不感兴趣.而我曾经是一个日常大量编码.运维的数据工程师,逻辑简 ...

  7. DIY机械键盘过程照

    我是个程序员,偶而搞下硬件开发,总觉得别人设计的键盘不满足自己的胃口,我自己DIY了一把机械键盘. 全键盘键位可编程,可以从内核开始编程,共设计69键,有点类似HHKB,但是比她要多了几个键盘. 功能 ...

  8. 从零DIY机械键盘/主控方案

    自从有了第一套机械键盘,先后修改了接口方案,安装了LED灯等,但是始终无法满足自己的DIY欲望. 于是想到最简单的方法就是用现成的主控,而主控来源于废弃的键盘,如下图: 这种主控也是矩阵方式,只需要测 ...

  9. yoda键盘linux,【简单评测】Yoda II机械键盘——DIY初解禁

    2015年第一代Yoda键盘出世,我当时正在做ThinkPad维修,对机械键盘领域所知有限,从2013年入行至今,本人一直是ThinkPad忠实用户也是ThinkPad粉丝.2016年末有幸加入一个神 ...

  10. 从0开始制作机械键盘

    机械键盘,造轮子,还是造键盘? 是的,没错,我要重新开始造轮子. 最开始萌生此想法的原因是想把一个USB接口的键盘改造成蓝牙键盘(别问我为什么不直接买一个).想改的前提有两个:一是笔者用的是笔记本,总 ...

最新文章

  1. Office WORD如何设置表格背景颜色
  2. [剑指offer]面试题5:从尾到头打印链表
  3. python2转python3代码_2to3 – 自动Python 2到3代码翻译 – 开发工具(Python教程)(参考资料)...
  4. jquer案例2:改变元素的样式、复选框、下拉框 省份的选择
  5. 【kafka】Kafka消费者分区分配策略详解
  6. mysql 多级主从_mysql主从复制-二级主从
  7. 数据挖掘十大经典算法(包括各自优缺点 / 适用数据场景)
  8. 整合并接班MSN!Win8版Skype完全体验
  9. 计算机科学导论考试A卷试题,计算机科学导论试题A答案
  10. 广义线性模型python
  11. C++primer Plus课本代码(第11章)
  12. 针对PVS方式的VDI部署趋势杀毒优化方法
  13. python爬虫抓取,免费高匿快代理 IP
  14. OpenCV:直方图均衡
  15. idou教你学Istio10 : 如何用Istio实现K8S Egress流量管理
  16. 音频文件转换为文本文件!
  17. Maven传递依赖的时候,同名包不同版本的包均会下载,但是编译的时候,只会加载一个高版本的。
  18. 将xlsx文件转换成CSV文件方法
  19. AutoMagic使用说明
  20. 移动端的ajax请求(痛的领悟)

热门文章

  1. android 音频子系统框架(一)
  2. Java Web学习—编程1:数字三角形+三种解题思路+详细规律
  3. Spring(三) 表单页面处理
  4. 浅层与深层、局部与全局、低级与高级特征的辨析
  5. Node中间件multer库学习
  6. 东欧小哥打造超全Python速查表登上GitHub热榜,标星4600+
  7. Alios-Things之wifi模块二次开发-(1)搭建Alios-Things开发环境(基于ubuntu 16.0.4)
  8. 世界银行的WDI世界发展指标数据EXCEL版本(1960-2017年)
  9. mysql无法加载主类_错误: 找不到或无法加载主类 JDBC
  10. 项目进度管理方法——里程碑