理系的な戯れ

理工学系とくにロボットやドローンに関する計算・プログラミング等の話題を扱って、そのようなことに興味がある人たちのお役に立てればと思っております。

STM32でシリアル通信

STM32でシリアル通信

はじめに

今回の記事は、 STM32マイコンでシリアル通信をして モータの回転数情報を得るプログラムを構築するにはどうしたら良いのかを説明します。

前回までで、モータの実験をするのを目標にして、

MacBookにSTM32の開発環境を構築して、Lチカができるようになりました。

モータを動かしてエンコーダからパルスを取得してデータをPC等で受け取って解析するためのWBSは以下の通りです。

モータ実験をするためのWBS(Work Breakdown Structure)

  • モータのオンオフ FET一石でオンオフするだけなのでGPIOを出力にできれば良い
  • データをPCに転送するためのUART通信(シリアル通信)
  • タイマーを使ったエンコーダの読み取り
  • タイマー割り込みによる周期処理
  • タイマーによるパルス幅の測定(できたら、今は必須ではない)
  • モータ・エンコーダのピン配置の確認
  • 駆動回路の設計と制作
  • 実験!

エンコーダパルス取得してもデータをPCで受け取れないとあまり意味がありません。まずは、 シリアル通信をできるようにしたいと思います。

STM32でシリアル通信

シリアル通信は昨今ではUART通信と言い、そちらで調べても多くの情報が得られます。 調べてみると、前回の記事 で書いたSTM32CubeMX→SW4STM32の開発の流れだと ポーリング方式(ループで送受信を繰り返す方式)であれば、かなり簡単に実現できることがわかりました。

今回はマイコンからデータをPCに吐き出してくれれば良いので、ポーリング方式で十分なのでそちらでやってみます。

受信は

char rxbuf[1];    //適当なところでバッファを確保

HAL_UART_Receive(&huart2, (uint8_t *)rxbuf, sizeof(rxbuf), 0xF);

引数は順にUARTのハンドル、データバッファ、データサイズ、タイムアウト時間(ms)

送信は

char txbuf[]="Hoge Hoge !";    //適当なところでバッファを確保

HAL_UART_Transmit(&huart2, (uint8_t *)txbuf, sizeof(txbuf), 0xFFFF);

引数は受信と同じです。

以上のようにすると、良いようです。

すごく簡単。

送信実験

送信プログラムを作り書き込んでみました。無事にPCで受信できました。

f:id:kouhei_ito:20200109113554p:plain
UART送信実験

xprintfを導入し書式付き文字列を表示

ChaNさんの作られたxprintfを拝借して、 カウントアップするカウンタ変数の値を送るように改良できました。感謝です。

f:id:kouhei_ito:20200109194401p:plain
アップカウンタ値送信

おわりに

きまった文字列を送信するのは簡単にできました。 任意の整数値を表示できるようにもなり、モータの角速度のデータをとる準備が着々と進んでいます。