leonardo到手已經(jīng)很久了,但一直還沒有想好用他來做點啥,前不久一個搞藝術(shù)的好朋友說自己每天用鼠標(biāo)手特別不舒服,而且鍵盤都很少用, 問我能不能做一個手勢控制電腦鼠標(biāo)的一樣?xùn)|西,例如兩個手指頭就代表左右鍵,食指控制光標(biāo)上下左右移動,然后食指按下則點擊左鍵,中指按下則點擊右鍵。之前我也看到過一個MIT天才(具體啥名給忘了)在食指中指套兩顏色不同的項圈,用電腦攝像頭識別,用來控制電腦?墒俏椰F(xiàn)在還木有那種水平,想想自己身邊接觸的,然后leonordo立馬蹦了出來,一直都想玩下leonardo的控制電腦鼠標(biāo)鍵盤功能,現(xiàn)在終于有了動力,就先做個簡單的飛鼠吧,也就是無線鼠標(biāo),至于后面脫離高成本的無線通信用手指控制電腦,后面再慢慢想吧,希望看到此篇的同志們請不要覺得我很蛋疼很無聊(雖然自己有點這么認(rèn)為,呵呵),有啥好的想法,分享出來大家一起研究下。 于是準(zhǔn)備材料,做飛鼠嘛,自然想到最簡單可靠的的無線通信方式也就是藍牙,示意圖如下
下一步工作就是設(shè)置藍牙AT指令,使藍牙一上電便主機從機自動連接上,此點就不多闡述,后面會單獨寫出藍牙設(shè)備與藍牙設(shè)配對并建立連接。
leonardo程序:
[mw_shl_code=c,true]int range = 5; //X Y軸一步移動的范圍,影響移動的速度。
int responseDelay = 10; //鼠標(biāo)相應(yīng)延時,ms為單位
int xDistance,yDistance;
void setup()
{
Serial1.begin(9600); //開串口,注意這里是serial1,這是leonardo的串口與其他arduino的區(qū)別
}
void loop()
{
unsigned char Recieve[4]; //設(shè)置數(shù)組,存接受到的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; //設(shè)置鼠標(biāo)向X軸方向移動的距離
if(Recieve[1] == 'w')
yDistance -= range;
else if(Recieve[1] == 's')
yDistance = range; //設(shè)置鼠標(biāo)向Y軸方向移動的距離
else
yDistance = 0;
if ((xDistance != 0) || (yDistance != 0))
{ Mouse.move(xDistance, yDistance, 0); } //執(zhí)行鼠標(biāo)移動動作
if(Recieve[2] == '0') {
if (!Mouse.isPressed(MOUSE_LEFT)) {
Mouse.press(MOUSE_LEFT); //執(zhí)行鼠標(biāo)按下左鍵
}
}
else {
if (Mouse.isPressed(MOUSE_LEFT)) {
Mouse.release(MOUSE_LEFT);
}
} //未使用時必須釋放左鍵
if(Recieve[3] == '0') {
if (!Mouse.isPressed(MOUSE_RIGHT)) {
Mouse.press(MOUSE_RIGHT);
} //執(zhí)行鼠標(biāo)按下右鍵
}
else {
if (Mouse.isPressed(MOUSE_RIGHT)) {
Mouse.release(MOUSE_RIGHT);
} // //未使用時必須釋放右鍵
}
delay(responseDelay); // 延時,讓其執(zhí)行動作
}
[/mw_shl_code]
UNO使用外部電池供電,整個搖桿部分就可以拿到十米左右的地方控制電腦。UNO程序如下:
[mw_shl_code=c,true]char Y=6, R=3, G=4;
void setup(void)
{
pinMode(R, INPUT_PULLUP); //設(shè)置搖桿按鍵上拉
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); //讀搖桿的兩個按鍵狀態(tài)
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,使發(fā)送數(shù)據(jù)穩(wěn)定
}
[/mw_shl_code]
這樣leonardo部分連接電腦,手持搖桿在很遠(yuǎn)的位置就可以遙控電腦鼠標(biāo)。
調(diào)試說明:受到藍牙通信速率和leonardo本身控制命令的束縛,整個控制光標(biāo)不會向普通鼠標(biāo)那樣靈活,因為它一條指令必須給一小段時間延時反應(yīng)。
承擔(dān)因您的行為而導(dǎo)致的法律責(zé)任,
本站有權(quán)保留或刪除有爭議評論。
參與本評論即表明您已經(jīng)閱讀并接受
上述條款。