آردوینو، نام بردهای الکترونیکی کوچکی است که توسط شرکت ایتالیایی Arduino در چندین مدل، طراحی و عرضه شدهاند. با استفاده از این بردهای مبتنی بر میکروکنترلر که اپنسورس نیز هستند، میتوان پروژههای گوناگون و متنوعی را توسعه داد. بهطور مثال، میتوان از آنها در ترکیب با سایر ماژولها و قطعات، در فرایند ساخت ربات با آردوینو، وسایل اینترنت اشیا، ساخت رادیو کنترل با آردوینو برای هدایت انواع سیستمها و رباتها، ساخت بازی با آردوینو، پهپادها، دستگاههای بهکار رفته در هوشمندسازی منازل و بسیاری از پروژههای الکترونیکی جذاب و کاربردی دیگر کمک گرفت. این بردها همچنین دارای محیط کدنویسی و IDE مخصوص به خود هستند که با زبانی شبیه به زبان برنامه نویسی C++ میتوان آنها را کدنویسی و برای انجام وظایف مورد نظر برنامهریزی کرد. در این نوشتار از مجله فرادرس، نحوه ساخت ربات با آردوینو را بهصورت گام به گام و به زبان ساده برای شما توضیح دهیم.
آردوینو این قابلیت را در اختیار شما میدهد تا ماژولها و سنسورهای مختلف را به آن متصل کنید. بدینترتیب توانایی دریافت اطلاعات دیجیتال یا آنالوگ از محیط را پیدا میکنند. سپس این دادهها توسط میکروکنترلر روی بورد، که به نوعی مغز بردهای آردوینو محسوب میشوند، پردازش شده و با توجه به هدفی که دارید و برنامهای که روی میکروکنتر آردوینو نوشتهاید میتوانید از طریق خروجیهای این بورد، عمل مورد نظر را انجام دهید. بهطور مثال، در ساخت ربات ماشین کنترلی با آردوینو، پینهای خروجی روی این بورد میتوانند به درایور موتور DC ربات وصل شوند و با فرمان شما، این موتورها شروع به حرکت کنند و بیشمار عمل دیگری که میتوانید از این طریق انجام دهید. در این مطلب قصد داریم تا مراحل ساخت ربات با آردوینو که در واقع یک ماشین کنترلی است را با هم مرور کنیم. به این صورت که ابتدا وسایل و قطعات لازم، به شما معرفی میشوند و سپس، نحوه سرهم کردن، انجام اتصالات، برنامهنویسی و پروگرام بورد آردوینو را به شما توضیح میدهیم.
ساخت ربات با آردوینو چگونه است؟
با تهیه یک بورد آردوینو از مدلهای موجود در بازار و همچنین فراهم کردن سایر قطعات مرتبط با رباتی که در ذهن دارید، میتوانید خیلی راحت ربات مدنظر خود را با آردوینو بسازید. ازجمله رباتهایی که میتوانید با آردوینو بسازید میتوان به ربات تعقیب کننده خط یا ربات مسیریاب، ربات تشخیص موانع، ربات ماشین، کوادکوپتر، ربات نوازنده پیانو، ربات شطرنجباز و بسیاری موارد دیگر اشاره کرد.
ربات ماشین کنترلی با آردوینو
در این نوشتار قصد داریم تا نحوه ساخت یک ربات خودرو با آردوینو را به شما آموزش دهیم. این ربات در واقع یک ماشین کنترلی ساده است و قابلیت حرکت به جهات گوناگون جلو، عقب و همچنین چرخش به طرفین را دارد. تصویری که در زیر مشاهده میکنید، نمایی از ربات ساخته شده با آردوینو و دسته کنترل آن را نشان میدهد.
یادگیری آردوینو با فرادرس چگونه است؟
در صورتیکه قصد ورود به حوزه برنامهنویسی میکروکنترلرها و پیادهسازی طیف گستردهای از پروژههای الکترونیکی کاربردی و جذاب را دارید، پیشنهاد میکنیم تا دانش و مهارت استفاده از پلتفرمهایی مانند آردوینو را یاد بگیرید. جدای از اینکه ممکن است فردی با سن کم و کنجکاو در این زمینه باشید یا حتی کسیکه سنی بسیار بالاتر دارد و میخواهد که در این حوزه از تکنولوژی عقب نماند، در هر صورت، یادگیری و کسب مهارت استفاده از آردوینو بسیار آسان است و با انتخاب منبعی مناسب برای یادگیری، احتمالاً آن را بهسادگی پشت سر خواهید گذاشت. این پلتفرم سختافزاری و نرمافزاری اپنسورس، ضمن اینکه میتواند برای مقاصد آموزشی استفاده شود، قابلیت انجام پروژههای متنوعی، از ساخت انواع رباتها گرفته تا پروژههای هوشمندسازی ساختمان و اینترنت اشیا، گلخانههای هوشمند و بیشمار پروژه دیگر را در اختیار شما قرار میدهد.
همانطور که اشاره شد، انتخاب منبع یادگیری مناسب میتواند تأثیر بسیار زیادی در سرعت یادگیری و همچنین حفظ انگیزی شما در این مسیر داشته باشد. شما در انتخاب منابع گوناگون از جمله شرکت در کارگاهها و کلاسهای آموزشی حضوری و آنلاین، یادگیری بهصورت خودآموز از ویدیوها و آموزشهای متنی و غیره، محدودتی ندارید. اما منبعی که هم بهلحاظ هزینه مقرون بهصرفه باشد و هم محدودیتی به لحاظ موقعیت جغرافیای شهر شما و موارد اینچنینی ایجاد نکند، بسیار ارزشمند است. فیلمهای آموزشی، یکی از همین منابع محسوب میشوند.
فرادرس بهعنوان یکی از قدیمیترین و بزرگترین پلتفرمهای آموزش آنلاین ایران، فیلمهای آموزشی گوناگونی را برای یادگیری مهارتهای گوناگون از جمله نحوه استفاده و برنامهنویسی پلتفرم آردوینو، منتشر کرده است. در ادامه، مجموعه فیلمهای آموزش «آردوینو» (Arduino)، مقدماتی تا پیشرفته از فرادرس را آوردهایم. این فیلمهای آموزشی میتوانند راهنمای بسیار خوبی برای شما در مسیر یادگیری استفاده از این بردهای مبتنی بر میکروکنترلر باشند که بسته به هدف خود و بررسی سرفصلها میتوانید فیلم آموزشی مناسب برای خود را انتخاب کنید.
اسامی برخی فیلمهای آموزش رایگان آردوینو از فرادرس را در ادامه، آوردهایم.
در زیر برخی دیگر از فیلمهای آموزش موجود در این مجموعه را معرفی کردهایم.
وسایل مورد نیاز برای ساخت ربات با آردوینو
برد آردوینو یکی از مهمترین مؤلفههایی است که برای ساخت ربات ماشین کنترلی از آن استفاده میکنیم.
اما افزون بر بورد آردوینو به وسایل دیگری هم نیاز داریم که در جدول زیر، عناوین و تعداد هر کدام را بیان کردهایم.
نام قطعه | تعداد |
بورد آردوینو مدل نانو | ۲ عدد |
فرستنده و گیرنده رادیویی 433MHz RF | یک عدد |
ماژول درایور موتور L298N | یک عدد |
موتور DC گیربکسدار | ۴ عدد |
چرخ ربات قابل اتصال به موتور | ۴ عدد |
ماژول جویاستیک | یک عدد |
باتری لیتیمومی با ولتاژ ۳٫۷ ولتی | ۲ عدد |
جای باتری ۲ تایی | یک عدد |
پینهدر | – |
بورد سوراخدار خام | ۲ عدد |
سیم لحیم | – |
منبع تغذیه یا باتری کتابی ۹ ولت | یک عدد |
کلید راکر | یک عدد |
برخی از این این قطعات را در تصویر زیر مشاهده میکنید.
معرفی اجمالی قطعات بهکار رفته در ماشین کنترلی
پیش از اینکه ساخت ربات با آردوینو را شروع کنیم، بهتر است با قطعات مورد استفاده بهصورت فنی آشنا شوید. در ادامه، قطعاتی که برای ساخت ربات ماشین کنترلی و رادیو کنترل آن، انتخاب شده است را توضیح دادهایم.
بورد آردوینو نانو
همانطور که اشاره شد، در این پروژه به ۲ عدد بورد آردوینو نیاز داریم. یک مورد برای نصب روی ربات ماشین و دیگری که روی رادیو رادیو کنترل ماشین قرار میگیرد. آردوینوی نخست، فرمانهای رادیویی دریافتی توسط گیرنده رادیویی را پردازش کرده و سپس، فرمان مورد نظر ما را از طریق کنترل موتورهای ربات اجرا میکند. بهطور مثال اگر فرمان ما حرکت رو به جلو باشد، آنگاه هر ۴ موتور آردوینو به یک سمت شروع به چرخیدن میکنند که باعث حرکت ماشین به سمت جلو خواهد شد. آردوینو دیگر با توجه به وضعیت جویاستیک، مقدار مرتبط با آن را از طریق ماژول فرستنده رادیویی ارسال میکند. نقش آردوینو در هر ۲ بخش را میتواند بسیار مهم دانست. بورد آردوینوی مورد استفاده در این پروژه مدل Nano است که نمونهای از آن را در تصویر زیر مشاهده میکنید.
مدلهای گوناگونی از آردوینو در بازار وجود دارد که بسته به میکروکنترلر مورد استفاده در ساخت آن، تعداد پینها و غیره با هم تفاوت دارند و دارای قیمتهای متفاوتی نیز هستند. از رایجترین و محبوبترین مدلهای آردوینو میتوان به UNO و Nano اشاره کرد که از میکروکنترلر ATmega328P و ATmega328 بهره میبرند و برای ساخت ربات با آردوینو میتوان از آنها استفاده کرد.
فرستنده و گیرنده رادیویی
قرار است ربات ماشین کنترلی ساخته شده را با استفاده از یک دسته کنترلی و از راه دور هدایت کنیم. بههمین دلیل از ماژولهای رادیویی برای ایجاد ارتباط بیسیم و ارسال فرمانها از رادیو کنترل به ربات ماشین استفاده کردهایم. ماژولهای مورد استفاده در این پروژه فرستنده و گیرنده 433MHz RF هستند. در تصویر زیر، ماژول فرستنده رادیویی را مشاهده میکنید.
همانطور که در عکس نیز مشخص است، این مدل از ماژول فرستنده رادیویی از ۴ پایه بهشرح زیر تشکیل شده است.
- پایه مثبت منبع تغذیه یا VCC
- پایه منبع منبع تغذیه یا GND
- پایه دیتا یا DATA
- پایه آنتن یا ANT
در ادامه، تصویر ماژول گیرنده رادیویی و پایههای آن را مشاهده میکنید.
این ماژول در هر سمت خود چهار پایه دارد. از سمت راست بهترتیب پینهای GND، داده یا DAT، پین NC یا غیر متصل و پین VCC را داریم و پینهای سمت چپ نیز بهترتیب VCC ،GND ،GND و ANT هستند. تصویر آورده شده در زیر، پینهای فرستنده و گیرنده رادیویی را بهخوبی نشان دادهاند.
ماژول درایور موتور
در این پروژه برای کنترل موتورهای ربات از ماژول درایور مدل L298N استفاده کردهایم که با منبع تغذیه با ولتاژ ۹ تا ۱۲ ولت فعالیت میکند. در یکی از نوشتههای پیشین، به توضیح کاملی در مورد این ماژول پرداختهایم که از طریق لینک زیر میتوانید به آن دسترسی پیدا کنید.
این ماژول درایور موتور که تراشه L298N را روی خود جای داده است، یکی از بهترین درایور موتورهای DC موجود در بازار است که گزینه رایج و پرکاربردی برای ساخت ربات با آردوینو و کنترل موتورهای DC محسوب میشود. راهنمای پینهای این ماژول در تصویر آورده شده در زیر، بهخوبی قابل مشاهده است.
موتور DC
در این پروژه از موتورهای گیربکسدار N20 با ویژگی 150rpm استفاده کردهایم.
این موتور با چرخدندههای فلزی، گزینه خوبی برای ساخت ربات با آردوینو بهشمار میرود. ضمن اینکه وزن زیادی ندارد و گشتاور آن نیز بالا است. این موتور، دوام خوبی دارد و میتوان گفت که علت قیمت بهنسبت بالای آن نیز همین عمر بالایی است که دارد. میتوانید از این نوع موتورهای قدرتمند برای ساخت رباتهایی که در مسیرهای سخت و سربالایی حرکت میکنند، استفاده کنید.
البته، این تنها انتخاب شما نیست و میتوانید از موتورهای TT که نمونهای از آن در تصویر آورده شده نیز استفاده کنید. این موتورها را در بازار بهقیمت ارزانتری میتوانید خریداری کنید.
منبع تغذیه
در این پروژه برای تغذیه ماژول درایور موتور ۲ عدد باتری لیتیوم یون ۳٫۷ ولتی را بهکار گرفتهایم که بهصورت سری بسته شدهاند و ولتاژی در حدود ۸ ولت را تأمین میکنند.
در این مورد میتوانید بهعنوان یک جایگزین، از آداپتور با ولتاژ متغیر یا باتری کتابی ۹ ولت هم استفاده کنید.
نحوه اتصال پین های ماژول جوی استیک
جویاستیک قطعهای است که یک اهرم دارد و میتوانید آن را با دست یا انگشت آن را حرکت دهید. در واقع، با حرکت دادن اهرم آن در جهات گوناگون میتوانید دستگاه مورد نظر خود را هدایت کنید. یکی کاربردهای گسترده جویاستیک را میتوان در کنترلرهای کنسولهای بازی مشاهده کرد. هر چند که در کنترلرهای دیگر مانند دسته کنترلی رباتها، پهپادها، دستگاههای صنعتی و غیره نیز بهطور گسترده مورد استفاده قرار میگیرند.
همانطور که پیشتر هم اشاره کردیم، آردوینو میتواند به سنسورهایی متصل شده و اطلاعاتی را از آنها بخواند. ماژول جویاستیک که تصویر آن را در ادامه نیز آوردهایم را میتوان سنسوری در نظر گرفت که حرکت اهرم در جهات گوناگون و محورهای عمودی و افقی را اندازه گرفته و آن را به آردوئینو منتقل میکند. سپس میتوانیم دادهها را پردازش کرده و از آنها برای کنترل وسیله یا ربات خود استفاده کنیم. ماژول جویاستیک در درون خود از پتانسیومترهایی کمک میگیرد تا حرکت اهرم در جهات مختلف را اندازهگیره کند.
ربات ما، یک ماشین کنترلی است و قصد داریم روی دسته کنترل آن یک جوی استیک قرار دهیم تا فرمان حرکت به جهات مختلف را از این طریق به ربات منتقل کنیم. پینهای ماژول جویاستیک در تصویر آورده شده در زیر، بهخوبی قابل مشاهده هستند و از همین طریق به بورد آردوینو متصل میشوند.
ماژول جویاستیک پینهایی به شرح بیان شده در زیر دارد.
۲ پین VRx و VRy، در واقع بیانگر موقعیت پتانسیومترهایی است که در راستای محورهای افقی و عمودی وجود دارند. همچنین خوب است بدانید که زیر اهرم این نوع از جویاستیک، یک دکمه دکمه فشاری یا به اصطلاح «Push Button» هم وجود دارد که میتوان آن را برای عملیات خاصی برنامهریزی کرد. پین SW به وضعیت همین دکمه اشاره دارد. استفاده از این نوع جویاستیک برای ایجاد کنترلر ربات کفایت میکند اما بهطور کلی، انواع دیگری جویاستیکها نیز وجود دارند که دارای ابعادی بزرگتر، دکمهها و امکانات بیشتر هستند.
سرهم کردن قطعات ربات ماشین کنترلی
با توجه به ماهیت پروژه ما، مونتاژ قطعات و انجام اتصالات را در ۲ بخش، شامل سرهم کردن قطعات دسته کنترل و سرهم کردن ربات خودرو بیان میکنیم.
در یکی از مطالب پیشین مجله فرادرس، توضیح دادیم که ساخت رادیو کنترل با آردوینو چگونه است و مراحل ساخت یک دسته کنترل از راه دور کمی پیشرفتهتر برای ربات را از صفر تا صد بیان کردیم که از ماژول ارتباط رادیویی مدل NRF24L01+ برای ارتباطات بیسیم استفاده میکند و مطالعه آن میتوانید برایتان بسیار سودمند باشد.
اکنون، مطلب را با مونتاژ و ساخت بخش سختافزاری رادیو کنترل ربات ادامه میدهیم.
سرهم کردن ریموت کنترل ربات
در این قسمت میخواهیم دسته کنترل ربات را به لحاظ سختافزاری سرهم کنیم. این مدار شامل یک فرستنده رادیویی، یک ماژول جویاستیک PS2 و یک بورد آردوینو است. تصویری که در ادامه آورده شده، نمای کلی از ارتباط بین قطعات موجود در رادیو کنترل یا فرستنده ربات ما را نشان میدهد.
برای انجام این اتصالات هم میتوانید از برد بورد استفاده کنید و هم بوردهای سوراخدار خام را بهکار ببرید. اگر از برد بورد استفاده کردید میتوانید بهصورت زیر پیش بروید.
- ابتدا یک سیم از پین GND آردوینو به لاین منفی برد بورد وصل میکنیم. با انجام این کار تمامی GND-های مدار میتوانند به همین لاین وصل مشوند و از سیمکشیهای اضافی پرهیز میشود.
- یک سیم دیگر نیز از پین 5V آردوینو به لاین مثبت برد بورد وصل میکنیم. این مورد هم مانند مورد قبل بهویژه در مدارهای پیچیدهتر از شلوغی مدار پیشگیری میکند.
در صورت استفاده از ZeroPCB نیز روش مشابهی خواهید داشت. با این فرق که میبایست اتصالات را از زیر بورد و با لحیم کردن به هم وصل کنید. تصویر زیر یک مثال از نصب قطعات روی اینگونه نوع بوردها و برقراری اتصالات با لحیم کردن را در پروژهای دیگر نشان میدهد.
به پروژه ساخت دسته کنترل ربات خود باز میگردیم. همانطور که در تصویر زیر مشخص شده است، برای اتصال ماژول فرستنده رادیویی و همچنین بورد آردوینو روی بورد، لازم است تا ابتدا پینهدرهای مادگی را با توجه به پینهای این ماژولها روی بورد سوراخدار لحیم کنیم. ماژول جوی استیک را نیز بههمینترتیب روی بورد قرار میدهیم.
طبق راهنمایی که در ادامه آورده شده، اتصالات مدار «فرستنده» یا «ریموت کنترل» ربات را انجام میدهیم. این اتصالات از زیر بورد سوراخدار و بهطور معمول با مفتول و لحیم کردن انجام میشود.
- پایههای ماژول جویاستیک را میبایست طبق اطلاعات جدول زیر به بورد آردوینو وصل کرد.
پایه ماژول جیاستیک PS2 | پین آردوینو |
Vrx | A2 |
Vry | A1 |
+5V یا VCC | 5V |
GND | GND |
- سپس به سراغ پایههای ماژول فرستنده میرویم و آن را با توجه به اطلاعات آورده شده در جدول زیر به آردوینو وصل میکنیم.
پایه ماژول فرستنده رادیویی | پین آردوینو |
DATA | D12 |
+5V یا VCC | 5V |
GND | GND |
سرهم کردن قطعات ربات ماشین
اکنون وقت رسیده تا قطعات ربات ماشین را سرهم کنیم.
برای این منظور میبایست قطعاتی مانند موتورها، چرخها، ماژول درایور موتور، گیرنده و منبع تغذیه، به بورد آردوینو وصل شوند. تصویری که در ادامه آورده شده، مدار ربات ماشین را بهخوبی نشان میدهد.
با توجه به اینکه ربات ما یک خودرو است پس لازم است تا یک شاسی برای آن تهیه کنیم. چرخهای ربات روی این شاسی نصب شده و محکم میشوند و قطعات ربات از جمله بورد آردوینو، ماژول درایور موتور، گیرنده رادیویی، منبع تغذیه و غیره نیز روی آن قرار میگیرند. پس هنگام تهیه شاسی باید به این موارد توجه داشته باشید.
علیرغم اینکه شاسیهای متنوع و آمادهای برای انواع رباتها در بازار موجود است، شما میتوانید با وسایل معمولی مانند یک جعبه مقوایی و با صرف کمترین هزینه، یک شاسی معمولی برای خود بسازید. بهخصوص اگر در حال توسعه یک نمونه آزمایشی از ربات خود هستید. در تصویر زیر، نمونهای از یک شاسی آماده موجود در بازار را نشان دادهایم.
شما میتوانید تختههای پلکسی که در ابعاد یک ربات خودرو موجود هستند هم تهیه کنید یا اینکه با استفاده از تخته ۳-لایه یک شاسی برای ربات خود بسازید. پس از تهیه شاسی، میتوانید آن را به نحوی که در ادامه، توضیح دادهایم تکمیل کنید.
۲ عدد از موتورها را به قسمت زیرین و در یک سمت از شاسی متصل و محکم میکنیم.
ما از بستهای مخصوص و پیچ برای اتصال محکم موتورها به شاسی استفاده کردهایم و شما در صورت عدم دسترسی به این نوع بستها میتوانید از بستهای کمربندی و انواع چسبها مانند چسب ۲-طرفه و غیره استفاده کنید. ۲ موتور دیگر را به سمت دیگر شاسی متصل میکنیم که تصویر آورده شده در ادامه، این مورد را بهخوبی نشان میدهد.
توجه داشته باشید که موتورهای هر سمت از خودرو، ۲ به ۲ به هم وصل هستند. به زبان سادهتر یعنی اینکه با هم شروع به حرکت میکنند و در یک سمت میچرخند. به این دلیل که به یک ترمینال از درایور موتور وصل هستند و با هم کنترل میشوند.
قطعاتی نظیر ماژول گیرنده رادیویی، آردوینو و کلید را لازم است تا روی یک بورد سوراخدار قرار دهیم. برای این منظور، درست ماننده بورد بخش قبل عمل میکنیم و از پینهدر مادگی کمک میگیریم. تصویر آورده شده در زیر، بورد ما را پس از آمادهسازی نشان میدهد.
در تصویر زیر هم قسمت زیرین این بورد را نشان دادهایم که در واقع اتصالات در آن بهطور کامل مشهود است.
برای انجام این اتصالات، لازم است تا نحوه ارتباط پینهای این قطعات با هم را بدانید. پس به سراغ ماژول گیرنده میرویم. تصویر زیر را در نظر بگیرید. اتصال منبع تغذیه یا همان باتری کاملا واضح است.
این ماژول را نیز با کمک جدول زیر به بورد آردوینو وصل میکنیم. اتصالات در زیر بورد سوراخدار و بال وصل کردن سیمها به پایههای پینهدرها صورت میگیرند.
ماژول گیرنده | بورد آردوینو |
VCC | 5v |
GND | GND |
DATA | D3 |
حال میخواهیم ماژول درایور موتور را به آردوینو وصل کنیم.
میتوانید از اطلاعات موجود در جدول زیر برای مرتبط ساختن ماژول درایور موتور به آردوینو استفاده کنید.
ماژول درایور موتور | بورد آردوینو |
ENA | D5 |
IN1 | D8 |
IN2 | D9 |
IN3 | D10 |
IN4 | D11 |
ENB | D6 |
اکنون که اتصال پینهدرها انجام شد، میتوانیم بورد آردوینو، ماژول گیرنده رادیویی و کلید را روی این بورد جایگذاری کنیم. پس از آن، نوبت به جایدادن این بورد و سایر ماژولها روی شاسی رسیده است. پس موارد گفته شده در ادامه را روی شاسی قرار میدهیم.
- جای باتری ۲ تایی را روی شاسی قرار داده و محکم میکنیم برای چسباندن آن روی شاسی میتوانید از چسبهای ۲-طرفه استفاده کنید.
- بورد شامل آردوینو، ماژول گیرنده، ماژول درایور موتور L298+N و کلید را روی شاسی قرار داده و محکم میکنیم. پیشنهاد میکنیم برای این منظور از پیچهای پایه بورد که در تصویر زیر نشان داده شده، استفاده کنید. به دلیل اینکه این بورد در قسمت زیرین خود نیز دارای اتصالاتی است این پینها ارتفاع آن را از روی شاسی کمی بالاتر میآورند.
- مجدد میتوانید با استفاده از همین پایهها، ماژول درایور موتور را روی شاسی قرار دهید.
تصویری که در ادامه آورده شده، نمایی از اسمبل ربات تا این لحظه را نشان میدهد.
اکنون میتوانیم چرخها را به شاشی ربات یا در اصل، به موتورها متصل کنیم. این مورد را در تصویر آورده شده در زیر نشان دادهایم.
پیشتر نیز اشاره کردیم که موتورهای زیر شاسی، ۲ به ۲ به هم متصل هستند. در اینجا لازم است تا برای انجام اتصالات، بهترتیبی که در ادامه توضیح داده شده، عمل کنیم.
ربات خودروی ما چهار عدد موتور دارد که به چهار عدد چرخ متصل شدهاند و بهصورت دو به دو توسط درایور موتور کنترل میشوند. هر موتور دارای ۲ سیم قرمز و مشکلی است.
برای اتصال موتورها به ماژول درایور L98N لازم است تا سیمهای موتورها را به ترمینالهای خروجی درایور طبق راهنمای زیر، وصل کنیم..
موتورهای N20 | ماژول L298N |
قرمز موتور شماره ۱ و ۲ | ترمینال OUT2 |
مشکی موتور شماره ۱ و ۲ | ترمینال OUT1 |
قرمز موتور شماره ۳ و ۴ | ترمینال OUT3 |
مشکی موتور شماره ۳ و ۴ | ترمینال OUT4 |
منظور از «ترمینال»، همان قسمتهای آبیرنگ است که در کنار آنها عبارت OUT بههمراه یک عدد نوشته شده است.
در رابطه با اتصال کلید در مدار هم کافی است تا سیم مثبت جای باتری را به پایه وسط کلید وصل کرده و سپس پایه کناری کلید را به ترمینال مربوط به تغذیه درایور موتور متصل کنید. در این حالت زمانی که کلید در حالت «روشن» باشد انرژی مدار شما نیز تأمین خواهد شد.
برنامه نویسی ربات
تا این قسمت توانستیم ربات خود را به لحاظ سختافزاری سرهم کرده و اتصالات لازم را بین Arduino و سایر قطعات انجام دهیم. اکنون میخواهیم ربات آردوینو خود را برنامهریزی کنیم و کدهای برنامهنویسی خود را روی آن آپلود کنیم.
قبل از هر چیز، میبایست محیط کدنویسی آردوینو را آماده کنید.
نصب و راه اندازی محیط کدنویسی آردوینو
برای برنامهریزی میکروکنترلرهای آردوینو یا به زبان سادهتر برای برنامهنویسی رباتهای ساخته شده با آردوینو میبایست از محیطهای کدنویسی مخصوص آردوینو استفاده کنید.
- برای دانلود IDE آردوینو به سایت رسمی آن مراجعه کرده و روی منوی SOFTWARE کلیک کنید تا صفحه دانلود این برنامه باز شود.
- لینک صفحه دانلود نرمافزار Arduino IDE: «+»
- سپس، با توجه به اینکه سیستم عامل کامپیوتر شما ویندوز، macOS یا لینوکس است، روی لینکمربوط به پلتفرم خود کلیک کنید تا دانلود این برنامه شروع شود. در صورتی که پیش از دانلود سوالاتی از شما پرسیده شد میتوانید روی گزینه «JUST DOWNLOAD» کلیک کنید.
- پس از دانلود، کافی است تا فایل نصبی «arduino-ide.exe» را باز کرده و بهسادگی مراحل نصب را طی کنید.
- اکنون میتوانید نرمافزار آردوینو را باز کنید که در این صورت، پنجرهای مشابه با تصویر زیر خواهید دید. این برنامه دارای ادیتور کد و نوار ابزاری شامل گزینههای آپلود کد روی بورد آردوینو، باز کردن فایل کد و غیره است.
«نرمافزار IDE آردوینو» – برای مشاهده تصویر در اندازه اصلی، روی آن کلیک کنید. - تنظیمی که لازم است پیش از پروگرام کردن بورد آردوینو انجام دهید، انتخاب مدل بورد خود در این نرمافزار است. پس برای این منظور، از منوی Tools این برنامه و در فهرستی که با رفتن روی گزینه «:Board» باز میشود، نام بورد خود را انتخاب کنید.
- پس از نوشتن مدهای مربوطه در ادیتور این نرمافزار یا باز کردن فایل کدهای از پیش نوشته شده، میتوانید از آیکنهای بالای رابط کاربری این برنامه، روی آیکن علامت تیک یا «Verify» کلیک کنید. با انجام این کار، کدهای شما کامپایل میشوند و اگر خطایی وجود داشته باشد در کادر پایین صفحه به شما نمایش داده میشود.
- پس از اطمینان از اینکه کدها مشکلی ندارند میتوانید روی آیکن «Upload» که آیکن آن یک «فلش به سمت راست» است، کلیک کنید. با انجام این کار، پس از کامپایل کدها، عمل آپلود کدها روی میکروکنترلر آردوینو نیز انجام میشود.
برنامه نویسی فرستند یا دسته کنترلی ربات
اکنون که با نحوه کدنویسی و آپلود کدهای برنامهنویسی روی بردهای آردوینو آشنا شدیم، وقت آن رسیده تا کدهای ربات خود را نیز به بوردهای آردوینو منتقل کنیم. نخست به سراغ آردوینو روی ریموت کنترل ربات میرویم و پس از اتصال آن از طریق کابل USB به کامپیوتر، کدهای زیر را به ادیتور نرمافزار آردوینو منتقل کرده و روی بورد آپلود میکنیم.
1#include <VirtualWire.h>
2const int transmit_pin = 12;
3
4String str;
5char cstr[100];
6String message = "";
7unsigned int mlength;
8
9int flag = 0;
10int buttonf = 0;
11int power = 7;
12int button = 4;
13int vrx = A2;
14int vry = A1;
15
16int xdata = 0;
17int ydata = 0;
18void setup() {
19
20 vw_set_tx_pin(transmit_pin);
21 vw_setup(2000);
22 Serial.begin(9600);
23
24 pinMode(vrx, INPUT);
25 pinMode(vry, INPUT);
26 pinMode(power, OUTPUT);
27 digitalWrite(power, HIGH);
28
29 pinMode(button, INPUT);
30 digitalWrite(button, HIGH);
31}
32
33void loop() {
34 control();
35
36 if (buttonf == 1) {
37 xdata = analogRead(vrx);
38 ydata = analogRead(vry);
39 SendData(xdata, ydata, buttonf);
40 }
41
42 if (buttonf == 0) {
43 SendData(0, 0, 0);
44 delay(100);
45 }
46}
47
48void SendData(int xvalue, int yvalue, int buttonstatus) {
49
50 message = message + xvalue + "," + yvalue + "," + buttonstatus;
51 mlength = message.length();
52 str = message;
53 str.toCharArray(cstr, 100);
54 vw_send((uint8_t *)cstr, mlength);
55 vw_wait_tx();
56 str = "";
57 message = "";
58}
59
60void control() {
61 if ((digitalRead(button) == LOW) && (buttonf == 0)) {
62
63 Serial.println(" Started");
64 buttonf = 1;
65 delay(1000);
66 }
67
68 if ((digitalRead(button) == LOW) && (buttonf == 1)) {
69
70 Serial.println("ended");
71 buttonf = 0;
72 delay(1000);
73 }
74 digitalWrite(button, HIGH);
75}
این کدها را در ادامه، توضیح دادهایم.
- خط شماره ۱: در این خط، کتابخانه VirtualWire را با دستور include وارد برنامه کردهایم. با استفاده از این کتابخانه میتوانیم از قابلیتهای ماژولهای فرستنده رادیویی بهرهمند شویم. برای نصب این کتابخانه، مانند سایر کتابخانهها عمل میکنیم. بنابراین، در نرمافزار آردوینو به منوی Sketch رفته و از گزینه Include Library گزینه Add .ZIP Library را انتخاب میکنیم. سپس فایل کتابخانه را از روی سیستم خود انتخاب کرده و روی Open کلیک میکنیم.
- لینک دانلود کتابخانه VirtualWire: «+»
- خط شماره ۲: در این خط شماره پین مورد استفاده برای فرستنده را بهصورت یک ثابت عددی بهنام transmit_pin تعریف کردهایم که عدد 12 را درون خود نگه میدارد.
- خط شماره ۴: متغیری رشتهای بهنام str تعریف کردهایم. در ادامه، قرار است تا یک پیام متنی درون این متغیر حفظ شود.
- خط شماره ۵: آرایهای کاراکتری با ۱۰۰ سلول و بهنام cstr تعریف کردهایم.
- خط شماره ۶: متغیری رشتهای بهنام message و با مقدار تهی یا “” تعریف کردهایم.
- خط شماره ۷: متغیر mlength ، بهصورت عددی اعلان شده است که بیانگر طول پیام است.
- خطوط شماره ۱۳ و ۱۴: پینهای مربوط به ماژول جویاستیک را در متغیرهایی بهنام vrx و vry مشخص کردهایم.
- خطوط شماره ۱۸ تا ۳۱: در این بخش تنظیمات و مقداردهیهای اولیه را انجام میدهیم.
- خط شماره ۲۰: در این خط گفتهایم که پین ارسال دادهها و tx فرستنده رادیویی، پین transmit_pin است که پیشتر آن را تعریف کردهایم.
- خط شماره ۲۱: شروع به کار ماژول فرستنده با سرعت ۲۰۰۰ بیت در ثانیه انجام شده است.
- خط شماره ۲۲: دستور Serial.begin(9600) در این خط، ارتباط سریال آردوینو را برقرار میکند که ۹۶۰۰، سرعت بیت در ثانیه آن است.
- خطوط شماره ۲۴ و ۲۵: در این خطوط، پینهای مربوط به جویاستیک نصب شده روی بورد فرستنده ربات را بهصورت ورودی تعیین کردهایم. بدینترتیب میتوانیم مقادیر این سنسورها را بخوانیم. دستور pinMode با آرگومان نام پین و همچنین کلمه INPUT را برای این منظور بهکار گرفتهایم.
- خطوط شماره ۳۳ تا ۴۶: بدنه تابع loop یا همان تابع اصلی برنامه آردوینو را نشان میدهد. در این تابع، ابتدا تابعcontrol() صدا زده شده است و پس از آن، ۲ شرط بررسی میشود. سپس، در صورت تحقق هر یک از این شرطها، دادههای مربوطه با تابعSendData() ارسال میشود.
پس از آپلود موفقیت آمیز کدها روی آردوینو میتوانیم بورد را از سیستم جدا کرده و به سراغ پروگرام کردن آردوینوی بعدی برویم.
برنامه نویسی گیرنده یا ربات خوردو
در این قسمت میخواهیم بورد آردوینوی موجود روی ربات خودرو را برنامهنویسی کنیم. برای این منظور بورد را به کامپیوتر متصل کرده و کدهای آورده شده در زیر را به نرمافزار آردوینو کپی میکنیم. سپس با کلیک روی آیکنهای Verfy و پس از آن Upload، کدها را به روی بورد آردوینوی خود منتقل میکنیم.
1#include <VirtualWire.h>
2
3const int receive_pin = 3;
4
5String message;
6String myString;
7int xvalue;
8int yvalue;
9int buttonf;
10int xdata;
11int ydata;
12int bfdata;
13int ena = 5;
14int enb = 6;
15
16int in1 = 8;
17int in2 = 9;
18int in3 = 10;
19int in4 = 11;
20
21
22void setup() {
23 delay(1000);
24 Serial.begin(9600);
25 pinMode(ena, OUTPUT);
26 pinMode(enb, OUTPUT);
27
28 pinMode(in1, OUTPUT);
29 pinMode(in2, OUTPUT);
30 pinMode(in3, OUTPUT);
31 pinMode(in4, OUTPUT);
32
33 analogWrite(ena, 0);
34 analogWrite(enb, 0);
35 delay(1000);
36 Serial.println("setup");
37 vw_set_rx_pin(receive_pin);
38 vw_set_ptt_inverted(true);
39 vw_setup(2000);
40 vw_rx_start();
41}
42
43void loop() {
44 uint8_t buf[VW_MAX_MESSAGE_LEN];
45 uint8_t buflen = VW_MAX_MESSAGE_LEN;
46
47 if (vw_get_message(buf, &buflen)) {
48 int i;
49 for (i = 0; i < buflen; i++) {
50 char c = (buf[i]);
51 message = message + c;
52 }
53 myString = message;
54 Serial.println(message);
55
56 String l = getValue(myString, ',', 0);
57 String m = getValue(myString, ',', 1);
58 String n = getValue(myString, ',', 2);
59 xdata = l.toInt();
60 ydata = m.toInt();
61 bfdata = n.toInt();
62
63 if (((xdata >= 510) && (xdata <= 600)) && ((ydata >= 480) && (ydata <= 502))) {
64 Serial.println("Stopped");
65 analogWrite(ena, 0);
66 analogWrite(enb, 0);
67 digitalWrite(in1, LOW);
68 digitalWrite(in2, LOW);
69 digitalWrite(in3, LOW);
70 digitalWrite(in4, LOW);
71 }
72 if (bfdata == 0) {
73 analogWrite(ena, 0);
74 analogWrite(enb, 0);
75 digitalWrite(in1, LOW);
76 digitalWrite(in2, LOW);
77 digitalWrite(in3, LOW);
78 digitalWrite(in4, LOW);
79 }
80 if (((xdata > 600) && (xdata <= 1023)) && ((ydata >= 502) && (ydata <= 518))) {
81 Serial.println("forward");
82 int xmapped = map(xmapped, xdata, 1023, 255, 0);
83 int ymapped = map(ymapped, xdata, 1023, 255, 0);
84 analogWrite(ena, xmapped);
85 analogWrite(enb, ymapped);
86
87 digitalWrite(in1, HIGH);
88 digitalWrite(in2, LOW);
89 digitalWrite(in3, LOW);
90 digitalWrite(in4, HIGH);
91 }
92 if (((xdata >= 0) && (xdata < 480)) && ((ydata >= 480) && (ydata <= 510))) {
93 Serial.println("reverse");
94 int xmapped = map(xmapped, xdata, 479, 255, 0);
95 int ymapped = map(ymapped, xdata, 479, 255, 0);
96 analogWrite(ena, xmapped);
97 analogWrite(enb, ymapped);
98
99 digitalWrite(in1, LOW);
100 digitalWrite(in2, HIGH);
101 digitalWrite(in3, HIGH);
102 digitalWrite(in4, LOW);
103 }
104 if (((ydata > 600) && (ydata <= 1023)) && (bfdata == 1)) {
105 Serial.println("Right");
106 int ymapped = map(ymapped, ydata, 1023, 255, 0);
107 analogWrite(ena, ymapped);
108 analogWrite(enb, 0);
109
110 digitalWrite(in1, HIGH);
111 digitalWrite(in2, LOW);
112 digitalWrite(in3, LOW);
113 digitalWrite(in4, LOW);
114 }
115 if (((ydata >= 0) && (ydata <= 479) && (bfdata == 1))) {
116 Serial.println("left");
117 int ymapped = map(ymapped, ydata, 479, 255, 0);
118 analogWrite(ena, 0);
119 analogWrite(enb, ymapped);
120
121 digitalWrite(in1, LOW);
122 digitalWrite(in2, LOW);
123 digitalWrite(in3, LOW);
124 digitalWrite(in4, HIGH);
125 }
126 message = "";
127 }
128}
129
130String getValue(String data, char separator, int index) {
131 int found = 0;
132 int strIndex[] = { 0, -1 };
133 int maxIndex = data.length() - 1;
134
135 for (int i = 0; i <= maxIndex && found <= index; i++) {
136 if (data.charAt(i) == separator || i == maxIndex) {
137 found++;
138 strIndex[0] = strIndex[1] + 1;
139 strIndex[1] = (i == maxIndex) ? i + 1 : i;
140 }
141 }
142 return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
143}
در ادامه، برخی خطوط این کد را توضیح دادهایم.
- خط شماره ۱: در این برنامه هم لازم است تا ابتدا کتابخانه VirtualWire را وارد برنامه کنیم تا بتوانیم از قابلیتهای ماژولهای رادیویی بهرهمند شویم.
- خط شماره ۳: در این خط پین شماره 3 آردوینو برای دریافت دادهها رادیویی را تعریف کردهایم.
- خطوط شماره ۱۳ تا ۱۹: در این خطوط پینهای آردوینو که به درایور موتور متصل شدهاند را تعریف کردهایم. پینهای شماره ۵ و ۶ که بهترتیب بهصورت ena و enb نامگذاری شدهاند، پینهایی هستند که از طریق آنها میتوانیم سرعت موتورهای خود را کنترل کنیم. پینهای ۸ تا ۱۱ را نیز با نام in1 تا in4 تعریف کردهایم. در واقع از طریق از پینها که به ترمینالهای OUT1 تا OUT4 متصل هستند، موتوهای ربات را کنترل میکنیم.
- خطوط شماره ۲۲ تا ۴۱: در این خطوط، بدنه تابع Setup آردوینو را داریم که تنظیمات و مقداردهی اولیه را در بر میگیرد.
در صورتیکه کدها با موفقیت روی برد آپلود شوند، میتوان گفت که کار تمام است و پروژه را با موفقیت بهپایان رساندهایم. حالا، باتریها را در جای باتری جایگذاری کرده و سپس، کلید ربات را نیز در حالت روشن قرار میدهیم.
برای تأمین انرژی مورد نیاز ریموتکنترل نیز کابل USB آردوینو را به آن متصل میکنیم. با روشن شدن بردها، چراغ آردوینو نیز روشن شده و میتوانید با ریموتکنترل، ربات خود را هدایت کنید. اکنون اگر اهرم جویاستیک را به سمت بالا فشار دهید، ربات خودروی شما هم میبایست به سمت جلو حرکت کند. برای جهات دیگر یعنی حرکت به سمت عقب، راست یا چپ هم تنها کافی است تا اهرم جوی استیک را به آن سمت فشار دهید.
این ربات بهلحاظ مصرف انرژی نیز بهصورت بهینه عمل میکند و مصرف آن تنها برای زمانی است که جویاستیک را به جهتی حرکت میدهید.
ادامه یادگیری آردوینو با فرادرس
تا این قسمت از مطلب ساخت ربات با آردوینو، نحوه ساخت ربات ماشین کنترلی را با هم مرور کردیم. اکنون، اگر بخواهید دانش خود را در مورد بوردهای آردوینو گسترش دهید، میتوانید فیلمهای آموزش مرتبط با آردوینو در فرادرس را مشاهده کنید که لینک آنها را در ادامه آوردهایم.
جمعبندی ساخت ربات با آردوینو
در این مطلب از مجله فرادرس، نحوه ساخت ربات خودرو را با هم مرور کردیم. نخست، گفتیم که ربات ما چه توانمندیهایی دارد، چه قطعاتی را برای ساخت آن لازم داریم و چگونه میبایست این قطعات را سرهم کنیم. پس از ساخت بخش سختافزاری ربات خودرو و همچنین ریموتکنترل آن، به برنامهنویسی و توسعه بخش نرمافزاری آن نیز پرداختیم. ربات آموزش داده شده در این نوشتار در واقع، یک ماشین کنترلی است که از ۴ عدد موتور و چرخ تشکیل شده است که بهواسطه آنها حرکت میکند. برای کنترل این ربات از جویاستیک و ارتباط رادیویی استفاده کردیم و با ارسال فرمانهای مشخص، ربات خود را کنترل کردیم.
بهطورکلی، برای ساخت رباتهای معمولی، فرایند خیلی سخت و پیچیدهای در پیش ندارید و افراد گوناگون نیز میتوانند با فراهم ساختن برخی وسایل و قطعات مانند یک بورد آردوینو ، انواع موتورهای DC، انواع سنسورها، چرخها و سایر موارد مرتبط که در این نوشتار هم به آنها پرداختیم، انجام چنین پروژههایی رو شروع کنند. مورد دیگر، موضوع برنامهنویسی ربات و میکروکنترلر است که یادگیری آن نیز با فیلمهای آموزشی معرفی شده بسیار آسان است.
این آموزش متنی را میتوانید یک نقطه شروع برای ساخت ربات با آردوینو در نظر بگیرد. سپس با خلاقیت خود رباتهای متنوع و پیچیدهتری را پیادهسازی کنید. میتوان ادعا کرد که با دسترسی به قطعات مختلفی که بازار پیدا میشود و منابع متعددی که روی اینترنت وجود دارد در این زمینه محدودتی نخواهید داشت. بهطور مثال میتوانید بهجای استفاده از ماژول جویاستیک از دکمههای فشاری استفاده کنید یا اینکه تکنولوژیهای دیگری را برای ارتباطات بیسیم خود انتخاب کنید.
source