Protokol UART pada Arduino Contoh dan Tutorial

Hallo, Pada artikel sebelumnya kita sudah membahas tentang metode transmisi data pada mikrokontroller khususnya arduino UNO, yaitu ada transmisi data parallel dan serial. Transmisi data serial dibagi menjadi 2, yaitu : Sinkron dan Asinkron. Protokol komunikasi serial sinkron adalah SPI dan I2C sedangkan protokol serial asinkron adalah UART. Nah, pada artikel kali ini kita akan membahas secara detail tentang protokol komunikasi serial asinkiron UART.

Definisi

Protokol ini memungkinkan komunikasi dua arah antara Arduino dan perangkat eksternal, seperti sensor, modul GPS, modem GSM, PC bahkan sesama arduino dan mikrokontroller lain. Pada arduino nano, uno, promini pin 0 (Rx) dan pin 1 (Tx) digunakan sebagai protocol komunikasi UART, Pin TX digunakan untuk mengirim data dari Arduino ke perangkat eksternal, sementara pin RX digunakan untuk menerima data dari perangkat eksternal. Komunikasi UART arduino digunakan untuk komunikasi antara arduino PC termasuk proses upload sketch, menghubungkan pin Rx dan Tx ke modul lain dapat mengganggu komunikasi arduino dan PC sehingga mengakibatkan kegagalan upload sketch ke arduino. Komunikasi UART juga digunakan untuk mengirim perintah dari arduino ke PC melalui serial monitor. Pin Tx pada perangkat transmitter dihubungkan ke pin Rx pada perangkat receiver sedangkan pin Rx transmitter dihubungkan ke pin Tx receiver.

UART termasuk dalam komunikasi serial asynchronous, artinya komunikasi antar perangkat tidak menggunakan sinyal clock untuk mensinkronasikan data. Untuk mensinkronasikan data yang dikirim, UART menambahkan bit kedalam data yang di transfer berupa start bit dan stop bit, fungsi dari bit ini adalah sebagai penanda awal dan akhir dari paket data yang di transmisikan, jadinya UART receiver tahu awal dan akhir pembacaan data. Ketika receiver UART mendeteksi start bit, maka receiver sudah siap untuk menerima bit seterusnya, jika receiver mendeteksi stop bit, maka transimisi data bisa biakhiri. Bit –bit data pada komunikasi UART dikirim dan diterima dengan frekuensi tertentu yang disebut sebagai baudrate, baudrate adalah ukuran kecepatan transfer data, satuannya adalah bit per second (bps), UART transmitter dan receiver beroperasi pada baudrate yang sama, arduino Uno biasanya menggunakan baudrate 9600 bps.

Cara Kerja

UART mengirim dan menerima data dari data bus, Data di transfer dari data bus ke UART transmitter (UART 1) secara parallel, setelah UART transmitter mendaparkan data parallel dari data bus, ditambahkanlah start bit, parity bit dan stop bit, sehingga membentuk sebuah paket data, setiap paket data berisi 1 start bit, 5-9 data bit (tergantung kapasitas UART), 1 parity bit dan 1 atau 2 stop bit. Kemudian paket data dikirimkan secara serial, bit per bit melalui pin Tx, setelah itu, UART receiver (UART 2) membaca paket data tersebut bit per bit dari pin Rx. Selanjutnya UART receiver mengubah kembali data serial menjadi data parallel kemudian membuang start bit, parity bit dan stop bit, terakhir UART receiver mengirim data dalam bentuk parallel ke data bus perangkat receiver. 

Paket Data

Paket data pada protokol UART terdiri dari start bit, data frame, parity bit dan stop bit. 

  • Start Bit
Start bit adalah bit yang menjadi aba-aba bahwa data akan dikirimkan. Ketika tidak mentransmisi data, kondisi pin transimisi data berada dalam keadaan HIGH. Untuk memulai transfer data, UART transmitter mengubah kondisi pin transmisi dari HIGH ke LOW,        ini akan memberitahu receiver UART untuk mulai melakukan pembacaan data
 
  • Data Frame

Data frame adalah data sesungguhnya yang di transmisikan. Jumlahnya bisa 5 sampai 8 bit jika menggunakan parity bit, sedangkan jika tidak menggunakan parity bit bisa sampai 9 bit. Biasanya data yang paling awal dikirim adalah least significant bit (LSB).

  • Parity bit

Parity bit adalah sebuah digit yang digunakan untuk mengecek kesamaan data saat dikirim  dan diterima. pada komunikasi serial UART, parity bit ditambahkan pada data frame (paket data) oleh transmitter, selanjutnya digunakan oleh reciever untuk mengecek apakah data yang ditransfer sudah sesuai atau tidak. nilai parity bit bisa 0 atau 1 tergantung dari pengecekan parity nya, pengecekan tersebut akan menghasilkan 2 kemungkinan yaitu paritas ganjil (even parity) atau paritas genap (odd parity). Bagaimana transmitter menambahkan parity bit kedalam paket data ? pertama, transmitter melakukan parity checking yaitu mengecek jumlah digit yang bernilai 1 pada paket yang akan dikirimkan, hasil pengecekan tersebut jumlah digit bernilai 1 bisa ganjil atau genap, kemudian, parity bit akan ditambahkan pada frame sesuai aturan berikut :

Transmitter tidak menambahkan parity bit pada data frame (paket data), juga reciever juga tidak perlu melakukan parity check saat paket data sudah diterima.

Transmitter menambahkan parity bit agar 1s (digit bernilai 1) pada date frame  jumlahnya genap. contohnya, jika ingin mengirimkan huruf “a” (1100001) menggunakan metode even partity (paritas genap), 1s pada huruf a adalah 3, yang mana itu adalah bilangan ganjil. maka transmitter akan menambahkan parity bit bernilai 1 agar 1s menjadi bilangan genap. contoh lainnya, jika kita ingin mengirimkan huruf “A” (1000001), 1s pada huruf A adalah 2, yang mana  sudah genap bilangannya, maka transmitter akan menambahkan parity bit 0 agar menjaga jumlah 1s pada data frame tetap genap.

Proses nya sama dengan Even Parity, hanya saja jumlah 1s dijaga agar bilangannya ganjil.

Parity bit selalu bernilai 0, space parity disebut juga bit filling, sesuainya namanya, bit ini digunakan untuk mengisi 7 bit data yang akan di kirimkan ke reciever yang hanya menerima 8 bit data.

Proses nya sama dengan space parity, hanya saja parity bit selalu bernilai 1.

Jadi parity bit adalah cara UART Reciever mengecek data yang diterima, apakah data tersebut ada perubahan atau tidak selama proses transmisi. data bisa berubah akibat radiasi elektromagnetik, baud rate yang tidak sesuai atau jarak transfer data yang jauh, setelah reciever UART membaca data frame, reciever akan menghitung jumlah 1s dan mengecek apakah jumlahnya genap atau ganjil, jika parity bit nya 0 (even parity), maka 1s harusnya berjumlah genap. Jika parity bit nya 1 (odd parity), maka 1s harusnya berjumlah ganjil. Ketika parity bit sesuai dengan data frame, UART reciever tahu bahwa data yang diterima sudah sesuai dengan data yang dikirim oleh transmitter, namun jika parity bit nya 0 dan 1s  adalah bilangan ganjil, atau parity bit 1 dan 1s adalah bilangan genap, maka UART Reciever tahu bahwa ada ketidaksamaan paket data yang dikirim dan paket data yang diterima

  •  Stop bit

Stop bit adalah bit terakhir yang dikirim pada suatu paket data yang ditransmisikan. UART transmitter mengubah kondisi pin dari LOW ke HIGH setidaknya sebanyak 2 bit.

Langkah-Langkah Transmisi Data

1.UART transmitter menerima data dalam bentuk parallel dari data bus

2. UART Transmitter menambahkan start bit, parity bit dan stop bit pada data frame dan membuat sebuah paket data.

3. Seluruh paket data dikirim secara serial dari transmitter UART ke receiver UART. Reciever UART membaca paket data pada frekuensi baudrate yang sudah ditentukan.

4. Reciever UART membuang start bit, parity bit dan stop bit dari data frame

5. Reciever UART mengubah data serial kembali menjadi data parallel dan mengirimkan nya ke data bus receiver.

Kelebihan dan Kekurangan

Kelebihan Protokol Komunikasi UART :

  • Hanya menggunakan 2 kabel
  • Tidak membutuhkan sinyal clock
  • Mempunyai parity bit untuk mengecek error pengiriman data
  • Struktur data peket bisa diubah selama kedua UART sudah di atur untuk itu
  • Metode komunikasi yang banyak digunakan

Kekurangan :

  • Jumlah bit yang bisa dikirimkan setiap paketnya hanya 9 bit
  • Tidak bisa digunakan untuk berkomunikasi dengan banyak komponen dalam satu saluran
  • Toleransi baudrate maksimal 10%

Fungsi-Fungsi Komunikasi UART pada Arduino

Berikut Beberapa fungsi yang sering digunakan pada pemrograman arduino saat malakukan transmisi data dengan protokol komunikasi UART :

  • if (serial)

Fungsi ini digunakan untuk mengecek adakah koneksi serial yang terhubung dengan arduino, fungsi ini berguna untuk memastikan koneksi seril sudah terhubung dengan benar dengan perangkat lain sebelum melakukan transmisi data.

				
					if (Serial)
				
			

fungsi if(serial) akan menghasilkan nilai balik true jika koneksi serial tersambung, dan nilai false jika tidak ada serial

  • serial.Available()

Pada dasarnya, ketika kita menggunakan fungsi `Serial.available()`, Arduino akan memeriksa apakah ada data yang diterima dan tersedia dalam buffer serial. Buffer serial adalah area memori tempat data yang diterima dari koneksi serial disimpan sementara sebelum diolah oleh program (Bisa menyimpan sampai 64 Byte) . Fungsi `Serial.available()` mengembalikan jumlah byte yang tersedia dalam buffer serial. Jika nilainya lebih besar dari nol, ini berarti ada data yang dapat dibaca. Dengan menggunakan fungsi ini, kita bisa memeriksa apakah ada data yang masuk sebelum membaca atau memprosesnya, sehingga menghindari pembacaan yang tidak valid atau proses yang tidak perlu.

				
					Serial.available()
				
			

Nilai balik fungsi ini adalah jumlah byte yang ada pada buffer serial. 

  • Serial.begin()

Fungsi `Serial.begin()` digunakan untuk menginisialisasi koneksi serial antara Arduino dan perangkat eksternal, seperti komputer atau modul serial lainnya. Fungsi ini biasa dipanggil di dalam fungsi `setup()` untuk menentukan parameter komunikasi serial, seperti kecepatan baud rate.

				
					Serial.begin(baudrate);
				
			

nilai baudrate menentukan kecepatan komunikasi serial. Baudrate adalah ukuran yang mengindikasikan jumlah simbol atau bit data yang dapat dikirim dalam satu detik, satuannya bps (bit per second). Contoh umum baudrate adalah 9600, 115200, dan sebagainya.

pastikan baudrate yang digunakan dalam `Serial.begin()` sama dengan baudrate yang diatur pada perangkat eksternal yang terhubung ke Arduino. Jika kedua perangkat tidak menggunakan baudrate yang sama, maka komunikasi serial tidak akan berhasil.

  • Serial.end()

Fungsi `Serial.end()` digunakan untuk menghentikan koneksi serial yang aktif antara Arduino dan perangkat eksternal. Fungsi ini biasanya dipanggil jika kita ingin menghentikan komunikasi serial atau perlu mengosongkan buffer serial. 

				
					Serial.end();
				
			

Setelah memanggil fungsi `Serial.end()`, tidak ada lagi data yang dapat diterima atau dikirim melalui koneksi serial. Oleh karena itu, pastikan untuk memanggil `Serial.begin()` kembali jika ingin menggunakan koneksi serial lagi. Fungsi `Serial.end()` bermanfaat jika kita ingin menghemat daya atau tidak lagi memerlukan komunikasi serial dalam program Arduino.

  • Serial.flush()

Fungsi `Serial.flush()` digunakan untuk membersihkan atau mengosongkan buffer transmit dan receive serial. Fungsi ini mengirim semua data yang tertunda dalam buffer transmitter dan mengosongkan buffer receiver sebelum melakukan transmisi data lain.

				
					Serial.flush();
				
			

Setelah memanggil `Serial.flush()`, Arduino akan menunggu hingga semua data yang masih tertunda dalam buffer transmit serial dikirimkan sepenuhnya. Selama periode ini, program akan berhenti dan menunggu sampai data terkirim.

Fungsi ini berguna dalam situasi dimana kita perlu memastikan bahwa semua data yang ditulis melalui `Serial.write()` telah dikirimkan sebelum melanjutkan dengan tugas berikutnya. Selain itu, `Serial.flush()` juga berguna ketika kita ingin memastikan bahwa buffer receive serial tidak berisi data yang tidak relevan sebelum memulai transmisi data baru.

  • Serial.print()

Fungsi `Serial.print()` digunakan untuk mengirim data atau nilai ke koneksi serial dan memunculkannya sebagai teks. Fungsi ini berguna untuk menampilkan informasi atau hasil pengolahan data kepada pengguna melalui monitor serial atau perangkat eksternal yang terhubung ke Arduino.

				
					Serial.print(parameter);
				
			

Kita bisa mengisi parameter dengan nilai berupa angka, karakter, string, variabel, atau tipe data lainnya yang dapat diubah menjadi teks. kita juga bisa menggunakan fungsi `Serial.print()` dengan mengatur format bilangan sesuai keinginkan, Misal, `Serial.print(angka, DEC)` untuk mencetak angka dalam format desimal, atau `Serial.print(angka, HEX)` untuk mencetak angka dalam format heksadesimal. Selain itu, `Serial.print()` juga mendukung multiple arguments yang dapat digabungkan, seperti `Serial.print(nilai1, nilai2, nilai3)`. 

  • Serial.read()

Fungsi `Serial.read()` digunakan untuk membaca data yang diterima melalui koneksi serial. Fungsi ini membaca byte data dari buffer receive serial dan mengembalikan nilainya sebagai bilangan bulat (integer).

				
					int data = Serial.read();
				
			

Ketika memanggil `Serial.read()`, Arduino akan membaca byte data dari buffer receive serial. Fungsi ini akan mengembalikan byte data sebagai nilai bilangan bulat (integer) dari 0 hingga 255. Jika buffer kosong, `Serial.read()` akan mengembalikan nilai -1. `Serial.read()` hanya akan membaca satu byte data setiap kali dipanggil. Jika Anda mengirimkan lebih dari satu byte dalam satu kali transmisi, Anda perlu memanggil `Serial.read()` secara berulang untuk membaca setiap byte secara individu. Fungsi `Serial.read()` berguna ketika Anda ingin membaca data yang diterima melalui koneksi serial dan melakukan tindakan tertentu berdasarkan nilai byte data. Anda dapat menggunakan `Serial.read()` untuk memproses data yang diterima dan mengambil langkah-langkah selanjutnya dalam program Arduino Anda.

  • Serial.readByte()

Fungsi `Serial.readBytes()`, digunakan untuk membaca sejumlah byte data yang diterima melalui koneksi serial dan menyimpannya kedalam data array

				
					Serial.readBytes(buffer, length);
				
			

Parameter :

  • `buffer` adalah array byte yang digunakan untuk menyimpan data yang diterima.

  • `length` adalah jumlah byte yang ingin Anda baca dari koneksi serial.

Setelah memanggil `Serial.readBytes()`, Arduino akan membaca sejumlah byte data dari buffer receive serial dan menyimpannya dalam array `buffer`. Fungsi ini akan membaca hingga mencapai jumlah byte yang ditentukan oleh `length`. Jika jumlah byte yang tersedia dalam buffer kurang dari `length`, fungsi ini akan membaca semua byte yang tersedia dan menghentikan operasi pembacaan.

				
					voidsetup() {
  Serial.begin(9600);  // Memulai komunikasi serial dengan kecepatan 9600 bps
}
voidloop() {
  if (Serial.available() >0) {
    byte buffer[10];
    int length = Serial.readBytes(buffer, 10);
    Serial.print("Data yang diterima: ");
    for (int i = 0; i < length; i++) {
      Serial.print(buffer[i]);
      Serial.print(" ");
    }
    Serial.println();
  }
}

				
			

Dalam contoh di atas, `Serial.readBytes()` digunakan untuk membaca 10 byte data pada buffer dan menyimpannya dalam array `buffer`. Jumlah byte yang berhasil dibaca disimpan dalam variabel `length`. Kemudian, data yang diterima ditampilkan melalui `Serial.print()`. Penting untuk dicatat bahwa `Serial.readBytes()` beroperasi secara blok, artinya fungsi ini akan menunggu hingga jumlah byte yang kita tentukan pada parameter `length` tersedia dalam buffer receive serial sebelum membaca data. 

Jika kita ingin membaca byte data satu per satu, kita bisa menggunakan `Serial.read()` secara berulang-ulang. jika kita ingin membaca beberapa data secara langsung gunakan `Serial.readBytes()`.

  • Serial.write()

Fungsi `Serial.write()` digunakan untuk mengirimkan data dalam bentuk byte melalui komunikasi serial.  melalui port USB pada Arduino, yang terhubung ke komputer atau perangkat lain.

				
					Serial.write(parameter);
				
			

Parameter yang kita isi dalam fungsi ini adalah data dalam bentuk byte, yang akan dikirim melalui komunikasi serial. bisa berupa bilangan bulat, karakter, atau array byte. Fungsi `Serial.write()` hanya mengirim data dalam bentuk byte. Jika kita ingin mengirim karakter atau string, kita perlu mengonversi data tersebut menjadi byte terlebih dahulu.

Contoh Project

Sekarang kita coba membuat project sederhana untuk menggontrol LED menggunakan protokol serial UART. Bahan-bahan yang dibutuhkan : Arduino UNO, 3 LED (RGB), 3 Resistor 220 Ohm, Breadboard dan kabel jumper. buat rangkaian seperti ini

Algoritma yang akan kita program adalah :

  1.  Buka Serial Monitor
  2. Arduino menunggu kita memasukan perintah melalui serial monitor
  3. Jika kita ketik huruf A mengirimnya dari serial monitor, maka LED hijau akan menyala selama 2 detik
  4. Jika kita ketik huruf B mengirimnya dari serial monitor, maka LED merah akan menyala selama 2 detik
  5. Jika kita ketik huruf C mengirimnya dari serial monitor, maka LED kuning akan menyala selama 2 detik
Coba ketik buat sketch ini:
				
					//Project Serial - purwarupa3d.com
const byte GreenLED = 8;
const byte RedLED = 9;
const byte YellowLED = 10;

void setup() {
Serial.begin(9600);
pinMode (GreenLED, OUTPUT);
pinMode (RedLED, OUTPUT);
pinMode (YellowLED, OUTPUT);
}

void loop() {
if (Serial.available() > 0) {
  char data = Serial.read();
  if (data == 'A') {
    Serial.print ("data ");
    Serial.print (data);
    Serial.println(" diterima");
    digitalWrite(GreenLED,HIGH);
    delay (2000);
    digitalWrite(GreenLED,LOW);
  }

  if (data == 'B') {
    Serial.print ("data ");
    Serial.print (data);
    Serial.println(" diterima");
    digitalWrite(RedLED,HIGH);
    delay (2000);
    digitalWrite(RedLED,LOW);
  }
  if (data == 'C') { 
    Serial.print ("data ");
    Serial.print (data);
    Serial.println(" diterima");
    digitalWrite(YellowLED,HIGH);
    delay (2000);
    digitalWrite(YellowLED,LOW);
  }
  }
}

				
			

Upload sketch dan buka serial monitor. coba ketik dan kirim huruf A ,B dan C satu per satu dan perhatikan apa yang terjadi, samakah dengan algoritma yang kita inginkan tadi?. sillahkan eksplor dan kembangkan sendiri. 

Tinggalkan komentar