ボード間通信
このラボでは、Pi4ボードとHiFive1ボードの間にUARTベースの通信チャネルを確立します。
パート0:UART接続のセットアップ(TA用)
このパートでは、HiFive1ボードとRaspberry Pi4ボードを2つのUARTチャネルを介して接続します。
(このステップはTAによって実行されることに注意してください。)
Pi 4には4つのUARTがあり、そのうちの2つ(uart2とuart3)を使用します。 /boot/config.txtファイルの最後に次の行を追加して、uart2とuart3を有効にします。
dtoverlay =uart2,115200 dtoverlay =uart3,115200
システムを再起動すると、/ dev / ttyAMA1と/ dev / ttyAMA2が作成されます。
HiFiveのUART1RX(ピン7)をRaspberry Pi4のUART2TX(ピン27)に接続します。これは、Pi4とHiFive1の間の主要な通信回線です。 Pi 4から、/ dev / ttyAMA1を介してチャネルにアクセスできます。
HiFive 1のデバッグでは、HiFive1のUART0 TX(ピン1)をPi4のUART3RX(ピン29)に接続します。 Pi 4からは、/ dev / ttyAMA2からアクセスできます。
要約すると、Pi4から次の2つのファイルにアクセスできます。
/ dev / ttyAMA1 Pi 4→HiFive1:ステアリング角度をHiFive1(uart1)に送信します。
/ dev / ttyAMA2HiFive1→Pi4:HiFive1のコンソール(uart0)出力を受信する
パート1:HiFive1のプログラミング
ラボのこの部分では、Pi4からデータを受信するようにHiFive1をプログラムします。
PC上 (Pi 4ではありません)、次のようにプロジェクトスケルトンをダウンロードします。
$ cd〜 / Documents / PlatformIO
$ wget https://ittc.ku.edu/~heechul/courses/eecs388/l10-comm.tar.gz
$ tar zxvf l10-comm.tar.gz
l10-interruptフォルダーをVSCodeワークスペースに追加します。
あなたの仕事は、HiFive1のUART1チャネルからデータを受信し、受信したデータをUART0チャネルに送信することです。以下は大まかな擬似コードです タスクの。
一方、(1){
if(UART1の準備はできていますか?){data =UART1から読み取ります。データをUART0に出力します。
}
タスクを実装するには、以下に示す提供されているシリアルAPIを使用する必要がある場合があります。 devidはUART0にアクセスする場合は0であり、UART1にアクセスする場合は1であることに注意してください。
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);
特に、ser_isready()関数を使用して、特定のUARTチャネルに読み取る保留中のデータがあるかどうかを確認する必要がある場合があります。関数が何をしているのかをよりよく理解するには、eecs388_lib.hファイルとeecs388_lib.cファイルを確認してください。
int ser_isready(int devid)
{
uint32_t regval =*(volatile uint32_t *)(UART_ADDR(devid)+ UART_IP); regvalを返す;
}
HiFive1のプログラミングが終了したら、 Raspberry Pi4に切り替えます 2つの端末を開きます。1つはHiFive1にデータを送信するためのもので、もう1つはHiFive1から出力されるデバッグメッセージを表示するためのものです。
送信者の端末(term1)
$ screen / dev / ttyAMA1 115200
デバッグ端末(term2)
$ screen / dev / ttyAMA2 115200
次に、「term1」に文字列を入力します。
HiFive 1を正しくプログラムした場合は、「term2」端末からメッセージが出力されるはずです。
パート2:Raspberry Pi4のプログラミング。
端末を使用する代わりに、Pi 4でPythonプログラムを実行して、HiFive1と通信します。あなたの仕事は、前のラボのdnn.pyを拡張して、ステアリング出力を/ dev / ttyAMA1シリアルチャネルに送信できるようにすることです。次の擬似コード dnn.pyに加える必要のある変更の一般的な考え方を提供します:
Trueの場合、/ dev / ttyAMA1および/ dev / ttyAMA2へのシリアル接続を開きます。
image =camera.read()
angle =dnn_inference(image)「angle」を/ dev / ttyAMA1に書き込みます Wait_till_next_period()
シリアル接続を閉じます
上記の機能を実現するには、シリアルパッケージをインポートして使用できるPythonのpySerialAPIを使用する必要があります。
シリアルをインポート
これを使用して、2つの別々のシリアルチャネルを作成する必要があります。1つはHiFive1に書き込むためのものです
/ dev / ttyAMA1および/ dev / ttyAMA2をデバッグするための別の。両方のチャネルをボーレート115200bpsで開く必要があることに注意してください。
ser1 =serial.Serial(…)ser2 =serial.Serial(…)
DNNがフレームを処理するときに受信した角度は、シリアルwrite()関数を使用してHiFive1に送信できます。
ser1.write(…)
ただし、書き込み()にはバイト値が必要ですが、DNNによって生成される角度はfloat32値であるため、HiFive1に送信するには角度データを変換する必要があります。最後に、すべてのフレームが処理された後、シリアルclose()関数を呼び出すことでシリアル接続を閉じることができます。
ser1.close()ser2.close()
付録
Pi4のGPIOマッピング。
Raspberry Pi4のピン配列
Raspberry Pi 4は新しいハードウェア機能でいっぱいになるだけでなく、内部にはいくつかの追加のGPIO機能があり、生活を少し楽にして、ユーザーが追加のハードウェアを必要とせずに周辺機器をプロジェクトに拡張できるようにします。 Raspberry Pi 4で使用できるI2C、UART、およびSPIインターフェース。
GPIOピン配置
GPIOピン配置の完全なリストはRaspberryPI 4自体にあります。コマンドラインに移動して、 pinout と入力するだけです。 。
以下は、すべての新しいRaspberry Pi4の追加のピン配置機能のリストです。
GPIO –汎用入出力ピン
これらのデジタルピンは、デジタル入力を受信したり、デジタル信号を出力したりするようにプログラムできます。 Raspberry Piは各GPIOピンで3V3ロジックを使用します。つまり、3V3はデジタル1(ON)であり、0Vはデジタル0(OFF)です。したがって、デジタルコンポーネントをRaspberry Piに接続し、3V3(ON)信号を提供するか、電流が16mA以下であれば3V3デジタル信号を受信することができます。
I2C –集積回路間
これはデバイス間のかなり一般的なタイプの通信であり、マスターとスレーブを持つことで機能します。この場合のマスターはRaspberryPi自体であり、スレーブデバイスは通常プロジェクトの機能を拡張するハードウェア周辺機器です。 I2Cの優れている点は、各デバイスが異なるI2Cアドレスを持っていれば、同じ2線式インターフェイスを使用して同じマスターに数百のデバイスを接続できることです。次のLinuxコマンドを使用して、インターフェイスにアクセスし、どのデバイスが接続されているかを確認できます。
sudo i2cdetect -y 1
ここで、「1」はマスターインターフェイスです。 Raspberry Pi4には合計6つあります。
SPI –シリアルペリフェラルインターフェース
SPIは、デバイス間で通信するための別のタイプの通信プロトコルです。また、マスター/スレーブセットアップを使用しますが、主にメイン(マスター)コントローラーとセンサーなどの周辺機器(スレーブ)の間の短距離で使用されます。 SPIは通常、3線を使用してRaspberryPiと通信します。 SCLK、MOSI、MISO。 SPIを使用する前に、RaspberryPi構成メニュー内でSPIを有効にする必要があります。
UART –ユニバーサル非同期レシーバ/トランスミッタ
I2cやSPIとは異なり、UARTはプロトコルではありません。 UART(シリアル)は、シリアルデータを送受信するために設計された物理回路です。 UARTはクロック信号を必要としないため、非同期である理由。これにより、データの送受信に必要なワイヤが最小限に抑えられますが、スタートビットやストップビットなどのエラーチェックのために、パケットとともに送信する追加のデータも必要になります。通常、Raspberry Piに関しては、UARTはヘッドレスセットアップで使用されます。つまり、GUIやその他のインターフェイスはありません。代わりに、Raspberry Piをデスクトップ/ラップトップまたは他のデバイスに接続し、コマンドラインインターフェイスを使用してUART経由で通信することができます。この方法は、設定方法についてもう少し知識が必要なため、上級ユーザー向けです。
Raspberry Piユーザーによく見られるもう1つのアプリケーションは、ArduinoUNOボードをRaspberryPiに接続することです。これは、Piのアナログ機能が制限されているためです。
製造プロセス