leonardo做的无线鼠标
海神 于 2012-12-19 23:21 编辑
leonardo到手已经很久了,但一直还没有想好用他来做点啥,前不久一个搞艺术的好朋友说自己每天用鼠标手特别不舒服,而且键盘都很少用, 问我能不能做一个手势控制电脑鼠标的一样东西,例如两个手指头就代表左右键,食指控制光标上下左右移动,然后食指按下则点击左键,中指按下则点击右键。之前我也看到过一个MIT天才(具体啥名给忘了)在食指中指套两颜色不同的项圈,用电脑摄像头识别,用来控制电脑。可是我现在还木有那种水平,想想自己身边接触的,然后leonordo立马蹦了出来,一直都想玩下leonardo的控制电脑鼠标键盘功能,现在终于有了动力,就先做个简单的飞鼠吧,也就是无线鼠标,至于后面脱离高成本的无线通信用手指控制电脑,后面再慢慢想吧,希望看到此篇的同志们请不要觉得我很蛋疼很无聊(虽然自己有点这么认为,呵呵),有啥好的想法,分享出来大家一起研究下。 于是准备材料,做飞鼠嘛,自然想到最简单可靠的的无线通信方式也就是蓝牙,示意图如下
下一步工作就是设置蓝牙AT指令,使蓝牙一上电便主机从机自动连接上,此点就不多阐述,后面会单独写出蓝牙设备与蓝牙设配对并建立连接。
leonardo程序:
[C] 纯文本查看 复制代码
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[
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程序如下:
[C] 纯文本查看 复制代码
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,中间输出nif(Y<100)
Serial.write('s');
else if(Y>800)
Serial.write('w');
else
Serial.write('n'); //Y轴向上输出w,向下输出s,中间输出nif(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本身控制命令的束缚,整个控制光标不会向普通鼠标那样灵活,因为它一条指令必须给一小段时间延时反应。
via - arduino中文社区