آیا تا به حال به ایجاد پروژه ای در رابطه با کنترل از راه دور ربات با استفاده از ماژول ASK و برد آردوینو اندیشیده اید؟ ما در این مطلب قصد داریم پس از معرفی هر یک از عملکردهای حرکتی یک ربات از طریق ریموت ASK ٬ مهارت راه اندازی و کنترل یک ربات را به طور کامل به شما دانش پژوه عزیز آموزش دهیم. کنترل از راه دور با فرکانس رادیویی (RF) و مکانیزم رانندگی، قسمت اصلی این ربات یا ماشین رادیو کنترل (RC) است. در مدار ریموت کنترل RF یک ماژول ASK با فرکانس 433 مگاهرتز ارزان قیمت وجود دارد، که شامل یک جفت ماژول فرستنده و گیرنده است. در این پروژه ماژول ASK، دادهها را با استفاده از یک کتابخانه آردوینو ارسال و دریافت میکند.
از آنجایی که فرستنده و گیرنده هردو برای برقراری ارتباط به کتابخانهی آردوینو نیاز دارند، لازم است که از دو برد آردوینو استفاده کنیم. مدار موردنظر شامل یک برد آردوینو UNO است ولی به جای آن میتوانید از هر برد آردوینو دیگری مانند pro mini، nano، micro و غیره یا حتی یک میکروکنترلر ATmega328p، برای کوچکتر و ارزانتر شدن پروژه استفاده کنید.
اگر ترجیح می دهید همه تجهیزات لازم دراین پروژه جذاب را در کوتاه ترین زمان بررسی و خرید نمایید٬ پیشنهاد ما به شما دانش پژوهان عزیز٬ بازدید از فروشگاه اینترنتی لوازم الکترونیک و رباتیک روبوایکیو از طریق لینک هر محصول در بخش زیر می باشد:
تجهیزات لازم برای کنترل از راه دور ربات با استفاده از ماژول ASK:
- ماژول فرستنده ASK فرکانس 433 مگاهرتز (۱عدد)
- ماژول گیرنده ASK فرکانس 433 مگاهرتز (۱ عدد)
- ماژول آردوینو UNO R3 (۲عدد)
- ماژول درایور موتور DC با آی سی L293D یا درایور L293D (۱ عدد)
- تک سوئیچ (۴ عدد)
- تعدادی سیم برد بوردی
- مقاومت ۱۰ کیلو اهم (۴ عدد)
- برد بورد (در صورت نیاز یک عدد)
مکانیزم راندن و کنترل جهت ماشین RC توسط دو موتور محرکه در انتهای ماشین انجام میشود، که جهت چرخش آنها میتواند به طور مستقل توسط یک درایور موتور کنترل شود. دو چرخ جلویی نیز آزاد هستند.
مزیت اصلی این ربات این است که میتوان با ایجاد تغییرات جزئی در کد یا مدار، قابلیتهای جدیدی را به آن اضافه کرد. از آن جایی که ارتباط RF از یک کتابخانهی انتقالِ داده استفاده میکند، هرگونه کنترل دیگر موتورها، چراغها و غیره هم میتواند به آن اضافه شود. همچنین با استفاده از یک جفت ماژول فرستنده و گیرنده ASK دیگر، ربات میتواند مقادیری مثل اطلاعات خوانده شده از سنسور، مختصات، پیام تایید و تصدیق و غیره را اندازهگیری و به گیرنده ارسال کند.
نحوه عملکرد ریموت کنترل یک ربات
در این بخش ابتدا با معرفی سخت افزاری یک ریموت کنترل آشنایی خود را آغاز می کنیم. ریموت کنترل عموماَ دارای دو جفت سوئیچ هستند که یک جفت از آنها برای به جلو و عقب راندن ربات و جفت سوئیچ دیگر هم برای تغییر جهت یا چرخش به چپ و راست است.
برای حرکت دادن ربات به سمت جلو یا عقب، فقط کافی است یکی از دکمههای جلو و عقب را فشار دهید. برای گردش به راست یا چپ در جهت جلو یا عقب هم، باید یکی از دکمههای چپ یا راست را همزمان با یکی از دکمههای جلو وعقب فشار دهید.
در ادامه نشان میدهیم که چگونه با فشردن همزمان دکمههای ریموت، میتوان از طریق تغییر جهت چرخها ربات را به جهتهای مختلف حرکت داد.
حرکت رو به جلو و عقب ربات
هنگامی که چرخها رو به جلو بچرخند، ربات RC مستقیم و روبه جلو حرکت میکند. در این حالت چرخ سمت راست در جهت عقربههای ساعت و چرخ سمت چپ در خلاف جهت عقربههای ساعت میچرخد.
برای حرکت به سمت عقب، هردو چرخ به سمت عقب میچرخند، یعنی چرخ سمت راست خلاف جهت عقربههای ساعت و چرخ سمت چپ در جهت عقربههای ساعت میچرخد.
گردش به راست یا چپ
در اینجا چرخاندن ربات به راست و چپ درهردو حرکت روبه جلو و عقب از طریق متوقف کردن چرخش یکی از موتورها حاصل میشود.
- حرکت به سمت جلو و چپ به این شکل است که چرخ سمت راست به حرکتش روبه جلو یا درجهت عقربههای ساعت ادامه میدهد ولی چرخ سمت چپ متوقف میشود.
- حرکت به سمت جلو و راست هم زمانی اتفاق میافتد که چرخ سمت چپ به جلو یا خلاف جهت عقربههای ساعت می چرخد ولی چرخ راست متوقف میشود.
برای چرخش ربات رادیو کنترل به سمت راست، چرخش موتور سمت راست متوقف شده و به موتور سمت چپ اجازه داده میشود تا چرخش در خلاف جهت عقربههای ساعت را ادامه دهد. به همین ترتیب، برای چرخش ربات به سمت چپ، چرخ سمت چپ متوقف و چرخ سمت راست به چرخش خود ادامه میدهد. این گردشها می تواند در هر دو حرکات رو به جلو و عقب اعمال شود. از این رو وسیله نقلیه میتواند در طول راندن روبه جلو و عقب به سمت چپ و راست هم چرخانده شود.
- حرکت به سمت عقب و چپ: چرخ سمت راست به عقب یا خلاف جهت عقربههای ساعت میچرخد، چرخ چپ نیز متوقف میشود.
- حرکت به سمت عقب و راست: چرخ سمت چپ به عقب یا در جهت عقربههای ساعت میچرخد، چرخ راست نیز متوقف میشود.
همچنین به جای توقف چرخ میتوان جهت را با کاهش سرعت موتور یا چرخاندن آن در جهت مخالف تغییر داد.
راه اندازی بخش فرستنده یا ریموت کنترل
همانطور که در تصویر زیر قابل مشاهده می باشد٬ مدار فرستنده عمدتاً دارای تنها 4 سوئیچ ورودی، یک ماژول فرستنده ASK و یک برد آردوینو است. آردوینو فرستنده با استفاده از کتابخانه Radiohead، کلمات یا آرایهای کاراکتری را از طریق ماژول ASK برای ورودی سوئیچ مربوطه به گیرنده ارسال میکند؛ هر کلمه یک پیام یا دستور برای یک عمل خاص است.
هم اکنون می توانید با تجهیزاتی که تهیه نموده اید سیم بندی ریموت کنترل ربات خود را به سادگی انجام دهید:
کدنویسی سمت فرستنده
در این مرحله نوبت به آپلود کد زیر در IDE آردوینو مربوط به فرستنده می رسد٬ پس از اتمام این کار به سراغ راه اندازی و تنظیم بخش گیرنده ربات خود می رویم:
#include <RH_ASK.h>
#include <SPI.h>
const int forward_switch = 2, reverse_switch = 3, left_switch = 4, right_switch = 5;
int state = 0;
char *msg;
RH_ASK driver;
void setup()
{
driver.init();
pinMode(forward_switch, INPUT);
pinMode(reverse_switch, INPUT);
pinMode(left_switch, INPUT);
pinMode(right_switch, INPUT);
}
void loop()
{
while (digitalRead(forward_switch) == HIGH && digitalRead(left_switch) == LOW
&& digitalRead(right_switch) == LOW) {
msg = "forward";
transmit(msg);
}
while (digitalRead(reverse_switch) == HIGH && digitalRead(left_switch) == LOW
&& digitalRead(right_switch) == LOW) {
msg = "reverse";
transmit(msg);
}
while (digitalRead(forward_switch) == HIGH && digitalRead(left_switch) == HIGH) {
msg = "forward_left";
transmit(msg);
}
while (digitalRead(forward_switch) == HIGH && digitalRead(right_switch) == HIGH) {
msg = "forward_right";
transmit(msg);
}
while (digitalRead(reverse_switch) == HIGH && digitalRead(left_switch) == HIGH) {
msg = "reverse_left";
transmit(msg);
}
while (digitalRead(reverse_switch) == HIGH && digitalRead(right_switch) == HIGH) {
msg = "reverse_right";
transmit(msg);
}
}
void transmit(char* msg) {
driver.send((uint8_t *)msg, strlen(msg));
driver.waitPacketSent();
delay(100);
}
ساخت و راه اندازی گیرنده یا ربات (ماشین رادیو کنترل)
قسمت گیرنده در این پروژه همانطور که در تصویر زیر پیداست٬ شامل یک برد آردوینو، گیرنده ASK و دو موتور است که توسط درایور موتور L293D هدایت میشوند.
درایور موتور برای تغذیه موتورها به منبع خارجی نیاز دارد که میتواند به درایور L293D متصل شود. برای آشنایی با درایور موتور L293D می توانید مقاله “ کنترل و راه اندازی استپر موتور با درایور موتور L293D و آردوینو” را مطالعه نمایید.
کدنویسی سمت گیرنده:
در این بخش نیز لازم است تکه کد زیر را در IDE آردوینو سمت گیرنده٬ آپلود نماییم
#include <RH_ASK.h>
#include <SPI.h>
RH_ASK driver;
const int motor_1a = 7, motor_1b = 6, motor_2a = 5, motor_2b = 4;
char receive[32];
unsigned long last = 0;
void setup()
{
driver.init();
pinMode(motor_1a, OUTPUT);
pinMode(motor_1b, OUTPUT);
pinMode(motor_2a, OUTPUT);
pinMode(motor_2b, OUTPUT);
}
void loop()
{
uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
uint8_t buflen = sizeof(buf);
if (driver.recv(buf, &buflen))
{
last = millis();
memset(receive, 0, sizeof(receive));
for (int i = 0; i < buflen; i++) {
receive[i] = buf[i];
}
if (strcmp(receive, "forward") == 0) {
forward();
}
else if (strcmp(receive, "reverse") == 0) {
reverse();
}
else if (strcmp(receive, "forward_left") == 0) {
forward_left();
}
else if (strcmp(receive, "forward_right") == 0) {
forward_right();
}
else if (strcmp(receive, "reverse_left") == 0) {
reverse_left();
}
else if (strcmp(receive, "reverse_right") == 0) {
reverse_right();
}
}
if ((millis() - last) > 300) {
brake();
}
}
void forward() {
digitalWrite(motor_1a, HIGH);
digitalWrite(motor_1b, LOW);
digitalWrite(motor_2a, HIGH);
digitalWrite(motor_2b, LOW);
}
void reverse() {
digitalWrite(motor_1a, LOW);
digitalWrite(motor_1b, HIGH);
digitalWrite(motor_2a, LOW);
digitalWrite(motor_2b, HIGH);
}
void forward_left() {
digitalWrite(motor_1a, LOW);
digitalWrite(motor_1b, LOW);
digitalWrite(motor_2a, HIGH);
digitalWrite(motor_2b, LOW);
}
void forward_right() {
digitalWrite(motor_1a, HIGH);
digitalWrite(motor_1b, LOW);
digitalWrite(motor_2a, LOW);
digitalWrite(motor_2b, LOW);
}
void reverse_left() {
digitalWrite(motor_1a, LOW);
digitalWrite(motor_1b, LOW);
digitalWrite(motor_2a, LOW);
digitalWrite(motor_2b, HIGH);
}
void reverse_right() {
digitalWrite(motor_1a, LOW);
digitalWrite(motor_1b, HIGH);
digitalWrite(motor_2a, LOW);
digitalWrite(motor_2b, LOW);
}
void brake() {
digitalWrite(motor_1a, LOW);
digitalWrite(motor_1b, LOW);
digitalWrite(motor_2a, LOW);
digitalWrite(motor_2b, LOW);
}
بهتر است به نکات زیر نیز توجه نمایید تا بهترین نتیجه ممکن را از این پروژه چالش برانگیز به دست آوردید:
- برای سیم کشی آسان بین آردوینو و درایور موتور L293D، می توانید تنها دستورات digitalwrite مربوط به وضعیت پینها از تابع forward را اجرا کنید تا جهت چرخش را بیابید. زمانی که سیمهای ورودی موتور وصل میشوند تا جهت چرخش رو به جلو دریافت شود، چرخش در جهت دیگر نیز مانند کد عمل میکند.
- حرکات مختلف با ترکیب فشردن سوئیچها را میتوان به راحتی با تغییر کد فرستنده و گیرنده اعمال کرد. در کد بالا، اگر کلید چپ یا راست به تنهایی و بدون فشردن کلید جلو یا عقب فشار داده شود، ربات بدون حرکت باقی میماند.
اما با تغییرات ساده در کد، میتوان موتور را بدون هیچ گونه حرکت روبه جلو یا عقبی و فقط با فشردن کلیدهای چپ یا راست، به چرخش و حرکت در جهت چپ یا راست دراورد.
- برای چرخش ساعتگرد ربات می توانید هر دو موتور سمت راست و چپ را در خلاف جهت عقربههای ساعت بچرخانید. موتور سمت راست را به صورت پادساعتگرد و موتور سمت چپ را رو به جلو حرکت دهید.
- برای چرخش پادساعتگرد ربات می توانید هر دو موتور سمت راست و چپ را در جهت عقربههای ساعت بچرخانید. موتور سمت راست را به صورت ساعتگرد و موتور سمت چپ را در خلاف جهت عقربه های ساعت بچرخانید.
۴ دیدگاه. Leave new
با سلام و احترام.
مطلب آموزشی خیلی خوبی است.من تمام مطالب شما و آموزش های شما را دنبال و اجرا میکنم.واقعا کار شما در کشور عزیز ما ایران بسیار بسیار تاثیر گذار بوده و خواهد بود.از خدای مهربان بی نهایت سپاسگزارم و بنده حقیر برایتان دعا مینمایم که افرادی مثل شما و تیم فعال و زحمتکش روبوایکیو در راه تعالی علم و دانش، فعالیتهای بسیار مثبت و چشمگیر می نمایید.با تشکر فراوان از شما
سلام و درود خدمت شما همراه همیشگی روبوایکیو
ما همواره قدردان حضور پررنگ و مؤثر شما هستیم و خواهیم بود، انشالله در این مسیر دوستانی چون شما به جمع ما اضافه شوند و این انگیزه برای کمک به رشد و شکوفایی استعداد ناب دانش پژوهان این آکادمی نیز قوی و راسخ باقی بماند.
موفق و پیروز باشید
سلام . چطور این پروژه را با l298 انجام بدهم ؟؟
سلام امیرحسین عزیز
لطفاً سوالتون رو با جزئیات بیشتری مطرح کنید. برای جایگزینی ماژول درایور موتور دقیقا در چه بخشی (نحوه اتصال، کد، …) ابهام دارید؟