机械臂是令人着迷的工程创造之一,看着这些东西像人类手臂一样倾斜和摇动来完成复杂的事情总是令人着迷的。这些机械臂可以在装配线上进行焊接、钻孔、喷漆等繁重机械工作的行业中找到,最近,高精度的先进机械臂已被开发用于执行复杂的外科手术。在上一篇文章中,我们3D打印了一个机械臂,并使用MG995伺服电机来构建机械臂。我们将再次使用相同的3D 打印机械臂来制作带有Arduino Nano、MPU6050 陀螺仪和弯曲传感器的手势控制机械臂。
3D打印机械臂的位置可以通过连接到MPU6050陀螺仪和弯曲传感器的手套来控制。柔性传感器用于控制机器人的夹具伺服电机,MPU6050用于在X轴和Y轴上移动机器人。如果您没有打印机,那么您也可以用简单的纸板制作手臂,就像我为Arduino 机器人手臂项目制作的那样。
首先,我们来了解一下MPU6050传感器和弯曲传感器。
MPU6050 陀螺仪和加速度计传感器
MPU6050 基于微机械系统(MEMS) 技术。该传感器具有3 轴加速度计、3 轴陀螺仪和内置温度传感器。它可以用来测量加速度、速度、方向、位移等参数。我们之前已经将MPU6050与Arduino和Raspberry pi接口,并使用它构建了一些项目,例如自平衡机器人、Arduino数字量角器和Arduino倾角仪。
MPU6050传感器特点:
通讯:I2C 协议,I2C 地址可配置
输入电源:3-5Vd
内置16位ADC,提供高精度
内置DMP提供高计算能力
可用于与其他I2C 设备(例如磁力计)连接
内置温度传感器
弯曲传感器
弯曲传感器实际上是一个可变电阻。当您弯曲传感器时,其电阻会发生变化。通常有两种尺寸:2.2 英寸和4.5 英寸。
为什么我们在项目中使用柔性传感器?在这种手势控制的机械臂中,弯曲传感器用于控制机械臂的夹具。当手套上的弯曲传感器弯曲时,安装在夹具上的伺服电机旋转并且夹具打开。
3D打印机械臂准备就绪
本文使用的3D打印机械臂基于ThinZverse中EEZYbotARM提供的设计。制作3D 打印机械臂的完整过程和带有视频的装配细节可在上面分享的Thingiverse 链接中找到。
上图是3D打印机械臂组装4个伺服电机后的图像。
所需组件
Arduino Nano开发板
弯曲传感器
10k电阻
MPU6050
连接电缆
面包板
电路原理图
下图是基于Arduino的手势控制机械臂的电路连接。
MPU6050与Arduino Nano的电路连接:
MPU6050Arduino NanoVCC+5VGNDGNDSDAA4SCLA5 弯曲传感器包含两个引脚。它不包含极化端子。因此,第一个引脚P1 通过10k 上拉电阻连接到Arduino Nano 的模拟引脚A0,第二个引脚P2 接地到Arduino。
将MPU6050 和Flex 传感器安装到手套上
我们将MPU6050 和Flex 传感器安装在手套上。这里,手套和机械臂通过电缆连接,也可以通过使用射频连接或蓝牙连接进行无线连接。
连接完成后,手势控制机械臂的最终设置如下图:
为机械臂编程Arduino Nano
完整的代码在本文末尾提供。这里解释了一些重要的代码。
首先,包含必要的库文件。 Wire.h库用于Arduino Nano和MPU6050之间的I2C通信以及Servo.h来控制伺服电机。
包括
包括
接下来,声明Servo 类的对象。当我们使用四个伺服电机时,将创建四个对象。
舵机servo_1;
舵机servo_2;
舵机servo_3;
舵机servo_4;
接下来,声明MPU6050的I2C地址和要使用的变量。
常量int MPU_addr=0x68; //MPU6050 I2C地址
int16_t 轴_X,轴_Y,轴_Z;
int minVal=265;
int 最大值=402;
双x;
双y;
双z;
在void setup()函数中,将串行通信的波特率设置为9600。
串行.开始(9600);
并建立Arduino Nano与MPU6050之间的I2C通信:
Wire.begin(); //初始化I2C通信
Wire.beginTransmission(MPU_addr);//开始与MPU6050通信
Wire.write(0x6B); //写入寄存器6B
Wire.write(0); //向6B寄存器写入0以复位
Wire.endTransmission(true); //结束I2C传输
此外,还定义了四个PWM 引脚用于连接伺服电机。
servo_1.attach(2); //正向/反向_电机
servo_2.attach(3); //上/下电机
servo_3.attach(4); //夹具电机
servo_4.attach(5); //左/右_电机
接下来,在void循环函数中,再次建立MPU6050和Arduino Nano之间的I2C连接,然后开始从MPU6050的寄存器中读取X、Y、Z轴数据并将其存储到相应的变量中。
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B); //从寄存器0x3B开始
Wire.endTransmission(假);
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=地图(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);
如果(flex_sensorip 750)
{
夹具=0;
}
别的
{
夹具=180;
}
servo_3.write(夹具);
然后,将MPU6050在X轴上从0到60的运动映射到0到90,实现伺服电机机械臂的正向/反向运动。
如果(x=0 x=60)
{
int mov1=地图(x,0,60,0,90);
Serial.print('F/R 运动=');
串口.print(mov1);
Serial.println((char)176);
servo_1.write(mov1);
}
MPU6050在X轴上从250到360的运动映射到0到90,用于伺服电机的机械手的上/下运动。
使用Arduino 操作手势控制机械臂
最后,将代码上传到Arduino Nano,并戴上安装有MPU6050和弯曲传感器的手套。
现在,向下移动手可向前移动手臂,向上移动手可向上移动手臂。然后向左或向右倾斜您的手以向左或向右旋转机器人手。弯曲您的手以打开支架,然后松开以将其关闭。
编辑:hfy