Membangun Komunikasi UART antara Raspberry Pi 4 dan Papan HiFive1
Dalam lab ini Anda akan menyiapkan tautan UART yang andal antara Raspberry Pi 4 dan HiFive1, memprogram HiFive1 untuk mencerminkan data yang diterima, dan membuat skrip Python di Pi untuk meneruskan sudut pengaruh ke papan.
Bagian 0: Mengaktifkan UART pada Raspberry Pi 4
Pi 4 dilengkapi dengan empat pengontrol UART. Untuk latihan ini kami akan menggunakan uart2 dan uart3. Tambahkan baris berikut ke /boot/config.txt dan reboot:
dtoverlay=uart2,115200 dtoverlay=uart3,115200
Setelah reboot, node perangkat /dev/ttyAMA1 (uart2) dan /dev/ttyAMA2 (uart3) akan tersedia.
Sambungkan papan sebagai berikut:
- HiFive1 UART1 RX (pin 7) ↔ Pi 4 UART2 TX (pin 27) – jalur data untuk perintah pengaruh.
- HiFive1 UART0 TX (pin 1) ↔ Pi 4 UART3 RX (pin 29) – saluran debug untuk output konsol.
Dari Pi Anda dapat mengakses saluran ini melalui /dev/ttyAMA1 (kirim ke HiFive1) dan /dev/ttyAMA2 (terima konsol HiFive1).
Bagian 1: Memprogram HiFive1
Di PC Anda (bukan Pi), unduh proyek kerangka:
$ cd ~/Documents/PlatformIO $ wget https://ittc.ku.edu/~heechul/courses/eecs388/l10-comm.tar.gz $ tar zxvf l10-comm.tar.gz
Tambahkan folder l10-interrupt ke workspace VSCode Anda. Tujuannya adalah untuk membaca data dari UART1, mencerminkannya pada UART0, dan mencetak hasilnya ke konsol.
Berikut adalah algoritma ringkas:
while (1) { if (ser_isready(1)) { char data = ser_read(1); ser_write(0, data); ser_printline(0, "Received: "); /* sesuaikan format sesuai kebutuhan */ } } API serial didefinisikan dalam eecs388_lib.h/c:
void ser_setup(int devid); int ser_isready(int devid); void ser_write(int devid, char c); void ser_printline(int devid, char *str); char ser_read(int devid); int ser_readline(int devid, int n, char *str);
Ingat bahwa devid = 0 memilih UART0 dan devid = 1 memilih UART1. Fungsi ser_isready memeriksa register IP UART untuk data tertunda:
int ser_isready(int devid) { uint32_t regval = *(volatile uint32_t *)(UART_ADDR(devid) + UART_IP); return regval; } Setelah mengompilasi dan memflash, beralih ke Pi dan buka dua terminal:
- Pengirim data:
screen /dev/ttyAMA1 115200 - Penonton debug:
screen /dev/ttyAMA2 115200
Ketik string apa pun di terminal pengirim; string yang sama seharusnya muncul di terminal debug, mengonfirmasi operasi yang benar.
Bagian 2: Skrip Python pada Raspberry Pi 4
Alih-alih terminal manual, tulis program Python yang:
- Membuka
/dev/ttyAMA1 untuk menulis sudut pengaruh. - Membuka
/dev/ttyAMA2 untuk debug. - Menangkap frame kamera, menjalankan inferensi DNN, dan mengirim sudut yang dihasilkan ke HiFive1.
Contoh kerangka menggunakan pySerial:
import serial import time import cv2 # atau antarmuka kamera Anda # Buka port serial ser1 = serial.Serial('/dev/ttyAMA1', 115200, timeout=1) ser2 = serial.Serial('/dev/ttyAMA2', 115200, timeout=1) while True: # Tangkap frame frame = cv2.imread('frame.jpg') # ganti dengan pembacaan kamera aktual # Jalankan inferensi DNN angle = dnn_inference(frame) # float32 # Konversi float ke representasi 4-byte angle_bytes = angle.to_bytes(4, byteorder='little', signed=True) ser1.write(angle_bytes) # Opsional: baca output debug debug = ser2.readline().decode().strip() if debug: print('HiFive1:', debug) # Kontrol waktu (misalnya, 30 fps) time.sleep(1/30) # Bersihkan ser1.close() ser2.close() Catatan: Konversikan float ke byte sebelum mengirim, dan gunakan urutan byte yang sama pada HiFive1 saat menafsirkan nilai.
Lampiran: Ringkasan GPIO dan Periferal Raspberry Pi 4
Pi 4 menawarkan antarmuka I²C, SPI, dan UART yang lebih luas dari model Pi asli. Gunakan perintah pinout untuk melihat semua pin:
pinout
Periferal utama:
- I²C – hingga 6 bus, temukan perangkat dengan
sudo i2cdetect -y 1. - SPI – aktifkan melalui
raspi-config, gunakan garis SCLK/MOSI/MISO standar. - UART – serial asinkron, ideal untuk komunikasi tanpa monitor atau menghubungkan mikrokontroler seperti HiFive1.
Untuk konfigurasi detail, konsultasikan dokumentasi resmi Raspberry Pi: Panduan Config-txt.