Настройка UART-коммуникации между Raspberry Pi 4 и HiFive1
В этой лабораторной работе вы настроите надежные UART-линки между Raspberry Pi 4 и HiFive1, запрограммируете HiFive1 на эхо принятых данных и создадите Python-скрипт на Pi для передачи углов руления на плату.
Часть 0: Включение UART на Raspberry Pi 4
Pi 4 имеет четыре UART-контроллера. Для упражнения используем uart2 и uart3. Добавьте в /boot/config.txt и перезагрузите:
dtoverlay=uart2,115200
dtoverlay=uart3,115200
После перезагрузки будут доступны устройства /dev/ttyAMA1 (uart2) и /dev/ttyAMA2 (uart3).
Подключите платы так:
- HiFive1 UART1 RX (пин 7) ↔ Pi 4 UART2 TX (пин 27) — канал данных для команд руления.
- HiFive1 UART0 TX (пин 1) ↔ Pi 4 UART3 RX (пин 29) — отладочный канал для консольного вывода.
С Pi доступ к этим каналам через /dev/ttyAMA1 (отправка на HiFive1) и /dev/ttyAMA2 (прием консоли HiFive1).
Часть 1: Программирование HiFive1
На вашем ПК (не на Pi) скачайте скелет проекта:
$ cd ~/Documents/PlatformIO
$ wget https://ittc.ku.edu/~heechul/courses/eecs388/l10-comm.tar.gz
$ tar zxvf l10-comm.tar.gz
Добавьте папку l10-interrupt в рабочее пространство VSCode. Цель: читать данные из UART1, эхать на UART0 и печатать результат в консоль.
Краткий алгоритм:
while (1) {
if (ser_isready(1)) {
char data = ser_read(1);
ser_write(0, data);
ser_printline(0, "Received: "); /* скорректируйте форматирование */
}
}
Serial API определен в 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);
Помните: devid = 0 выбирает UART0, devid = 1 — UART1. Функция ser_isready проверяет регистр UART IP на наличие ожидающих данных:
int ser_isready(int devid) {
uint32_t regval = *(volatile uint32_t *)(UART_ADDR(devid) + UART_IP);
return regval;
}
После компиляции и прошивки переключитесь на Pi и откройте два терминала:
- Отправитель данных:
screen /dev/ttyAMA1 115200 - Просмотр отладки:
screen /dev/ttyAMA2 115200
Введите любую строку в терминале отправителя; та же строка должна появиться в терминале отладки, подтверждая корректную работу.
Часть 2: Python-скрипт на Raspberry Pi 4
Вместо ручных терминалов напишите Python-программу, которая:
- Открывает
/dev/ttyAMA1для записи углов руления. - Открывает
/dev/ttyAMA2для отладки. - Захватывает кадры камеры, запускает DNN-инференс и отправляет полученный угол на HiFive1.
Пример скелета с pySerial:
import serial
import time
import cv2 # или ваш камерный интерфейс
# Открытие последовательных портов
ser1 = serial.Serial('/dev/ttyAMA1', 115200, timeout=1)
ser2 = serial.Serial('/dev/ttyAMA2', 115200, timeout=1)
while True:
# Захват кадра
frame = cv2.imread('frame.jpg') # замените на реальное чтение камеры
# DNN-инференс
angle = dnn_inference(frame) # float32
# Конвертация float в 4-байтовое представление
angle_bytes = angle.to_bytes(4, byteorder='little', signed=True)
ser1.write(angle_bytes)
# Опционально: чтение отладочного вывода
debug = ser2.readline().decode().strip()
if debug:
print('HiFive1:', debug)
# Контроль тайминга (например, 30 fps)
time.sleep(1/30)
# Очистка
ser1.close()
ser2.close()
Примечание: конвертируйте float в байты перед отправкой и используйте тот же порядок байтов на HiFive1 при интерпретации значения.
Приложение: Обзор GPIO и периферии Raspberry Pi 4
Pi 4 предлагает расширенные интерфейсы I²C, SPI и UART по сравнению с оригинальными моделями Pi. Используйте команду pinout для просмотра всех пинов:
pinout
Ключевые периферийные интерфейсы:
- I²C — до 6 шин, обнаружение устройств через
sudo i2cdetect -y 1. - SPI — включение через
raspi-config, стандартные линии SCLK/MOSI/MISO. - UART — асинхронный последовательный порт, идеален для headless-коммуникации или подключения к микроконтроллерам вроде HiFive1.
Для детальной конфигурации обратитесь к официальной документации Raspberry Pi: Config‑txt Guide.
Производственный процесс
- Основы цифровой связи: от теории к практической реализации
- Понимание направлений передачи данных: от симплекса к полнодуплексной связи
- Оптическая передача данных: использование света для высокопропускной, помехонепроницаемой передачи
- Детерминизм и отказоустойчивость: ключевые принципы проектирования промышленных сетей управления
- Мастерство дальности беспроводной связи: как мощность, скорость данных и интерференции формируют связность
- Бесшовная MQTT интеграция: NodeMCU DHT22 сенсоры с Raspberry Pi 3 B+ как брокер
- Интеграция данных сенсоров в Raspberry Pi: практическое руководство
- Бесшовная I2C-интеграция Arduino и Raspberry Pi 2 для IoT-проектов с датчиками
- M2M (Machine-to-Machine) коммуникация: что это и почему это важно
- Революционный компактный оптический усилитель обещает бесшумовую космическую и волоконную связь