機(jī)械臂是引人入勝的工程創(chuàng)作之一,看著這些東西傾斜和搖動(dòng)像人類的手臂一樣完成復(fù)雜的事情總是令人著迷。這些機(jī)械臂可以在裝配線中進(jìn)行焊接、鉆孔、噴漆等劇烈機(jī)械工作的行業(yè)中找到,最近還開(kāi)發(fā)了高精度的先進(jìn)機(jī)械臂來(lái)執(zhí)行復(fù)雜的外科手術(shù)。在之前的文章中,我們3D打印了機(jī)械臂,并使用MG995伺服電機(jī)制作了機(jī)械臂。我們將再次使用相同的3D打印機(jī)器人手臂,通過(guò)Arduino Nano、MPU6050陀螺儀和彎曲(Flex)傳感器制作手勢(shì)控制的機(jī)器人手臂。
通過(guò)3D打印的機(jī)械臂位置可以通過(guò)與MPU6050陀螺儀和彎曲傳感器相連的手套來(lái)控制。 Flex傳感器用于控制機(jī)械手的夾具伺服電機(jī),MPU6050用于在X和Y軸上移動(dòng)機(jī)器人。如果您沒(méi)有打印機(jī),那么您也可以像為Arduino機(jī)器人手臂項(xiàng)目建造的那樣,用簡(jiǎn)單的紙板制作手臂。
首先,讓我們先了解MPU6050傳感器和彎曲傳感器。
MPU6050陀螺儀和加速度計(jì)傳感器
MPU6050基于微機(jī)械系統(tǒng)(MEMS)技術(shù)。該傳感器具有一個(gè)3軸加速度計(jì)、一個(gè)3軸陀螺儀和內(nèi)置溫度傳感器。它可以用來(lái)測(cè)量諸如加速度、速度、方向、位移等參數(shù)。我們之前已經(jīng)將MPU6050與Arduino和Raspberry pi進(jìn)行了連接,并且還使用它構(gòu)建了一些項(xiàng)目,例如自平衡機(jī)器人、Arduino數(shù)字量角器和Arduino測(cè)斜儀。
MPU6050傳感器的功能:
● 輸入電源:3-5Vd
● 內(nèi)置16位ADC提供高精度
● 內(nèi)置DMP提供高計(jì)算能力
● 可用于與磁力計(jì)等其他I2C設(shè)備接口
● 內(nèi)置溫度傳感器
彎曲傳感器
彎曲傳感器實(shí)際上是一個(gè)可變電阻器。彎曲傳感器時(shí),它的電阻會(huì)發(fā)生變化。通常有2.2英寸和4.5英寸兩種尺寸。
為什么我們?cè)陧?xiàng)目中使用柔性傳感器?在此手勢(shì)控制的機(jī)械臂中,使用彎曲傳感器控制機(jī)械臂的抓取器。當(dāng)手套上的彎曲傳感器彎曲時(shí),安裝在夾具上的伺服電機(jī)旋轉(zhuǎn),夾具打開(kāi)。

準(zhǔn)備好3D打印的機(jī)械臂
本文中使用的3D打印機(jī)械手是根據(jù)ThinZverse中EEZYbotARM提供的設(shè)計(jì)制作的。 Thingiverse鏈接中提供了制作3D打印機(jī)械臂和帶有視頻的組裝細(xì)節(jié)的完整過(guò)程,該鏈接在上方共享。
上圖是組裝4臺(tái)伺服電機(jī)后3D打印的機(jī)械臂的圖像。
所需的組件
● Arduino Nano開(kāi)發(fā)板
● 彎曲傳感器
● 10k電阻
● MPU6050
● 連接線
● 面包板
電路原理圖
下圖顯示了基于Arduino的手勢(shì)控制機(jī)械臂的電路連接。

MPU6050和Arduino Nano之間的電路連接:
| MPU6050 | Arduino Nano |
| VCC | +5V |
| GND | GND |
| SDA | A4 |
| SCL | A5 |
彎曲傳感器包含兩個(gè)引腳。它不包含極性端子。因此,第一個(gè)引腳P1通過(guò)一個(gè)10k的上拉電阻連接到Arduino Nano的模擬引腳A0,第二個(gè)引腳P2接地到Arduino。
將MPU6050和Flex傳感器安裝到手套上
我們將MPU6050和Flex傳感器安裝在手套上。此處,通過(guò)線纜連接手套和機(jī)械臂,也可以通過(guò)使用RF連接或藍(lán)牙連接將其無(wú)線連接。
連接完成后,手勢(shì)控制機(jī)械臂的最終設(shè)置如下圖所示:
為機(jī)械臂編程Arduino Nano
本文的末尾提供了完整的代碼。這里解釋了一些重要的代碼。
首先,包括必要的庫(kù)文件。 Wire.h庫(kù)用于Arduino Nano和MPU6050與Servo.h之間的I2C通信,以控制伺服電機(jī)。
#include
#include
接下來(lái),聲明用于類伺服的對(duì)象。當(dāng)我們使用四個(gè)伺服電動(dòng)機(jī)時(shí),將創(chuàng)建四個(gè)對(duì)象。
Servo servo_1;
Servo servo_2;
Servo servo_3;
Servo servo_4;
接下來(lái),聲明MPU6050的I2C地址和要使用的變量。
const int MPU_addr=0x68; //MPU6050 I2C Address
int16_t axis_X,axis_Y,axis_Z;
int minVal=265;
int maxVal=402;
double x;
double y;
double z;
在void setup()函數(shù)中,將串行通信的波特率設(shè)置為9600。
Serial.begin(9600);
并在Arduino Nano和MPU6050之間建立了I2C通信:
Wire.begin(); //Initilize I2C Communication
Wire.beginTransmission(MPU_addr);//Start communication with MPU6050
Wire.write(0x6B); //Writes to Register 6B
Wire.write(0); //Writes 0 into 6B Register to Reset
Wire.endTransmission(true); //Ends I2C transmission
另外,為伺服電機(jī)連接定義了四個(gè)PWM引腳。
servo_1.attach(2); // Forward/Reverse_Motor
servo_2.attach(3); // Up/Down_Motor
servo_3.attach(4); // Gripper_Motor
servo_4.attach(5); // Left/Right_Motor
接下來(lái),在void loop函數(shù)中,再次在MPU6050和Arduino Nano之間建立I2C連接,然后開(kāi)始從MPU6050的寄存器讀取X、Y、Z軸數(shù)據(jù)并將它們存儲(chǔ)在相應(yīng)的變量中。
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B); //Start with regsiter 0x3B
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr,14,true);//Read 14 Registers
axis_X=Wire.read()<<8|Wire.read();? ?? ?? ?? ?? ?
axis_Y=Wire.read()<<8|Wire.read();
axis_Z=Wire.read()<<8|Wire.read();
然后,將MPU6050傳感器的軸數(shù)據(jù)的最小值和最大值映射在-90到90的范圍內(nèi)。
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的形式計(jì)算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引腳上讀取撓曲傳感器的模擬輸出數(shù)據(jù),并根據(jù)彎曲傳感器的數(shù)字值設(shè)置夾具的伺服角度。因此,如果彎曲傳感器數(shù)據(jù)大于750,則夾具的伺服電機(jī)角度為0度,如果小于750,則為180度。
int gripper;
int flex_sensorip = analogRead(A0);
if(flex_sensorip > 750)
{
gripper = 0;
}
else
{
gripper = 180;
}
servo_3.write(gripper);
然后,將MPU6050在X軸上從0到60的移動(dòng)映射為0到90度,以實(shí)現(xiàn)伺服電機(jī)的機(jī)械臂正向/反向運(yùn)動(dòng)。
if(x >=0 && x <= 60)
{
int mov1 = map(x,0,60,0,90);
Serial.print("Movement in F/R = ");
Serial.print(mov1);
Serial.println((char)176);
servo_1.write(mov1);
}
MPU6050在X軸上從250到360的運(yùn)動(dòng)被映射為0到90度,用于伺服電機(jī)的上/下運(yùn)動(dòng)機(jī)械手。
使用Arduino進(jìn)行手勢(shì)控制的機(jī)械臂的工作
最后,將代碼上傳到Arduino Nano,并戴上MPU6050和彎曲傳感器安裝的手套。
現(xiàn)在,向下移動(dòng)手以使機(jī)械臂向前移動(dòng),向上移動(dòng)以使機(jī)械臂向上移動(dòng)。然后向左或向右傾斜手,以向左或向右旋轉(zhuǎn)機(jī)械手。彎曲手打開(kāi)夾持器,然后松開(kāi)以使其閉合。
編輯:hfy
-
傳感器
+關(guān)注
關(guān)注
2576文章
55043瀏覽量
791391 -
加速度計(jì)
+關(guān)注
關(guān)注
6文章
812瀏覽量
48174 -
MPU6050
+關(guān)注
關(guān)注
39文章
313瀏覽量
76393
發(fā)布評(píng)論請(qǐng)先 登錄
STM32驅(qū)動(dòng)PAJ7620手勢(shì)識(shí)別傳感器
CW32L012解算MPU6050姿態(tài)數(shù)據(jù)
CW32L012讀取MPU6050姿態(tài)數(shù)據(jù)
用dma加iic讀取mpu6050數(shù)據(jù)遇到的疑問(wèn)求解
泰科電子商用車機(jī)械自動(dòng)變速器傳感器集群介紹
TT電機(jī),Arduino Uno,L298N 5AD ,MPU6050最簡(jiǎn)自平衡機(jī)器人資料
【RA4M2-SENSOR】串口傳輸MPU6050陀螺儀數(shù)據(jù)測(cè)評(píng)
協(xié)作機(jī)械臂產(chǎn)品介紹
無(wú)位置傳感器控制的雙電機(jī)驅(qū)動(dòng)系統(tǒng)性能研究
小安派BW21-CBV-Kit入門教程之DMP6讀取MPU6050數(shù)據(jù)
觸覺(jué)傳感器已在亞馬遜倉(cāng)儲(chǔ)機(jī)械臂率先商用 新增形式有望加速市場(chǎng)增長(zhǎng)節(jié)奏
MPU-6000和MPU-6050產(chǎn)品規(guī)格書
如何制作和控制一只仿生手
基于MPU6050傳感器的手勢(shì)控制機(jī)械臂
評(píng)論