ARDUINO从入门到创客带师 第6弹 自制指点杆
以前想搞没搞成的项目,现在旧事重提一下。争取这次把所有之前想做没做成的项目都整出来
前作:用ARDUINO LEONARDO自制物理按键精灵(预算20)
本作中我们需要用前作的装备扩展人机交互设备来实现真正的严格意义上的HID设备,通俗来说就是做个基于摇杆模块的指点杆。
因此,硬件部分我们需要:
ARDUINO LEONARDO开发板或
ARDUINO MICRO+朴实可靠的MICROUSB数据线(不是那种没有数据的充电线)
或者CJMCU BEETLE等基于ATMEGA32U4的开发板
以及一个摇杆模块和足够多的杜邦线(连接单片机开发板和摇杆模块的电源和信号)
开发板方面,其实咱现在有很多便宜可靠的板子可以用
如果能接受自己焊排针的话,可以用MICRO版
接受不了也没关系,标准版并没有太贵
不要相信所谓的意大利原装进口,都是智商税,实际上很可能产自深圳华强北和上面二十多块钱的开发板一样。
如果不太在乎那个ARDUINO的商标的话到手价还能再便宜两块钱
如果不喜欢数据线可以上这种
摇杆不到2块钱(杜邦线需自备)
如果有钱可以买现成的SHIELD 需要搭配标准版的开发板
不过总之最后我们是回到中心吧,硬件准备完毕之后开始讲解原理。
USB HID(Human Interface Device) 类设备属于人机交互操作的设备,是一个比较大的类,用于控制计算机操作的某些方面,如 USB 鼠标、USB 键盘、USB 游戏操作杆、USB 触摸板电话拨号设备、VCR 遥控设备等
使用 HID 设备的一个 好处就是操作系统自带了 HID 类的驱动程序, 用户无需开发很麻烦的驱动程序,很多简单的 USB 设备枚举成 HID 设备,这样就可以不用安装驱动而直接使用。当插入 USB 设备后,主机会向设备请求各种描述符来识别设备。为了把一 个设备识别为 HID 类,设备在定义描述符的时候必须遵守 HID 规范。不过严格来说HID设备并不需要一定要有人机接口,前作的物理按键精灵就没有人机接口,但是依然能完成对电脑的操作。
目前关于利用单片机开发板模拟键鼠常见的方案可以用ARDUINO Uno开发板加电阻模拟为usb设备,或者重烧16u2这样的串口转usb芯片来让开发板能具有模拟USB设备的能力。如下图
但是实际上无论是ARDUINO的用户还是开发者都非常不推荐这种方案,而是推荐用可以原生模拟USB设备的Leonardo这种基于32U4的开发板,是目前市面上比较成熟的方案
简单来说,开发板搭载的单片机可以原生模拟USB设备,可以通过读取模拟/数字端口的输入经过算法转化成对下位机的指令输出。简单来说就是上图的情况你按下五个物理按键中的任何一个都可以通过代码定义转化为对电脑/手机等下位机的输出,至于这个算法代码就是早就被编译封装成库的函数库了。当然如果你乐意的话,烧写代码让单片机自动执行对下位机的操作也是可以的。就像之前的物理按键精灵教程一样。
而在这里我们用单片机开发板的模拟端口读取摇杆的XY轴信息然后转变成对下位机的操作。
鼠标摇杆控制
你可以用Arduino Leonardo等开发板+鼠标函数库控制鼠标。这个代码加入了一个按键打开和关闭鼠标摇杆控制的开关。
Arduino的光标移动是相关联的。每次读到输入时,光标的位置就会根据它当前位置更新。
两个模拟输入(范围从0到1023)被转换成-12到12。这个程序假设操纵杆的静息值在这个范围的中心,但有一个阈值。
按键允许你切换鼠标控制打开和关闭。连接一个LED到pin5,当Arduino控制鼠标时,LED灯点亮。第二个按键(要通过一个10kΩ电阻下拉到地)连接到D3,来作为鼠标的左键点击。
注意:当你用Mouse.move()命令时,Arduino会接管你的电脑键盘!为了确保你没有失去对电脑的控制同时运行这个函数,确定在你调用Mouse.move()前,启动一个可靠的控制系统。这个程序包括一个按键切换鼠标控制状态,所以你可以打开和关闭鼠标控制。
连线图
用micro-USB线连接你的Leonardo开发板到你的电脑。连接按键SW到数字IO接口6,摇杆的x轴连接到模拟引脚A0,y轴连接到A1。
基本就是这样连
原理图
样例代码
/*
JoystickMouseControl
Controls the mouse from a joystick on an Arduino Leonardo, Micro or Due.
Uses a pushbutton to turn on and off mouse control, and
a second pushbutton to click the left mouse button
Hardware:
* 2-axis joystick connected to pins A0 and A1
* pushbuttons connected to pin D2 and D3
The mouse movement is always relative. This sketch reads
two analog inputs that range from 0 to 1023 (or less on either end)
and translates them into ranges of -6 to 6.
The sketch assumes that the joystick resting values are around the
middle of the range, but that they vary within a threshold.
WARNING: When you use the Mouse.move() command, the Arduino takes
over your mouse! Make sure you have control before you use the command.
This sketch includes a pushbutton to toggle the mouse control state, so
you can turn on and off mouse control.
created 15 Sept 2011
updated 28 Mar 2012
by Tom Igoe
this code is in the public domain
*/
#include "Mouse.h"
// set pin numbers for switch, joystick axes, and LED:
const int switchPin = 2; // switch to turn on and off mouse control
const int mouseButton = 3; // input pin for the mouse pushButton
const int xAxis = A0; // joystick X axis
const int yAxis = A1; // joystick Y axis
const int ledPin = 5; // Mouse control LED
// parameters for reading the joystick:
int range = 12; // output range of X or Y movement
int responseDelay = 5; // response delay of the mouse, in ms
int threshold = range / 4; // resting threshold
int center = range / 2; // resting position value
boolean mouseIsActive = false; // whether or not to control the mouse
int lastSwitchState = LOW; // previous switch state
void setup() {
pinMode(switchPin, INPUT); // the switch pin
pinMode(ledPin, OUTPUT); // the LED pin
// take control of the mouse:
Mouse.begin();
}
void loop() {
// read the switch:
int switchState = digitalRead(switchPin);
// if it's changed and it's high, toggle the mouse state:
if (switchState != lastSwitchState) {
if (switchState == HIGH) {
mouseIsActive = !mouseIsActive;
// turn on LED to indicate mouse state:
digitalWrite(ledPin, mouseIsActive);
}
}
// save switch state for next comparison:
lastSwitchState = switchState;
// read and scale the two axes:
int xReading = readAxis(A0);
int yReading = readAxis(A1);
// if the mouse control state is active, move the mouse:
if (mouseIsActive) {
Mouse.move(xReading, yReading, 0);
}
// read the mouse button and click or not click:
// if the mouse button is pressed:
if (digitalRead(mouseButton) == HIGH) {
// if the mouse is not pressed, press it:
if (!Mouse.isPressed(MOUSE_LEFT)) {
Mouse.press(MOUSE_LEFT);
}
}
// else the mouse button is not pressed:
else {
// if the mouse is pressed, release it:
if (Mouse.isPressed(MOUSE_LEFT)) {
Mouse.release(MOUSE_LEFT);
}
}
delay(responseDelay);
}
/*
reads an axis (0 or 1 for x or y) and scales the
analog input range to a range from 0 to
*/
int readAxis(int thisAxis) {
// read the analog input:
int reading = analogRead(thisAxis);
// map the reading from the analog input range to the output range:
reading = map(reading, 0, 1023, 0, range);
// if the output reading is outside from the
// rest position threshold, use it:
int distance = reading - center;
if (abs(distance) < threshold) {
distance = 0;
}
// return the distance for this axis:
return distance;
}
注解:
Mouse.click()鼠标点击
Mouse.move()鼠标移动
Mouse.press()鼠标按下
Mouse.release()鼠标放开
Mouse.isPressed()鼠标已经放下
KeyboardLogout - 利用按键命令注销当前使用者
KeyboardMessage - 当一个按键被按下,发送一个文本字符串。
KeyboardReprogram - 在Arduino IDE上打开一个新窗口,用简单的跑马灯程序重新编译Leonardo
KeyboardSerial - 从串口里读取一个字节,然后返回一个键值。
KeyboardAndMouseControl - 在一个程序里示范鼠标和键盘命令
ButtonMouseControl - 通过5个按键控制光标行动
JoystickMouseControl - 当按键被按下时,通过一个操纵杆来控制电脑光标的行动
程序烧写
ARDUINO IDE的安装就不用咱多说了吧,非常简单,只要有电脑就可以了,唯一可能存在的问题是网速,建议各位下载完IDE之后好好保存到本地别弄丢了,或者条件允许干脆刻盘或者存U盘之类的。
ARDUINO LEONARDO在普通的WIN7电脑上存在驱动BUG,XP下配置ARDUINO环境又需要配置JAVA环境上费点功夫,所以我建议各位可以在自己的电脑固态硬盘上分个无关紧要30来G的空间用来装个WIN10备用,平时可以不用。毕竟咱这套配置XP有点浪费性能,WIN7正好,如果有可能的话上个UBUNTU也是可以的,当然咱试过了最后效果不是很好。
总之ARDUINO LEONARDO在WIN10下基本上是免驱的,可以直接被识别,无论你用的是什么型号的开发板,ARDUINO IDE都可以正常识别。
然后最后程序上传成功了就OK了
使用方面嘛说实话和IBM的指点杆手感肯定没法比了,毕竟实际上是个遥感而且精度还不是特别高。至于源代码设计的什么开关效果我试了,完全没用,默认开机就是可以直接使用的,并没有物理或者程序开关。而且实际使用方面按下遥感的鼠标按键还不太灵,经实测我们用手直接蹭遥感背面的排针焊盘就可以模拟鼠标左键按下操作了,总之就这么回事吧
视频:arduino自制指点杆
PS:我还是觉得想办法转接IBM的本子的键盘信号比较实用,毕竟IBM的键盘可是支持热插拔的,开机拔了再插上完全可用。而且手感上确实是现在的本子键盘没法比的,指点杆还能大幅提升码字的效率,手不离键盘就可以完成操作,配合双拼打字效率非常可以。双拼有个好处是想到哪就可以打哪,没比说话的思维慢多少。
现在T40系列的IBM笔记本键盘也就值十多块钱那样吧,算上运费二三十,要是可以大量买回来转接当USB键鼠使用那是最好不过了,有空问问51nb的大佬们有没有方法吧。
IBM IS GOD
我那T23还没发货,甚至都没有回信,但是我还是想要老IBM的本子
最后上期的WIFI时钟 NODEMCU D-DUINO模块阿卡林大佬给出了自己的方案 原文:
我看了下,和我的连线是相反的,试试
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 4, /* data=*/ 5);
如果是1106就把SSD1306换成SH1106
好使的话告诉我
——————原文结束
首先项目这个文件还在原来的位置github.com/flyAkari/ESP8266_Network_Clock
flyAkari/ESP8266_Network_Clock 很容易就能找到并下载
于是咱在这个不怎么用的WIN10系统上装了一大堆库和驱动之后终于搞起了之前项目的最终版本
看得出来大佬用的是阿里云的NTP服务器啊
总之改好这个位置的代码就可以编译上传了……然后果然报错了
结果我回头一看除了刚才我装的时区库 库文件夹一个库都没有
难怪编译的时候各种报错
在装好了阿卡林大佬提供的打包好的库文件夹合集之后编译没问题了开始上传
然后依然报错,原因是串口方面驱动装好之后IDE还默认用原来LEONARDO那个串口呢,难怪传不上去
估计咱们图吧垃圾佬最喜欢看到的就是这个上传成功的颜色了吧
顺带说下,这会儿程序上传成功之后原来的屏幕虽然还亮但是画面上的时间已经静止了,而且这次没需要重新配置WIFI
咱的习惯是给8266模块上散热的,毕竟铁内裤都上了不上个散热显得有点浪费,而且实际上8266模块的发热还是不低的,最好还是给安排上散热片比较好。散热片的安装基本和扣CPU散热器差不多的意思,只不过8266模块对于散热要求比较低所以咱用的是导热双面胶。
最后:
总之怎么能简化操作流程让每个小白只要动手就能完成制作是咱的理念。
顺带说下,这段代码其实还是值点钱的,之前阿卡林大佬在视频里面也说过了,光是代码闲鱼上就能卖5块钱呢,刷好之后的硬件价格更是相比原先直接翻倍,所以这个大佬提供了开源的代码和对小白充分的指导这里咱们是非常尊敬的,而且也在用自己的方法帮助大佬。总之吧如果各位在AB站有账号的话欢迎给大佬投蕉投币关注点赞收藏无限连。
ACFUN: 会飞的阿卡林 上次双十一的闭坑指南还挂在ac11622322 呢
B:会飞的阿卡林
GITHUB:flyAkari
最后最近这些项目都完结了之后干点啥呢?是搞WIFI天气预报气象台(并没有接入自己家的气象站)还是搞搞咱现在手上的别的模块?
这模块是干啥用的来着
这个我也想不起来是啥了
总之咱还是先回二次元待会儿吧,一会儿更个2019年度动画推荐短篇和一个漫评
感谢各位一直以来的支持了