こんにちは、しゅうです。
他の業務が立て込んでいて久しぶりの投稿です。
センサ値自体の表示は次回の記事になります…
そこで今回は、センサ値などを表示させるために、マイコンとパソコンが通信できるように設定します。
こちらの記事で行ったUSB通信ではなくUART通信を行います。
そのため、使用する関数や設定が異なってくるのでそちらをご紹介していきます。
必要なもの
今回はNucleoボードの他に必要なものがいくつかあります。
ショートさせる箇所を変え、さらに基板上の0Ω抵抗を付け替えるのでハンダコテを用意しましょう。抵抗がちっちゃいのでピンセットもあると安心です!
また、UARTからUSBに変換するUSBシリアル変換モジュールも使います。僕は秋月さんが販売しているこちらを使っています。
それに伴い、変換モジュールとパソコンをつなげるためのmicro-B to type-Cケーブル(もちろんto type-Aケーブルでも問題ないです)も用意しましょう。
そして、メスtoメスのジャンパワイヤを少なくとも3本。これは変換モジュールと開発ボードを接続するためです。
あとは、前回からしれっと使っているmini-B to type-Aケーブルと開発ボードのNUCLEO-F103RBです。
必要ではありませんが、ショート箇所を確認するためのテスターもあると安心ですよ!
今回使うものは以下の写真にまとめました。
UART通信のための準備
UART通信に関する説明は、以前のブログでご紹介しているのでそちらを参照してください。
ピンの設定
STM32CubeIDEを開いて、UART通信に必要な設定を行います。下の画像のようにConnectivityのUSART2を選択しましょう。ModeはAsynchronousを選択しましょう。PA2とPA3が緑色にハイライトされます。画像内ではPA5をGPIO_Outputに設定していますが、LEDを光らせるためだけなので設定しなくても問題ありません。
また、System CoreのSYSを選択して、DebugをSerial Wireにしておきましょう。
ちなみに、USARTはUniversal Synchronous/Asynchronous Receiver/Transmitterの略でUARTにSynchronousという文字列が追加されています。すなわち、USARTは同期も非同期にも対応できたり、対応速度が早かったりします。詳しくはまたいずれお話ししましょう!
基板上の設定
マニュアルの25ページ目あたりを参照すると、ハードウェア的にはUSART1が使われているそうです。F103C8が付いている方にTX/RXがついていますが今回は直接F103RBの方と通信したいのでハードウェアの変更をします!0Ω抵抗を付け替えていきます。半田コテを温めておきましょ〜う!
Nucleoをひっくり返して、F103C8がついている側にあるSB13とSB14を外します。外した0Ω抵抗はそのまま使うのでなくさないようにしてください!!
下画像内の赤い丸で囲っている部分にSB13, SB14があり、既に抵抗を外してあります。
次に、USART2がアサインされているPA2(TX), PA3(RX)を有効にするためには、SB62, SB63をショートさせる必要があります。つまり、そこに先ほど外した0Ω抵抗を取り付けます。半田ブリッジでも問題ありません!
そして、最終的に次の画像のようになっていれば、PA2とPA3がハードウェア的に有効になります。
ハンダコテで外したり、つけたりしたあと、余計な箇所がショートしていないかを確認すると良いです。
追加コード
今回は、キーボード入力を受け取って、それを返すプログラムを書きます。もし受け取れなかった場合はTimeoutなどと表示させます。
main.cの92行目あたりから追加していきます!以下を参考にしてください。
uint8_t data[256]; HAL_StatusTypeDef s; /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { s = HAL_UART_Receive(&huart2, data, 1, 3000); if(s == HAL_TIMEOUT){ HAL_UART_Transmit(&huart2, "UART Timeout\r\n", 15, 10); }else if(s == HAL_OK){ HAL_UART_Transmit(&huart2, data, 1, 10); } /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ }
HAL_UART_Receive関数でキーボード入力(あるいはPC側からの信号)を受信してdata変数に格納します。その結果がHAL_TIMEOUTかHAL_OKかを判別します。
HAL_TIMEOUTの場合、HAL_UART_Transmit関数を使ってTimeoutと表示させます。この時、\r\nをつけていないと正しく表示されませんので注意してください。
HAL_OKの場合は、同じ関数を使って、取得したデータを表示させます。
ということでビルドと書き込みを行いましょう!ちょっと前にやったので、復習も兼ねて前回の記事を見てみてください。
データ取得!
USB-Serial変換モジュールとNucleoボードを接続します。GNDはGND同士をつなげます。Nucleoボードには複数GNDがありますが、どこでも良いです。TX/RXはNucleoボードの右下にあるTX/D1とRX/D0に接続します。ユーザマニュアルの36ページ目にピンの割り振りが描かれています。メス側でもオス側でも、どちらも接続先は同じですのでどっちでも問題ないです。
NucleoボードとUSB-Serial変換モジュールをそれぞれ開発PCに接続したら、ターミナルを開きましょう。
screenコマンドを使って、Nucleoボードと通信します。詳しくはこちらのブログを参照してください。僕は以下のコマンドを実行しました。
$ screen /dev/tty.usbserial-DM01OYUO 115200
すると、入力したキーボードなどの信号が表示されます。
のはずですが、僕はひたすらTimeoutが表示されていきますね…
マイクロマウスにおいては、こちらから何か信号を送ることはほぼなく、マウスが取得したセンサ値や迷路の状態を見れれば良いのでとりあえずは良いことにします。後々、解決法がわかりましたらまたブログを書きます。
まとめ
以上、UART通信の送信部分はできました!受信がうまく機能していないのは悔しいですが、ちゃんと受信のための制限時間が機能していてひとまずは良いです…もう少しマニュアルと睨めっこしてみます。
次回はいよいよセンサ値を表示させます!!