ارتباط سریال RS-485 بین Raspberry Pi و Arduino Uno

 

ارتباط سریال 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
پتانسیومتر ۱۰K
سیم



پایه ها و ویژگی های ماژول مبدل MAX-485 TTL به RS-485

Pinout

 

Pin Name Pin Description
VCC ۵V
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 +

برای اتصال MAX485 TTL به ماژول تبدیل شده RS-485 به Raspberry Pi از پین های UART زیر Pi استفاده می شود (GPIO14 ، GPIO15).

پایه ها رزبری

 

اتصال ماژول RS-485 با Arduino UNO

برای اتصال MAX485 TTL به ماژول مبدل RS-485 به Arduino UNO از پین های UART زیر UNO استفاده می شود (۰،۱).

Circuit-Diagram-for-Connecting-RS-485-Module-with-Arduino-UNO

 

اتصال مدار بین یک RS-485 و Raspberry Pi 3 B + (Master):

RS-485 Raspberry Pi 3 B+
DI GPIO14 (TX)
DE RE GPIO4
R0 GPIO15(RX)
VCC ۵V
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 ۵V
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 +۵V
ORANGE (PWM) ۳
BROWN GND

اتصال مدار بین LCD 16×2 و Arduino UNO:

۱۶×۲ LCD Arduino UNO
VSS GND
VDD +۵V
V0 To potentiometer centre pin for contrast control of LCD
RS ۸
RW GND
E ۹
D4 ۱۰
D5 ۱۱
D6 ۱۲
D7 ۱۳
A +۵V
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 را انتخاب کنید

۳. سپس serial را انتخاب کنید
۴.سپس بر روی “No” (این مورد برای غیرفعال کردن کنسول Linux UART استفاده می شود) کلیک کنید

۵- پس از آن از 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>          
بعد پین های صفحه نمایش LCD 16X2 که قرار است با Arduino UNO استفاده شوند، تعریف شده و سپس آبجکت Servo نیز ایجاد می شود.
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

 

}

 

}

 

 


مطالب پیشنهادی برای شما


 

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *