0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用Arduino Leonardo和MPU6050制作一个有线的手势控制器

科技观察员 来源:八色木 作者:八色木 2022-04-03 17:02 次阅读

本文将向你展示如何使用Arduino Leonardo和MPU6050加速计/陀螺仪模块来制作一个类似于任天堂Wii控制器的手势控制装置。手势控制装置主要用于游戏、互动活动和一些基础娱乐。几年前,任天堂创造了一种全新的人机交互模式,手势控制,它允许用户在Wii控制器的帮助下,通过游戏手柄与游戏内容进行交互。Wii控制器使用一个加速度计来识别你当前的手势,然后将手势映射到游戏控制器上。下面,我们也将使用Arduino Leonardo和MPU6050模块来制作一个有线的手势控制器。

pYYBAGJIENyAZRFJAAOpv3UYVYw852.png

Arduino Leonardo

工作原理

该装置依赖于两个关键组件:MPU6050和Arduino Leonardo。MPU6050可以帮助我们收集控制装置沿x轴和y轴移动的三维姿态数据。然后,根据传感器的值,我们可以控制光标位置。要实现单击鼠标的效果,需要停止移动光标并将其锁定在一个点上两秒钟(或者将它设置成一个按钮)。

poYBAGJIEOSAMY9xAAOzfGj7BX8801.png

Arduino Leonardo 和 MPU6050

MPU6050是一个IMU传感器,它基于MEMS技术,包含有6个自由度,可以提供6个值作为输出。这六个值中,三个来自加速度计,其余三个来自陀螺仪。

Arduino Leonardo与Arduino Uno外形相同。Arduino Uno配备的是ATmega385芯片,而Leonardo配备了atmega32u4芯片。它有20个数字输入/输出引脚,20个引脚中,7个引脚可作为PWM输出,12个引脚可作为模拟输入,同时它板载了一个微型USB接口,一个电源插口,一个ICSP端口和一个复位按钮。详见

连接Arduino Leonardo和MPU6050

需要说明:因为该装置代码中需要引入mouse.h库文件,而该库文件只支持ATmega32U4芯片,所以只有在基于ATmega32U4芯片的Arduino开发板才能支持这个项目。因此,除了选择Arduino Leonardo外你还可以使用 Arduino Pro Mini开发板。

pYYBAGJIEOmAEZh5AAQRWWIb5DM762.png

Arduino Leonardo和MPU605电路连接图

pYYBAGJIEO-AESsvAASmYK3_9YQ926.png

Arduino Leonardo和MPU605实物连接图

上传代码

根据上面的图连接好硬件后,就可以将你的Arduino Leonardo连接到电脑上,并将代码上传到你的Arduino上。代码分为两部分,第一部分是校准代码,第二部分是包点击功能的代码。首先上传校准代码:

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

}

上传代码后,鼠标指针就会映射到传感器上。尝试摇动MPU传感器模块。如果正常,请可以接着上传第二部分代码。如果光标不能与MPU6050的移动而移动,那么需要更改源代码中的一些值。可以打开串口监视器,确保可以x和y值可以归零,也就是静止状态。如果不能归零,请根据校准情况修改源代码中的 vx 或 vy 的值。位置如下:

vx = (gx+300)/150; // change 300 from 0 to 355

vy = -(gz-100)/150; // same here about "-100" from -355 to 0

校准完成后,就可以上传第二部分的代码,这段代码还添加了单击功能。单击时,是将光标停留在计算机屏幕上的某个点上约两秒钟。代码将检查光标是否在屏幕的10×10像素区域内停留了x秒的延迟,来执行点击效果的。

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

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制装置
    +关注

    关注

    0

    文章

    48

    浏览量

    9173
  • Arduino
    +关注

    关注

    184

    文章

    6425

    浏览量

    184771
  • MPU6050
    +关注

    关注

    38

    文章

    304

    浏览量

    69815
收藏 人收藏

    评论

    相关推荐

    手势小车—如何用蓝牙将MPU6050的数据传送至89C51单片机

    一个手势控制的小车用有线MPU6050连接至单片机已实现了对小车的控制,现在要实现无线不知道
    发表于 07-06 22:47

    【转载】mpu6050的完全解读

    够自己制作基于MPU6050控制系统,但由于缺乏专业知识而难以上手。此外,MPU6050的数据是有较大噪音的,若不进行滤波会对整个控制系统
    发表于 01-28 09:52

    怎样使用MPU6050陀螺仪自制Arduino数字量角

    MPU6050惯性单元是3轴加速度计和3轴陀螺仪组合的单元。它还包含温度传感和DCM,
    发表于 06-28 10:14

    IIC控制器MPU6050的相关资料推荐

    文章目录4412下的IIC控制器主机发送和接收的流程图IIC寄存详解MPU6050原理MPU6050读写时序4412下的IIC控制器主机发
    发表于 02-10 07:53

    基于Arduino创建手势控制

    描述如何制作手势控制机器人|| #MadeWithArduino(发射)嘿,欢迎回到新项目
    发表于 06-22 06:55

    MPU6050(硬件IIC)

    MPU6050(硬件IIC)MPU6050(硬件IIC)
    发表于 04-02 16:29 71次下载

    ArduinoMPU6050的通信

    为避免纠缠于电路细节,我们直接使用集成的MPU6050模块。MPU6050的数据接口用的是I2C总线协议,因此我们需要Wire程序库的帮助来实现ArduinoMPU6050之间的通信
    发表于 11-07 14:25 7012次阅读
    <b class='flag-5'>Arduino</b>与<b class='flag-5'>MPU6050</b>的通信

    mpu6050姿态解算原理_mpu6050姿态解算程序

    mpu6050常用作提供飞控运行时的姿态测量和计算。本文首先介绍了MPU6050姿态解算的原理,其次详细的介绍了mpu6050姿态解算程序。
    的头像 发表于 03-09 09:15 4.2w次阅读

    MPU6050简介

    MPU6050简介什么是MPU6050MPU6050的特点MPU6050框图MPU6050初始化MPU6050—DMP使用介绍
    发表于 12-06 11:51 67次下载
    <b class='flag-5'>MPU6050</b>简介

    STM32-I2C总线通信与MPU6050

    文章目录1、I2C总线1.1 I2C总线协议1.2 I2C总线读写操作1.3 STM32F0-I2C控制器特征2、MPU6050MPU6050的特性参数MPU6050的寄存器介绍MPU6050
    发表于 12-06 14:06 26次下载
    STM32-I2C总线通信与<b class='flag-5'>MPU6050</b>

    23.IIC控制器MPU6050

    文章目录4412下的IIC控制器主机发送和接收的流程图IIC寄存器详解MPU6050原理MPU6050读写时序4412下的IIC控制器主机发送和接收的流程图IIC寄存器详解第一个寄存器
    发表于 12-06 15:21 10次下载
    23.IIC<b class='flag-5'>控制器</b>和<b class='flag-5'>MPU6050</b>

    使用Arduino Leonardo和红外传感器制作手势控制设备

    电子发烧友网站提供《使用Arduino Leonardo和红外传感器制作手势控制设备.zip》资料免费下载
    发表于 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>设备

    MPU6050Arduino陀螺仪游戏

    电子发烧友网站提供《带MPU6050Arduino陀螺仪游戏.zip》资料免费下载
    发表于 11-11 11:20 1次下载
    带<b class='flag-5'>MPU6050</b>的<b class='flag-5'>Arduino</b>陀螺仪游戏

    使用arduinompu6050和python控制游戏

    电子发烧友网站提供《使用arduinompu6050和python控制游戏.zip》资料免费下载
    发表于 12-13 11:04 1次下载
    使用<b class='flag-5'>arduino</b>、<b class='flag-5'>mpu6050</b>和python<b class='flag-5'>控制</b>游戏

    ArduinoMPU6050控制伺服电机

    电子发烧友网站提供《用ArduinoMPU6050控制伺服电机.zip》资料免费下载
    发表于 07-03 10:59 0次下载
    用<b class='flag-5'>Arduino</b>和<b class='flag-5'>MPU6050</b><b class='flag-5'>控制</b>伺服电机