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

Arduino pada Ubuntu

Bismillah,

Jadi berawal dari tugas akhir mata kuliah Mikrokontroler yang mengharuskan untuk menggunakan device yang kompatibel dengan Arduino IDE , saya dan teman saya (kelompok 2 orang) memutuskan untuk membeli board Arduino Uno Rev.3 . Itu pun belinya nunggu lama karena stock arduino uno di toko elektronik 51 habis, juga di beberapa toko online yang masih inden. Sampai akhirnya teman saya menemukan sebuah online-store yang ready-stock untuk Arduino Uno. Dan ini penampakan arduino uno (unboxed) :

Kenapa harus Uno? bukan Mega/Leonardo/Nano/Lilypad sekalian? Ya sebenernya tergantung kebutuhan juga sih, dan juga salah satu aspek yang menentukan yaitu : budget! Dengan harga pasaran Rp 270.000,00 – Rp 290.000 , Arduino Uno Rev.3 sudah cukup untuk membuat perangkat elektronik cerdas karena memiliki 14 pin I/O dengan 6 Analog Pin, VRef 5V , dan lain lain (bisa cek di website nya untuk spesifikasi lengkap). Untuk menghubungkan arduino dengan PC/Notebook digunakan kabel USB DKU (sama seperti kabel printer).

Pertama kali saya mencoba mengisi program pada arduino tersebut melalui windows, dan itu hal yang mudah (tinggal install driver,dan jadi). Kemudian saya jadi ingin mencoba menggunakan Ubuntu untuk mengunggah sketch (nama source-code yang digunakan arduino) ke Uno saya. Setelah googling beberapa saat akhirnya saya dapat menghubungkan Arduino Uno saya ke Ubuntu 12.04. Berikut saya berikan langkah nya :

1. Unduh dan pasang beberapa package yang dibutuhkan yaitu : avr-libc, avrdude, binutils-avr, gcc-avr, arduino, openjdk-6-jre. Caranya seperti biasa, menggunaka apt-get :

$ sudo apt-get install avr-libc avrdude binutils-avr gcc-avr arduino openjdk-6-jre

2. Kemudian hapus package brltty karena kemungkinan akan crash dengan port komunikasi serial.
$ sudo apt-get remove brltty

3 .  Setelah selesai, hubungkan arduino board ke PC/notebook anda, dan ketikkan pada terminal :

$ dmesg | grep tty
[ 0.000000] console [tty0] enabled
[ 81.653857] usb 2-1.2: GSM modem (1-port) converter now attached to ttyUSB0
[ 81.654028] usb 2-1.2: GSM modem (1-port) converter now attached to ttyUSB1
[ 81.654167] usb 2-1.2: GSM modem (1-port) converter now attached to ttyUSB2
[ 81.654287] usb 2-1.2: GSM modem (1-port) converter now attached to ttyUSB3
[ 8069.049542] cdc_acm 2-1.4:1.0: ttyACM0: USB ACM device

dari pesan tersebut nampak pada notebook saya ada devive baru dikenali pada port serial ttyACM0.

4. kemudian buka IDE arduino dengan mengetikkan:

$ arduino

5. Pada menu Tools/Serial Port , pilih port serial sesuai dengan milik anda, (misal milik saya /dev/ttyACM0 , sesuai dengan yang tadi muncul)

6. Coba salah satu example dan upload

7. Ketika selesai dan benar maka muncul tulisan : Done Uploading pada bagiam bawah.

Selesai! Alhamdulillah ..

Kiranya sekian saja tulisan saya kali ini, semoga bermanfaat. Saya juga masih newbie dalam dunia linux dan arduino jadi jika ada yang mau mengkoreksi tulisan ini saya persilakan. Dan kalau ada yang mau bertanya juga saya persilakan,insyaAllah saya jawab kalau memang saya tau jawabannya. Terimakasih atas kunjungannya. Ada kurangnya mohon maaf.