Raspberry Pi 4とHiFive1ボード間でUART通信を確立する
このラボでは、Raspberry Pi 4とHiFive1の間で信頼性の高いUARTリンクを確立し、HiFive1をプログラミングして受信データをエコーさせ、Pi上でステアリング角度をボードに転送するPythonスクリプトを作成します。
パート0:Raspberry Pi 4でのUART有効化
Pi 4には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のプログラミング
PC上で(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: ");
/* 必要に応じてフォーマット調整 */
}
}
シリアル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に切り替えて2つのターミナルを開く:
- データ送信側:
screen /dev/ttyAMA1 115200 - デバッグ表示側:
screen /dev/ttyAMA2 115200
送信側ターミナルで任意の文字列を入力すると、同じ文字列がデバッグ側ターミナルに表示され、正常動作を確認できます。
パート2:Raspberry Pi 4上のPythonスクリプト
手動ターミナルの代わりに、以下を行う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)
# タイミング制御(例:30fps)
time.sleep(1/30)
# クリーンアップ
ser1.close()
ser2.close()
注:floatをバイトに変換して送信し、HiFive1側でも同じバイトオーダーで解釈してください。
付録:Raspberry Pi 4 GPIOとペリフェラル概要
Pi 4は、従来のPiモデルを超える拡張I²C、SPI、UARTインターフェースを提供します。pinoutコマンドで全ピンを表示:
pinout
主要ペリフェラル:
- I²C – 最大6バス、
sudo i2cdetect -y 1でデバイス検出。 - SPI –
raspi-configで有効化、標準的なSCLK/MOSI/MISOラインを使用。 - UART – 非同期シリアル、ヘッドレス通信やHiFive1のようなマイコンとの接続に最適。
詳細な設定は公式Raspberry Piドキュメントを参照: Config-txtガイド。
製造プロセス
- シームレスMQTT統合:NodeMCU DHT22センサーとRaspberry Pi 3 B+ブローカー
- センサーデータをRaspberry Piに統合:実践ガイド
- ArduinoとRaspberry Pi 2のI2C連携でIoTセンサープロジェクトを実現
- M2M(マシンツーマシン)通信とは?その重要性と仕組み
- デジタル通信の基礎:理論から実践的実装まで
- データフローの理解:シンプレックスからフルデュプレックス通信まで
- 光データ通信:高帯域幅・耐干渉伝送のための光活用
- 決定論と耐障害性:産業制御ネットワークの必須設計原則
- UARTマスター: 汎用非同期受信送信機の完全解説
- 革命的コンパクト光増幅器、ノイズフリーで宇宙・光ファイバー通信を変革
- ワイヤレス通信距離をマスターする:電力、データレート、干渉が接続性をどう形作るか