در قسمت بیست و دوم از آموزش آردوینو به بررسی دریافت دادههای سریال از بیش از یک دستگاه سریال و همچنین، ارسال داده به بیش از یک دستگاه سریال، پرداختیم. در این قسمت قصد داریم درباره استفاده از آردوینو با رزبری پای صحبت کنیم.
در ادامه این مطلب درباره چگونگی استفاده از قابلیتهای آردوینو همراه با قدرت پردازش یک کامپیوتر لینوکس تکبردی مانند رزبری پای صحبت میکنیم. بهعنوانمثال، چگونگی ارسال دستورات به آردوینو از طریق یک اسکریپت که روی رزبری پای اجرا میشود، بررسی میگردد.
آردوینو میتواند دستورات سریال را از رزبری پای نظارت (monitor) کرده و به آنها پاسخ دهد. کدی که در اینجا قرار دارد، LEDهای آردوینو را از طریق اسکریپتهای پایتون که روی رزبری پای اجرا میشوند، کنترل میکند.
✅ نکته
پین دریافت سریال آردوینو (پین 0 که با RX روی برد مشخص شده است) را به پین 8 روی پینهای هدر رزبری پای متصل کنید. پین TX آردوینو (پین 1) را به پینGPIO 10 رزبری پای متصل کنید. پین گراند (GND) آردوینو را به یکی از پینهای گراند (ground) رزبری پای وصل کنید. (در شکل 1 از پین 14 استفاده شده است)
مطالب زیر مربوط به برد آردوینو Uno و هر آردوینوی سازگاری است که دارای یک پورت سریال واحد باشد که بین اتصال سریال USB و پینهای RX/TX مشترک است. اگر از بردی با پورت سریال سختافزاری اضافی مانند Leonardo، WiFi Rev2،Nano Every یا هر برد مبتنی بر ARM استفاده میکنید، مقدار #define mySerial Serial را به #define mySerial Serial1 تغییر دهید و اگر برد شما از پینهای 0 و 1 برای RX و TX استفاده نمیکند، از پینهای مناسب برای Serial1 استفاده کنید.
در اینجا یک اسکچ (برنامه) آردوینو وجود دارد که پیامهای سریال از رزبری پای را نظارت (مانیتور) میکند. این اسکچ را روی برد آردوینو آپلود کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | /* * ArduinoPi sketch * Pi control Arduino pins using serial messages * format is: Pn=state * where 'P' is header character, n is pin number, state is 0 or 1 * example: P13=1 turns on pin 13 */ // Replace Serial with Serial1 on boards with an additional serial port #define mySerial Serial void setup() { mySerial.begin(9600); // Initialize serial port to send/receive at 9600 baud } void loop() { if (mySerial.available()) // Check whether at least one character is available { char ch = mySerial.read(); int pin = -1; if( ch == 'P') // is this the beginning of a message to set a pin? { pin = mySerial.parseInt(); // get the pin number } else if (ch == 'B') // Message to set LED_BUILTIN { pin = LED_BUILTIN; } if( pin > 1) { // 0 and 1 are usually serial pins (leave them alone) int state = mySerial.parseInt(); // 0 is off, 1 is on pinMode(pin, OUTPUT); digitalWrite(pin, state); } } } |
اسکریپت پایتون (Python script) زیر را به عنوان blinkArduino.py
روی Raspberry Pi ذخیره کنید و با دستور python blinkArduino.py
آن را اجرا کنید. این اسکریپت باعث چشمک زدن LED آنبرد (onboard) آردوینو میشود. قبل از اجرای این اسکریپت، باید کتابخانهpython-serial
نصب شده باشد. شما میتوانید این کتابخانه را با اجرای دستور زیر روی Raspberry Pi نصب کنید:
1 | sudo apt-get install python-serial |
1 2 3 4 5 6 7 | #!/usr/bin/env python import serial from time import sleep ser = serial.Serial('/dev/serial0', 9600) ser.write('P13=1') sleep(1) ser.write('P13=0') |
وقتی اسکریپت اجرا میشود، یک LED روی پین ۱۳ باید به مدت یک ثانیه روشن شود و سپس خاموش شود.
اسکچ آردوینو شروع یک پیام را زمانی تشخیص میدهد که کاراکتر P دریافت شود. از تابع parseInt آردوینو برای استخراج شماره پین موردنظر و وضعیت پین استفاده میشود. ارسال پیام P13=1 باعث روشنشدن LED روی پین ۱۳ میشود. ارسال پیام P13=0 باعث خاموششدن LED میشود. اطلاعات بیشتر در مورد پیامهای سریال و تابع parseInt را میتوانید در قسمتهای قبلی پیدا کنید.
بسیاری از بردهای آردوینو و بردهای سازگار با آردوینو از پینی غیر از پین ۱۳ استفاده میکنند؛ بنابراین وقتی پیامی مانند B=1 ارسال میکنید، برای جلوگیری از نیاز به جستجوی این پین، اسکچ آردوینو از ثابت LED_BUILTIN بهعنوان شماره پین استفاده میکند (نیازی به شماره پین نیست).
اسکریپت پایتون (Python script) پیامهای لازم برای روشنکردن و سپس خاموشکردن LED را ارسال میکند. اگر LED داخلی برد شما روی پین ۱۳ نیست، از نسخهای استفاده کنید که از دستور B برای تغییر وضعیت LED اختصاصدادهشده به LED_BUILTIN استفاده میکند:
1 2 3 4 5 6 7 | #!/usr/bin/env python import serial from time import sleep ser = serial.Serial('/dev/serial0', 9600) ser.write('B=1') sleep(1) ser.write('B=0') |
پینهای Raspberry Pi تحمل ۵ ولت را ندارند، بنابراین اگر در حال اتصال یک برد Arduino سازگار با ۵ ولت به Raspberry Pi هستید، باید از تقسیمکننده ولتاژی که در شکل 1 نشاندادهشده است استفاده کنید. اگر از یک برد Arduino با ولتاژ ۳.۳ ولت استفاده میکنید، بهطورکلی حذف تقسیمکننده ولتاژ بیخطر بوده و استفاده از آن ضرری نخواهد داشت.
پیامهایی که در این دستورالعمل ارسال میشوند بسیار ساده هستند، اما میتوان آنها را گسترش داد تا Raspberry Pi بتواند تقریباً هر تابع Arduino را کنترل کند و Arduino نیز بتواند اطلاعات را به Pi ارسال کند. برای اطلاعات بیشتر در مورد راهاندازی Arduino با یک کامپیوتر از طریق لینک سریال، به قسمت 17 آموزش آردوینو مراجعه کنید.
چرا Arduino میتواند بسیار سریعتر از Raspberry Pi باشد؟
Raspberry Pi یک قطعه با قابلیتهای بسیار زیاد است. این دستگاه توانایی اجرای سیستمعاملهای پیچیدهای مانند لینوکس یا ویندوز 10 را دارد؛ اما برد Arduinoاین امکان را ندارد. این قابلیت میتواند بسیار مهم و حیاتی باشد در صورتی که بخواهید از درایورهای پیچیدهای مانند تشخیص گفتار، تطبیق الگوهای بصری و بیشمار قابلیت دیگر که توسط لینوکس و ویندوز پشتیبانی میشوند، استفاده کنید. با این حال، اگر برنامه شما نیاز به کنترل دقیق و با سرعت بالای ورودی یا خروجی پینها داشته باشد، آردوینو در برخی شرایط میتواند سریعتر از رزبری پای پاسخ دهد.
این موضوع به این دلیل است که کنترل پینها در رزبری پای از طریق لایههای نرمافزاری انجام میشود که برای جداسازی سختافزار از سیستمعامل طراحی شدهاند و یکی از این لایهها زبان برنامهنویسی ایی است که از آن استفاده میکنید. این سربار (overhead) باعث کاهش سرعت کنترل پینها میشود. علاوه بر این، ازآنجاکه سیستمعامل به طور مداوم هر وظیفه را برای پشتیبانی از سایر وظایف قطع میکند، ممکن است تأخیر کوچک اما ناپایداری در فواصل اختصاصدادهشده به وظیفه کنترل پینها ایجاد شود.
یک برد آردوینو Uno ساده میتواند به نرخ ثابتی برابر با ۸ مگاهرتز دست یابد. جونا پیهلایاما مجموعهای از بنچمارکها را روی سرعت GPIO رزبری پای انجام داد و با استفاده از Python و RPi.GPIO تنها به ۷۰ کیلوهرتز روی رزبری پای رسید. بااینحال، با استفاده از کتابخانههای بومی و زبان برنامهنویسی C، میتوان حتی از برد آردوینو Uno هم پیشی گرفت. پیهلایاما با این روش بهسرعت ۲۲ مگاهرتز دستیافت.
سختافزارهای جدیدتر آردوینو و بردهای سازگار با آردوینو حتی سریعتر هستند. بهعنوانمثال، Teensy 3 میتواند به نرخ تاگل (toggle) برابر با ۴۸ مگاهرتز دست یابد.