بازوی رباتیک کنترل شده با حرکت دست با استفاده از آردوینو نانو
بازوهای رباتیک یکی از خلاقیت های جذاب مهندسی است و تماشای نحوه عملکرد برای انجام کارهای پیچیده درست مانند بازوی انسان همیشه قابل توجه بوده است . این بازوهای رباتیک معمولاً در صنایع در خط مونتاژ که کارهای مکانیکی شدید مانند جوشکاری، حفاری، نقاشی و غیره را انجام می دهند، یافت می شوند.
بازوهای رباتیک پیشرفته اخیر با دقت بالا نیز برای انجام عملیات های جراحی پیچیده در حال توسعه هستند.
ما از بازوی رباتیک ایجاد شده توسط پرینتر سه بعدی استفاده خواهیم کرد تا با استفاده از آردوینو نانو، ژیروسکوپ MPU6050 و حسگر فلکس، یک بازوی رباتیک کنترل شده با حرکت دست ایجاد کنیم.
سنسور فلکس برای کنترل سروو دستگیره بازوی رباتیک و MPU6050 برای حرکت رباتیک در محور X و Y استفاده می شود. اگر چاپگر ندارید، می توانید بازوی خود را با مقوای ساده همانطور که برای پروژه بازوی رباتیک آردوینو ساختیم بسازید.
قبل از پرداختن به جزئیات، ابتدا با سنسور MPU6050 و سنسور فلکس آشنا می شویم.
سنسور ژیروسکوپی و شتاب سنج MPU6050
MPU6050 مبتنی بر فناوری سیستم های میکرو مکانیکی (MEMS) است. این سنسور دارای شتاب سنج ۳ محوره، ژیروسکوپ ۳ محوره و سنسور دمای داخلی است. می توان از آن برای اندازه گیری پارامترهایی مانند شتاب، سرعت، جهت، جابجایی و غیره استفاده کرد.
ویژگی های سنسور MPU6050:
ارتباط: پروتکل I2C با آدرس I2C قابل تنظیم
منبع تغذیه ورودی: ۳-۵ ولت
ADC 16 بیتی داخلی دقت بالایی را ارائه می دهد
DMP داخلی قدرت محاسباتی بالایی را ارائه می دهد
می توان از آن برای ارتباط با سایر دستگاه های I2C مانند مغناطیس سنج استفاده کرد
سنسور دمای داخلی
جزئیات پین اوت MPU6050:
سنسور فلکس
حسگرهای فلکس چیزی جز یک مقاومت متغیر نیستند. مقاومت سنسور فلکس زمانی که سنسور خم می شود تغییر می کند. آنها معمولا در دو اندازه ۲٫۲ اینچ و ۴٫۵ اینچ موجود هستند.
چرا در پروژه خود از سنسورهای انعطاف پذیر استفاده می کنیم؟
در این بازوی رباتیک کنترل شده با اشاره، از یک حسگر انعطاف پذیر برای کنترل گیره بازوی رباتیک استفاده شده است. هنگامی که سنسور فلکس روی دستکش خم می شود، موتور سروو متصل به گیره می چرخد و گیره باز می شود.
سنسورهای فلکس می توانند در بسیاری از پروژه ها مفید باشد و کاربرد فراوانی در ساخت انواع ربات ها دارد .
آماده سازی بازوی رباتیک پرینت سه بعدی:
بازوی رباتیک پرینت سه بعدی مورد استفاده در این آموزش با پیروی از طرح ارائه شده توسط EEZYbotARM ساخته شده است که در Thingiverse موجود است. روش کامل ساخت بازوی روباتیک پرینت سه بعدی و جزئیات مونتاژ با ویدئو در پیوند Thingiverse وجود دارد که در بالا به اشتراک گذاشته شده است.
قطعات مورد نیاز :
آردوینو نانو
سنسور فلکس
مقاومت ۱۰k
MPU6050
دستکش
سیم های اتصال
برد بورد
مدار پروژه :
اتصال مدار بین MPU6050 و آردوینو نانو:
اتصال مدار بین سروو موتور و آردوینو نانو:
یک سنسور فلکس شامل دو پین است. این شامل پایانه های قطبی نیست. بنابراین پین یک P1 به پین آنالوگ A0 آردوینو نانو با مقاومت pull-up 10k متصل می شود و پایه دو P2 به آردوینو متصل می شود.
نصب MPU6050 و سنسور فلکس روی دستکش :
ما MPU6050 و سنسور فلکس را روی یک دستکش نصب کرده ایم. در اینجا از یک اتصال سیمی برای اتصال دستکش و بازوی رباتیک استفاده می شود، اما می توان آن را با استفاده از اتصال RF یا اتصال بلوتوث بی سیم کرد.
پس از هر اتصال، تنظیمات نهایی بازوی رباتیک کنترل شده با حرکت مانند تصویر زیر به نظر می رسد:
برنامه نویسی آردوینو نانو برای بازوی رباتیک
در اینجا چند خط مهم کد توضیح داده شده است.
۱٫ ابتدا فایل های کتابخانه ای لازم را وارد کنید. کتابخانه Wire.h برای ارتباط I2C بین Arduino Nano & MPU6050 و servo.h برای کنترل سروو موتور استفاده می شود.
#include<Wire.h>
#include<Servo.h>
۲٫ در مرحله بعد، اشیاء برای کلاس servo اعلام می شود. همانطور که از چهار موتور سروو استفاده می کنیم، چهار شی مانند servo_1، servo_2، servo_3، servo_4 ایجاد می شود.
Servo servo_1;
Servo servo_2;
Servo servo_3;
Servo servo_4;
۳٫ سپس آدرس I2C MPU6050 و متغیرهای مورد استفاده اعلام می شود.
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، نرخ باود ۹۶۰۰ برای ارتباط سریال تنظیم شده است.
Serial.begin(9600);
و ارتباط I2C بین Arduino Nano و MPU6050 برقرار است:
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
همچنین چهار پایه 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
۵٫ سپس در تابع حلقه خالی، دوباره اتصال I2C را بین MPU6050 و آردوینو نانو برقرار کنید و سپس شروع به خواندن داده های X، Y، Z-Axis از رجیستر MPU6050 کنید و آنها را در متغیرهای مربوطه ذخیره کنید.
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 در محدوده ۹۰- تا ۹۰ ترسیم کنید.
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);
سپس از فرمول زیر برای محاسبه مقادیر 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);
سپس داده های خروجی آنالوگ سنسور فلکس را در پین A0 آردوینو نانو بخوانید و با توجه به مقدار دیجیتال سنسور فلکس، زاویه سروو گیره را تنظیم کنید. بنابراین اگر داده های سنسور فلکس بیشتر از ۷۵۰ باشد، زاویه سروو موتور گیره ۰ درجه و اگر کمتر از ۷۵۰ باشد ۱۸۰ درجه است.
int gripper;
int flex_sensorip = analogRead(A0);
if(flex_sensorip > 750)
{
gripper = 0;
}
else
{
gripper = 180;
}
servo_3.write(gripper);
سپس حرکت MPU6050 در محور X از ۰ تا ۶۰ بر حسب ۰ تا ۹۰ درجه برای حرکت رو به جلو/عکوس سروو موتور بازوی رباتیک ترسیم می شود.
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 از ۲۵۰ به ۳۶۰ بر حسب ۰ تا ۹۰ درجه برای بازوی روباتیک حرکتی UP/DOWN سروو موتور ترسیم شده است.
else if(x >=300 && x <= 360)
{
int mov2 = map(x,360,250,0,90);
Serial.print("Movement in Up/Down = ");
Serial.print(mov2);
Serial.println((char)176);
servo_2.write(mov2);
}
حرکت MPU6050 در محور Y از ۰ تا ۶۰ بر حسب ۹۰ تا ۱۸۰ درجه برای حرکت سمت چپ بازوی رباتیک سروو موتور ترسیم شده است.
if(y >=0 && y <= 60)
{
int mov3 = map(y,0,60,90,180);
Serial.print("Movement in Left = ");
Serial.print(mov3);
Serial.println((char)176);
servo_4.write(mov3);
}
حرکت MPU6050 در محور Y از ۳۰۰ به ۳۶۰ بر حسب ۰ تا ۹۰ درجه برای حرکت سمت راست بازوی رباتیک سروو موتور ترسیم شده است.
else if(y >=300 && y <= 360)
{
int mov3 = map(y,360,300,90,0);
Serial.print("Movement in Right = ");
Serial.print(mov3);
Serial.println((char)176);
servo_4.write(mov3);
}
کارکرد بازوی رباتیک کنترل شده با اشاره با استفاده از آردوینو
در نهایت، کد را در آردوینو نانو آپلود کنید و دستکش نصب شده با سنسور MPU6050 و Flex را بپوشید.
۱٫ اکنون دست را به سمت پایین حرکت دهید تا بازوی رباتیک به سمت جلو حرکت کند و به سمت بالا حرکت کنید تا بازوی رباتیک به سمت بالا حرکت کند.
۲٫ سپس دست را به چپ یا راست خم کنید تا بازوی رباتیک به چپ یا راست بچرخد.
۳٫ کابل فلکس متصل شده با انگشت دستکش را خم کنید تا گیره باز شود و سپس آن را رها کنید تا ببندید.
کد :
//Code for Gesture Controlled Robotic ARM (Arduino Nano & MPU6050)
//Circuit Digest
#include<Wire.h> //I2C Wire Library
#include<Servo.h> //Servo Motor Library
Servo servo_1;
Servo servo_2;
Servo servo_3;
Servo servo_4;
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()
{
Serial.begin(9600);
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
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
}
void loop()
{
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(); //Reads the MPU6050 X,Y,Z AXIS Value
axis_Y=Wire.read()<<8|Wire.read();
axis_Z=Wire.read()<<8|Wire.read();
int xAng = map(axis_X,minVal,maxVal,-90,90); // Maps axis values in terms of -90 to +90
int yAng = map(axis_Y,minVal,maxVal,-90,90);
int zAng = map(axis_Z,minVal,maxVal,-90,90);
x= RAD_TO_DEG * (atan2(-yAng, -zAng)+PI); //Formula to convert into degree
y= RAD_TO_DEG * (atan2(-xAng, -zAng)+PI);
z= RAD_TO_DEG * (atan2(-yAng, -xAng)+PI);
int gripper;
int flex_sensorip = analogRead(A0); //Reads flex sensor output
if(flex_sensorip > 750)
{
gripper = 0;
}
else
{
gripper = 180;
}
servo_3.write(gripper); //Writes gripper value to 3rd servo motor
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);
}
else if(x >=300 && x <= 360)
{
int mov2 = map(x,360,250,0,180);
Serial.print("Movement in Up/Down = ");
Serial.print(mov2);
Serial.println((char)176);
servo_2.write(mov2);
}
if(y >=0 && y <= 60)
{
int mov3 = map(y,0,60,90,180);
Serial.print("Movement in Left = ");
Serial.print(mov3);
Serial.println((char)176);
servo_4.write(mov3);
}
else if(y >=300 && y <= 360)
{
int mov3 = map(y,360,300,90,0);
Serial.print("Movement in Right = ");
Serial.print(mov3);
Serial.println((char)176);
servo_4.write(mov3);
}
}