- MPU6050陀螺仪和加速度计传感器
- 柔性传感器
- 准备好3D打印的机械手臂:
- 所需组件:
- 电路原理图:
- 将MPU6050和Flex传感器安装到手套上
- 为机械手臂编程Arduino Nano
- 使用Arduino进行手势控制的机械臂的工作
机械臂是引人入胜的工程创作之一,看着这些东西倾斜和摇动以完成复杂的事情就像人类的手臂一样总是令人着迷。这些机械臂通常在装配线的工业中常见,这些工业生产线执行诸如焊接,钻孔,喷漆等剧烈的机械工作,最近还开发了高精度的先进机械臂来执行复杂的外科手术。之前,我们3D打印了机械臂,并使用ARM7单片机构建了DIY拾取和放置机械臂。我们将再次使用相同的3D打印机器人手臂, 通过Arduino Nano,MPU6050陀螺仪和柔性传感器制作 手势控制的机器人手臂。
通过3D打印的机械手位置可以通过与MPU6050陀螺仪和弯曲传感器相连的手套来控制 。Flex传感器用于控制机械手的夹持器伺服,MPU6050用于在X和Y轴上移动机器人。如果您没有打印机,那么您也可以像我们为Arduino机器人手臂项目建造的那样,用简单的纸板制作手臂。为了获得启发,您还可以参考我们之前使用Arduino构建的Record and Play Robot Arm。
首先,让我们先了解MPU6050传感器和柔性传感器。
MPU6050陀螺仪和加速度计传感器
MPU6050基于微机械系统(MEMS)技术。该传感器具有 3轴加速度计,3轴陀螺仪和内置温度传感器。它可以用来测量诸如加速度,速度,方向,位移等参数。我们之前已经将MPU6050与Arduino和Raspberry pi进行了接口,并且还使用它构建了一些项目,例如自平衡机器人,Arduino数字量角器和Arduino测斜仪。
MPU6050传感器的功能:
- 通信:具有可配置I2C地址的I2C协议
- 输入电源:3-5V
- 内置16位ADC提供高精度
- 内置DMP提供高计算能力
- 可用于与磁力计等其他I2C设备接口
- 内置温度传感器
MPU6050的引脚排列详细信息:
销 | 用法 |
Vcc | 为模块提供电源,可以为+ 3V至+ 5V。通常使用+ 5V |
地面 | 已接地 |
串行时钟(SCL) | 用于为I2C通信提供时钟脉冲 |
串行数据(SDA) | 用于通过I2C通信传输数据 |
辅助串行数据(XDA) | 可用于与MPU6050连接其他I2C模块 |
辅助串行时钟(XCL) | 可用于与MPU6050连接其他I2C模块 |
AD0 | 如果单个MCU使用多个MPU6050,则可以使用该引脚来改变地址 |
中断(INT) | 中断引脚,指示数据可供MCU读取 |
柔性传感器
柔性传感器不过是一个可变电阻器。弯曲传感器时,弯曲传感器的电阻会发生变化。 它们 通常有2.2英寸 和 4.5英寸两种尺寸 。
为什么我们在项目中使用柔性传感器?
在此手势控制的机械手中,挠曲传感器用于控制机械手的抓取器。当手套上的挠曲传感器弯曲时,安装在夹具上的伺服电机旋转,夹具打开。
Flex传感器在许多应用中可能很有用,并且我们使用Flex传感器(例如游戏控制器,Tone发生器等)构建的项目很少。
准备好3D打印的机械手臂:
本教程中使用的3D打印机械手是按照ThinGive 中可用的EEZYbotARM给出的设计制作的 。Thingiverse链接中提供了制作3D打印机械臂和带有视频的装配细节的完整过程,该链接在上方共享。
上面是我与4个伺服电机组装后的3D打印机器人手臂的图像。
所需组件:
- Arduino纳米
- 柔性传感器
- 10k电阻
- MPU6050
- 手手套
- 连接线
- 面包板
电路原理图:
下图显示了 基于Arduino的手势控制机械手的电路连接 。
MPU6050和Arduino Nano之间的电路连接:
MPU6050 |
Arduino纳米 |
VCC |
+5伏 |
地线 |
地线 |
SDA |
A4 |
SCL |
A5 |
伺服电机和Arduino Nano之间的电路连接:
Arduino纳米 |
伺服马达 |
电源适配器 |
D2 |
伺服1橙色(PWM引脚) |
-- |
D3 |
伺服2橙色 (PWM引脚) |
-- |
D4 |
伺服3橙色 (PWM引脚) |
-- |
D5 |
伺服4橙色 (PWM引脚) |
-- |
地线 |
伺服1,2,3,4棕色(GND引脚) |
地线 |
-- |
伺服1,2,3,4红色 (+ 5V引脚) |
+5伏 |
甲 柔性传感器 包含两个引脚。它不包含极化端子。因此,第一个引脚P1通过上拉电阻10k连接到Arduino Nano的模拟引脚A0,第二个引脚P2接地到Arduino。
将MPU6050和Flex传感器安装到手套上
我们已经将MPU6050和Flex传感器安装在手套上。此处,有线连接用于连接手套和机械臂,但可以使用RF连接或蓝牙连接将其无线连接。
每次连接后,手势控制机械臂的最终设置 如下图所示:
为机械手臂编程Arduino Nano
像往常一样, 本教程的结尾给出了完整的代码以及可运行的视频。这里解释了一些重要的代码行。
1.首先,包括必要的库文件。 Wire.h 库用于Arduino Nano和MPU6050与 Servo.h 之间的I2C通信, 以控制伺服电机。
#包括
2.接下来,声明用于类伺服的对象。当我们使用四个伺服电动机时,将创建四个对象,例如,伺服_1,伺服_2,伺服_3,伺服_4。
伺服伺服_1; 伺服舵机_2; 伺服舵机_3; 伺服舵机_4;
3。接下来,声明MPU6050的I2C地址和要使用的变量。
const int MPU_addr = 0x68; // MPU6050 I2C地址 int16_t axis_X,axis_Y,axis_Z; int minVal = 265; int maxVal = 402; 双x; y 双Z者除外;
4.接下来,在 空白设置中 ,将串行通信的波特率设置为9600。
Serial.begin(9600);
并在Arduino Nano和MPU6050之间建立了I2C通信:
Wire.begin(); //初始化I2C通信线 .beginTransmission(MPU_addr); //开始与MPU6050通讯 Wire.write(0x6B); //写入寄存器6B Wire.write(0); //将0写入6B寄存器以重置 Wire.endTransmission(true); //结束I2C传输
另外,为伺服电机连接定义了四个PWM引脚。
伺服_1.attach(2); //正向/反向 伺服 舵机_2.attach(3); //上/下电机伺服_3.attach(4); // Gripper_Motor伺服 _4.attach(5); //左/右马达
5.接下来在 void循环 功能中,再次在MPU6050和Arduino Nano之间建立I2C连接,然后开始从MPU6050的寄存器读取X,Y,Z轴数据并将它们存储在相应的变量中。
Wire.beginTransmission(MPU_addr); Wire.write(0x3B); //以 regsiter 0x3B开头Wire.endTransmission(false); Wire.requestFrom(MPU_addr,14,true); //读取14个寄存器 axis_X = Wire.read()<< 8-Wire.read(); axis_Y = Wire.read()<< 8-Wire.read(); axis_Z = Wire.read()<< 8-Wire.read();
然后,将MPU6050传感器的轴数据的最小值和最大值映射在-90到90的范围内。
int xAng = map(axis_X,minVal,maxVal,-90,90); int yAng = map(axis_Y,minVal,maxVal,-90,90); int zAng = map(axis_Z,minVal,maxVal,-90,90);
然后使用以下公式以0到360的形式计算x,y,z值。
x = RAD_TO_DEG *(atan2(-yAng,-zAng)+ PI); y = RAD_TO_DEG *(atan2(-xAng,-zAng)+ PI); z = RAD_TO_DEG *(atan2(-yAng,-xAng)+ PI);
然后在Arduino Nano的A0引脚上读取挠曲传感器的模拟输出数据,并根据挠曲传感器的数字值设置夹具的伺服角度。因此,如果挠曲传感器数据大于750,则夹具的伺服电机角度为0度,如果小于750,则为180度。
内部抓爪 int flex_sensorip = AnalogRead(A0); if(flex_sensorip> 750) { 抓手= 0; } else { 抓手= 180; } Servo_3.write(gripper);
然后, 将MPU6050在X轴上从0到60 的运动映射为0到90度,以实现伺服电机的机械臂正/反向运动。
if(x> = 0 && x <= 60) { int mov1 = map(x,0,60,0,90); Serial.print(“ F / R中的运动=”); Serial.print(mov1); Serial.println((char)176); 伺服_1.write(mov1); }
和 MPU6050对在X轴从250至360的运动 在0至90度的伺服电机的UP / DOWN运动机械臂术语被映射。
否则if(x> = 300 && x <= 360) { int mov2 = map(x,360,250,0,90); Serial.print(“向上/向下移动=”); Serial.print(mov2); Serial.println((char)176); 伺服_2.write(mov2); }
MPU6050在Y轴上从0到60的移动 被映射为90到180度,用于伺服电机的机械臂向左移动。
if(y> = 0 && y <= 60) { int mov3 = map(y,0,60,90,180); Serial.print(“向左移动=”); Serial.print(mov3); Serial.println((char)176); Servo_4.write(mov3); }
MPU6050在Y轴上从300到360的移动 被映射为0到90度,用于伺服电机的机械臂向右移动。
否则if(y> = 300 && y <= 360) { int mov3 = map(y,360,300,90,0); Serial.print(“向右移动=”); Serial.print(mov3); Serial.println((char)176); Servo_4.write(mov3); }
使用Arduino进行手势控制的机械臂的工作
最后,将代码上传到Arduino Nano,并戴上MPU6050和Flex传感器安装的手套。
1.现在,向下移动手以向前移动机械臂,然后向上移动以向上移动机械臂。
2.然后向左或向右倾斜手,以向左或向右转动机械臂。
3.弯曲与手手套的手指相连的柔性电缆以打开夹持器,然后松开以使其闭合。
下面的视频演示了完整的工作原理。