查看:
10515
回复: 6 |
参赛作品《基于STM32 AD的USB键盘》
|
|
发表于2017-06-05 22:23:42
|
显示全部楼层
1#
电梯直达
【报名阶段需要填写的内容】 1. 参赛者姓名(必填项):金鹏 2. 单位或学校名称(必填项):华中数控 3. 当前职务或职称(必填项):嵌入式设计 4. 参赛作品的名字(必填项):基于STM32-AD方案的USB键盘 5. 简要陈述您的idea和作品(必填项):不同于一般键盘的实现方式,本方案采用STM32F070的AD采样,理论上最少仅需AD的一个通道(即1个IO)即可实现对键盘单个按键、 组合按键的识别,并通过STM32F070自带的USB控制器,做USB从站,使电脑能够识别USB键盘设备。本方案实现方式新颖、关键器件少、成本低。 6. 拟用到的立创商城在售物料(必填项):C86951 STM32F070F6P6 C86951 XC6210B332MR C91146 MicroUSB连接器 7. 拟用到的非立创商城物料或其它补充(必填项):若干精密电阻、按键 【作品正式发表(报名成功后进入设计阶段)需要填写的内容】 一、作品简介 例如,可以包括但不局限于以下内容: 1.作品的整机外观图片或焊接组装好的PCBA图片; PCB:
PCBA,正面已焊接轴体、LED,并安装上按键帽:
红轴轴体特写:
上电时整体效果:
2.作品的研究背景、目的和功能、市场应用前景; 研究背景:一般的应用中AD是来采样电压值,例如对电池电量的监控,对于12位AD,能最小分辨出0.8mV左右的电压变化,如使用电阻分压获得不同的电压值,再对应不同的按键, 那么使用AD采样且最少用1个通道就能做出键盘。市面最精简的按键为61按键,本作品参照61按键来做,留出了很大的余量空间,理论上做出标准104键盘完全没有问题。 而且STM32F070带USB控制器,满足做USB设备的条件。 目的和功能:做出与标准键盘相同功能的AD键盘,使用STM32F070的AD采样电压值,内部建立电压值和按键键值的对应表、各种判断和控制,并使用STM32F070自带的USB控制器, 实现一个标准的USB HID设备,即可完成AD USB键盘。 市场应用前景:最少使用1个MCU+若干阻容+1个LDO+1个MicroUSB插座即可完成功能,硬件成本低且电路简单,MCU的1根线(AD的1路通道)即可完成对所有按键的键值采样(即电压采样), 创新、趣味、实用性方面:1)MCU的一根线即可完成对所有按键的键值采样,是有别于传统按键处理方式的一种创新。 2)本方案采用机械键盘的轴体来做,在按键手感上大大优于一般的轻触按键或薄膜按键;轴体上加了LED灯,使按键有背光,不仅在光线暗的情况下不影响打字, 而且方便DIY爱好者自己动手更换轴体、RGB彩灯、按键帽,使键盘用起来更炫酷; 3)定义了背光模式切换按键,可以切换背光开关或是RGB背光颜色,兼容性设计上可实现呼吸灯,MCU的一路PWM接到了LED,控制背光亮度,让键盘灵动起来。 公益性上:1)在青茶红黑四个常用轴体中中采用红轴的设计,考虑到红轴的直上直下、按下力度较小、无声,长时间打字手不会累,而且不会吵到其他人。 2)采用最小的61键设计,整体尺寸很迷你,适合随身携带。 二、系统构架图
三、硬件部分的描述 1.原理图、PCB:见附件ad_keyboard_V0_1.rar 备注:原理图有更正过,但PCB没有重新投板更正,实际电路飞线暂时解决。图纸仅供参考,不保证全部正确。 2.实现原理、系统的工作过程: 1)STM32的AD的其中一个通道(1个IO)串行连接了每个按键处的分压电阻,每个按键对应唯一一个单独的分压值,当没有任何按键按下时,AD采样的值为0,当有任意按键按下时, 便接通了采样电阻到+3.3V的通路,AD线上即采得某个固定的电压值(实际是一个很小范围内的电压值)。 2)按照事先建立好每个按键对应的电压值,并对应到键值,当按键按下时,便识别到是某一个按键,并在定时器中开启检测,判断是短按键还是长按键或是无效按键。 3)检测到有效按键后,通过USB将键值发送到PC,在PC端打开的记事本上,即显示之前按键的按键值。 4)上电默认背光开启,可通过指定的轻触按键关闭。 四、材料清单(BOM列表) 用到的立创商城的物料:STM32F070F6P6 http://www.szlcsc.com/product/details_88128.html micro usb连接器 http://www.szlcsc.com/product/details_92335.html micro usb线缆 http://www.szlcsc.com/product/details_94745.html 轻触开关 http://www.szlcsc.com/product/details_3838.html USB转TTL模块 http://www.szlcsc.com/product/details_92502.html 五、软件部分的描述(选填) 软件主要分为两个部分: 1)AD采样、建立电压值和键值的对应关系、长短按键判断和处理、IO信号处理等 2)USB HID设备初始化、各类描述符的建立、键值发送等 备注:1)一定要下载对应MCU的ST官方最新HAL LIB固件库。 2)USB HID协议是重点,可参考圈圈的USB书籍及一些开发板的USB例程。 3)按键键值对应的十六进制值,请查询USB HID设备文挡 4)代码不完善还有BUG,只对主要部分做说明,仅供参考。 MAIN函数: #include "config.h" /** * @brief Main program * @param None * @retval None */ int main(void) { /* STM32F0xx HAL library initialization*/ HAL_Init(); /* Configure the system clock to have a system clock = 48 Mhz */ SystemClock_Config(); /* Hardware Initialization */ LED_BL_IO_Init(); KEY_Init(); USART2_Init(115200); TIMER3_Init(99, 4799); ADC_Init(); USB_Device_Init(); /* Infinite loop */ while(1) { USB_Keyboard_Process(); } } USB HID设备初始化: void USB_Device_Init(void) { /* Init Device Library */ USBD_Init(&USBD_Device, &HID_Desc, 0); /* Register the HID class */ USBD_RegisterClass(&USBD_Device, &USBD_HID); /* Start Device Process */ USBD_Start(&USBD_Device); } 通过USB发送键值: ...... if((adc_value) && (USBD_Device.ep0_state == USBD_EP0_IDLE)) { adc_value = Get_Adc_Average(ADC_CHANNEL_0, 1); vol = (float)adc_value*(3.3/4096); key = KEY_Output(vol); if(key) { if( (key_short && key_short_out_once) || key_long) { USB_Keyboard_Send(key); key_short_out_once = 0; } } } else { USB_Keyboard_Send(0); } ...... 六、作品演示 作品仅完成基本功能,还存在一些问题,演示视频如下:https://v.qq.com/x/page/o0538a7j5w3.html 七、总结 1)AD键盘的优点是成本低、制作简单,理论上1根线即可采集所有按键键值,方便DIY设计。 2)缺点也是显而易见的,即暂时无法做到无冲突,由于是采用AD采样,每个按键对应1个唯一的电压值,当第一个按键按下后,必须抬起,再按下下一个按键,才能正确识别; 当然也可以设计采样电阻的阻值是2的n次方,并在表里加入2键、3键甚至更多的组合,但这么做会非常复杂、而且组合越多,采样出来的值越容易被误判,所以考虑到这点, 对一些需要长按的功能键,例如SHIFT、CTRL等,本方案采用IO处理。 3)限于本人水平精力有限,STM32 AD键盘仅完成单个按键功能,且上述设计和描述难免有错误或不严谨的地方,请大家见谅。 对于后续功能完善以及关于AD键盘的缺点,希望有兴趣的朋友可以在我的基础上进行改进升级,或者有更好的想法、方案,跟帖讨论。 |
|
发表于2017-08-15 17:59:10
|
显示全部楼层
6#
好想法
|
|