UART-communicatie tot stand brengen tussen Raspberry Pi 4 en HiFive1-boards
In deze lab zet je betrouwbare UART-links op tussen een Raspberry Pi 4 en een HiFive1, programmeer de HiFive1 om ontvangen data te echoën, en maak een Python-script op de Pi om stuurhoeken door te sturen naar het bord.
Deel 0: UART Inschakelen op de Raspberry Pi 4
De Pi 4 wordt geleverd met vier UART-controllers. Voor deze oefening gebruiken we uart2 en uart3. Voeg de volgende regel toe aan /boot/config.txt en herstart:
dtoverlay=uart2,115200 dtoverlay=uart3,115200
Na herstarten, zullen de device-nodes /dev/ttyAMA1 (uart2) en /dev/ttyAMA2 (uart3) beschikbaar zijn.
Verbind de borden als volgt:
- HiFive1 UART1 RX (pin 7) ↔ Pi 4 UART2 TX (pin 27) – datapad voor stuurcommando's.
- HiFive1 UART0 TX (pin 1) ↔ Pi 4 UART3 RX (pin 29) – debug-kanaal voor console-uitvoer.
Vanaf de Pi kun je deze kanalen benaderen via /dev/ttyAMA1 (sturen naar HiFive1) en /dev/ttyAMA2 (HiFive1-console ontvangen).
Deel 1: De HiFive1 Programmeren
Op je PC (niet de Pi), download het skeletproject:
$ cd ~/Documents/PlatformIO $ wget https://ittc.ku.edu/~heechul/courses/eecs388/l10-comm.tar.gz $ tar zxvf l10-comm.tar.gz
Voeg de l10-interrupt-map toe aan je VSCode-werkruimte. Het doel is data te lezen van UART1, het te echoën op UART0, en het resultaat naar de console te printen.
Hier is een beknopt algoritme:
while (1) { if (ser_isready(1)) { char data = ser_read(1); ser_write(0, data); ser_printline(0, "Received: "); /* formatting aanpassen indien nodig */ } }
De seriële API is gedefinieerd in 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);
Onthoud dat devid = 0 UART0 selecteert en devid = 1 UART1 selecteert. De ser_isready-functie checkt de UART IP-register voor pending data:
int ser_isready(int devid) { uint32_t regval = *(volatile uint32_t *)(UART_ADDR(devid) + UART_IP); return regval; }
Na compileren en flashen, schakel naar de Pi en open twee terminalvensters:
- Data-zender:
screen /dev/ttyAMA1 115200 - Debug-viewer:
screen /dev/ttyAMA2 115200
Typ een willekeurige string in de zender-terminal; dezelfde string zou in de debug-terminal moeten verschijnen, wat correcte werking bevestigt.
Deel 2: Python-script op de Raspberry Pi 4
In plaats van handmatige terminals, schrijf een Python-programma dat:
/dev/ttyAMA1opent voor het schrijven van stuurhoeken./dev/ttyAMA2opent voor debugging.- Camera-frames capturet, DNN-inferentie draait, en de resulterende hoek naar de HiFive1 stuurt.
Voorbeeld-skelet met pySerial:
import serial import time import cv2 # of je camera-interface # Seriële poorten openen ser1 = serial.Serial('/dev/ttyAMA1', 115200, timeout=1) ser2 = serial.Serial('/dev/ttyAMA2', 115200, timeout=1) while True: # Frame capture frame = cv2.imread('frame.jpg') # vervangen met echte camera-read # DNN-inferentie draaien angle = dnn_inference(frame) # float32 # Float converteren naar 4-byte representatie angle_bytes = angle.to_bytes(4, byteorder='little', signed=True) ser1.write(angle_bytes) # Optioneel: debug-uitvoer lezen debug = ser2.readline().decode().strip() if debug: print('HiFive1:', debug) # Timing-controle (bijv. 30 fps) time.sleep(1/30) # Opruimen ser1.close() ser2.close()
Let op: Converteer de float naar bytes voordat je stuurt, en gebruik dezelfde byte-order op de HiFive1 bij het interpreteren van de waarde.
Bijlage: Raspberry Pi 4 GPIO en Perifere Overzicht
De Pi 4 biedt uitgebreide I²C, SPI en UART-interfaces bovenop de originele Pi-modellen. Gebruik het pinout-commando om alle pins te bekijken:
pinout
Belangrijke randapparatuur:
- I²C – tot 6 bussen, apparaten ontdekken met
sudo i2cdetect -y 1. - SPI – inschakelen via
raspi-config, standaard SCLK/MOSI/MISO lijnen gebruiken. - UART – asynchrone seriële, ideaal voor headless communicatie of verbinden met microcontrollers zoals de HiFive1.
Voor gedetailleerde configuratie, raadpleeg de officiële Raspberry Pi-documentatie: Config-txt Gids.
Productieproces
- Naadloze MQTT Integratie: NodeMCU DHT22 Sensoren Met Raspberry Pi 3 B+ Als Broker
- Sensordata integreren in een Raspberry Pi: Een praktische gids
- Naadloze Arduino‑Raspberry Pi 2 I2C-integratie voor IoT-sensorprojecten
- M2M (Machine-naar-Machine) Communicatie: Wat Het Is & Waarom Het Belangrijk Is
- Fundamenten van digitale communicatie: van theorie naar praktische implementatie
- Datastroom begrijpen: van simplex naar full-duplex communicatie
- Optische data communicatie: licht benutten voor hoge-bandbreedte, storingvrije transmissie
- Determinisme en fouttolerantie: essentiële ontwerprincipes voor industriële controle netwerken
- UART onder de knie krijgen: De Universal Asynchronous Receiver/Transmitter uitgelegd
- Revolutionaire Compacte Optische Versterker Belooft Ruisonvrije Ruimte- en Vezelcommunicatie
- Draadloze communicatiebereik meesteren: Hoe vermogen, datasnelheid en interferentie connectiviteit vormen