Tutorial: Komunikasi arduino menggunakan RS485


Tutorial kali ini mengenai komunikasi antara dua buah arduino menggunakan modul RS485. Sebenarnya saya juga merujuk dari tutorial lain berbahasa inggris di sini . RS485 merupakan salahsatu modul komunikasi half duplex, secara serial. Half duplex berarti mampu mengirim atau menerima data pada jalur yang sama, namun bergantian (satu arah dalam satu waktu). Modul RS485 memiliki 8 pin yaitu Vcc, GND, A&B, DE, RE, DI, dan RO. Pada tutorial ini saya menggunakan Arduino Uno dan Leonardo, 2 buah modul RS485, serta 16 kabel jumper, dan sebuah breadboard.

Modul RS485

Rangkaiannya seperti berikut :

rangkaian di fritzing
rangkaian di fritzing

– Pin DI (data in) ke pin 11 Arduino sebagai TX software serial (kabel putih)
– Pin RO (receive out) ke pin 10 Arduino sebagai RX software serial (kabel jingga)
– Pin DE (data enable) dan RE (receive enable) dijumper dan dihubungkan ke pin 3 Arduino (kabel hijau)
– Pin A dan B (RS485 pair) dipasangkan kedua modul RS485 (kabel biru & kuning)
– Vcc dan GND dihubungkan (kabel merah dan hitam)

Modul RS485 ini dihubungkan dengan port serial arduino. Jika arduino yang digunakan hanya memiliki satu port serial (yang dihubungkan ke serial monitor PC), makan gunakanlah software serial (salah satu library arduino yang dapat menggunakan pin digital sebagai port serial).

Kemudian programnya ada 2, masing-masing untuk master dan remote. Program arduino dapat membuka 2 sketch dalam waktu yang sama, namun perhatikan PORT communication yang digunakan. Setelah kedua program diupload ke masing-masing perangkat, pilih port komunikasi dengan master lalu buka serial monitor. Ketikkan suatu karakter maka karakter itu akan dikirim melalui RS485 ke device remote untuk kemudian dikembalikan ke master dan ditampilkan di layar serial monitor.

arduino uno dan leo - RS485 (abaikan bunga)
arduino uno dan leo – RS485 (abaikan bunga)

Kode program Arduino Master :

/* YourDuino SoftwareSerialExample1
   - Connect to another Arduino running "YD_SoftwareSerialExampleRS485_1Remote"
   - Connect this unit Pins 10, 11, Gnd
   - Pin 3 used for RS485 direction control
   - To other unit Pins 11,10, Gnd  (Cross over)
   - Open Serial Monitor, type in top window. 
   - Should see same characters echoed back from remote Arduino

   Questions: terry@yourduino.com
 *edited:
 - addded filter
*/

/*-----( Import needed libraries )-----*/
#include <SoftwareSerial.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define SSerialRX 10 //Serial Receive pin
#define SSerialTX 11 //Serial Transmit pin

#define SSerialTxControl 3 //RS485 Direction control

#define RS485Transmit HIGH
#define RS485Receive LOW

#define Pin13LED 13

/*-----( Declare objects )-----*/
SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX

/*-----( Declare Variables )-----*/
int byteReceived;
int byteReceivedSerial;
int byteSend;

void setup() /****** SETUP: RUNS ONCE ******/
{
 // Start the built-in serial port, probably to Serial Monitor
 Serial.begin(9600);
 Serial.println("YourDuino.com SoftwareSerial remote loop example");
 Serial.println("Use Serial Monitor, type in upper window, ENTER");

 pinMode(Pin13LED, OUTPUT); 
 pinMode(SSerialTxControl, OUTPUT); 

 digitalWrite(SSerialTxControl, RS485Receive); // Init Transceiver 

 // Start the software serial port, to another device
 RS485Serial.begin(4800); // set the data rate 

}//--(end setup )---

void loop() /****** LOOP: RUNS CONSTANTLY ******/
{
 digitalWrite(Pin13LED, HIGH); // Show activity
 if (Serial.available())
 {
 byteReceivedSerial = Serial.read();

 digitalWrite(SSerialTxControl, RS485Transmit); // Enable RS485 Transmit 
 RS485Serial.write(byteReceivedSerial); // Send byte to Remote Arduino

 digitalWrite(Pin13LED, LOW); // Show activity 
 delay(10);
 digitalWrite(SSerialTxControl, RS485Receive); // Disable RS485 Transmit 
 }

 if (RS485Serial.available()) //Look for data from other Arduino
 {
 digitalWrite(Pin13LED, HIGH); // Show activity
 byteReceived = RS485Serial.read(); // Read received byte
 if ((byteReceived == byteReceivedSerial) && (byteReceived != NULL))
 {
 Serial.write(byteReceived); // Show on Serial Monitor
 delay(10);
 digitalWrite(Pin13LED, LOW); // Show activity 
 }
 } 

}//--(end main loop )---

/*-----( Declare User-written Functions )-----*/

//NONE
//*********( THE END )***********

Kode program Arduino Remote

/* YourDuino SoftwareSerialExample1Remote
   - Used with YD_SoftwareSerialExampleRS485_1 on another Arduino
   - Remote: Receive data, loop it back...
   - Connect this unit Pins 10, 11, Gnd
   - To other unit Pins 11,10, Gnd  (Cross over)
   - Pin 3 used for RS485 direction control   
   - Pin 13 LED blinks when data is received  
   
   Questions: terry@yourduino.com 
   *edited:
   - addded delay
*/

/*-----( Import needed libraries )-----*/
#include <SoftwareSerial.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define SSerialRX        10  //Serial Receive pin
#define SSerialTX        11  //Serial Transmit pin

#define SSerialTxControl 3   //RS485 Direction control
#define RS485Transmit    HIGH
#define RS485Receive     LOW

#define Pin13LED         13

/*-----( Declare objects )-----*/
SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX

/*-----( Declare Variables )-----*/
int byteReceived;
int byteSend;

void setup()   /****** SETUP: RUNS ONCE ******/
{
  // Start the built-in serial port, probably to Serial Monitor
  Serial.begin(9600);
  Serial.println("SerialRemote");  // Can be ignored
  
  pinMode(Pin13LED, OUTPUT);   
  pinMode(SSerialTxControl, OUTPUT);  
  
  digitalWrite(SSerialTxControl, RS485Receive);  // Init Transceiver
  
  // Start the software serial port, to another device
  RS485Serial.begin(4800);   // set the data rate 
}//--(end setup )---


void loop()   /****** LOOP: RUNS CONSTANTLY ******/
{
  //Copy input data to output  
  if (RS485Serial.available()) 
  {
    byteSend = RS485Serial.read();   // Read the byte 
    
    digitalWrite(Pin13LED, HIGH);  // Show activity
    delay(10);              
    digitalWrite(Pin13LED, LOW);   

    if(byteSend != NULL)
    {
      digitalWrite(SSerialTxControl, RS485Transmit);  // Enable RS485 Transmit    
      delay(10);
      RS485Serial.write(byteSend); // Send the byte back
      delay(10);   
      digitalWrite(SSerialTxControl, RS485Receive);  // Disable RS485 Transmit      
    } 
//    delay(100);
  }// End If RS485SerialAvailable
  
}//--(end main loop )---

/*-----( Declare User-written Functions )-----*/
//NONE

//*********( THE END )***********

Contoh di atas hanyalah sebagai dasar untuk mengetahui cara kerja komunikasi menggunakan RS485. Untuk penerapannya, komunikasi menggunakan RS485 ini dapat digunakan untuk beberapa buah arduino sebagai remote/client dengan maksimum jarak/panjang kabel 1200 meter dengan kecepatan maksimum 20Mbps. Cocok untuk diaplikasikan dalam sebuah sistem sensor network.

Dalam komunikasi menggunakan RS485, setiap perangkat harus secara bergantian mengirim, dan menerima. Seperti bagaimana manusia berkomunikasi seharusnya. Bahwa agar tercipta suatu komunikasi yang baik, maka harus ada yang berperan sebagai pendengar yang setia dan pembicara yang jelas.

Sekian tutorial mengenai komunikasi arduino menggunakan modul RS485.  Jika ada yang hendak ditanyakan bisa melalui kolom komentar di bawah. Semoga bermanfaat.

*sumber:

https://arduino-info.wikispaces.com/RS485-Modules
http://arduino-info.wikispaces.com/SoftwareSerialRS485Example
https://www.arduino.cc

 

Advertisements

2 thoughts on “Tutorial: Komunikasi arduino menggunakan RS485

Tinggalkan komentar

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s