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:



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:

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.

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).

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:

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.

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
- 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.
Love tthis
LikeLike