分享

用ARDUINO LEONARDO自制物理按键精灵(预算20)

 金刚光 2020-01-04

ARDUINO从入门到创客带师第一弹 按键精灵(物理)

玩游戏不想重复简单操作怎么办?

不想按空格了

简单做个基于ARDUINO单片机开发板的物理按键精灵吧

Leonardo相较前文的其他型号开发板直接使用了ATmega32u4的USB通信功能,取消了USB转UART芯片。可以看到上图LEONARDO的标准ARDUINO开发板并没有之前D1或者UNO的USB转串口芯片CH341或者CP210X,而是直接用的USB直连MCU, 这使得它不仅可以作为一个虚拟的COM端口,还可以作为鼠标或者键盘连接到计算机。ATmega32u4提供了UART TTL(5V)的通信方式,32u4还允许通过USB在电脑上虚拟COM端口来进行虚拟串行(CDC)通信。这个芯片使用标准的USB串行驱动(在Windows上需要一个.inf文件),可以作为一个全速USB2.0设备。本文就是利用搭载这个型号单片机的开发板作为虚拟HID设备使用

HID是Human Interface Device的缩写,由其名称可以了解HID设备是直接与人交互的设备,例如键盘、鼠标与游戏杆等。不过HID设备并不一定要有人机接口,只要符合HID类别规范的设备都是HID设备,利用LEONARDO做按键精灵就可以不需要人来操作单片机直接利用单片机的程序输出,没有人机接口

和其他的标准开发板一样,LEONARDO标准板的左下方有个5.5*2.1DC输入口,直流电源经过AMS1117稳压给开发板供电,可以输入6V-20V。但是,如果低于7V,5V引脚将提供小于5V的电源,控制板可能会不稳定。如果使用大于12V的电源稳压器可能过热,从而损坏电路板。推荐的范围是7V-12V。ATmega32u4具有32KB的Flash(其中4KB被引导程序使用)。它还有2.5KB的SRAM和1KB的EEPROM

其实LEONARDO的实际应用方向上来看基本都是作为HID方向的,无论是BADUSB还是模拟键鼠,相比更常见的UNO活着基于8266的D1等开发板来说其实使用面更窄。现在大伙都喜欢搞物联网,什么东西都要弄个WIFI芯片连上网,就显得高大上了。就连小米的台灯都带个8266,对着手机说话就可以定时开关灯或者调亮度调色之类的,也许过不了多长时间对着手机说话就可以给厕所冲水,如果出门想起来家里厕所忘了冲,可以对手机说话就能让厕所冲水,非常实用。

有一说一ESP8266成本便宜应用范围广而且性能相比之下还更高,还能享受ARDUINO的环境和库,编程习惯友好当然用的人就多了。

硬件部分:

这次其实非常简单,只需要采购一个开发板就可以了,搜索的时候最好是按销量来,一般天猫的东西普遍比较贵但是它们买了搜索所以如果不仔细看的话很容易买贵,大伙都不是傻子同样的东西卖的价格相差太远当然没人买了。所以按实际销量来的话搜索结果里的标价比较接近商品的实际价值。一般买左上那个17.2包邮的NANO小板型就行,右上那个20块钱的标准版也可以 LEONARDO更多的应用方向并不需要太多的IO,除非你打算拿它DIY机械键盘……图吧垃圾佬会需要自己DIY机械键盘?二手键盘30块钱一个,不能再多。洗一下接着用

此外咱个人来说只要键盘手感好是不是机械的完全无所谓,机械键盘再机械,也没有咱自己30块钱收的打字机键盘机械,这可真是纯·机械键盘,手感那是真的爽,手劲不够大的话都打不出字

之所以现在的机械键盘这么多人喜欢主要还是普通的廉价键盘手感太次,笔记本也好台式机也好,大多数的键盘都不是什么好东西,如今IBM也不在了很少有人再觉得用笔记本自带的键盘和指点杆出门真的可以不需要键鼠的感觉,现在的笔记本键盘手感基本没比敲桌子好到哪,所以也无外乎有人面对投影键盘也能用得下去。而我个人觉得台式机的话大多数人也并不会上罗技……罗技的键盘真的好用,相比机械也不差。

此外本篇教程的契机就是因为机械键盘连按空格太吵所以才会需要硬件模拟按键……其实我个人对于键盘的要求是要静音,手感好是其次,咱过去最极限的时候为了静音让键盘实现零噪音甚至可以在实体店花高价去买可以折起来的“软”键盘,那是真的手感基本和啃轮胎一样但是确实没有噪音,妈妈再也不知道我在电脑桌干什么了。

不要相信什么意大利原装进口,这东西都是开源的,Arduino的硬件原理图、电路图、IDE等软件和核心库都是开源的,开发人员可以在开源协议的范围内任意修改原始设计及相应的代码。华强北产的和所谓意大利的没有本质区别。即使是华强北的开发板,用的也都是质量合格的元件,不存在质量问题。根据实际经验反倒是高价的所谓正版更容易GG,至少咱以前实验室的沙雕同学是炸的155的开发板,咱自己十块二十块的倒是一直用到现在。

LEONARDO需要用USB数据线连接到电脑,这个一般的开发板都会给,不给也顶多加一两块钱。此外LEONARDO用的是MICROUSB接口,一般这种接口的老式数据线一般人家都会有,如果没有的话买一两根质量好点的线也没多钱,1米5的针织软包屏蔽线两根也就10多块钱包邮

此外我们还需要做一个触发,让开发板决定什么时候该重复哪些按键,可以是个带线开关或者干脆找根杜邦线,上期如果跟着我们做了CPU温度显示的话这会儿手上应该有现成的杜邦线,到时候可以直接把它接在开发板上充当开关(以上这段可以//了,实际使用上并没有设计程序开关,上电自动执行,不想用直接拔了)

如果将来有用这个板子做鼠标指点杆或者说摇杆的需求,可以考虑买个XY轴摇杆,三四块钱吧,如果想简单做个小键盘功能键比如音量加减之类的,可以买个矩阵键盘,5块钱左右 需要旋钮就可以搞个编码器,总之ARDUINO外号叫电子积木,什么东西只要想要就随手可以买回来,装上库加上代码就可以用了

软件部分

首先为完成这个目的,需要库文件:

#include <Keyboard.h> //USB键盘库(这是键盘操作的库,只能在Arduino Leonardo系列的开发板上使用,如果在Arduino UNO 上编译的话,会报错)

//#include <HID.h> //HID设备库(keyboard库调用着这个库)

ARDUINO环境的安装咱就不说了,上期造CPU温度显示的时候已经说过了

建议小白选EXE直接安装就行了,全自动安装不用考虑别的太多。

把开发板通过数据线有效连接在电脑上,所谓有效连接就是最好是直接连接USB接口,不经过延长线或者转接卡,否则可能会出现供电不足

正常识别之后,驱动应该能自动安装

WIN7 64位如果装不上驱动,请按照这个教程进行

反正我遇到这个问题之后直接投降掏出自带XP的T43接着装ARDUINO了,反正又不是不能用

我们的目的是把开发板插入电脑后,自动重复空格按键 能完成目的就行

Arduino的程序结构与传统的c程序结构有所不同——Arduino程序中没有main函数。其实并不是Arduino程序中没有main函数,而是main函数的定义隐藏在了Arduino的核心库文件中。在进行Arduino开发中不直接操作main函数,而是使用setup和loop这两个函数。

setup() Arduino控制器通电或者复位后,就会开始执行Arduino的初始化配置(IO口 串口等);

loop() setup函数执行完毕后,Arduino会接着执行loop()函数中的程序。而loop函数是一个死循环,其中的程序会不断地重复运行。通常在loop函数中完成程序的主要功能,如驱动各种模块和采集数据等。

先在Arduino IDE里新建一个文件,导入资源库:

#include <Keyboard.h>

然后这个库常见的函数如下:开始键盘通讯:

Keyboard.begin();//开始键盘通讯

按键操作:

Keyboard.press();

与按键对应的是释放:

Keyboard.release();

Keyboard.releaseAll(); 是松开所有的按键;

当然还可以输入:Keyboard.println("");

最后是结束键盘通讯:Keyboard.end();//结束键盘通讯

有了这些就可以实现我们的目的了

此外,对于Keyboard这个库的命令来说,括号中使用ASCII数值来确定输入

ASCII值的表格

特殊按键

Failed to find GetFileInformationByHandleEx procedure in kernel32.dll可还行

老话叫缺啥补啥,下载之后解压/复制到指定位置就行了

还是不行那就在xp上安装vc2012/2013运行库

还是一样报错,行吧,好在咱还有WIN10,这次的WIN10比上次的好用点,至少开机不会不知道为啥就把笔记本的CPU跑100%还睿频了

#include <Keyboard.h>

void setup() { // put your setup code here, to run once:}

void loop() {Keyboard.press(32)

Keyboard.release(32) // put your main code here, to run repeatedly:

}

基本上在搞明白库和函数之后,ARDUINO大部分的时间都是在改BUG,比如这次的代码就缺了两个;——在编译之后报错信息会告诉你怎么改,只要你能稍微懂点英文

这样编译完成就可以上传了

然后就成功了,这次上传完事了之后ARDUINO LEONARDO自动重启了之后就开始自动鬼畜空格了,完美

这是完整的

#include <Keyboard.h>

void setup() {

// put your setup code here, to run once:

}

void loop() {Keyboard.press(32);

Keyboard.release(32)

// put your main code here, to run repeatedly:

;}

进阶:加上鼠标的操作

游戏中跑步和踩车机需要用到一个空格,但是举重需要空格+鼠标交替连点 那么实现起来就需要涉及到鼠标

这里其实就是在开头加上个鼠标库#include "Mouse.h"

然后在LOOP的那行代码底下加上函数实现Mouse.click(MOUSE_LEFT)反复按左键这么简单

其实关于ARDUINO LEONARDO这种USB HID类设备还有很多比物理按键精灵更有意思的玩法,比如自制BADUSB通过固件层实现对设备的渗透,这个咱可以以后再说

这里有一个可以做一个简单的自制鼠标键盘的教程,建议各位观摩学习:

Arduino模拟鼠标键盘-Arduino中文社区

以上 就这样

PS:这次阿卡林大佬我在寻求帮助的时候说自己还没玩过这个,有点意外。好在咱要实现的功能简单,凭咱自己没学过C语言的水平居然也能对付,要么怎么说ARDUINO真的是神器呢,对小白不要太友好。这回儿要是没有环境或者像51 STM32那种反人类环境的话没准咱就放弃了,C语言从入门到放弃,太真实了

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多