leonardo到手已经很久了,但一直还没有想好用他来做点啥,前不久一个搞艺术的好朋友说自己每天用鼠标手特别不舒服,而且键盘都很少用, 问我能不能做一个手势控制电脑鼠标的一样东西,例如两个手指头就代表左右键,食指控制光标上下左右移动,然后食指按下则点击左键,中指按下则点击右键。之前我也看到过一个MIT天才(具体啥名给忘了)在食指中指套两颜色不同的项圈,用电脑摄像头识别,用来控制电脑。可是我现在还木有那种水平,想想自己身边接触的,然后leonordo立马蹦了出来,一直都想玩下leonardo的控制电脑鼠标键盘功能,现在终于有了动力,就先做个简单的飞鼠吧,也就是无线鼠标,至于后面脱离高成本的无线通信用手指控制电脑,后面再慢慢想吧,希望看到此篇的同志们请不要觉得我很蛋疼很无聊(虽然自己有点这么认为,呵呵),有啥好的想法,分享出来大家一起研究下。 于是准备材料,做飞鼠嘛,自然想到最简单可靠的的无线通信方式也就是蓝牙,示意图如下
下一步工作就是设置蓝牙AT指令,使蓝牙一上电便主机从机自动连接上,此点就不多阐述,后面会单独写出蓝牙设备与蓝牙设配对并建立连接。
leonardo程序:
int range = 5; //X Y轴一步移动的范围,影响移动的速度。 int responseDelay = 10; //鼠标相应延时,ms为单位 int xDistance,yDistance; void setup() { Serial1.begin(9600); //开串口,注意这里是serial1,这是leonardo的串口与其他arduino的区别 } void loop() { unsigned char Recieve[4]; //设置数组,存接受到的4个字符 for(int i=0;i<4;i++) { Recieve[i]=Serial1.read(); delay(2); } if(Recieve[0] == 'a') xDistance -= range; else if(Recieve[0] == 'd') xDistance = range; else xDistance = 0; //设置鼠标向X轴方向移动的距离 if(Recieve[1] == 'w') yDistance -= range; else if(Recieve[1] == 's') yDistance = range; //设置鼠标向Y轴方向移动的距离 else yDistance = 0; if ((xDistance != 0) || (yDistance != 0)) { Mouse.move(xDistance, yDistance, 0); } //执行鼠标移动动作 if(Recieve[2] == '0') { if (!Mouse.isPressed(MOUSE_LEFT)) { Mouse.press(MOUSE_LEFT); //执行鼠标按下左键 } } else { if (Mouse.isPressed(MOUSE_LEFT)) { Mouse.release(MOUSE_LEFT); } } //未使用时必须释放左键 if(Recieve[3] == '0') { if (!Mouse.isPressed(MOUSE_RIGHT)) { Mouse.press(MOUSE_RIGHT); } //执行鼠标按下右键 } else { if (Mouse.isPressed(MOUSE_RIGHT)) { Mouse.release(MOUSE_RIGHT); } // //未使用时必须释放右键 } delay(responseDelay); // 延时,让其执行动作 }
UNO使用外部电池供电,整个摇杆部分就可以拿到十米左右的地方控制电脑。UNO程序如下:
char Y=6, R=3, G=4; void setup(void) { pinMode(R, INPUT_PULLUP); //设置摇杆按键上拉 pinMode(G, INPUT_PULLUP); Serial.begin(9600); //开串口 } void loop() { int X,Y,R_Button,G_Button; X=analogRead(1); Y=analogRead(0); //读摇杆两轴的模拟值 R_Button=digitalRead(R); G_Button=digitalRead(G); //读摇杆的两个按键状态 if(X<100) Serial.write('a'); else if(X>800) Serial.write('d'); else Serial.write('n'); //x轴向左输出a,向右输出d,中间输出n if(Y<100) Serial.write('s'); else if(Y>800) Serial.write('w'); else Serial.write('n'); //Y轴向上输出w,向下输出s,中间输出n if(G_Button ==0) Serial.write('0'); else Serial.write('1'); //左边按键按下输出0,否则输出1 if(R_Button == 0) Serial.write('0'); else Serial.write('1'); //右边按键按下输出0,否则输出1 delay(10); //延时10ms,使发送数据稳定 }
下面是实物图:
这样leonardo部分连接电脑,手持摇杆在很远的位置就可以遥控电脑鼠标。
调试说明:受到蓝牙通信速率和leonardo本身控制命令的束缚,整个控制光标不会向普通鼠标那样灵活,因为它一条指令必须给一小段时间延时反应。