Komunikasi Serial Arduino-ke-Arduino | ASAS Serial| ASAS WIRELESS

Komunikasi Serial, adalah kaedah komunikasi yang dilaksanakan antara 2 MicroController, untuk menghantar DATA sedikit mahupun banyak kepada MicroController penerima.

Pelbagai jenis komunikasi yang ada hari ini adalah seperti:

  • USB
  • Internet / WiFi
  • Bluetooth
  • Radio Frequency

Komunikasi antara 2 MicroController (juga Arduino) membolehkan anda explore applikasi wireless dan jarak jauh seperti:

  • Robot control dan monitoring
  • RC Kapal Terbang, Drone, Kereta, Bot dan sebagainya
  • Wireless Sensor suhu, ketinggian, GPS, cahay dan sebagainya
  • Juga pelbagai applikasi auto dan robotik lain

Yang paling best adalah, anda dapat membuat Custom Remote-Station, yang mempunyai pelbagai kawalan output juga dapat membaca pelbagai reading sensor dari robot serta applikasi anda pada jarak jauh (bergantung pada module wireless).

Contoh-contoh Custom Remote Control juga Custom Remote Station:

e4925458959b3043c33d717267b53781
Custom Remote PS2 Joystick
imag0747-1-1
Custome RC Transmitter. Source : https://oscarliang.com
elite20th10020helicopter20flight20sim
Konsep Remote Station untuk UAV (Unmanned-Aerial-Vehicle). Source : http://www.helicoptersonly.com

KAEDAH KOMUNIKASI

Beberapa protocol seperti berikut dapat digunakan untuk membuat satu Arduino berkomunikasi dengan Arduino yang lain:

  • Serial UART (Hardware Serial -Tx / Rx)
  • Serial Software (Library SoftwareSerial)
    Nota: Serial Software mempunyai isu tidak boleh digunakan dengan Servo.h Library.
  • SPI (synchronous)
  • I2C (synchronous)

Dalam artikel ini, kami akan menerangkan komunikasi yang termudah iaitu Serial UART antara 2 Arduino.

APA ITU KOMUNIKASI SERIAL ?

Arduino UNO mempunyai 13 Pin Digital dan 6 pin Analog. Kesemua sambungan Input/Output ini adalah sambungan secara Parallel kepada chip ATmega328P Arduino. Ini bermakna, kesemua Input/Output dari pin-pin ini di proses secara “serentak” atau hampir serentak disebabkan cara sambungan mereka terus pada chip MCU.

Dalam Komunikasi Serial, kesemua data Input/Output tadi, diterjemahkan ke bentuk binary yang bersiri seperti rajah di bawah, sebelum dihantar ke Unit Ke-Dua:

SERIAL DATA.jpg

Dengan kaedah Serial, sambungan juga wiring hardware dapat di perkemaskan dan dipermudahkan kepada hanya menggunakan 3-5 wire sambungan dan dapat menghantar data dari pelbagai jenis applikasi kepada MCU.

Sebagai contoh, dengan menggunakan Serial UART Arduino, sambungan hanya menggunakan 3 wire sambungan iaitu, wayar Tx, Rx, juga Ground.

Walaubagaimanapun, unit ke-Dua yang menerima data Serial, harus menterjemahkan semula data-data tersebut ke bentuk Parallel semula, atau ke dalam bentuk yang boleh digunakan oleh Input/Output peripherals unit tersebut.

Serial convert.jpg

Komunikasi Serial UART seperti di atas  tidak mempunyai “Denyutan Nadi” atau Clock Data, juga mempunyai nama lain iaitu Assynchronous Serial (UART). Sambungan Serial UART Arduino, hanya menggunakan 3 wire sambungan iaitu, wayar Tx, Rx, juga Ground.

Serial SPI dan juga IIC berbeza dengan UART. Mereka mempunyai wayar ke-Empat yang memberikan “Denyutan Nadi” atau Data Clock pada signal Serial mereka. SPI dan IIC juga dikenali dengan nama lain, Synchronous Serial (USART).

52ddb2d8ce395fad638b4567
Sumber : SparkFun.com

Perbezaan yang ketara antara 2 jenis Komunikasi Serial (UART vs USART) adalah dari segi kelajuan data yang diterima-hantar, kilobytes per second.

UART 
Dalam UART, tanpa Denyutan Nadi, pengguna perlu menyatakan kelajuan data yang dihantar pada Unit-Penerima juga pada Unit-Transmitter, yang lebih dikenali sebagai Baud Rate. Baud Rate Serial UART sering dinyatakan pada kelajuan 9600, 19200, 38400, 57600, 115200, dan 115200bps merupakan kelajuan maksimum UART sebelum data hilang.

USART 
Dalam konteks Komunikasi USART seperti SPI dan IIC, pengguna tidak perlu menyatakan kelajuan data, kerana Data Clock akan mengawal kelajuan data-transfer. Dengan USART kelajuan Transmisi/Receive-Data boleh pergi pada kelajuan maksimum 4Mbps.

Serial UART dengan Arduino ?

Setiap Board Arduino mempunyai sekurang-kurangnya satu peripheral UART pada MCU ATmega328P. Arduino Mega pula mempunyai 4 port UART.

Sambungan Serial UART pada 2 Unit Arduino boleh dibuat berdasarkan rajah di bawah:

ard-ke-ard-connect

PENTING!: Dengan kaedah Serial UART, wayar Tx-Penghantar, perlu disambungkan pada wayar Rx-Penerima, dan juga vice-versa untuk wayar seterusnya.

Walaubagaimanapun, harus diingat bahawa, Port USB pada Arduino, yang disambungkan pada Komputer, juga menggunakan Pin Rx(0) dan Pin Tx(1) ketika berkomunikasi untuk memasukkan sketch baru juga ketika menggunakan fungsi Serial Monitor.

Oleh itu, menggunakan Serial Monitor (Komputer) serentak bersama penggunaan Serial UART untuk berkomunikasi dengan Arduino lain atau module lain, akan mengganggu data-transfer. Elakkan menggunakan 2 komunikasi UART-Hardware dalam satu masa yang sama.
(Sebagai Contoh : Jika ingin menggunakan Hardware Serial, Disconnect kan dahulu sambungan Pin 0 dan Pin 1 ketika memasukkan sketch dalam Arduino, bila sudah upload, sambungakan semula)

Pihak Arduino telah mengenal pasti masalah ini, dan komuniti Arduino telah menyediakan Library Serial Software, yang membuat simulasi komunikasi Serial UART menggunakan Algortyhm Coding dalam Arduino IDE. Dengan library ini, komunikasi Serial UART(simulasi) dapat digunakan pada mana-mana pin digital, tanpa menggunakan Pin 0 dan Pin 1.

KAEDAH CODING DAN ALGORYTHM Serial UART

Lihat contoh di bawah untuk contoh code ringkas menghantar data melalui Serial pada Arduino Kedua. Dalam code ini, 2 signal analog dan 2 signal digital di hantar melalui Serial.

//Serial Komunikasi Arduino-ke-Arduino
//Code disediakan oleh MatGyver.my

int pot0 = 0;  
int pot1 = 0;  
int butang1 = 0;
int butang2 = 0;

void setup() {

 pinMode(A0,INPUT); //input analog pada pin A0
 pinMode(A1,INPUT); //input analog pada pin A1
 //Input Pull_up digunakan untuk tidak menggunakan perintang
 pinMode(2,INPUT_PULLUP); //butang pada pin 2
 pinMode(3,INPUT_PULLUP); //butang pada pin 3
 
 Serial.begin(9600); //memulakan komunikasi Serial dengan Baud Rate 9600kbps
}

void loop() {
 butang1 = digitalRead(2);
 butang2 = digitalRead(3);

///+++APABILA BUTANG DITEKAN+++///
//digital read memberi value LOW bila butan ditekan
//ini kerana ktia menggunakan INPUT_PULLUP bukan INPUT
    if (butang1 == LOW){
      butang1 = 255;   //berikan value maksimum digital 255   
       }
    if (butang2 == LOW){
      butang2 = 255;  //berikan value maksimum digital 255 
    }
///+++APABILA BUTANG DILEPAS+++///
    if (butang1 == HIGH){
      butang1 = 0;    //berikan value minimum digital 0
    }
    if (butang2 == HIGH){
      butang2 = 0;    //berikan value minimum digital 0
    }
    pot0 = analogRead(A0);          
    pot0 = map(pot0, 0, 1023, 0, 255);  //map Analog input pada digital 255 max 
    pot0 = constrain(pot0, 0, 255);     //beri had limit pada data   
 
    pot1 = analogRead(A1);             
    pot1 = map(pot1, 0, 1023, 0, 255);  //map Analog input pada digital 255 max 
    pot1 = constrain(pot1, 0, 255);     //beri had limit pada data   
 
 ///+++++HANTAR SIGNAL+++++////
 //Susunan data ini perlu sama dengan susunan data penerima
 Serial.write("<");      // Ini penanda aras permulaan Data Serial
 Serial.write(butang1);    
 Serial.write(butang2);  
 Serial.write(pot0);
 Serial.write(pot1);
 
 delay(15);
}

PENTING! : Setiap data yang dihantar hanya mempunyai 1 byte maksimum dengan Serial.write(). Dengan itu, value maksimum 8 bit yang boleh dihantar hanyalah 255. Tidak boleh lebih.

Lihat contoh di bawah untuk contoh code ringkas menerima data tersebut dari Serial Arduino Pertama.

//Serial Komunikasi Arduino-ke-Arduino RECEIVER Code
//Code disediakan oleh MatGyver.my

#include <Servo.h>
Servo servosaya1;
Servo servosaya2;
int Servo1 = 0;  
int Servo2 = 0;  
int LED1 = 0;
int LED2 = 0;

//+++MEMASTIKAN ARDUINO MENERIMA DATA DALAM BENTUK BYTE+++//
byte datamula; //menyimpan penanda "<" dipermulaan
              //semua data yang datang dari serial adalah dalam bentuk byte
              //atau 8 bit
void setup() {
 pinMode(2, OUTPUT); //input analog pada pin A0
 pinMode(3, OUTPUT); //input analog pada pin A1
 servosaya1.attach(4);
 servosaya2.attach(5);
 Serial.begin(9600); //memulakan komunikasi Serial dengan Baud Rate 9600kbps
 delay(300);
}
void loop() {
 Serial.flush(); //memastikan mana-mana data serial habis di hantar
                 //serta membuang mana-mana buffer data serial           
 if(Serial.available()){ //panggilan untuk melihat jika ada data dari serial port
   datamula   = Serial.read(); //menyimpan data permulaan "<"
   LED1       = Serial.read(); //menyimpan data dari butang1
   LED2       = Serial.read(); //menyimpan data dari butang2
   Servo1     = Serial.read(); //menyimpan data dari pot0
   Servo2     = Serial.read(); //menyimpan data dari pot1
 }
 //perhatikan, susunan data serupa dengan susunan data dari PENGHANTAR (ini penting)

 //Algorythm di bawah akan terjemahkan semua data serial kepada output
 if(datamula == '<'){     //INI SANGAT PENTING! Dengan mempunyai data permulaan yang betul,
                          //semua OUTPUT dapat disusun semula dengan betul
   if (LED1 == 255)      
   digitalWrite(2, HIGH);//data nilai 255 yang diterima tukar pada signal HIGH LED1
   if (LED1 == 0)
   digitalWrite(2, LOW); //data nilai 0 yang diterima tukar pada signal LOW LED1
   if (LED2 == 255)
   digitalWrite(3, HIGH);//data nilai 255 yang diterima tukar pada signal HIGH LED2
   if (LED2 == 0)
   digitalWrite(3, LOW); //data nilai 0 yang diterima tukar pada signal LOW LED2
   }
   
 if(datamula == '<'){     //Safety untuk check data buat kali ke-2
                          
    Servo1 = map(pot0, 0, 255, 0, 180);//map semula data serial 255 pada kawalan servo                      
    Servo1 = constrain(pot0, 0, 180);  //beri had limit pada data  
    servosaya1.write(Servo1); //gerakkan Servo1

    Servo2 = map(pot0, 0, 255, 0, 180);//map semula data serial 255 pada kawalan servo                        
    Servo2 = constrain(pot0, 0, 180);  //beri had limit pada data  
    servosaya2.write(Servo2); //gerakkan Servo2
    }
 
 delay(15); //kealjuan loop 15ms
}

Anda boleh download Coding/Sketch di atas di URL berikut:

Sketch ini tidak begitu susah, kerana anda hanya perlu bermain dengan nombor 0~255 sahaja, dan terjemahkan data tersebut mengikut kreativiti anda.

BEBERAPA KELEMAHAN Serial UART

Selain dari kelajuan data yang tidak begitu laju, salah satu kelemahan UART adalah ia berada pada TTL (Transistor-to-Transistor Logic) Level.

Signal data TTL bermain pada voltan 5V dan currentnya sangat rendah, ini menyebabkan connection antara 2 Arduino anda tidak dapat pergi begitu jauh, hanya sehingga 1~3m sahaja.

Jika sambungan wayar adalah lebih dari 3m, dikhuatiri akan ada Data-Loss atau sambungan menerima Electromagnetic-Noise dari sekeliling yang akan mengganggu transmisi.

Walaubagaimanapun, wujud module-module perantara yang dapat membawa data Serial UART anda pergi dengan lebih jauh, ikuti berikut.

MODULE PERANTARAAN

Terdapat 2 kaedah untuk meningkatkan jarak transmisi Serial UART:

  • Solusi Wired (menggunakan Module Booster wayar lebih panjang)
  • Solusi Wireless (menggunakan Module Wireless, Bluetooth, Wifi atau RF)

MODULE WIRED (menggunakan wire panjang)
Bagi penggunaan wire panjang di antara 2 Arduino, 3 jenis module berikut dapat digunakan:

  • USB Module (3~5m)
  • RS-232 Module (sehingga 15m)
  • Rs-485 Module (sehingga ~400m)

Dari 3 di atas, penggunaan RS-232 module adalah antara pilihan lebih mudah dan murah, tidak perlu sebarang perubahan coding/sketch, dan anda hanya perlu menggunakan module RS232-to-TTL converter.

rs232conn
Sambungan Arduino-ke-Arduino dengan RS-232 Module Converter

Module RS-232 to TTL Converter boleh didapati di URL berikut:

Bagi penggunaan yang lebih jauh, boleh menggunakan module RS-485 tetapi,
“Alang-alang menyeluk perkasam, biar terus Wireless…”

MODULE WIRELESS
Untuk Wireless Communication, module-module seperti di bawah dapat digunakan. Kebanyakan module wireless yang menggunakan protocol UART, tidak perlu penambahan algorythm dan library:

  • Bluetooth HC-05/HC-06 (jarak dekat dan mudah)
    Jenis Komunikasi : Serial UART
    Dapatkan di URL ini : HC-06 Bluetooth
    ARD-KE-ARD BT BT.jpg
  • Wifi (ESP8266)  (jarak dekat dan mudah)
    Jenis Komunikasi : Serial UART
    Dapatkan di URL ini : Module WiFi ESP8266
  • nRF24L01+ (cost murah dan jarak jauh ~1000m)
    Jenis Komunikasi : Serial SPI
    Dapatkan di URL ini : Module nRF24L01+
  • Module RF lain seperti 433MHz
    Jenis Komunikasi : Serial UART
    Dapatkan di URL ini : Module RF Tranceiver 433MHz
  • Xbee (cost tinggi)
    Jenis Komunikasi : Serial UART

Ikuti artikel-artikel berikut, untuk maklumat lanjut mengenai setiap penggunaan Module di atas:

  • Menggunakan Module nRF24L01+ sebagai RF Transceiver
  • Menggunakan Bluetooth Module HC-05/HC-06
  • Menggunakan Wifi Module ESP8266

Jika anda dapati artikel ini membantu kroang dan project korang, jangan lupa untuk sumbangkan “Like” pada aritkel, atau kongsikan aritkel ini supaya kami lebih bersemangat untuk kongsikan artikel-artikel yang lebih mantap!

Disclaimer : Tentang MatGyver.my

Artikel-artikel di MatGyver.my ditulis khas untuk DIY-ers dan Hobbyist yang tiada latar belakang Electronics Engineering mahupun Mechanical Engineering. Setiap artikel MatGyver.my diolah dan digubah semudah yang mungkin bertujuan untuk mempermudahkan pemahaman dan penggunaan sesuatu komponen teknikal untuk aktiviti DIY. Artikel-artikel di MatGyver.my tidak sesuai untuk pembaca yang memerlukan info yang terlalu detail dan sangat mendalam sehingga boleh mendapat segulung Ijazah Sarjana Muda Electronics Engineering atau Mechanical Engineering.

Namun, kami alu-alukan anda-anda yang hebat untuk memberi penjelasan yang lebih terperinci pada mana-mana persoalan yang timbul tentang 2 topik utama di atas.

Published by Mat Gyver

Peneraju Komuniti Digital Maker Malaysia. Pembangunan Komuniti diUtamakan.

One thought on “Komunikasi Serial Arduino-ke-Arduino | ASAS Serial| ASAS WIRELESS

Tinggalkan Jawapan

Masukkan butiran anda dibawah atau klik ikon untuk log masuk akaun:

WordPress.com Logo

Anda sedang menulis komen melalui akaun WordPress.com anda. Log Out /  Tukar )

Facebook photo

Anda sedang menulis komen melalui akaun Facebook anda. Log Out /  Tukar )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: