本文將向你展示如何使用Arduino Leonardo和MPU6050加速計(jì)/陀螺儀模塊來制作一個類似于任天堂Wii控制器的手勢控制裝置。手勢控制裝置主要用于游戲、互動活動和一些基礎(chǔ)娛樂。幾年前,任天堂創(chuàng)造了一種全新的人機(jī)交互模式,手勢控制,它允許用戶在Wii控制器的幫助下,通過游戲手柄與游戲內(nèi)容進(jìn)行交互。Wii控制器使用一個加速度計(jì)來識別你當(dāng)前的手勢,然后將手勢映射到游戲控制器上。下面,我們也將使用Arduino Leonardo和MPU6050模塊來制作一個有線的手勢控制器。
Arduino Leonardo
該裝置依賴于兩個關(guān)鍵組件:MPU6050和Arduino Leonardo。MPU6050可以幫助我們收集控制裝置沿x軸和y軸移動的三維姿態(tài)數(shù)據(jù)。然后,根據(jù)傳感器的值,我們可以控制光標(biāo)位置。要實(shí)現(xiàn)單擊鼠標(biāo)的效果,需要停止移動光標(biāo)并將其鎖定在一個點(diǎn)上兩秒鐘(或者將它設(shè)置成一個按鈕)。
Arduino Leonardo 和 MPU6050
MPU6050是一個IMU傳感器,它基于MEMS技術(shù),包含有6個自由度,可以提供6個值作為輸出。這六個值中,三個來自加速度計(jì),其余三個來自陀螺儀。
Arduino Leonardo與Arduino Uno外形相同。Arduino Uno配備的是ATmega385芯片,而Leonardo配備了atmega32u4芯片。它有20個數(shù)字輸入/輸出引腳,20個引腳中,7個引腳可作為PWM輸出,12個引腳可作為模擬輸入,同時它板載了一個微型USB接口,一個電源插口,一個ICSP端口和一個復(fù)位按鈕。詳見
連接Arduino Leonardo和MPU6050
需要說明:因?yàn)樵撗b置代碼中需要引入mouse.h庫文件,而該庫文件只支持ATmega32U4芯片,所以只有在基于ATmega32U4芯片的Arduino開發(fā)板才能支持這個項(xiàng)目。因此,除了選擇Arduino Leonardo外你還可以使用 Arduino Pro Mini開發(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)指針就會映射到傳感器上。嘗試搖動MPU傳感器模塊。如果正常,請可以接著上傳第二部分代碼。如果光標(biāo)不能與MPU6050的移動而移動,那么需要更改源代碼中的一些值??梢源蜷_串口監(jiān)視器,確??梢詘和y值可以歸零,也就是靜止?fàn)顟B(tài)。如果不能歸零,請根據(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)完成后,就可以上傳第二部分的代碼,這段代碼還添加了單擊功能。單擊時,是將光標(biāo)停留在計(jì)算機(jī)屏幕上的某個點(diǎn)上約兩秒鐘。代碼將檢查光標(biāo)是否在屏幕的10×10像素區(qū)域內(nèi)停留了x秒的延遲,來執(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瀏覽量
186951 -
MPU6050
+關(guān)注
關(guān)注
39文章
307瀏覽量
71362
發(fā)布評論請先 登錄
相關(guān)推薦
評論