[ロボスイープ競技] 異なるマイコン間の通信に挑戦!

ロボスイープ

こんにちは!東京理科大学Miceです。今回はラズベリーパイZeroとSTM32F446との間で通信を試みました!

背景

ロボスイープ競技では、マイコンを用いたリアルタイム処理と汎用コンピュータを用いた高度な処理の両立が求められます。そのため、一つの機体上に複数のコンピュータが搭載される可能性が高くなります。そこで、複数のコンピュータ間でデータのやり取りを問題なく行える環境を構築することで、今後の研究を円滑に行えるようにすることを目的にこの研究を始めることにしました。

概要

マイコン(NUCLEO-F446RE,以下 Nucleo)と汎用コンピュータ(Raspberry Pi Zero 2 W、以下ラズベリーパイ Zero)の間で通信を行う状況を再現しました。想定しているロボットの概要を以下に記します。

  • ロボットには STM32F446 のチップとラズベリーパイ Zero が搭載されている
  • ラズベリーパイ Zero はカメラやネットワークから得た情報を処理し、Nucleo に送信する役割を持つ
  • Nucleo は各種センサやラズベリーパイ Zero からの情報から判断してロボットを動かす
  • 本実験の目標は Nucleo とラズベリーパイ Zero の間で双方向通信を実現することである。

使用器具

  • PC(Windows11)
  • 各種ソフト(STM Cube IDE, Teraterm)
  • Nucleo-F446RE(Nucleo)
  • Raspberry Pi Zero 2 W)(Raspberry Pi OS,ラズベリーパイ Zero)
  • ブレッドボード,ジャンプワイヤ
  • オシロスコープ(OWON PDS5022S)

測定系

ケーブルの接続はブレッドボードで行っています!途中にプローブを挟んでオシロスコープで波形を観測できるようにしています。

実験の方法

今回は、簡単に通信のテストをするために数字をカウントして送信しました。ボーレートは320400に設定していますが、これはミスです!後日再実験して掲載します。

ラズベリーパイZero → Nucleo 通信コード

まずは、ラズベリーパイZeroからNucleoにメッセージを送ります。数字のカウントアップと数審の送信を行います。

# インポート
import serial
import time

# シリアルポートを開く
serial_send = serial.Serial('/dev/serial0', 320400, timeout=3)

# カウンターを初期化
count = 0

# 数字を送り続ける
while True:
    msg = "Hello from rspzero count: " + str(count) + "\n\r"
    serial_send.write(msg.encode())
    print(sending msg...)
    print("count: " + msg(count))
    time.sleep(1.5)

serial_send.close()

Nucleoで受信 通信コード

do {
    /* 受信割り込み*/
	HAL_UART_Receive_IT(&huart1, rcvBuffer, 1);

	while (flagRcved == FALSE) {
	}

	sndBuffer[rcvLength] = rcvBuffer[0];
	rcvLength++;
	flagRcved = FALSE;
} while ((rcvBuffer[0] != CHAR_CR) && (rcvLength < BUFF_SIZE));

/* 受信したらPCに送信 */
HAL_UART_Transmit_IT(&huart2, sndBuffer, rcvLength);
rcvLength = 0;

/* ラズベリーパイZeroに戻す */
char msg[30];
sprintf(msg, "%s\n\r", "HelloWorld!!");
HAL_UART_Transmit(&huart1, (uint8_t*) msg, strlen(msg), 100);

ラズベリーパイZeroで受信

# インポート
import serial

# シリアルポートを開く
serial_receive = serial.Serial('/dev/serial0', 320400, timeout=3)

# 受信を待つ
while True:
    data = serial_receive.readline()
    print(data)

serial_send.close()

結果

文字化けやスタックなどの問題は一切起きず、問題なく通信できました!オシロスコープで測定された波形も崩れていませんでした(先行実験ではボーレートによってはリンギングが発生していた)。

コメント

タイトルとURLをコピーしました