RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用Arduino Leonardo和MPU6050制作一個有線的手勢控制器

科技觀察員 ? 來源:八色木 ? 作者:八色木 ? 2022-04-03 17:02 ? 次閱讀

本文將向你展示如何使用Arduino Leonardo和MPU6050加速計(jì)/陀螺儀模塊來制作一個類似于任天堂Wii控制器的手勢控制裝置。手勢控制裝置主要用于游戲、互動活動和一些基礎(chǔ)娛樂。幾年前,任天堂創(chuàng)造了一種全新的人機(jī)交互模式,手勢控制,它允許用戶在Wii控制器的幫助下,通過游戲手柄與游戲內(nèi)容進(jìn)行交互。Wii控制器使用一個加速度計(jì)來識別你當(dāng)前的手勢,然后將手勢映射到游戲控制器上。下面,我們也將使用Arduino Leonardo和MPU6050模塊來制作一個有線的手勢控制器。

pYYBAGJIENyAZRFJAAOpv3UYVYw852.png

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è)置成一個按鈕)。

poYBAGJIEOSAMY9xAAOzfGj7BX8801.png

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ā)板。

pYYBAGJIEOmAEZh5AAQRWWIb5DM762.png

Arduino Leonardo和MPU605電路連接圖

pYYBAGJIEO-AESsvAASmYK3_9YQ926.png

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);

}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 控制裝置
    +關(guān)注

    關(guān)注

    0

    文章

    52

    瀏覽量

    9247
  • Arduino
    +關(guān)注

    關(guān)注

    188

    文章

    6468

    瀏覽量

    186951
  • MPU6050
    +關(guān)注

    關(guān)注

    39

    文章

    307

    瀏覽量

    71362
收藏 人收藏

    評論

    相關(guān)推薦

    手勢小車—如何用藍(lán)牙將MPU6050的數(shù)據(jù)傳送至89C51單片機(jī)

    一個手勢控制的小車用有線MPU6050連接至單片機(jī)已實(shí)現(xiàn)了對小車的控制,現(xiàn)在要實(shí)現(xiàn)無線不知道
    發(fā)表于 07-06 22:47

    怎樣使用MPU6050陀螺儀自制Arduino數(shù)字量角

    MPU6050慣性單元是3軸加速度計(jì)和3軸陀螺儀組合的單元。它還包含溫度傳感和DCM,
    發(fā)表于 06-28 10:14

    IIC控制器MPU6050的相關(guān)資料推薦

    文章目錄4412下的IIC控制器主機(jī)發(fā)送和接收的流程圖IIC寄存詳解MPU6050原理MPU6050讀寫時序4412下的IIC控制器主機(jī)發(fā)
    發(fā)表于 02-10 07:53

    MPU6050(硬件IIC)

    MPU6050(硬件IIC)MPU6050(硬件IIC)
    發(fā)表于 04-02 16:29 ?79次下載

    ArduinoMPU6050的通信

    為避免糾纏于電路細(xì)節(jié),我們直接使用集成的MPU6050模塊。MPU6050的數(shù)據(jù)接口用的是I2C總線協(xié)議,因此我們需要Wire程序庫的幫助來實(shí)現(xiàn)ArduinoMPU6050之間的通信
    發(fā)表于 11-07 14:25 ?7798次閱讀
    <b class='flag-5'>Arduino</b>與<b class='flag-5'>MPU6050</b>的通信

    使用Arduino讀取MPU6050數(shù)據(jù)的程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用Arduino讀取MPU6050數(shù)據(jù)的程序免費(fèi)下載。
    發(fā)表于 07-24 17:17 ?27次下載
    使用<b class='flag-5'>Arduino</b>讀取<b class='flag-5'>MPU6050</b>數(shù)據(jù)的程序免費(fèi)下載

    MPU6050簡介

    MPU6050簡介什么是MPU6050MPU6050的特點(diǎn)MPU6050框圖MPU6050初始化MPU6050—DMP使用介紹
    發(fā)表于 12-06 11:51 ?76次下載
    <b class='flag-5'>MPU6050</b>簡介

    23.IIC控制器MPU6050

    文章目錄4412下的IIC控制器主機(jī)發(fā)送和接收的流程圖IIC寄存詳解MPU6050原理MPU6050讀寫時序4412下的IIC控制器主機(jī)發(fā)
    發(fā)表于 12-06 15:21 ?10次下載
    23.IIC<b class='flag-5'>控制器</b>和<b class='flag-5'>MPU6050</b>

    如何使用MPU6050Arduino構(gòu)建個數(shù)字量角器

    MPU6050款 集成 了 IC 3 軸加速度計(jì)和 3 軸陀螺儀的 單元。它還包含溫度傳感
    發(fā)表于 08-31 15:42 ?5533次閱讀
    如何使用<b class='flag-5'>MPU6050</b>和<b class='flag-5'>Arduino</b>構(gòu)建<b class='flag-5'>一</b><b class='flag-5'>個數(shù)字量角器</b>

    使用Arduino Leonardo和紅外傳感制作手勢控制設(shè)備

    電子發(fā)燒友網(wǎng)站提供《使用Arduino Leonardo和紅外傳感制作手勢控制設(shè)備.zip》資
    發(fā)表于 10-26 15:57 ?0次下載
    使用<b class='flag-5'>Arduino</b> <b class='flag-5'>Leonardo</b>和紅外傳感<b class='flag-5'>器</b><b class='flag-5'>制作</b><b class='flag-5'>手勢</b><b class='flag-5'>控制</b>設(shè)備

    簡單的MPU6050 IMU Arduino機(jī)器人更新

    電子發(fā)燒友網(wǎng)站提供《簡單的MPU6050 IMU Arduino機(jī)器人更新.zip》資料免費(fèi)下載
    發(fā)表于 11-03 11:53 ?0次下載
    簡單的<b class='flag-5'>MPU6050</b> IMU <b class='flag-5'>Arduino</b>機(jī)器人更新

    MPU6050Arduino陀螺儀游戲

    電子發(fā)燒友網(wǎng)站提供《帶MPU6050Arduino陀螺儀游戲.zip》資料免費(fèi)下載
    發(fā)表于 11-11 11:20 ?1次下載
    帶<b class='flag-5'>MPU6050</b>的<b class='flag-5'>Arduino</b>陀螺儀游戲

    使用arduino、mpu6050和python控制游戲

    電子發(fā)燒友網(wǎng)站提供《使用arduinompu6050和python控制游戲.zip》資料免費(fèi)下載
    發(fā)表于 12-13 11:04 ?1次下載
    使用<b class='flag-5'>arduino</b>、<b class='flag-5'>mpu6050</b>和python<b class='flag-5'>控制</b>游戲

    如何連接nRF24L01和MPU6050進(jìn)行手勢控制

    電子發(fā)燒友網(wǎng)站提供《如何連接nRF24L01和MPU6050進(jìn)行手勢控制.zip》資料免費(fèi)下載
    發(fā)表于 01-31 09:19 ?1次下載
    如何連接nRF24L01和<b class='flag-5'>MPU6050</b>進(jìn)行<b class='flag-5'>手勢</b><b class='flag-5'>控制</b>

    ArduinoMPU6050控制伺服電機(jī)

    電子發(fā)燒友網(wǎng)站提供《用ArduinoMPU6050控制伺服電機(jī).zip》資料免費(fèi)下載
    發(fā)表于 07-03 10:59 ?1次下載
    用<b class='flag-5'>Arduino</b>和<b class='flag-5'>MPU6050</b><b class='flag-5'>控制</b>伺服電機(jī)
    RM新时代网站-首页