ارتباط سریال RS-485 بین Raspberry Pi و Arduino Uno
انتخاب یک پروتکل ارتباطی برای ارتباط بین میکروکنترلرها و دستگاه های جانبی، قسمت مهمی از سیستم امبدد است. مهم است زیرا عملکرد کلی هر برنامه به ابزار ارتباطی بستگی دارد زیرا مربوط به کاهش هزینه، انتقال سریعتر داده ها، پوشش مسافت طولانی و غیره است.
RS485 پروتکل ارتباط سریال
RS-485 یک پروتکل ارتباط سریال آسنکرون است که نیازی به کلاک ندارد. این روش برای انتقال داده های باینری از یک دستگاه به دستگاه دیگر از تکنیکی به نام سیگنال دیفرانسیل استفاده می کند.
روش انتقال سیگنال دیفرانسیل چیست؟
روش سیگنال دیفرانسیل با ایجاد ولتاژ دیفرانسیل با استفاده از ۵ ولت مثبت و منفی کار می کند. هنگامی که از دو سیم استفاده می کنید، یک ارتباط Half-Duplex فراهم می کند و Full-Duplex به ۴ سیم نیاز دارد.
در این آموزش زاویه موتور سروو متصل به Arduino UNO با ارسال مقادیر زاویه از Raspberry Pi به Arduino UNO از طریق ارتباط سریال RS-485 کنترل می شود. Raspberry Pi به عنوان Master و Arduino UNO با سرو موتور به عنوان slave استفاده می شود. همچنین این نمایشگر دارای صفحه نمایش LCD 16×2 برای نشان دادن مقدار زاویه ای است که از Raspberry Pi دریافت می شود.
لوازم مورد نیاز این آموزش
Raspberry Pi 3 B + (با نصب سیستم عامل Raspbian)
آردوینو UNO
ماژول مبدل MAX485 TTL به RS485 (2)
سرو موتور SG-90
LCD 16×2
پتانسیومتر 10K
سیم
پایه ها و ویژگی های ماژول مبدل MAX-485 TTL به RS-485
Pin Name | Pin Description |
VCC | 5V |
A | Non-inverting Receiver Input Non-Inverting Driver Output |
B | Inverting Receiver Input Inverting Driver Output |
GND | GND (0V) |
R0 | Receiver Out (RX pin) |
RE | Receiver Output (LOW-Enable) |
DE | Driver Output (HIGH-Enable) |
DI | Driver Input (TX pin) |
ماژول مبدل MAX-485 TTL به RS-485 دارای ویژگی های زیر است:
ولتاژ کار: ۵ ولت
تراشه MAX485 روی برد
مصرف کم برای ارتباطات RS485
فرستنده و گیرنده محدود با سرعت پایین
سیم کشی راحت RS-485
اندازه برد: ۴۴ ۱۴ ۱۴ میلی متر
امکان ارتباط سریال با فاصله ۱۲۰۰ متر را فراهم می کند
اتصال ماژول RS-485 با Raspberry Pi 3 B +
اتصال ماژول RS-485 با Arduino UNO
برای اتصال MAX485 TTL به ماژول مبدل RS-485 به Arduino UNO از پین های UART زیر UNO استفاده می شود (۰،۱).
اتصال مدار بین یک RS-485 و Raspberry Pi 3 B + (Master):
RS-485 | Raspberry Pi 3 B+ |
DI | GPIO14 (TX) |
DE RE | GPIO4 |
R0 | GPIO15(RX) |
VCC | 5V |
GND | GND |
A | To A of Slave RS-485 |
B | To B of Slave RS-485 |
اتصال مدار بین یک RS-485 و Arduino UNO (slave):
RS-485 | Arduino UNO |
DI | ۱ (TX) |
DE RE | ۲ |
R0 | ۰ (RX) |
VCC | 5V |
GND | GND |
A | To A of Master RS-485 |
B | To B of Master RS-485 |
آردوینو UNO با سرو موتور SG-90:
Servo Motor (SG-90) | Arduino UNO |
RED | +5V |
ORANGE (PWM) | ۳ |
BROWN | GND |
اتصال مدار بین LCD 16×2 و Arduino UNO:
۱۶×۲ LCD | Arduino UNO |
VSS | GND |
VDD | +5V |
V0 | To potentiometer centre pin for contrast control of LCD |
RS | ۸ |
RW | GND |
E | ۹ |
D4 | ۱۰ |
D5 | ۱۱ |
D6 | ۱۲ |
D7 | ۱۳ |
A | +5V |
K | GND |
با این کار تمام اتصالات مدار لازم بین همه اجزا به پایان می رسد. اکنون برنامه نویسی Raspberry Pi و Arduino UNO را با کد Master و Slave شروع کنید.
برنامه نویسی Raspberry Pi به عنوان Master با استفاده از Python
در Master برد Raspberry Pi ، مقدار زاویه دامنه (۰،۱۰،۴۵،۹۰،۱۳۵،۱۸۰،۱۳۵،۹۰،۴۵،۱۰،۰) از طریق پورت سریال به ماژول RS-485 ارسال می شود که مقداری را برای Arduino UNO ارسال می کند و سروو موتور را با توجه به آن کنترل می کند . بنابراین، برای استفاده از پورت سریال در Raspberry Pi، پورت UART سریال باید فعال شود.
فعال کردن پین های UART (پورت سریال) در Raspberry Pi:
قبل از استفاده از پین های UART در Raspberry Pi ، باید فعال شود. برای فعال کردن پین های UART (سریال) در صفحه Raspberry Pi مراحل زیر را دنبال کنید.
۱. ترمینال را باز کرده و sudo raspi-config را تایپ کنید
۲. گزینه های Interfacing را انتخاب کنید
۵- پس از آن از raspi-config خارج شوید
۶. برد را مجدداً راه اندازی کنید
اکنون پورت سریال آماده استفاده است.
مهم: قبل از نوشتن مقادیر در ماژول RS-485 ، پین های DE & RE باید بالا باشند.
بنابراین، اکنون می توانیم جزئیات مربوط به برنامه نویسی پایتون را در بخش اصلی مشاهده کنیم.
در ابتدا، کلیه کتابخانه ها برای وسایل جانبی مورد استفاده وارد می شوند. کتابخانه هایی که در اینجا مهم هستند عبارتند از: زمان، سریال (برای ارتباط سریال)، GPIO برای دسترسی به GPIO و sleep.
import time import serial import RPi.GPIO as GPIO from time import sleep
در بخش زیر، گزینه GPIO.BOARD مشخص می کند که شما به تعداد پین های صفحه به پین ها اشاره می کنید.
GPIO.setmode(GPIO.BOARD)
پین GPIO شماره ۷ در Raspberry Pi به دلیل اینکه پایه ۷ Pi به DE & RE RS-485 متصل است، HIGH شده است. زیرا باعث می شود RPi مقادیر را به RS-485 ارسال کند.
GPIO.setup(7, GPIO.OUT, initial=GPIO.HIGH)
کلاس سریال را در پین GPIO14 & GPIO 15 (پورت Serial0) با اطلاعات مختلف مانند پورت سریال ، نرخ باود ، برابری و بیت های توقف آغاز کنید.
send = serial.Serial( port='/dev/serial0', baudrate = 9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1 )
متغیر “i” با آرایه ای از مقادیر زاویه تعریف شده است، این مقادیر از طریق ارتباط سریال ارسال می شوند.
i = [0,10,45,90,135,180,135,90,45,10,0]
تابع send.write (str (x)) مقادیر را به عنوان یک پورت سریال به RS-485 می فرستد که به صورت مداوم در داخل حلقه while نوشته شده است. مقادیر با تأخیر ۱.۵ ثانیه ارسال می شوند.
while True: for x in i: send.write(str(x)) print(x) time.sleep(1.5)
این کد مربوط به Raspberry Pi است که به عنوان Master در ارتباطات سریال مبتنی بر RS485 عمل می کند.
برنامه نویسی آردوینو UNO (Slave)
در سمت Slave که Arduino UNO است ، مقادیر از Master دریافت می شود. سروو موتور متصل به آردوینو با توجه به مقدار دریافت شده چرخانده می شود و همچنین مقدار در صفحه LCD نمایش داده می شود. بنابراین، در برنامه نویسی آردوینو از کتابخانه نمایشگر LCD و کتابخانه موتور سروو استفاده می شود.
مهم: از آنجا که Slave RS-485 از Arduino UNO مقدار دریافت می کند ، پایه های DE & RE باید low باشند.
Arduino IDE برای برنامه نویسی Arduino UNO استفاده می شود.
درست مثل Master، ما چندین وسیله جانبی داشتیم و شامل کتابخانه های ضروری نیز بودیم، به همین ترتیب قسمت slave دارای وسایل جانبی مانند موتور سروو و نمایشگر LCD 16X2 است ، بنابراین با گنجاندن کتابخانه برای این وسایل جانبی شروع کنید.
#include <LiquidCrystal.h> #include <Servo.h>
LiquidCrystal lcd(8,9,10,11,12,13); // Define LCD display pins RS,E,D4,D5,D6,D7 Servo servo;
در ابتدا یک پیام نمایش داده می شود که با توجه به پروژه قابل تغییر است و سپس برای پیام بعدی پاک می شود.
lcd.begin(16,2); lcd.print("pishronic.ir"); lcd.setCursor(0,1); lcd.print("RS_485"); delay(3000); lcd.clear();
ارتباط سریال با نرخ باودریت ۹۶۰۰ آغاز می شود.
Serial.begin(9600);
همانطور که Arduino RS-485 مقداری را از Master دریافت می کند، پین ۲ (EnablePin) برای ایجاد حالت در ورودی و همچنین ایجاد پین DE & RE از RS-485 برای خواندن مقدار از برذ Master Raspberry Pi باید LOW شود.
digitalWrite(enablePin, LOW);
پایه سروو موتور PWM به پایه ۳ Arduino PWM متصل است.
servo.attach(3);
حلقه while زمانی اجرا می شود که مقداری در پورت سریال که ماژول RS485 متصل است در دسترس باشد.
از تابع Serial.paseInt برای دریافت مقدار عدد صحیح (Angle) از پورت سریال که از Raspberry Pi ارسال می شود استفاده می شود
int angle = Serial.parseInt();
مقدار چرخش دریافت شده را به موتور موتور بنویسید تا شافت سرو موتور از (۰ به ۱۸۰) بچرخد.
servo.write(angle);
و در آخر، مقدار زاویه با استفاده از توابع LCD مربوطه در صفحه نمایش LCD نمایش داده می شود.
lcd.setCursor(0,0); lcd.print("Angle From RPi "); lcd.setCursor(0,1); lcd.print(angle);
در این قسمت برنامه نویسی سمت slave را به پایان می رساند. همچنین با بارگذاری کدها در Raspberry Pi و Arduino UNO ، هر دو کنترلر برای یک نسخه آزمایشی آماده هستند.
آزمایش ارتباط سریال RS 485 با Raspberry Pi و Arduino UNO
وقتی اتصالات مدار کامل شد و کد در Arduino UNO بارگذاری شد، سپس از ترمینال برای اجرای کد پایتون در Raspberry Pi استفاده کنید. مقدار Angle از Raspberry Pi به Arduino Uno ارسال می شود تا از طریق ارتباط سریال RS-485 زاویه سرو موتور را کنترل کند.
با این کار آموزش کامل ارتباط سریال RS485 با استفاده از Raspberry Pi به پایان می رسد. اگر پیشنهادی دارید، لطفاً در بخش نظرات برای ما بنویسید.
Code
Master Raspberry Pi Code:
import time import serial import RPi.GPIO as GPIO from time import sleep GPIO.setwarnings(False) GPIO.setmode(GPIO.BOARD) GPIO.setup(7, GPIO.OUT, initial=GPIO.HIGH) send = serial.Serial( port='/dev/serial0', baudrate = 9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1 ) i = [0,10,45,90,135,180,135,90,45,10,0] while True: for x in i: send.write(str(x)) print(x) time.sleep(1.5)
Slave Arduino Code:
#include <LiquidCrystal.h> //Include LCD library for using LCD display functions
#include <Servo.h> //
For using Servo functions int enablePin = 2;
LiquidCrystal lcd(8,9,10,11,12,13); // Define LCD display pins RS,E,D4,D5,D6,D7
Servo servo;
void setup() {
lcd.begin(16,2);
lcd.print(“pishronic.ir”);
lcd.setCursor(0,1);
lcd.print(“RS_485”);
delay(3000);
lcd.clear();
Serial.begin(9600); // initialize serial at baudrate 9600:
pinMode(enablePin, OUTPUT);
delay(10);
digitalWrite(enablePin, LOW); // (Pin 2 always LOW to receive value from Master)
servo.attach(3); // (Servo PWM pin connected to Pin 3 PWM pin of Arduino) }
void loop()
{
while (Serial.available()) //While have data at Serial port this loop executes
{
lcd.clear();
int angle = Serial.parseInt(); //Receive INTEGER value from Master throught RS-485
servo.write(angle); //Write received value to Servo PWM pin (Setting Angle) l
cd.setCursor(0,0);
lcd.print(“Angle From RPi “);
lcd.setCursor(0,1);
lcd.print(angle); //Displays the Angle value
}
}
مطالب پیشنهادی برای شما
- MQTT چیست؟
- معرفی Webmin برای کار با Raspberry Pi
- پیدا کردن MAC Address در Raspberry Pi
- ۸ عامل برای انتخاب یک IoT وب سرور
- تفاوت بین روتر و فایروال - مهر ۱۰, ۱۴۰۳
- مسیریابی استاتیک در ویندوز - مهر ۸, ۱۴۰۳
- پروتکل SNMP - شهریور ۱۵, ۱۴۰۳