ربات کنترل شده با اشاره دست با استفاده از آردوینو

بیایید یک ربات با قابلیت کنترل با حرکات دست بسازیم که دوستان و خانواده شما را شگفت زده می کند – این مثل یک جادو هست! این راهنمای گام به گام به شما کمک می کند تا با استفاده از اجزای ساده ای مانند آردوینو، شتاب سنج MPU6050، جفت فرستنده و گیرنده nRF24L01 و ماژول درایور موتور L293D، یک ربات کنترل شده با اشاره دست بسازید. ما ربات را به دو قسمت تقسیم می کنیم: فرستنده و گیرنده.

بخش فرستنده شامل یک آردوینو Uno، شتاب سنج MPU6050 و ژیروسکوپ به همراه فرستنده گیرنده nRF24L01 است. از طرف دیگر، بخش گیرنده شامل یک آردوینو Uno، nRF24L01، دو موتور DC و یک درایور موتور L293D است. فرستنده به عنوان کنترل از راه دور عمل می کند و به ربات اجازه می دهد تا به اشارات پاسخ دهد و بر اساس آن حرکت کند. به طرز چشمگیری، حرکات ربات با حرکاتی که با دستان خود انجام می دهید کنترل می شود. این پروژه ترکیبی از فناوری حسگر، ارتباطات بی سیم و کنترل موتور برای ایجاد یک تجربه جذاب و تعاملی است. مراحل این آموزش را دنبال کنید تا این ربات جادویی که با اشاره کنترل می شود را زنده کنید و تأثیری ماندگار بر روی اطرافیان خود بگذارید.

ربات کنترل با اشاره چگونه کار می کند؟

این پروژه شامل دو مدار است: مدار فرستنده و مدار گیرنده. حسگر شتاب سنج MPU6050 حرکات دست را به سیگنال های الکتریکی تبدیل می کند.

آردوینو نانو این سیگنال ها را پردازش کرده و از طریق فرستنده RF ارسال می کند

در انتهای گیرنده، گیرنده RF این سیگنال ها را دریافت کرده و آنها را برای رمزگشایی به Arduino Uno ارسال می کند. پس از دریافت سیگنال ها، آردوینو Uno موتورها را از طریق درایور موتور فعال می کند و ربات را هدایت می کند تا “به جلو”، “به عقب”، “چپ” یا “راست” حرکت کند.

اگر مقدار شتاب در امتداد محور x کمتر از ۳۴۰ باشد، ربات باید به جلو حرکت کند.

اگر مقدار شتاب در امتداد محور x بیش از ۳۶۰ باشد، ربات باید به سمت عقب حرکت کند.

اگر مقدار شتاب در امتداد محور y کمتر از ۱۴۰ باشد، ربات باید به سمت چپ بچرخد.

اگر مقدار شتاب در امتداد محور y بیش از ۱۶۰ باشد، ربات باید به راست بچرخد.

اگر هیچ یک از شرایط بالا برآورده نشد، ربات باید متوقف شود.

اجزای مورد نیاز برای ساخت ربات

  1. آردینو UNO
  2. آردینو nano
  3. NRF24L01
  4. MPU6050
  5. ۲WD Acrylic Chassis kit
  6. L298N Motor Driver Module
  7. ۷٫۴V Li-ion battery/ 9V battery
  8. سیم و اتصالات

شتاب سنج و ژیروسکوپ MPU6050

ماژول حسگر MPU6050 مانند یک کامپیوتر کوچک است که می تواند حرکت را به ۶ روش مختلف حس کند: ۳ برای شتاب و ۳ برای چرخش (ژیروسکوپ). همچنین دارای سنسور دمای داخلی است. این ماژول می‌تواند با دستگاه‌های دیگر مانند میکروکنترلرها و حسگرها (مانند مغناطیس‌سنج یا سنسور فشار)، با استفاده از یک گذرگاه I2C و یک گذرگاه I2C کمکی مرتبط شود .

کار اصلی MPU6050 اندازه گیری سرعت حرکت یک چیز، جهت گیری آن و سایر موارد مرتبط با حرکت است.

با یک پردازشگر دیجیتال حرکتی همراه است، یک مینی کامپیوتر درون آن که می تواند محاسبات پیچیده را انجام دهد. این باعث می شود MPU6050 برای تجزیه و تحلیل و کنترل حرکت در برنامه های مختلف مفید باشد.

ماژول گیرنده NRF24L01

nRF24L01 یک فرستنده رادیویی فشرده است که برای باند جهانی ۲٫۴ – ۲٫۵ گیگاهرتز ISM طراحی شده است. بسته بندی شده در یک تراشه واحد، شامل یک سازنده ی فرکانس کاملاً یکپارچه، یک تقویت کننده قدرت، یک نوسان ساز کریستالی، یک دمدولاتور، مدولاتور و یک موتور پروتکل پیشرفته ShockBurst است.

شما به راحتی می توانید قدرت خروجی، کانال های فرکانس و پروتکل های آن را با استفاده از یک رابط SPI تنظیم کنید.

این ماژول فرستنده گیرنده در محدوده ولتاژ ۱٫۹ ولت تا ۳٫۶ ولت کار می کند. این دستگاه دارای حالت‌های Power Down و Standby داخلی است که استفاده از آن را کم مصرف و ساده می‌کند.

طراحی مدار ربات

مدارات این ربات به دو بخش کلی تقسیم بندی می شود :

  1. مدارات فرستنده
  2. مدارات گیرنده

مدار فرستنده

بخش فرستنده این پروژه شامل شتاب‌سنج و ژیروسکوپ MPU6050، فرستنده گیرنده nRF24L01 و آردوینو Uno است. آردوینو به دریافت اطلاعات از MPU6050 ادامه می دهد و سپس این داده ها را به فرستنده nRF ارسال می کند. سپس فرستنده RF این داده ها را به محیط اطراف پخش می کند.

مدار گیرنده ربات

بخشی از ربات کنترل‌شده با اشاره که سیگنال‌ها را دریافت می‌کند شامل Arduino Uno، فرستنده گیرنده nRF24L01، ۲ موتور DC و یک ماژول درایور موتور است. گیرنده NRF24L01 داده های ارسال شده از راه دور را ضبط می کند و آن را به آردوینو منتقل می کند. پس از آن، آردوینو بر اساس سیگنال های دریافتی، به حرکت موتورهای DC فرمان می دهد. نمودار مدار این بخش گیرنده در زیر ارائه شده است.

برنامه نویسی ربات

در این قسمت کد های برنامه نویسی ربات به همراه توضیحات آن ارائه می شود .

برنامه نویسی قسمت فرستنده ربات

کد فرستنده از شتاب سنج و ژیروسکوپ MPU6050 به همراه فرستنده گیرنده nRF24L01 برای برقراری ارتباط بی سیم با گیرنده استفاده می کند.

سنسور MPU6050 داده‌های حرکتی را می‌گیرد و سپس با استفاده از ماژول nRF24L01 نقشه‌برداری و به گیرنده منتقل می‌شود.

داده های ارسالی نشان دهنده حرکات دست در امتداد محورهای X و Y است که امکان کنترل حرکت ربات را فراهم می کند.

اطمینان حاصل کنید که کتابخانه های لازم را نصب کرده اید

SPI.h library — RF24.h library — Wire.h library — I2Cdev.h library — MPU6050.h library

#include <SPI.h>        //SPI library for communicate with the nRF24L01+
#include "RF24.h"       //The main library of the nRF24L01+
#include "Wire.h"       //For communicate
#include "I2Cdev.h"     //For communicate with MPU6050
#include "MPU6050.h"    //The main library of the MPU6050

در اینجا، کتابخانه های لازم فراخوان شده است. SPI برای ارتباط با ماژول nRF24L01، RF24 کتابخانه اصلی برای nRF24L01، Wire برای ارتباطات عمومی و I2Cdev و MPU6050 برای رابط با شتاب سنج و ژیروسکوپ MPU6050 استفاده می شود.

//Define the object to access and cotrol the Gyro and Accelerometer (We don't use the Gyro data)
MPU6050 mpu;
int16_t ax, ay, az;
int16_t gx, gy, gz;

در این قسمت از برنامه ، نمونه‌ای از کلاس MPU6050 ایجاد می‌شود و متغیرهایی برای ذخیره خوانش‌های شتاب‌سنج و ژیروسکوپ (ax، ay، az، gx، gy، gz) اعلام می‌شوند.

//Define packet for the direction (X axis and Y axis)
int data[2];
 
//Define object from RF24 library - 8 and 9 are a digital pin numbers to which signals CE and CSN are connected.
RF24 radio(8,9);

یک داده آرایه با اندازه ۲ برای ذخیره داده های محور X و Y معرفی می شود . یک تابع RF24 به نام رادیو با پین های دیجیتال ۸ و ۹ به عنوان پایه های CE و CSN ایجاد می شود.

//Create a pipe addresses for the communicate                                    
const uint64_t pipe = 0xE8E8F0F0E1LL;

یک آدرس منحصر به فرد برای ارتباط بین فرستنده و گیرنده تعریف شده است.

void setup(void)
{
  Serial.begin(9600);
  Wire.begin();
  mpu.initialize();              //Initialize the MPU object
  radio.begin();                 //Start the nRF24 communicate    
  radio.openWritingPipe(pipe);   //Sets the address of the receiver to which the program will send data.
}

تابع setup ارتباط سریال، کتابخانه سیم بندی ، MPU6050 و ارتباط nRF24 را مقداردهی اولیه می کند. و آدرس ارتباطی فرستنده را تنظیم می کند.

void loop(void){
 
  //With this function, the acceleration and gyro values of the axes are taken.
  //If you want to control the car axis differently, you can change the axis name in the map command.
  mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
 
  //In two-way control, the X axis (data [0]) of the MPU6050 allows the robot to move forward and backward.
  //Y axis (data [1]) allows the robot to right and left turn.
  data[0] = map(ax, -17000, 17000, 300, 400 ); //Send X axis data
  data[1] = map(ay, -17000, 17000, 100, 200);  //Send Y axis data
  radio.write(data, sizeof(data));
  Serial.print("X axix data = ");
  Serial.println(data[0]);
  Serial.print("Y axix data = ");
  Serial.println(data[1]);
}

در حلقه اصلی، تابع getMotion6 مقادیر شتاب سنج و ژیروسکوپ را می خواند. داده های محور X و Y به یک محدوده خاص نگاشت شده و در آرایه داده ذخیره می شوند.

سپس این داده ها با استفاده از تابع radio.write ارسال می شوند. داده‌های محور X و محور Y برای اشکال‌زدایی در مانیتور سریال چاپ می‌شوند.

برنامه سمت گیرنده

در سمت گیرنده، Arduino Uno با ماژول nRF24L01 داده های ارسالی را از فرستنده دریافت می کند. بسته به سیگنال های دریافتی که نشان دهنده حرکات دست هستند، آردوینو جهت دو موتور DC را با استفاده از یک ماژول درایور موتور (L293D) کنترل می کند. کد شامل منطق حرکت ربات به جلو، عقب، چپ، راست یا توقف بر اساس حرکات دست تفسیر شده است.

#include <SPI.h>      //SPI library for communicate with the nRF24L01+
#include "RF24.h"     //The main library of the nRF24L01+

این خطوط شامل کتابخانه های لازم برای ارتباط با ماژول nRF24L01 می باشد.

//Define enable pins of the Motors
const int enbA = 3;
const int enbB = 6;
 
//Define control pins of the Motors
//If the motors rotate in the opposite direction, you can change the positions of the following pin numbers
const int IN1 = 2;    //Right Motor (-)
const int IN2 = 4;    //Right Motor (+)
const int IN3 = 5;    //Left Motor (+)
const int IN4 = 7;    //Right Motor (-)
 
//Define variable for the motors speeds
//I have defined a variable for each of the two motors
//This way you can synchronize the rotation speed difference between the two motors
int RightSpd = 200;
int LeftSpd = 250;

این خطوط، پایه‌های کنترل موتور (فعال و پایه‌های ورودی) را مشخص می‌کنند و سرعت‌های اولیه را برای موتورهای راست و چپ تعیین می‌کنند.

//Define packet for the direction (X axis and Y axis)
int data[2];
 
//Define object from RF24 library - 8 and 9 are a digital pin numbers to which signals CE and CSN are connected
RF24 radio(8,9);

داده های آرایه ای با اندازه ۲ برای ذخیره داده های محور X و Y دریافت شده از فرستنده اعلام می شود. یک تابع RF24 به نام رادیو با پین های دیجیتال ۸ و ۹ به عنوان پایه های CE و CSN ایجاد می شود.

//Create a pipe addresses for the communicate
const uint64_t pipe = 0xE8E8F0F0E1LL;

یک آدرس منحصر به فرد برای ارتباط بین فرستنده و گیرنده تعریف شده است.

void setup()
{
  //Define the motor pins as OUTPUT
  pinMode(enbA, OUTPUT);
  pinMode(enbB, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
 
  Serial.begin(9600);
  radio.begin();                    //Start the nRF24 communicate            
  radio.openReadingPipe(1, pipe);   //Sets the address of the transmitter to which the program will receive data.
  radio.startListening();            
  }

تابع راه‌اندازی پین‌های کنترل موتور را به‌عنوان OUTPUT راه‌اندازی می‌کند، ارتباط سریال را انجام می دهد ، ماژول nRF24 را راه‌اندازی می‌کند، آدرس ارتباطی گیرنده را تنظیم می‌کند و آن را برای پذیرش داده‌های ورودی آماده می‌کند.

void loop(){
  if (radio.available()){
    radio.read(data, sizeof(data));
 
    if(data[0] < 340){
      //forward            
      analogWrite(enbA, RightSpd);
      analogWrite(enbB, LeftSpd);
      digitalWrite(IN1, HIGH);
      digitalWrite(IN2, LOW);
      digitalWrite(IN3, HIGH);
      digitalWrite(IN4, LOW);
      Serial.println("forward");
    }
   
    if(data[0] > 360){
      //backward              
      analogWrite(enbA, RightSpd);
      analogWrite(enbB, LeftSpd);
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, HIGH);
      Serial.println("backward");
    }
     
    if(data[1] > 160){
       //right
      analogWrite(enbA, RightSpd);
      analogWrite(enbB, LeftSpd);
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      digitalWrite(IN3, HIGH);
      digitalWrite(IN4, LOW);
      Serial.println("right");
    }
 
    if(data[1] < 140){
     //left
      analogWrite(enbA, RightSpd);
      analogWrite(enbB, LeftSpd);
      digitalWrite(IN1, HIGH);
      digitalWrite(IN2, LOW);
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, HIGH);
      Serial.println("left");
    }
 
    if(data[0] > 340 && data[0] < 360 && data[1] > 140 && data[1] < 160){
      //stop car
      analogWrite(enbA, 0);
      analogWrite(enbB, 0);
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, LOW);
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, LOW);
      Serial.println("stop");
    }
  }
}

در حلقه اصلی، برنامه بررسی می کند که آیا داده های موجود از فرستنده وجود دارد یا خیر. اگر داده در دسترس باشد، مقادیر محور X و Y را از فرستنده می خواند. بسته به مقادیر دریافتی، منطق کنترل موتور خاص برای حرکت روبات به جلو، عقب، راست، چپ یا توقف اجرا می‌شود. وضعیت حرکت برای اشکال زدایی در مانیتور سریال چاپ می شود.

توجه: در کد گیرنده، منطق کنترل موتور به طور کامل اجرا نشده است و ممکن است لازم باشد آن را بر اساس تنظیمات و تنظیمات درایور موتور خاص خود تغییر دهید. همچنین، کالیبراسیون MPU6050 ممکن است برای اطمینان از خوانش دقیق ضروری باشد. اطمینان حاصل کنید که اتصالات سیم کشی با تخصیص پین در کد مطابقت دارند.

تست ربات

هنگامی که اجزای سخت افزاری را مونتاژ کردید، فرستنده و گیرنده آردوینو را به لپ تاپ خود متصل کرده و کد ارائه شده را آپلود کنید. پس از آن، شتاب‌سنج MPU6050 را برای تأثیرگذاری بر حرکات ماشین ربات تنظیم کنید.

کد

//Arduino Code for gesture controlled robot

#include <SPI.h>        //SPI library for communicate with the nRF24L01+

#include "RF24.h"       //The main library of the nRF24L01+

#include "Wire.h"       //For communicate

#include "I2Cdev.h"     //For communicate with MPU6050

#include "MPU6050.h"    //The main library of the MPU6050


//Define the object to access and cotrol the Gyro and Accelerometer (We don't use the Gyro data)

MPU6050 mpu;

int16_t ax, ay, az;

int16_t gx, gy, gz;

//Define packet for the direction (X axis and Y axis)

int data[2];

//Define object from RF24 library - 8 and 9 are a digital pin numbers to which signals CE and CSN are connected.

RF24 radio(8,9);

//Create a pipe addresses for the communicate                                    

const uint64_t pipe = 0xE8E8F0F0E1LL;

void setup(void){

  Serial.begin(9600);

  Wire.begin();

  mpu.initialize();              //Initialize the MPU object

  radio.begin();                 //Start the nRF24 communicate     

  radio.openWritingPipe(pipe);   //Sets the address of the receiver to which the program will send data.

}

void loop(void){

  

  //With this function, the acceleration and gyro values of the axes are taken. 

  //If you want to control the car axis differently, you can change the axis name in the map command.

  mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

  //In two-way control, the X axis (data [0]) of the MPU6050 allows the robot to move forward and backward. 

  //Y axis (data [1]) allows the robot to right and left turn.

  data[0] = map(ax, -17000, 17000, 300, 400 ); //Send X axis data

  data[1] = map(ay, -17000, 17000, 100, 200);  //Send Y axis data

  radio.write(data, sizeof(data));

  Serial.print("X axix data = ");

  Serial.println(data[0]);

  Serial.print("Y axix data = ");

  Serial.println(data[1]);

}
0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگو شرکت کنید؟
نظری بدهید!

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *