查看: 32707|回复: 27

leonardo做的无线鼠标

[复制链接]

该用户从未签到

发表于 2012-12-19 16:42 | 显示全部楼层 |阅读模式
本帖最后由 海神 于 2012-12-19 23:21 编辑

leonardo到手已经很久了,但一直还没有想好用他来做点啥,前不久一个搞艺术的好朋友说自己每天用鼠标手特别不舒服,而且键盘都很少用, 问我能不能做一个手势控制电脑鼠标的一样东西,例如两个手指头就代表左右键,食指控制光标上下左右移动,然后食指按下则点击左键,中指按下则点击右键。之前我也看到过一个MIT天才(具体啥名给忘了)在食指中指套两颜色不同的项圈,用电脑摄像头识别,用来控制电脑。可是我现在还木有那种水平,想想自己身边接触的,然后leonordo立马蹦了出来,一直都想玩下leonardo的控制电脑鼠标键盘功能,现在终于有了动力,就先做个简单的飞鼠吧,也就是无线鼠标,至于后面脱离高成本的无线通信用手指控制电脑,后面再慢慢想吧,希望看到此篇的同志们请不要觉得我很蛋疼很无聊(虽然自己有点这么认为,呵呵),有啥好的想法,分享出来大家一起研究下。     于是准备材料,做飞鼠嘛,自然想到最简单可靠的的无线通信方式也就是蓝牙,示意图如下
2222.png
     下一步工作就是设置蓝牙AT指令,使蓝牙一上电便主机从机自动连接上,此点就不多阐述,后面会单独写出蓝牙设备与蓝牙设配对并建立连接。
    leonardo程序:

kittenblock中小学创客名师推荐的图形化编程软件

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=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程序如下:

kittenblock中小学创客名师推荐的图形化编程软件

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,使发送数据稳定
}



下面是实物图:
22.png
这样leonardo部分连接电脑,手持摇杆在很远的位置就可以遥控电脑鼠标。
调试说明:受到蓝牙通信速率和leonardo本身控制命令的束缚,整个控制光标不会向普通鼠标那样灵活,因为它一条指令必须给一小段时间延时反应。


打赏作者鼓励一下!
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2012-12-19 17:14 | 显示全部楼层
    有视频看看就更好了
    如果以上内容对你有帮助,你可以通过打赏支持作者
  • TA的每日心情
    开心
    2015-7-10 19:53
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2012-12-19 19:42 | 显示全部楼层
    论坛里关于leonardo的帖子好少啊,强顶
  • TA的每日心情
    开心
    2016-6-30 15:05
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2012-12-21 13:04 | 显示全部楼层
    我顶!!!!!!!!!!!!

    该用户从未签到

    发表于 2013-1-3 11:09 | 显示全部楼层
    想法超棒

    该用户从未签到

    发表于 2013-1-6 18:12 | 显示全部楼层
    调试说明:受到蓝牙通信速率和leonardo本身控制命令的束缚,整个控制光标不会向普通鼠标那样灵活,因为它一条指令必须给一小段时间延时反应。
    对这个有点小疑惑,鼠标传输的数据量也很小吧,蓝牙的通信速率会对这个造成影响吗?
    不过你用的摇杆代替位移传感器可能确实达不到那么好的效果

    该用户从未签到

    发表于 2013-2-19 21:56 | 显示全部楼层
    我是菜鸟,看看热闹

    该用户从未签到

    发表于 2013-4-21 10:27 | 显示全部楼层
    要做一个键盘,也是用的这块板子,引脚不够怎么办啊?想做矩阵键盘,但是不知道如何检测两个脚是否相连。

    该用户从未签到

    发表于 2013-7-4 08:26 | 显示全部楼层
    不错,支持一下。

    该用户从未签到

    发表于 2013-8-15 19:07 | 显示全部楼层
    看起来好高端的样子
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    KittenBot杯第六届开源硬件开发大赛启动啦
    KittenBot杯第六届开源硬
    大赛简介: 第六届开源硬件开发大赛由Arduino中文社区发起 由KittenBot冠名赞助
    游戏机和开发板脑洞一下;这个本来就是开源的。
    游戏机和开发板脑洞一下;
    这个开发板和标准UNO是1;1的;通用。做在一起是因为可以不用游戏机时可以切换回来做开
    新人求助,关于舵机和限位开关。
    新人求助,关于舵机和限位
    新人求助社区各位哥哥姐姐,具体需要用航模遥控器的3段开关控制Arduino nano控制一个3
    基于MWC开源飞控DIY关键总结分享:
    基于MWC开源飞控DIY关键总
    很早就已经很想写这么一个帖,但总是由于各种原因没能落实,但最后还是找了时
    有关函数返回值的问题
    有关函数返回值的问题
    求助大神们,这个程序中有return返回值,但为什么有这个“ warning: return-statement
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表