はしもとの自作マウス研修

STM32とPCでUART通信 – はしもとの自作マウス研修 Part5

はしもとの自作マウス研修

はしもとの自作マウス研修一覧

こんにちは!はしもとです。
いつのまにか肌寒い時期になり、今年もあと2,3ヶ月ぐらいですね〜
入社して半年ですが、ここまで本当にあっという間に過ぎていました^^;
この半年間は、本当に色々な仕事を経験させていただいて、
ロボットについてまだまだたくさん勉強しないといけないな〜と感じる日々でした。
今年もあとわずか?ですが、少しずつでもできること増やしていけたらと思っています。

ということで、今回のブログについて。
まず前回は、STM32F446REで環境構築を行った後、Lチカをしました。
今回は、STM32F446REとPCでUART通信を行ったので、
UARTについて復習した内容や実際行った作業について書いていきます。

UART(Universal Asynchronous Receiver Transmitter)とは?

用語の意味

同期式シリアル信号をパラレル信号に、
また逆にパラレル信号をシリアル信号に変換する通信回路のことです。
では、シリアル信号、パラレル信号とは何でしょうか?

これらは、シリアル通信またはパラレル通信でやり取りされる信号のことです。
もうすこし具体的に書くと以下のようになります。

シリアル通信とは、シリアル(直列)の文字通り、文字が順番に送られてくるような通信方法です。
この場合、信号線は最少で1本となります。
一方パラレル通信は、文字が並列に並んで一気に運ばれてくるような通信方法です。
パラレル通信では、信号線は複数必要になります。

また、UART同士で通信するときは、非同期でシリアル通信を行います。そのため、信号線は送信用と受信用の2つの線で通信を行い、クロック用の信号線は存在しないです。
クロック信号がないため、通信する前にあらかじめ送受信するデバイス間で、
転送速度を決める必要があります。

UARTを使った具体例

UARTを用いて、CPUとUARTデバイスのやりとりがどのように行われているか見ていきます。
CPUからUARTにデータを送信する際には、8,9bitでデータがパラレルで送られてきます。
この複数のデータ信号をUARTが1本のデータ信号に変換して、
シリアル信号としてUARTデバイス側に送信(Tx)します。
逆にUARTがUARTデバイスからシリアル信号を受信(Rx)した場合は、
複数のデータ信号になるまでデータを溜めて、
CPUにデータを送れるようにパラレルにデータを変換して送信します。

STM32とPCでUART通信

UARTについてわかってきたところで、実際に実装していきます。
今回は、STM32F446REとPCでUART通信を行い、
文字列をSTM32からPC側に送信するプログラムを実装していきます。
これを応用すると、壁センサの値を読み取り、
UART通信を使い、それらの値をPC側に送れるようになります。

では、どのように実装したか書いていきます。
まず、STM32CubeIDEを使って、新しいプロジェクトを作ります。
STM32CubeIDEの環境構築やプロジェクトの作り方はこちらのブログをご参照ください。
今回は、UARTの設定について書いていきます。

  1. まず、下記の画像のようにPinout&Configurationを設定します。
    ボーレートはデフォルトの値のままにしました。
  2. 設定を保存し、コードを自動生成します。
  3. UART通信するために、下記のようにmain.cの一部のコードを変更します。
    HAL_UART_Transmit関数については、後述のとおりです。

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1)
    {
    /* USER CODE END WHILE */
    uint8_t msg[] = "hello world!\n\r";
    HAL_UART_Transmit(&huart2, msg, strlen((char*)msg), 100);
    /* USER CODE BEGIN 3 */
    }
    /* USER CODE END 3 */
    
  4. プログラムを保存し、STM32F446REに書き込む。
    (やり方は前のブログと同じです。)
  5. ターミナル上でUART通信を用いて送られてくる文字を確認する。
    ターミナルは、こちらのサイトを参考に、STM32CubeIDE上で表示できるようにしました。

HAL_UART_Transmit()

HAL_UART_Transmit(&huart2, msg, strlen((char*)msg), 100);
  • 第1引数:UARTの構造体へのポインタを指定
  • 第2引数:1バイト符号なし整数uint8_t型の配列、この変数に表示したい文字を格納する。
  • 第3引数:送信データのサイズを指定
  • 第4引数:タイムアウト時間、上記では100[msec]

より詳細に知りたい方はこちらです。

まとめ

今回は、STM32とPCでUART通信を行いました。
UARTは、本来の意味も調査しながら実装しました。
これで壁センサやIMUの値を確認し、マウスの調整ができるようになります。

次回からは、ESP32の開発ボードを使って、STM32とESP32の通信を行っていこうと思います。
それでは!

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