Dalam sebuah proyek mikrokontroler, terkadang satu board tidak cukup untuk menangani seluruh fungsi sistem. Salah satu solusi yang dapat digunakan adalah membagi tugas ke beberapa mikrokontroler dan membuat keduanya saling berkomunikasi. Salah satu metode komunikasi yang sederhana tetapi cukup powerful adalah UART (Universal Asynchronous Receiver/Transmitter). Dengan UART, dua mikrokontroler dapat saling bertukar data menggunakan jalur komunikasi serial. Pada artikel ini, kita akan menggunakan Raspberry Pi Pico dan Raspberry Pi Pico W untuk membangun komunikasi UART dua arah. Raspberry Pi Pico akan bertugas membaca nilai LDR, kemudian mengirimkan data sensor ke Raspberry Pi Pico W. Selanjutnya, Pico W akan memproses data tersebut dan mengirimkan perintah kembali ke Pico untuk mengontrol LED. Jadi, komunikasi yang dibuat tidak hanya berupa pesan seperti "Halo dari Raspberry Pi Pico", tetapi sudah menggunakan format data, parsing, komunikasi dua arah, serta respons dari mikrokontroler penerima. Secara sederhana, sistem yang akan dibuat adalah:
LDR → Raspberry Pi Pico → UART → Raspberry Pi Pico W → UART → Raspberry Pi Pico → LED
Mengenal UART pada Raspberry Pi Pico dan Pico W
Apa Itu UART?
UART adalah protokol komunikasi serial asynchronous yang memungkinkan dua perangkat elektronik bertukar data. UART biasanya menggunakan dua jalur utama:
- TX (Transmit) untuk mengirim data.
- RX (Receive) untuk menerima data.
Selain itu, perangkat yang berkomunikasi perlu memiliki GND yang sama. TX dari satu perangkat harus dihubungkan ke RX perangkat lainnya.
Mengapa Menggunakan Pico dan Pico W?
Raspberry Pi Pico dan Raspberry Pi Pico W memiliki banyak kesamaan dari sisi pemrograman dan GPIO. Perbedaannya, Pico W memiliki konektivitas Wi-Fi, sehingga dapat dikembangkan lebih lanjut untuk terhubung ke jaringan. Pada proyek ini kita membagi tugas menjadi dua.
Raspberry Pi Pico
Pico bertugas sebagai node sensor. Tugasnya:
1. Membaca nilai LDR.
2. Menentukan status kondisi berdasarkan nilai LDR.
3. Mengirim data ke Pico W melalui UART.
4. Menerima perintah dari Pico W.
5. Mengontrol LED berdasarkan perintah yang diterima.
Raspberry Pi Pico W
Pico W bertugas sebagai controller. Tugasnya:
1. Menerima data LDR dari Pico.
2. Membaca dan memproses data.
3. Menentukan apakah LED harus menyala atau mati.
4. Mengirim perintah kembali ke Pico.
5. Menampilkan informasi komunikasi melalui terminal.
Dengan pembagian tersebut, komunikasi menjadi lebih realistis karena kedua mikrokontroler memiliki fungsi masing-masing.
Komponen yang Dibutuhkan
Untuk membuat proyek komunikasi UART Raspberry Pi Pico dan Pico W, komponen yang diperlukan adalah:
- 1 × Raspberry Pi Pico
- 1 × Raspberry Pi Pico W
- 1 × LDR
- 1 × Resistor 10 kΩ
- 1 × LED
- 1 × Resistor 220 Ω atau 330 Ω
- Kabel jumper
- Breadboard
- 2 × kabel USB
LDR digunakan sebagai sensor cahaya, sedangkan LED digunakan sebagai indikator hasil pemrosesan.
Wiring Raspberry Pi Pico dan Pico W
Kita akan menggunakan UART0 pada kedua board. Pada contoh ini:
- GP0 digunakan sebagai TX.
- GP1 digunakan sebagai RX.
Hubungkan kedua board seperti berikut:
TX dan RX harus disilangkan. Jangan menghubungkan TX ke TX atau RX ke RX.
Wiring LDR pada Raspberry Pi Pico
LDR digunakan untuk mendeteksi perubahan intensitas cahaya di sekitar sensor. Agar perubahan cahaya dapat dibaca oleh Raspberry Pi Pico, LDR dapat dirangkai bersama resistor 10 kΩ sebagai voltage divider. Pada rangkaian ini, salah satu kaki LDR dihubungkan ke 3,3V, sedangkan kaki LDR lainnya dihubungkan ke satu titik yang juga terhubung ke GP26 (ADC0). Dari titik tersebut, resistor 10 kΩ dihubungkan menuju GND. Dengan susunan tersebut, perubahan intensitas cahaya pada LDR akan menghasilkan perubahan tegangan yang dapat dibaca oleh pin analog GP26. Dengan demikian, GP26 berfungsi sebagai input analog untuk membaca perubahan tegangan dari rangkaian LDR. Nilai ADC yang diperoleh kemudian dapat digunakan oleh program untuk menentukan kondisi terang atau gelap dan mengontrol komponen lain, seperti LED.
Wiring LED pada Raspberry Pi Pico
LED dapat dihubungkan ke GPIO 15 melalui resistor. Koneksinya sebagai berikut:
- GP15 → Resistor 220Ω/330Ω → Anoda LED
- Katoda LED → GND
LED ini nantinya akan dikontrol berdasarkan perintah yang diterima dari Pico W.
Konsep Komunikasi yang Digunakan
Agar komunikasi lebih kompleks, kita tidak akan mengirim nilai sensor begitu saja. Pico akan mengirim data menggunakan format tertentu. Contohnya:
LDR:45678;STATUS:GELAP
Format tersebut memiliki dua informasi:
- LDR → nilai pembacaan sensor.
- STATUS → kondisi lingkungan berdasarkan nilai sensor.
Pico W kemudian membaca data tersebut dan memisahkan nilai LDR serta statusnya. Setelah memproses data, Pico W mengirim respons:
CMD:LED_ON
atau:
CMD:LED_OFF
Pico W menerima data sensor dari Raspberry Pi Pico, kemudian dapat mengirimkan perintah kontrol kembali ke Raspberry Pi Pico. Dengan demikian, kedua mikrokontroler dapat saling bertukar data. Raspberry Pi Pico mengirimkan data sensor ke Pico W, sedangkan Pico W mengirimkan perintah kembali untuk mengontrol LED atau komponen lainnya.
Program Raspberry Pi Pico sebagai Sensor Node
Pada Raspberry Pi Pico, kita akan membaca LDR dan mengirimkan data ke Pico W.
from machine import Pin, ADC, UART
from time import sleep
# =========================
# KONFIGURASI
# =========================
ldr = ADC(26)
led = Pin(15, Pin.OUT)
uart = UART(
0,
baudrate=9600,
tx=0,
rx=1
)
threshold = 30000
# =========================
# PROGRAM UTAMA
# =========================
while True:
nilai_ldr = ldr.read_u16()
if nilai_ldr < threshold:
status = "GELAP"
else:
status = "TERANG"
# Membuat paket data
pesan = "LDR:{};STATUS:{}\n".format(
nilai_ldr,
status
)
# Mengirim data ke Pico W
uart.write(pesan)
print("Data dikirim:", pesan.strip())
# Membaca perintah dari Pico W
if uart.any():
data = uart.readline()
if data:
perintah = data.decode().strip()
print("Perintah diterima:", perintah)
if perintah == "CMD:LED_ON":
led.value(1)
elif perintah == "CMD:LED_OFF":
led.value(0)
sleep(1)
Program tersebut memiliki dua fungsi utama. Pertama, Pico membaca nilai LDR dan mengirimkan data ke Pico W. Kedua, Pico juga memeriksa apakah terdapat perintah yang dikirim kembali oleh Pico W.
Penjelasan Format Data
Bagian berikut:
pesan = "LDR:{};STATUS:{}\n".format(
nilai_ldr,
status
)
digunakan untuk membuat paket data. Misalnya nilai LDR yang terbaca adalah 25000, maka data yang dikirim menjadi:
LDR:25000;STATUS:GELAP
Karakter ; digunakan sebagai pemisah antar-data. Sedangkan \n digunakan sebagai penanda bahwa satu paket data telah selesai. Format sederhana seperti ini membuat data lebih mudah diproses oleh mikrokontroler penerima.
Program Raspberry Pi Pico W sebagai Controller
Sekarang kita buat program pada Raspberry Pi Pico W. Pico W akan menerima data dari Pico, mengambil nilai LDR dan statusnya, kemudian menentukan perintah LED.
from machine import UART
from time import sleep
# =========================
# KONFIGURASI UART
# =========================
uart = UART(
0,
baudrate=9600,
tx=0,
rx=1
)
print("Pico W siap menerima data...")
# =========================
# PROGRAM UTAMA
# =========================
while True:
if uart.any():
data = uart.readline()
if data:
pesan = data.decode().strip()
print("--------------------------")
print("Data diterima:", pesan)
# Memisahkan data
bagian = pesan.split(";")
if len(bagian) == 2:
nilai_ldr = int(
bagian[0].split(":")[1]
)
status = bagian[1].split(":")[1]
print("Nilai LDR :", nilai_ldr)
print("Status :", status)
# Menentukan perintah LED
if status == "GELAP":
perintah = "CMD:LED_ON"
else:
perintah = "CMD:LED_OFF"
# Mengirim perintah kembali
uart.write(perintah + "\n")
print("Perintah dikirim:", perintah)
sleep(0.1)
Bagaimana Pico W Membaca Data?
Misalnya Pico mengirim:
LDR:25000;STATUS:GELAP
Pico W menerima data tersebut sebagai satu string. Kemudian kode:
bagian = pesan.split(";")
akan memisahkannya menjadi:
LDR:25000
STATUS:GELAP
Selanjutnya nilai LDR diambil menggunakan:
nilai_ldr = int(
bagian[0].split(":")[1]
)
Sedangkan status diambil menggunakan:
status = bagian[1].split(":")[1]
Hasil akhirnya:
Nilai LDR : 25000
Status : GELAP
Dengan teknik tersebut, Pico W tidak hanya menerima data, tetapi juga memahami isi data yang diterimanya.
Komunikasi Dua Arah
Pada proyek ini, komunikasi antara Raspberry Pi Pico dan Raspberry Pi Pico W berlangsung secara dua arah. Raspberry Pi Pico terlebih dahulu membaca nilai LDR, kemudian mengirimkan informasi tersebut ke Pico W melalui komunikasi UART. Setelah menerima dan memproses data, Pico W mengirimkan perintah kembali ke Pico untuk menentukan apakah LED harus dinyalakan atau dimatikan.
Sebagai contoh, ketika kondisi lingkungan gelap, Raspberry Pi Pico dapat mengirimkan data seperti LDR:25000;STATUS:GELAP kepada Pico W. Setelah menerima data tersebut, Pico W memproses informasi dan mengirimkan perintah CMD:LED_ON kembali ke Raspberry Pi Pico. Pico kemudian menjalankan perintah tersebut sehingga LED menyala.
Sebaliknya, ketika kondisi lingkungan terang, Pico dapat mengirimkan data LDR:55000;STATUS:TERANG kepada Pico W. Pico W kemudian memberikan respons berupa CMD:LED_OFF. Setelah menerima perintah tersebut, Raspberry Pi Pico mematikan LED.
Dengan mekanisme ini, Pico bertugas membaca sensor dan mengontrol LED, sedangkan Pico W bertugas menerima, memproses, serta memberikan perintah kembali kepada Pico. Komunikasi dua arah tersebut membuat kedua mikrokontroler dapat saling bertukar informasi melalui UART.
Hasil Output pada Thonny
Jika sistem berjalan dengan baik, terminal Pico W dapat menampilkan output seperti:
Pico W siap menerima data...
--------------------------
Data diterima: LDR:24560;STATUS:GELAP
Nilai LDR : 24560
Status : GELAP
Perintah dikirim: CMD:LED_ON
--------------------------
Data diterima: LDR:25320;STATUS:GELAP
Nilai LDR : 25320
Status : GELAP
Perintah dikirim: CMD:LED_ON
--------------------------
Data diterima: LDR:58720;STATUS:TERANG
Nilai LDR : 58720
Status : TERANG
Perintah dikirim: CMD:LED_OFF
Sementara pada Pico:
Data dikirim: LDR:24560;STATUS:GELAP
Perintah diterima: CMD:LED_ON
Data dikirim: LDR:25320;STATUS:GELAP
Perintah diterima: CMD:LED_ON
Data dikirim: LDR:58720;STATUS:TERANG
Perintah diterima: CMD:LED_OFF
Output tersebut menunjukkan bahwa Pico dan Pico W benar-benar melakukan pertukaran data secara dua arah.
Mengapa Menggunakan Format Paket Data?
Jika hanya mengirim angka seperti 24560. Pico W memang bisa membacanya, tetapi semakin kompleks sistemnya, semakin sulit membedakan jenis data yang dikirim. Dengan format:
LDR:24560;STATUS:GELAP
penerima dapat mengetahui bahwa:
- 24560 adalah nilai LDR.
- GELAP adalah status sensor.
Konsep ini dapat dikembangkan lebih lanjut. Misalnya:
LDR:24560;TEMP:28.5;HUM:70;STATUS:GELAP
Satu paket dapat membawa beberapa parameter sekaligus.
Pengembangan dengan Wi-Fi pada Pico W
Penggunaan Raspberry Pi Pico W membuka peluang untuk mengembangkan proyek ini agar dapat terhubung ke jaringan Wi-Fi. Data hasil pembacaan LDR yang diperoleh oleh Raspberry Pi Pico dapat dikirimkan ke Pico W melalui UART. Selanjutnya, Pico W dapat mengolah data tersebut dan meneruskannya melalui koneksi Wi-Fi ke web server atau aplikasi lain.
Dalam pengembangan ini, Raspberry Pi Pico dapat difokuskan untuk menangani pembacaan sensor LDR dan kontrol LED, sedangkan Raspberry Pi Pico W bertugas menangani komunikasi UART dan koneksi jaringan. Dengan pembagian tugas tersebut, sistem dapat dikembangkan menjadi perangkat monitoring yang mampu mengirimkan informasi kondisi cahaya melalui jaringan Wi-Fi.
Sebagai contoh, nilai LDR yang dibaca oleh Pico dapat dikirim ke Pico W melalui UART. Setelah menerima data, Pico W dapat mengirimkan nilai tersebut ke web server sehingga kondisi cahaya dapat dipantau melalui browser atau perangkat lain yang terhubung ke jaringan. Misalnya:
Pico → Pico W
LDR:24560;STATUS:GELAP
Kemudian Pico W dapat mengolah data tersebut dan menampilkannya pada halaman web:
Monitoring Sensor
Nilai LDR : 24560
Status : GELAP
LED : ON
Ini merupakan salah satu contoh bagaimana UART dan Wi-Fi dapat digunakan bersama dalam sistem IoT.
Pengembangan Protokol Komunikasi
Format komunikasi yang digunakan pada proyek ini masih sederhana. Untuk sistem yang lebih besar, format paket dapat dibuat lebih terstruktur. Misalnya:
<START>LDR=24560;STATUS=GELAP<END>
atau menggunakan JSON:
{
"device": "pico",
"ldr": 24560,
"status": "GELAP"
}
Pico W kemudian dapat melakukan parsing terhadap data tersebut. Selain itu, sistem juga dapat ditambahkan:
- ID perangkat
- Nomor paket
- Timestamp
- Checksum
- ACK atau acknowledgment
- Error handling
- Timeout
- Retry ketika data gagal diterima
Contoh komunikasi dengan acknowledgment:
Pico → Pico W
DATA:LDR=24560
Pico W → Pico
ACK
Pico W → Pico
CMD:LED_ON
Dengan mekanisme tersebut, komunikasi menjadi lebih terkontrol karena pengirim dapat mengetahui apakah data sudah diterima oleh perangkat tujuan.
Masalah yang Sering Terjadi
1. TX dan RX Terbalik
Pastikan:
Pico TX → Pico W RX
Pico RX ← Pico W TX
Jangan:
TX → TX
RX → RX
2. Baud Rate Tidak Sama
Kedua perangkat harus menggunakan baud rate yang sama. Pada proyek ini menggunakan baudrate 9600 yang digunakan pada Pico dan Pico W.
3. Tidak Menghubungkan GND
Pastikan GND kedua board terhubung:
Pico GND → Pico W GND
GND bersama diperlukan sebagai referensi tegangan komunikasi.
4. Data Tidak Lengkap
Penggunaan karakter \n pada akhir paket membantu penerima mengetahui kapan satu pesan selesai. Contohnya:
uart.write(pesan + "\n")
Kemudian penerima menggunakan:
uart.readline()
untuk membaca satu baris data.
Dalam praktik, hasil dan kendala yang ditemui bisa berbeda tergantung perangkat, konfigurasi, versi library, dan sistem yang digunakan.
- Diskusi umum dan tanya jawab praktik: https://t.me/edukasielektronika
- Kendala spesifik dan kasus tertentu: http://bit.ly/Chatarduino






0 Komentar