آموزش ساخت ربات مریخ نورد
در این بخش ، آموزش ساخت یک مدل بسیار ساده شده ی ساخت ربات مریخ نورد را ارائه خواهیم کرد .
سیاره مریخ برای قرن ها تخیل ما را مجذوب خود کرده است و ایده ارسال مریخ نوردها برای کاوش در سطح آن، کنجکاوی ما را بیش از پیش تقویت کرده است. در این پروژه، ما به دنیای هیجان انگیز رباتیک می پردازیم و نحوه ساخت مریخ نورد مبتنی بر آردوینو با قابلیت عبور از زمین های مختلف را نشان خواهیم داد.
بنابراین، کمربند ایمنی خود را ببندید تا سفر هیجان انگیز ساخت مریخ نورد خودمان را آغاز کنیم.
در این مقاله، تمرکز ما بر روی ایجاد مریخ نورد با بلوتوث آردوینو است. یک هدف این آموزش ارائه یک توضیح گام به گام روشن از ساخت شاسی مریخ نورد تا برنامه ریزی و آزمایش آن است. وظیفه اصلی ما شامل آموزش کدنویسی است که به زبان برنامه نویسی C یا C++ نوشته شده است. میکروکنترلر آردوینو کد را کامپایل و اجرا می کند و به مریخ نورد این امکان را می دهد تا مطابق مشخصات مورد نظر ما عمل کند.
توضیحات طراحی مریخ نورد
قبل از اینکه به جنبههای فنی بپردازیم، بیایید لحظهای به درک طراحی مریخنورد بپردازیم. یک مریخ نورد معمولی باید در مناظر چالش برانگیز سطح مریخ حرکت کند. برای دستیابی به این هدف، ما بر روی ساخت یک مریخ نورد با سیستم ۶ چرخ محرک با سیستم تعلیق مناسب تمرکز خواهیم کرد تا از تحرک و پایداری مطلوب برای مریخ نورد اطمینان حاصل کنیم.
شاسی مریخ نورد به عنوان پایه ای برای کل وسیله نقلیه عمل می کند. باید محکم، بادوام و قابلیت عبور از زمین های مختلف را داشته باشد و همچنین باید قطعات الکترونیکی مختلف مانند برد آردوینو، منبع تغذیه و ماژول های کنترل موتور را در خود جای دهد.
من قطعات شاسی اکریلیک را با استفاده از SolidWorks ایجاد کردم و برش لیزری را برای ساخت مریخ نورد خود انجام دادم. من فایل های .dxf را برای پروژه مریخ نورد پیوست می کنم که می توانید از آن برای برش لیزری استفاده کنید. این ویدئو روند مونتاژ مریخ نورد را نشان می دهد.
قطعات مورد نیاز مریخ نورد
شاسی برش اکریلیک مریخ نورد
۶ موتور و چرخ BO
آردوینو اونو
ماژول درایور موتور L298n
ماژول بلوتوث HC-05
باتری ۱۲ ولت لیتیوم یونی با کانکتور
گیره L (8 عدد )
مهره و پیچ و مهره ۱۰ میلی متری M4 (8 عدد )
مهره و پیچ و مهره ۱۰ میلی متری M3 (12 عدد )
مهره و پیچ و مهره ۳۰ میلی متری M3 (12 عدد )
سوئیچ و اتصال سیم ها
ماژول درایور موتور L298N
ماژول درایور موتور L298N یک ماژول راه انداز موتور است که معمولاً در پروژه های رباتیک و الکترونیک استفاده می شود. این ماژول مبتنی بر مدار مجتمع L298n است، دارای دو مدار پل H، یکی برای هر کانال موتور است که امکان کنترل دو جهته موتورها را فراهم می کند. با ارائه سیگنال های منطقی مناسب به پایه های کنترل ماژول، می توانید سرعت و جهت موتور را کنترل کنید. از آنجایی که ما از سیگنال PWM تولید شده توسط آردوینو برای کنترل سرعت موتورها استفاده نمی کنیم، آنها با حداکثر سرعت خود کار خواهند کرد. دلیل این امر این است که ما پین های ENA و ENB را که مربوط به کنترل PWM هستند، در حالت ثابت روی برد نگه می داریم. بنابراین، هدف اصلی ماژول درایور موتور در این تنظیمات، تغییر جهت چرخش موتورها است. این قابلیت ربات را قادر می سازد در هر چهار جهت از جمله جلو، عقب، چپ و راست حرکت کند.
Pinout درایور موتور L298N
ماژول درایور موتور L298N دارای پین اوت خاصی است که با عملکردهای مختلف آن مطابقت دارد. در اینجا توضیحات پین اوت ماژول درایور موتور L298N آمده است.
VCC : این پین برای اتصال یک منبع تغذیه خارجی (تا ۱۲ ولت) برای تغذیه موتورها استفاده می شود.
GND : این پایه اتصال زمین برای ماژول است و باید به زمین منبع تغذیه و منبع سیگنال کنترل (آردوینو) متصل شود.
۵V : این پین یک خروجی ۵ ولتی تنظیم شده را ارائه می دهد که می تواند برای تغذیه اجزای خارجی یا تامین ولتاژ منطقی به منبع سیگنال کنترل استفاده شود.
ENA : این پین برای فعال یا غیرفعال کردن موتور متصل به کانال A و کانال B استفاده می شود و وظیفه کنترل سرعت موتور را از طریق سیگنال های PWM (Pulse Width Modulation) بر عهده دارد.
IN1 , IN2 , IN3 , IN4: این پایه ورودی برای کنترل جهت چرخش موتور متصل به کانال A، به طور مشابه IN3 و IN4 برای کانال B استفاده می شود. با ارائه سطوح منطقی مناسب (HIGH یا LOW)، می توانید جهت مورد نظر را تنظیم کنید. این پایه ها برای دریافت سیگنال (HIGH یا LOW) به پین های دیجیتال آردوینو متصل می شوند.
OUT1 , OUT2 : پین ذکر شده برای اتصال موتورها در نظر گرفته شده است. به طور خاص، یک موتور باید به OUT-1 و OUT-2 وصل شود در حالی که موتور دیگر باید به OUT-3 و OUT-4 متصل شود. لازم به ذکر است که موتورها را می توان در محدوده ولتاژ ۵ تا ۳۵ ولت متصل کرد. با این حال، شایان ذکر است که کاهش تقریبی ۲ ولت در ولتاژ خروجی در مقایسه با ولتاژ اعمال شده به پین Vcc وجود خواهد داشت.
ماژول بلوتوث HC-05
HC-05 یک ماژول بلوتوث پرکاربرد است که روشی راحت و قابل اعتماد برای افزودن قابلیت های ارتباط بی سیم به دستگاه های الکترونیکی ارائه می دهد. از ارتباط سریال از طریق پروتکل UART (گیرنده-فرستنده ناهمزمان جهانی) پشتیبانی می کند.
ماژول HC-05 از مشخصات بلوتوث نسخه ۲٫۰ پشتیبانی می کند و بسته به برنامه مورد نظر می تواند به عنوان یک دستگاه Master یا Slave از طریق دستورات AT پیکربندی شود. در حالت Master، می تواند اتصالات را با سایر دستگاه های بلوتوث آغاز کند، در حالی که در حالت Slave، می تواند اتصالات ورودی را بپذیرد.
HC-05 Pinout
ماژول بلوتوث HC-05 دارای یک پین اوت خاص است که با عملکردهای مختلف آن مطابقت دارد. در اینجا توضیحات پین اوت ماژول بلوتوث HC-05 آمده است.
VCC : این پین برای تامین برق ماژول استفاده می شود. معمولاً در محدوده ولتاژ ۳٫۳ تا ۶ ولت کار می کند.
GND : این پایه اتصال زمین ماژول است و باید به زمین منبع تغذیه و منبع سیگنال کنترل متصل شود.
TXD : این پین ، پین انتقال داده است و برای ارسال اطلاعات از ماژول به دستگاه دیگر استفاده می شود. باید به پین دریافت (RX) دستگاه گیرنده متصل شود.
RDX : این پین پین دریافت اطلاعات است و برای دریافت اطلاعات از دستگاه دیگری استفاده می شود. باید به پین انتقال (TX) دستگاه فرستنده متصل شود.
STATE : این پین یک پین اختیاری است که می توان از آن برای بررسی وضعیت ماژول استفاده کرد. می توان آن را طوری پیکربندی کرد که اطلاعات مربوط به وضعیت اتصال ماژول یا سایر اطلاعات مرتبط را ارائه دهد.
EN : این پین برای فعال یا غیرفعال کردن ماژول (حالت Command & Data) استفاده می شود. هنگامی که این پین بالا (۳٫۳ ولت یا ۵ ولت) کشیده می شود، ماژول فعال می شود (حالت فرمان)، و هنگامی که آن را LOW (0 ولت یا GND) کشیده می شود، ماژول غیرفعال می شود (حالت داده).
مونتاژ شاسی مریخ نورد
ما از یک ورق اکریلیک برش با لیزر برای ایجاد شاسی برای پروژه خود استفاده کرده ایم. ورق دقیقاً برش داده شده است تا تمام اتصالات و اجزای لازم را در خود جای دهد و امکان مونتاژ آسان با استفاده از پیچ گوشتی را فراهم می کند.
با کمک پیچ و مهره های ۱۰ میلی متری M4 پایه عقب را به پایه جلو متصل کنید
جفت پای جلو و عقب را با صفحه پایه با کمک گیره L با مهره ها و پیچ های ۱۰ میلی متری M3، M4 وصل کنید.
موتورها را با هر دو پایه به محل مناسب خود با مهره و پیچ و مهره ۳۰ میلی متری M3 وصل کرد.
تمام قطعات الکترونیکی را با چسب دو طرفه در محل مناسب خود قرار دهید.
نمودار مدار مریخ نورد با بلوتوث کنترل شده آردوینو
در اینجا شماتیک یک مریخ نورد کنترل شده با بلوتوث را مشاهده می کنید. در این طرح مجموعاً شش موتور داریم که سه موتور به صورت موازی در سمت راست و سه موتور به صورت موازی در سمت چپ متصل می شوند. این پیکربندی به هر سه موتور در هر طرف اجازه می دهد تا به طور همزمان کار کنند و با سرعت یکسان و در یک جهت کار کنند. با اتصال موازی آنها، اطمینان حاصل می کنیم که سیگنال های کنترلی و منبع تغذیه یکسان را دریافت می کنند. این ترتیب حرکت کارآمد و هماهنگ را برای مریخ نورد امکان پذیر می کند و قدرت مانور و پایداری آن را افزایش می دهد.
اتصالات :
ماژول بلوتوث آردوینو و HC-05:
پایه TX ماژول بلوتوث را به پایه RX (معمولاً پایه دیجیتال ۰) آردوینو وصل کنید.
پایه RX ماژول بلوتوث را به پایه TX (معمولاً پایه دیجیتال ۱) آردوینو وصل کنید.
پایه های VCC و GND ماژول بلوتوث را به برق مناسب (+۵ ولت) و پایه های زمین در آردوینو وصل کنید.
آردوینو و ماژول درایور موتور:
پایه های خروجی دیجیتال آردوینو (پایه های دیجیتال ۱۰، ۹، ۸ و ۷) را به پایه های ورودی مناسب (IN1، IN2، IN3، و IN4) در ماژول درایور موتور متصل کنید.
پین های ENA و ENB ماژول درایور موتور را با کمک هدر ماده به پین High State روی برد متصل کنید.
پایه های OUT1، OUT2، OUT3 و OUT4 ماژول درایور موتور را به پایانه های مناسب موتورها وصل کنید.
پایه های VCC (+5V) و GND ماژول درایور موتور را به اتصالات مناسب برق (Vin) و زمین (GND) در آردوینو وصل کنید.
منبع تغذیه:
ترمینال مثبت منبع تغذیه را به ورودی +۱۲ ولت ماژول درایور موتور وصل کنید.
ترمینال منفی منبع تغذیه را به پایه GND ماژول درایور موتور وصل کنید.
پایه GND آردوینو را به پایه GND ماژول درایور موتور وصل کنید.
توضیح کد های برنامه :
در اینجا کد کنترل کننده ی ساده ی مریخ نورد را قرار داده ایم .
پیکربندی پین : پین های روی برد آردوینو که به ماژول درایور موتور و سایر اجزا وصل شده اند تعریف شده اند. این مرحله تضمین می کند که از پین های صحیح برای کنترل موتور و سایر عملیات استفاده می شود.
ما پین های IN1، IN2، IN3 و IN4 را به صورت ۱۰،۹،۸ و ۷ پایه دیجیتال آردوینو تعریف کرده ایم. این پایه ها به پایه های ورودی ماژول درایور موتور متصل می شوند.
int state=0;
const int motorpin11=10; // L298n #NI1
const int motorpin12=9; // L298n #NI2
const int motorpin21=8; // L298n #NI3
const int motorpin22=7; // L298n #NI4
Setup: تابع setup فقط یک بار در ابتدای اجرای کد اجرا می شود. وظیفه پیکربندی پروتکل های ارتباطی، تنظیم حالت های پین و مقداردهی اولیه متغیرها را بر عهده دارد
در تابع setup() با مقداردهی اولیه ارتباط سریال سخت افزاری با نرخ باود ۹۶۰۰ شروع می کنیم. این به آردوینو اجازه می دهد تا با دستگاه های خارجی مانند ماژول بلوتوث با سرعت انتقال داده مشخص شده ارتباط برقرار کند.
در مرحله بعد، ما حالت های پین را برای پین های کنترل جهت مورد استفاده برای کنترل موتور تنظیم می کنیم. این پین ها برای کنترل حرکت و جهت موتورها پیکربندی شده اند. با تنظیم اولیه آنها بر روی LOW، اطمینان حاصل می کنیم که موتورها در شروع اجرای برنامه در حالت توقف هستند. این امر از هرگونه حرکت ناخواسته موتورها قبل از دریافت هر گونه دستور یا دستورالعمل جلوگیری می کند.
راهاندازی ارتباط سریال سختافزاری و تنظیم حالتهای پین مناسب، مراحلی حیاتی در آمادهسازی آردوینو برای کنترل مناسب موتور و اطمینان از کنترل و ثابت بودن حالت اولیه موتور هستند.
void setup() {
Serial.begin(9600);
pinMode(motorpin11,OUTPUT);
pinMode(motorpin12,OUTPUT);
pinMode(motorpin21,OUTPUT);
pinMode(motorpin22,OUTPUT);
digitalWrite(motorpin11,LOW);
digitalWrite(motorpin12,LOW);
digitalWrite(motorpin21,LOW);
digitalWrite(motorpin22,LOW);
}
LOOP : تابع حلقه پس از اتمام نصب به طور مداوم اجرا می شود. این تابع شامل منطق اصلی برنامه است که رفتار مریخ نورد را بر اساس دستورات دریافتی تعریف می کند.
تابع حلقه () یا LOOP به طور مداوم دستورات دریافتی از ماژول بلوتوث را بررسی می کند. بسته به فرمان دریافتی، مریخ نورد به جلو، عقب، گردش به چپ، گردش به راست یا توقف حرکت می کند.
کد به سیگنال های بلوتوث ورودی گوش می دهد و دستورات را از یک دستگاه جفت شده دریافت می کند. این می تواند شامل دستورالعمل هایی برای حرکت به جلو، عقب، چرخش به چپ یا راست، یا توقف مریخ نورد باشد.
void loop()
{ if (Serial.available()>0)
state=Serial.read();
{
دستورات دریافتی به سیگنال های کنترل موتور مناسب ترجمه می شوند. کد سیگنال های لازم را به ماژول راننده موتور ارسال می کند و جهت ها را مطابق دستورالعمل تنظیم می کند.
if (state=='F') {
digitalWrite(motorpin11,HIGH);
digitalWrite(motorpin12,LOW); // Forward motion of rover
digitalWrite(motorpin21,HIGH);
digitalWrite(motorpin22,LOW);
}
else if(state=='B') {
digitalWrite(motorpin11,LOW);
digitalWrite(motorpin12,HIGH); // Backward motion of rover
digitalWrite(motorpin21,LOW);
digitalWrite(motorpin22,HIGH);
}
else if(state=='S') {
digitalWrite(motorpin11,LOW);
digitalWrite(motorpin12,LOW); // Stop
digitalWrite(motorpin21,LOW);
digitalWrite(motorpin22,LOW);
}
else if(state=='L') {
digitalWrite(motorpin11,HIGH);
digitalWrite(motorpin12,LOW); // Left motion of rover
digitalWrite(motorpin21,LOW);
digitalWrite(motorpin22,HIGH);
}
else if(state=='R')
{
digitalWrite(motorpin11,LOW);
digitalWrite(motorpin12,HIGH); // Right motion of rover
digitalWrite(motorpin21,HIGH);
digitalWrite(motorpin22,LOW);
}
else if(state=='l')
{
digitalWrite(motorpin11,LOW);
digitalWrite(motorpin12,HIGH); // Backward Left motion of rover
digitalWrite(motorpin21,HIGH);
digitalWrite(motorpin22,LOW);
}
else if(state=='r')
{
digitalWrite(motorpin11,HIGH);
digitalWrite(motorpin12,LOW); // Backward Right motion of rover
digitalWrite(motorpin21,LOW);
digitalWrite(motorpin22,HIGH);
}
}}
داده های دریافتی با استفاده از دستورات if و else if مقایسه می شوند که امکان اجرای مشروط عبارات خاص را بر اساس ارزیابی این شرایط فراهم می کند. در این عبارات شرطی، ما هفت تابع حرکتی مختلف را تعریف کردهایم که با اقدامات مختلف مریخنورد مطابقت دارد. این توابع در داخل دستورات if بر اساس شرایط خاص فراخوانی می شوند. هر تابع وظیفه کنترل یک حرکت خاص مانند حرکت به جلو، عقب، چرخش به چپ یا راست، توقف، عقب به چپ و عقب به راست را بر عهده دارد. با سازماندهی کد به این روش، میتوانیم عملکرد را مدولار کنیم و درک و نگهداری آن را آسانتر کنیم. عبارات شرطی تضمین می کنند که تابع حرکت مناسب زمانی که شرط مربوطه بر اساس داده های دریافتی برآورده می شود، اجرا می شود. به طور خلاصه، دستور if و else if کد را قادر می سازد تا داده های دریافتی را ارزیابی کند و تابع حرکت مربوطه را بر اساس شرایط انجام شده اجرا کند و کنترل دقیق و مانورپذیری مریخ نورد را تسهیل می کند.
برنامه اندروید را برای کنترل مریخ نورد تنظیم کنید
برای اتصال ماشین کنترلشده با بلوتوث به تلفن خود، این مراحل را دنبال کنید: برنامه «Bluetooth RC Car» را در دستگاه Android خود باز کنید. لطفا توجه داشته باشید که در حال حاضر، این برنامه فقط برای کاربران اندروید در دسترس است. بلوتوث گوشی خود را با رفتن به تنظیمات گوشی خود روشن کنید. گوشی خود را به ماژول بلوتوث HC-05 وصل کنید. اگر یک ماژول HC-05 جدید دارید، یک مرحله اضافی قبل از اتصال وجود دارد. به تنظیمات بلوتوث گوشی خود بروید. دستگاه های بلوتوث را جستجو کنید. یک دستگاه بلوتوث به نام HC-05 پیدا خواهید کرد. با انتخاب دستگاه بلوتوث با تلفن خود آن را جفت کنید. در طول فرآیند جفت شدن، از شما خواسته می شود یک رمز عبور وارد کنید. رمز عبور پیش فرض برای HC-05 معمولاً ۱۲۳۴ یا ۰۰۰۰ است. رمز عبور را وارد کرده و فرآیند جفت شدن را ادامه دهید. پس از موفقیت آمیز شدن جفت شدن، مریخ نورد کنترل شده با بلوتوث شما اکنون به دستگاه اندرویدی شما متصل است.
با دنبال کردن این مراحل، میتوانید بین تلفن خود و ماژول بلوتوث مریخنورد ارتباط برقرار کنید و به شما این امکان را میدهد تا با استفاده از برنامه «Bluetooth RC Car» بهصورت بیسیم آن را کنترل کنید.
جمع بندی
تبریک می گویم! شما با موفقیت مریخ نورد مبتنی بر آردوینو خود را ساختید. اکنون زمان آن رسیده است که به آن اجازه پرسه زدن و کاوش را بدهید. مریخ نورد خود را به مناطق مختلف ببرید، آزمایشها را انجام دهید و دادههای ارزشمند را جمعآوری کنید. با استفاده از تلفن هوشمند یا سایر دستگاه های دارای بلوتوث آن را به صورت بی سیم کنترل کنید و نحوه مانور آن را در چالش ها مشاهده کنید.
ساخت مریخنورد آردوینو فرصتی هیجانانگیز برای بررسی روباتیک، الکترونیک و برنامهنویسی ارائه میدهد. این به ما امکان می دهد تا کاوش سیارات دوردست را شبیه سازی کنیم و کنجکاوی ما را در مورد اسرار جهان بر می انگیزد. بنابراین، ابزارهای خود را بردارید، خلاقیت خود را آزاد کنید و با مریخ نورد خودتان وارد این سفر هیجان انگیز ساختن و کاوش شوید!
کد کامل ربات مریخ نورد
int state=0;
const int motorpin11=10; // L298n #NI1
const int motorpin12=9; // L298n #NI2
const int motorpin21=8; // L298n #NI3
const int motorpin22=7; // L298n #NI4
void setup() {
pinMode(motorpin11,OUTPUT);
pinMode(motorpin12,OUTPUT);
pinMode(motorpin21,OUTPUT);
pinMode(motorpin22,OUTPUT);
digitalWrite(motorpin11,LOW);
digitalWrite(motorpin12,LOW);
digitalWrite(motorpin21,LOW);
digitalWrite(motorpin22,LOW);
Serial.begin(9600);
}
void loop() {
if (Serial.available()>0)
state=Serial.read();
{
if (state=='F')
{
digitalWrite(motorpin11,HIGH);
digitalWrite(motorpin12,LOW); // Forward motion of rover
digitalWrite(motorpin21,HIGH);
digitalWrite(motorpin22,LOW);
}
else if(state=='B')
{
digitalWrite(motorpin11,LOW);
digitalWrite(motorpin12,HIGH); // Backward motion of rover
digitalWrite(motorpin21,LOW);
digitalWrite(motorpin22,HIGH);
}
else if(state=='S')
{
digitalWrite(motorpin11,LOW);
digitalWrite(motorpin12,LOW); // Stop
digitalWrite(motorpin21,LOW);
digitalWrite(motorpin22,LOW);
}
else if(state=='L')
{
digitalWrite(motorpin11,HIGH);
digitalWrite(motorpin12,LOW); // Left motion of rover
digitalWrite(motorpin21,LOW);
digitalWrite(motorpin22,HIGH);
}
else if(state=='R')
{
digitalWrite(motorpin11,LOW);
digitalWrite(motorpin12,HIGH); // Right motion of rover
digitalWrite(motorpin21,HIGH);
digitalWrite(motorpin22,LOW);
}
else if(state=='l')
{
digitalWrite(motorpin11,LOW);
digitalWrite(motorpin12,HIGH); // Backward Left motion of rover
digitalWrite(motorpin21,HIGH);
digitalWrite(motorpin22,LOW);
}
else if(state=='r')
{
digitalWrite(motorpin11,HIGH);
digitalWrite(motorpin12,LOW); // Backward Right motion of rover
digitalWrite(motorpin21,LOW);
digitalWrite(motorpin22,HIGH);
}
}}