Komunikasi Board-to-Board
Di lab ini, Anda akan membuat saluran komunikasi berbasis UART antara papan Pi 4 dan HiFive 1.
Bagian 0:Siapkan koneksi UART (untuk TA)
Pada bagian ini, kita akan menghubungkan papan HiFive1 dan Raspberry Pi 4 melalui dua saluran UART.
(Perhatikan bahwa langkah ini akan dilakukan oleh TA.)
Pi 4 memiliki 4 UART dan kami akan menggunakan dua di antaranya (uart2 dan uart3). Tambahkan baris berikut di akhir file /boot/config.txt untuk mengaktifkan uart2 dan uart3.
dtoverlay=uart2.115200 dtoverlay=uart3.115200
Setelah me-reboot sistem, /dev/ttyAMA1 dan /dev/ttyAMA2 akan dibuat.
Hubungkan UART1 RX (pin7) HiFive ke UART2 TX Raspberry Pi 4 (pin 27). Ini adalah jalur komunikasi utama antara Pi 4 dan HiFive1. Dari Pi 4, Anda dapat mengakses saluran melalui /dev/ttyAMA1.
Untuk debugging HiFive 1, sambungkan UART0 TX (pin1) HiFive1 ke UART3 RX Pi 4 (pin 29). Dari Pi 4, dapat diakses melalui /dev/ttyAMA2.
Singkatnya, Anda akan dapat mengakses dua file berikut dari Pi 4.
/dev/ttyAMA1 Pi 4 → HiFive1:Kirim sudut kemudi ke HiFive1 (uart1).
/dev/ttyAMA2 HiFive1 → Pi 4:Menerima keluaran konsol (uart0) HiFive1
Bagian 1:Memprogram HiFive1
Di bagian lab ini, Anda akan memprogram HiFive1 untuk menerima data dari Pi 4.
Di PC Anda (bukan Pi 4), unduh kerangka proyek sebagai berikut.
$ 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 dalam ruang kerja VSCode.
Tugas Anda adalah menerima data dari saluran UART1 HiFive1 dan mengirim data yang diterima ke saluran UART0. Berikut ini adalah kode semu rough kasar tugas.
sementara (1) {
jika (apakah UART1 siap?) { data = baca dari UART1. cetak data ke UART0.
}
} Untuk mengimplementasikan tugas, Anda mungkin perlu menggunakan API serial yang disediakan seperti yang ditunjukkan berikut ini. Perhatikan bahwa devi adalah 0 untuk mengakses UART0, sedangkan 1 untuk mengakses UART1.
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);
Secara khusus, Anda mungkin perlu menggunakan fungsi ser_isready() untuk memeriksa apakah saluran UART tertentu memiliki data yang tertunda untuk dibaca. Untuk lebih memahami fungsi yang dilakukan, periksa file eecs388_lib.h dan eecs388_lib.c.
int ser_isready(int devid)
uint32_t regval =*(volatile uint32_t *)(UART_ADDR(devid) + UART_IP); kembali regval;
}
Setelah Anda selesai memprogram HiFive1, beralih ke Raspberry Pi 4 dan buka dua terminal:satu untuk mengirim data ke HiFive1, dan satu lagi untuk melihat output pesan debug dari HiFive1.
Terminal pengirim (term1)
$ screen /dev/ttyAMA1 115200
Terminal debug (term2)
$ screen /dev/ttyAMA2 115200
Sekarang, ketikkan string apa saja pada 'term1'.
Jika Anda memprogram HiFive 1 Anda dengan benar, Anda akan melihat pesan yang keluar dari terminal 'term2'.
Bagian 2:Memprogram Raspberry Pi 4.
Alih-alih menggunakan terminal, Anda sekarang menjalankan program python pada Pi 4 untuk berkomunikasi dengan HiFive1. Tugas Anda adalah memperluas dnn.py dari lab sebelumnya agar dapat mengirim output kemudi ke saluran serial /dev/ttyAMA1. Berikut kode semu memberikan gambaran umum tentang modifikasi yang perlu Anda lakukan pada dnn.py:
Buka sambungan serial ke /dev/ttyAMA1 dan /dev/ttyAMA2 Sementara Benar:
gambar = camera.read()
angle = dnn_inference(image) Tulis ‘angle’ ke /dev/ttyAMA1 Tunggu_till_next_period()
Tutup koneksi serial
Untuk mencapai fungsionalitas dari atas, Anda perlu menggunakan API pySerial Python yang dapat digunakan dengan mengimpor paket serial:
impor serial
Dengan itu, Anda harus membuat dua saluran serial terpisah, satu untuk menulis ke HiFive1 melalui
/dev/ttyAMA1 dan satu lagi untuk debugging di /dev/ttyAMA2. Perhatikan bahwa kedua saluran harus dibuka dengan baudrate 115200 bps.
ser1 = serial.Serial(…) ser2 = serial.Serial(…)
Sudut yang diterima dari DNN saat memproses frame kemudian dapat dikirim ke HiFive1 dengan menggunakan fungsi serial write():
ser1.write(…)
Namun, write() memerlukan nilai byte sedangkan sudut yang dihasilkan oleh DNN adalah nilai float32, jadi Anda harus mengonversi data sudut untuk mengirimkannya ke HiFive1. Terakhir, setelah semua frame diproses, koneksi serial dapat ditutup dengan menjalankan fungsi serial close():
ser1.close() ser2.close()
Lampiran
Pemetaan GPIO dari Pi 4.
Pinout Raspberry Pi 4
Raspberry Pi 4 tidak hanya penuh dengan fitur perangkat keras baru, tetapi di balik kap mesin ada beberapa fungsi GPIO tambahan untuk membuat hidup sedikit lebih mudah, memungkinkan pengguna untuk memperluas periferal mereka ke proyek mereka tanpa memerlukan perangkat keras tambahan Terutama ada banyak tambahan Antarmuka I2C, UART, dan SPI yang dapat digunakan di Raspberry Pi 4.
Pinout GPIO
Anda dapat menemukan daftar lengkap pin GPIO di Raspberry PI 4 itu sendiri, cukup buka baris perintah dan ketik pinout .
Di bawah ini adalah daftar semua fitur pinout tambahan Raspberry Pi 4 yang baru:
GPIO – Pin Output Input Tujuan Umum
Pin digital ini dapat diprogram untuk menerima input digital atau mengeluarkan sinyal digital. Raspberry Pi menggunakan logika 3V3 pada setiap pin GPIO, yang berarti bahwa 3V3 adalah digital 1 (ON) dan 0V adalah digital 0 (OFF). Oleh karena itu Anda dapat menghubungkan dan komponen digital ke Raspberry Pi dan memberikan sinyal 3V3 (ON) padanya atau menerima sinyal digital 3V3 dengan ketentuan arus tidak lebih dari 16mA.
I2C – Sirkuit Inter-Terintegrasi
Ini adalah jenis komunikasi antar perangkat yang cukup umum, ia bekerja dengan memiliki master dan slave. Master dalam hal ini adalah Raspberry Pi itu sendiri dan perangkat slave adalah periferal perangkat keras yang biasanya memperluas fungsionalitas proyek Anda. Apa yang hebat tentang I2C adalah Anda dapat menghubungkan ratusan perangkat hingga master yang sama menggunakan antarmuka dua kabel yang sama, asalkan setiap perangkat memiliki alamat I2C yang berbeda. Anda dapat mengakses antarmuka dan melihat perangkat mana yang terhubung dengan menggunakan perintah linux berikut:
sudo i2cdetect -y 1
Di mana "1" adalah antarmuka utama. Raspberry Pi 4 memiliki total 6.
SPI – Antarmuka Periferal Serial
SPI adalah jenis lain dari protokol komunikasi untuk berkomunikasi antar perangkat. Ini juga menggunakan pengaturan master/slave tetapi terutama digunakan dalam jarak pendek antara pengontrol utama (master) dan perangkat periferal (slave) seperti sensor. SPI biasanya menggunakan 3-kabel untuk berkomunikasi dengan Raspberry Pi; SCLK, MOSI dan MISO. Sebelum menggunakan SPI, Anda harus mengaktifkannya di dalam menu konfigurasi Raspberry Pi:
UART – Penerima/Pemancar Asinkron Universal
Tidak seperti I2c dan SPI, UART bukanlah sebuah protokol. UART (Serial) adalah sirkuit fisik yang dirancang untuk mengirim dan menerima data serial. UART tidak memerlukan sinyal clock, oleh karena itu mengapa UART tidak sinkron. Ini meminimalkan kabel yang diperlukan untuk mengirim dan menerima data tetapi juga memerlukan beberapa data tambahan untuk dikirim dengan paket untuk pengecekan kesalahan seperti bit mulai dan bit berhenti. Biasanya berkaitan dengan Raspberry Pi UART digunakan dalam pengaturan tanpa kepala, yang berarti tidak ada GUI atau antarmuka lainnya. Sebagai gantinya, Anda dapat menghubungkan Raspberry Pi ke Desktop/Laptop atau perangkat lain dan berkomunikasi dengannya melalui UART menggunakan antarmuka baris perintah. Metode ini ditujukan untuk pengguna yang lebih mahir karena memerlukan sedikit lebih banyak pengetahuan tentang cara menyiapkannya.
Aplikasi lain, yang khas di antara pengguna Raspberry Pi adalah menghubungkan papan Arduino UNO ke Raspberry Pi, karena Pi memiliki fungsionalitas analog yang terbatas.