查看: 10514
回复: 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路通道)即可完成对所有按键的键值采样(即电压采样),
          在成本和控制方式上有很大的优势和创新。

3.作品在创新性、趣味性、实用性甚至公益性方面,有哪些亮点可体现?

  创新、趣味、实用性方面: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-06-25 19:39:41   |  显示全部楼层
5#
AD键盘实现多个组合是个不态度好算的AD,方案思路不错,赞一个

主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部