Komunikasi UART Raspberry Pi Pico dan Pico W untuk Pertukaran Data Sensor

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:


Raspberry Pi Pico

Raspberry Pi Pico W

GP0 (TX)

GP1 (RX)

GP1 (RX)

GP0 (TX)

GND

GND


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.

Posting Komentar

0 Komentar