本文將向你展示如何使用Arduino Leonardo和MPU6050加速計(jì)/陀螺儀模塊來(lái)制作一個(gè)類(lèi)似于任天堂Wii控制器的手勢(shì)控制裝置。手勢(shì)控制裝置主要用于游戲、互動(dòng)活動(dòng)和一些基礎(chǔ)娛樂(lè)。幾年前,任天堂創(chuàng)造了一種全新的人機(jī)交互模式,手勢(shì)控制,它允許用戶在Wii控制器的幫助下,通過(guò)游戲手柄與游戲內(nèi)容進(jìn)行交互。Wii控制器使用一個(gè)加速度計(jì)來(lái)識(shí)別你當(dāng)前的手勢(shì),然后將手勢(shì)映射到游戲控制器上。下面,我們也將使用Arduino Leonardo和MPU6050模塊來(lái)制作一個(gè)有線的手勢(shì)控制器。
Arduino Leonardo
該裝置依賴于兩個(gè)關(guān)鍵組件:MPU6050和Arduino Leonardo。MPU6050可以幫助我們收集控制裝置沿x軸和y軸移動(dòng)的三維姿態(tài)數(shù)據(jù)。然后,根據(jù)傳感器的值,我們可以控制光標(biāo)位置。要實(shí)現(xiàn)單擊鼠標(biāo)的效果,需要停止移動(dòng)光標(biāo)并將其鎖定在一個(gè)點(diǎn)上兩秒鐘(或者將它設(shè)置成一個(gè)按鈕)。
Arduino Leonardo 和 MPU6050
MPU6050是一個(gè)IMU傳感器,它基于MEMS技術(shù),包含有6個(gè)自由度,可以提供6個(gè)值作為輸出。這六個(gè)值中,三個(gè)來(lái)自加速度計(jì),其余三個(gè)來(lái)自陀螺儀。
Arduino Leonardo與Arduino Uno外形相同。Arduino Uno配備的是ATmega385芯片,而Leonardo配備了atmega32u4芯片。它有20個(gè)數(shù)字輸入/輸出引腳,20個(gè)引腳中,7個(gè)引腳可作為PWM輸出,12個(gè)引腳可作為模擬輸入,同時(shí)它板載了一個(gè)微型USB接口,一個(gè)電源插口,一個(gè)ICSP端口和一個(gè)復(fù)位按鈕。詳見(jiàn)
連接Arduino Leonardo和MPU6050
需要說(shuō)明:因?yàn)樵撗b置代碼中需要引入mouse.h庫(kù)文件,而該庫(kù)文件只支持ATmega32U4芯片,所以只有在基于ATmega32U4芯片的Arduino開(kāi)發(fā)板才能支持這個(gè)項(xiàng)目。因此,除了選擇Arduino Leonardo外你還可以使用 Arduino Pro Mini開(kāi)發(fā)板。
Arduino Leonardo和MPU605電路連接圖
Arduino Leonardo和MPU605實(shí)物連接圖
上傳代碼
根據(jù)上面的圖連接好硬件后,就可以將你的Arduino Leonardo連接到電腦上,并將代碼上傳到你的Arduino上。代碼分為兩部分,第一部分是校準(zhǔn)代碼,第二部分是包點(diǎn)擊功能的代碼。首先上傳校準(zhǔn)代碼:
//calibrate_air_mouse
//calibrate_air_mouse
#include
#include
#include
#include
MPU6050 mpu;
int16_t ax, ay, az, gx, gy, gz;
int vx, vy;
void setup() {
Serial.begin(9600);
Wire.begin();
mpu.initialize();
if (!mpu.testConnection()) { while (1); }
}
void loop() {
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
vx = (gx+300)/150; // change 300 from 0 to 355
vy = -(gz-100)/150; // same here about "-100" from -355 to 0
Serial.print("gx = ");
Serial.print(gx);
Serial.print(" | gz = ");
Serial.print(gz);
Serial.print(" | X = ");
Serial.print(vx);
Serial.print(" | Y = ");
Serial.println(vy);
Mouse.move(vx, vy);
delay(20);
}
上傳代碼后,鼠標(biāo)指針就會(huì)映射到傳感器上。嘗試搖動(dòng)MPU傳感器模塊。如果正常,請(qǐng)可以接著上傳第二部分代碼。如果光標(biāo)不能與MPU6050的移動(dòng)而移動(dòng),那么需要更改源代碼中的一些值。可以打開(kāi)串口監(jiān)視器,確保可以x和y值可以歸零,也就是靜止?fàn)顟B(tài)。如果不能歸零,請(qǐng)根據(jù)校準(zhǔn)情況修改源代碼中的 vx 或 vy 的值。位置如下:
vx = (gx+300)/150; // change 300 from 0 to 355
vy = -(gz-100)/150; // same here about "-100" from -355 to 0
校準(zhǔn)完成后,就可以上傳第二部分的代碼,這段代碼還添加了單擊功能。單擊時(shí),是將光標(biāo)停留在計(jì)算機(jī)屏幕上的某個(gè)點(diǎn)上約兩秒鐘。代碼將檢查光標(biāo)是否在屏幕的10×10像素區(qū)域內(nèi)停留了x秒的延遲,來(lái)執(zhí)行點(diǎn)擊效果的。
//air_mouse_with_click
#include
#include
#include
#include
MPU6050 mpu;
int16_t ax, ay, az, gx, gy, gz;
int vx, vy, vx_prec, vy_prec;
int count=0;
void setup() {
Serial.begin(9600);
Wire.begin();
mpu.initialize();
if (!mpu.testConnection()) {
while (1);
}
}
void loop() {
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
vx = (gx+300)/200;
vy = -(gz-100)/200;
Mouse.move(vx, vy);
if ( (vx_prec-5)<=vx && vx<=vx_prec+5 && (vy_prec-5)<=vy && vy<=vy_prec+5) { // for checking the cursor doesn't move too much from its actual position: (in this case a 10 pixel square)
count++;
if(count == 100){ // the click will happen after 2 seconds the pointer has stopped in the 10px square
if (!Mouse.isPressed(MOUSE_LEFT)) {
Mouse.press(MOUSE_LEFT);
count = 0;
}
}
else {
if (Mouse.isPressed(MOUSE_LEFT)) {
Mouse.release(MOUSE_LEFT);
}
}
}
else {
vx_prec = vx; // updating values to check the position of the pointer and allow the click
vy_prec = vy;
count = 0;
}
delay(20);
}
-
控制裝置
+關(guān)注
關(guān)注
0文章
52瀏覽量
9247 -
Arduino
+關(guān)注
關(guān)注
188文章
6468瀏覽量
186952 -
MPU6050
+關(guān)注
關(guān)注
39文章
307瀏覽量
71363
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論