آموزش بخش آردوینو CarBot
مقدمه
ربات CarBot از یک میکروکنترلر (microcontroller unit) (MCU) به عنوان پل ارتباطی بین بدنه ربات و گوشی هوشمند استفاده میکند. به عبارت دیگر میکروکنترلر یک Firmware میباشد که ارتباط بین دو بخش اجزاء الکترونیکی و گوشی ربات را برقرار میسازد. در این آموزش، تنظیمات سختافزاری، پیکربندی نرمافزار، و تست عملکردهای مختلف را قدم به قدم بررسی میکنیم
وظایف اصلی میکروکنترلر
دریافت دستورات کنترلی و تنظیمات سنسور
ارتباط با اپلیکیشن اندروید از طریق پورت سریال USB.
تولید سیگنالهای کنترلی سطح پایین
خروجی PWM برای کنترل موتورها و سایر اجزای ربات.
مدیریت چراغهای راهنما
فعال/غیرفعال کردن چراغ راهنمای چپ و راست.
اندازهگیری مسافت پیموده شده چرخها
استفاده از سنسورهای نوری سرعت روی چرخهای جلو/عقب.
محاسبه ولتاژ باتری
استفاده از مدار تقسیمکننده ولتاژ (Voltage Divider).
اندازهگیری فاصله تا موانع
استفاده از سنسور اولتراسونیک (Sonar).
کنترل LEDهای وضعیت و نورپردازی
مدیریت چراغهای جلو، عقب و نشانگر وضعیت.
ارسال دادههای سنسور به اپلیکیشن
انتقال اطلاعات از طریق پورت سریال USB.
نمایش وضعیت ربات روی نمایشگر
نشان دادن اطلاعات حیاتی روی صفحه OLED.
فِرموِیر پیشنهادی:
Arduino Nano با میکروکنترلر ATmega328P
ESP32 Development Kit
چگونگی عملکرد
یک MCU دستورهای کنترل خودرو و سیگنالهای نشانگر را از طریق اتصال سریال دریافت میکند. این دستورها را به سیگنالهای PWM برای کنترلر موتور تبدیل میکند و LEDs را با توجه به سیگنال نشانگر تغییر میدهد. برنامه Arduino همچنین چرخشهای چرخ را با شمارش وقفههای حسگرهای نوری روی چرخهای جلو چپ و راست ردیابی میکند.
ولتاژ باتری را با اندازهگیری میانگین متحرک در مدار تقسیم ولتاژ محاسبه میکند. همچنین میتواند فاصله تا موانع جلوی خودرو را با حسگر اولتراسونیک اندازهگیری کند. این اندازهگیریها از طریق لینک سریال به برنامه Android ارسال میشود.
| ویژگی | توضیحات |
|---|---|
| کنترل موتور | PWM برای درایور موتور (مثلاً L298N) |
| سنسور سرعت چرخ | شمارش پالسهای نوری چرخهای جلو/عقب با استفاده از وقفهها |
| ولتاژ باتری | محاسبه ولتاژ با میانگین متحرک از طریق مدار تقسیم ولتاژ |
| فاصلهسنج اولتراسونیک | اندازهگیری فاصله تا موانع (فعال با HAS_SONAR 1) |
| LEDهای نشانگر | کنترل چراغهای راهنما و چراغهای جلو/عقب |
برای هر بدنه و هر ساختاری باید کد آردوینو متفاوت تهیه شود. باید در نظر داشت که با توجه به مشخصات سخت افزاری و نوع تجهیزات نصب شده روی ربات، بایستی کد مورد نیاز آن تجهیزات را داخل میکروکنترل آردوینو آماده شود.
برای این کار شما می توانید کد آماده مورد نیاز را دانلود کنید یا سفارش تولید کد برای ربات مورد نظر خود را داشته باشید.
کدهای آماده برای ربات های پیشنهادی ما را می توانید از آدرس های زیر دانلود نمایید.
ربات دست ساز(DIY)
ماشین سبک
ماشین باربری کنترلی RC
ربات همه منظوره
بدنه ماشین کنترلی
توضیح کد ارائه شده برای هر مدل از بدنه و تجهیزات جانبی
پیکربندی نرم افزاری
ما برای نصب و راهاندازی برنامه روی برد آردوینو از نرم افزار AdruinoIDE استفاده می کنیم. شما ابتدا این برنامه را دانلود و نصب نمایید . سپس باید کتابخانههای مورد نیاز از طریق برنامه AdruinoIDE نصب شود، این کار از طریق منوی Tools ➡️ Manage Libraries
انجام می گیرد.
دو کتابخانه را باید نصب کنیم
1- Adafruit_SSD1306
2- Adafruit_GFX Library
نام کتابخانه را جستجو کنید و سپس آخرین نسخه را نصب یا آپدیت نمایید.
کیت توسعه ESP32
1- در نرم افزار arduinoIDE وارد منوی
File> Preferences:
شوید.
و سپس در پنجره باز شده لینک https://dl.espressif.com/dl/package_esp32_index.json
را در قسمت “Additional Board Manager URLs” وارد نمایید و دکمه ok را کلیک کنید.
اگر شما برد ESP8266 را دارید از آدرس های زیر استفاده نمایید.
https://dl.espressif.com/dl/package_esp32_index.json,
http://arduino.esp8266.com/stable/package_esp8266com_index.json
تنظیمات Arduino nano برای نصب
Tools➡️Board➡️Arduino AVR Boards➡️Arduino NanoTools➡️Processor➡️ATmega328P (Old Bootloader)Tools➡️Port➡️*Select the USB port*
تنظیمات ESP32 برای نصب
Tools➡️Board➡️ESP32 Arduino➡️ESP32 Dev ModuleTools➡️Port➡️*Select the USB port*
توجه: در حال حاضر، اکثر بردهای ارزان آردوینو نانو با بوت لودر قدیمی عرضه می شوند. با این حال، بسته به فروشنده، ممکن است یکی از آنها را با بوت لودر جدید نیز دریافت کنید. بنابراین اگر قادر به آپلود سیستم عامل نیستید، به احتمال زیاد باید پردازنده را به ATmega328P تغییر دهید.
برای آپلود برنامه به برد آردوینو از منوی Sketch ➡️ Upload استفاده کنید یا از کلید ترکیبی (CTRL+U) یا از آیکن آپلود در بالا سمت چپ ➜
تست برنامه
ابتدا از منوی Tools ➡️ Serial Monitor پنل مانیتور سریال را باز می کنیم
سپس با دستورات زیر می توانیم ربات را تست نماییم.
جدول دستورات ارسال پیام به ربات CarBot
| دستور | فرمت | پارامترها | توضیحات | مثال | نکات |
|---|---|---|---|---|---|
| c | c<چپ>,<راست> | -255 تا 255 (عدد صحیح) | کنترل سرعت و جهت موتورها: • 0: توقف• 255: حداکثر سرعت به جلو• -255: حداکثر سرعت به عقب | c128,-128 | مثبت: چرخش به جلو منفی: چرخش به عقب مقادیر کمتر: سرعت کمتر |
| i | i<چپ>,<راست> | 0 (خاموش) یا 1 (روشن) | کنترل چراغهای راهنما: • i1,0: چراغ چپ• i0,1: چراغ راست• i1,1: هر دو• i0,0: خاموش | i1,0 | چراغها هر ۱ ثانیه یکبار فلاش میزنند فقط یک حالت همزمان فعال است |
| l | l<جلو>,<عقب> | 0 تا 255 (شدت نور) | تنظیم روشنایی LEDهای جلو و عقب: • 0: خاموش• 255: حداکثر روشنایی | l200,50 | نیازمند فعالسازی HAS_LEDS_FRONT و HAS_LEDS_BACK |
| s | s<زمان_ms> | عدد مثبت (میلیثانیه) | تنظیم فاصله زمانی بین اندازهگیریهای سنسور اولتراسونیک • پیشفرض: 1000 | s500 | در صورت خطا: ارسال MAX_SONAR_DISTANCE |
| w | w<زمان_ms> | عدد مثبت (میلیثانیه) | تنظیم فاصله زمانی گزارش سرعت چرخها (RPM) • پیشفرض: 1000 | w2000 | RPM به عنوان میانگین در بازه زمانی محاسبه میشود |
| v | v<زمان_ms> | عدد مثبت (میلیثانیه) | تنظیم فاصله زمانی گزارش ولتاژ باتری • پیشفرض: 1000• ارسال vmin، vlow و vmax | v2000 | ولتاژ با فیلتر میانگین متحرک (اندازه ۱۰) محاسبه میشود |
| h | h<زمان_ms> | عدد مثبت یا -1 (غیرفعال) | تنظیم زمان قطع فعالیت ربات در صورت عدم دریافت پیام حیات (Heartbeat) • پیشفرض: -1 (غیرفعال) | h3000 | بعد از ۳ ثانیه عدم دریافت پیام، ربات متوقف میشود |
| b | b<زمان_ms> | عدد مثبت (میلیثانیه) | تنظیم زمان بازنشانی سنسور ضربه • پیشفرض: 750 | b1000 | بعد از ۱ ثانیه، سنسور ضربه به حالت اولیه بازمیگردد |
| n | n<رنگ>,<وضعیت> | رنگ: b (آبی), g (سبز), y (زرد)وضعیت: 0 یا 1 | کنترل LEDهای وضعیت: • n b,1: روشن کردن آبی• n g,0: خاموش کردن سبز | n g,1 | نیازمند فعالسازی HAS_LEDS_STATUS |
| f | f | – | درخواست اطلاعات ربات (نوع و ویژگیهای فعال) • پاسخ: f<نوع_ربات>:v:i:s:b... | f → fRTR_V1:v:i:s:b... | پاسخ شامل لیستی از قابلیتها (مانند v برای ولتاژ، i برای نشانگرها) |
توضیحات تکمیلی:
- محدوده مقادیر:
- دستور
c: مقادیر منفی باعث چرخش موتورها به جهت معکوس میشوند. - دستور
l: مقادیر بالاتر از255به عنوان255در نظر گرفته میشوند.
- دستور
- وابستگی به سختافزار:
- دستورات
s،w،vوbنیازمند فعالسازی سنسورهای مربوطه در تنظیمات هستند.
- دستورات
- پیشفرضها:
- اگر پارامتر وارد نشود (مثلاً
sبدون مقدار)، از مقدار پیشفرض استفاده میشود.
- اگر پارامتر وارد نشود (مثلاً
- خطاها:
- در صورت ارسال دستور نادرست (مثلاً
c300,200)، ربات مقادیر را به نزدیکین حد مجاز (255یا-255) تبدیل میکند.
- در صورت ارسال دستور نادرست (مثلاً
نکته : از همین دستورات در برنامه نویسی نیز استفاده می کنیم برای تست ربات.پیامهای دریافتی از ربات
| پیشوند | توضیحات | مثال |
|---|---|---|
v | ولتاژ باتری | v12.5 |
w | سرعت چرخش چرخها (RPM) | w30,28 |
s | فاصله تا مانع (سانتیمتر) | s150 |
b | تشخیص برخورد | blf (برخورد چپ جلو) |
پارامترهای اخطار
| پارامتر | توضیحات |
|---|---|
NO_PHONE_MODE | حرکت خودکار ربات بدون گوشی (1 برای فعالسازی) |
STOP_DISTANCE | حداقل فاصله مجاز تا مانع (پیشفرض: ۱۰ سانتیمتر) |
TURN_THRESHOLD | آستانه تغییر جهت (پیشفرض: ۵۰ سانتیمتر) |
پیکربندی ویژگیها
| ویژگی | پارامتر | مقادیر | توضیحات |
|---|---|---|---|
| مدار تقسیم ولتاژ | HAS_VOLTAGE_DIVIDER |
0 یا 1 |
نیازمند تعیین VOLTAGE_DIVIDER_FACTOR، VOLTAGE_MIN، VOLTAGE_LOW و VOLTAGE_MAX |
| LEDهای نشانگر | HAS_INDICATORS |
0 یا 1 |
کنترل چراغهای راهنما |
| سنسور سرعت جلو/عقب | HAS_SPEED_SENSORS_FRONT / HAS_SPEED_SENSORS_BACK |
0 یا 1 |
ردیابی چرخش چرخها |
| سنسور اولتراسونیک | HAS_SONAR |
0 یا 1 |
اندازهگیری فاصله تا موانع |
| فیلتر میانه | USE_MEDIAN |
0 یا 1 |
بهبود دقت سنسور اولتراسونیک |
| سنسور ضربه | HAS_BUMPER |
0 یا 1 |
تشخیص برخورد |
| نمایشگر OLED | HAS_OLED |
0 یا 1 |
نیازمند کتابخانههای Adafruit_SSD1306 و Adafruit_GFX |
| LEDهای جلو/عقب/وضعیت | HAS_LEDS_FRONT / HAS_LEDS_BACK / HAS_LEDS_STATUS |
0 یا 1 |
کنترل روشنایی LEDها |
