もう少しペースを上げたい…
みなさんこんにちはYUUKIです。
10月になり秋らしい空気が流れるようになりました。
以前はみかんの美味しい南国に住んでいたこともあり、秋の訪れがこんなに早いのかと驚いております(笑)
さてさて、もう少しブログ更新もペースを上げてできたらなと思っていますが、相変わらず中途半端な更新頻度です。じっくり足元踏み固めながら進んでいる様子をご想像いただければと思います。
今回は、前回みたいにubuntuのトラブルもなく作業自体は比較的スムーズに進みました!
今回はシリアル通信です。
前回、開発ボードにちゃんと書き込みができて基本のLチカを確認し、環境構築ができたというところで終わっていました。次のステップとして、シリアル通信をやっていこうと思います。
ArduinoIDEでUNOに書き込みしたときは簡単にシリアルモニターに表示ができて楽でしたがSTM32CubeIDEだといろいろ準備が必要でした。
そのまえに・・・
少し脱線して前回の記事の続きをお話しします。
前回、プログラム書き込んでもLチカできなくて、原因が最初のコードの雛形を作る際の設定を開発ボードでやるのではなくマイコン単体でやってたからできなかったと結論付けて終わっていました。
いやいやマイコン単体のピンをマニュアル設定してでもできるでしょ…
ってことでなぜ前回できなかったのかを忘備録的に書いておきます。
理由は単純で、ピンを指定した後にPinoutviewの横にSystem Coreの欄でラベル設定をしないと使えないということでした。ラベルの名前を変えるとModifiedのチェックボックスにチェックがつき、これで書き込むと問題なくLチカできました。
(とりあえず触ってみる…みたいな感じで覚えていっているので、初歩的なところでも抜けているところがあります。本当ならある程度何か読んで把握してやるのがベストなんでしょうが、初心者がリアルに段階を踏みながら成長していると思って温かい目で見守ってください(笑))
UART通信
さて、本題に戻りましょう。
「Universal Asynchronous Receiver-Transmitter」の略語とされるUART通信。非同期式の信号データ通信の一種だそうです。0と1で構成されるbitの世界では、データの始まりと終わりを明確に示さないと狙ったものとは違うデータとなります。UART通信はスタートのbitとストップのbitを用いて送受信の同期を取るそうです。

・・・としゅうさんのブログで解説をしてくれています。この記事に加え、いろいろ調べてみるのですが、bitの世界でデータの送受信についてはイマイチ掴みかけているようで掴めていないが本音で、解説を読んだり聞いたりしている分には理解できるのですが、自分の頭の中でデータシートと照らし合わせて任意のデータを拾う?という部分に至るとまだイメージがわかないです。このあたりはもう少し時間をかけて掘りこんでいかないといけないですね。
UART通信に用いる信号線は半二重通信と呼ばれる1本のもの、全二重通信と呼ばれる2本使うものがあります。ほとんどが後者を採用しているようで、当然私も2本の信号線を使いました。
送信するピンをTX、受信するピンをRXと呼び、接続する際はTX-RX、RX-TXと接続しないといけません。
ここちゃんと理解していなくて基板の指示通りに接続して通信できないとモヤった時間が1.5時間くらいあったんですよね。それに気づかず適当にピンの差し替えで接続できて、モヤった理由に数日後きづきました(笑)
作業に移ります。
今回のシリアル通信をするにあたって大きく手順は3つでした。
・別売りのシリアル変換モジュールをNucleoに接続。
・コードを書き込む
・ubuntuにScreenをインストールし、ターミナルでシリアル接続の確認をする。
それでは細かく見ていきます。
まず、シリアル通信するために使用するモジュールにピンをはんだ付けします。
同梱しているストレートピンでも問題はないのですが、手持ちのジャンパー線が運悪くオスオスしか持っていなくてブレッドボードに挿して動作確認しました。これがどこがどのピンかを非常に確認しづらく不便でした。アングルピンは持ってたのでそれをつけたらよかったと後悔しました。
続いて、STM32CubeIDEにてピンを設定してコードを生成するのですが、その前にNucleoのマニュアルでどこを使えばUART通信できるのかを確認すると、どうやらデフォルトではUSART2をSTLinkを通して通信するようになっています。写真のような拡張モジュールを使って直接通信する際はNucleoの裏についている指定のジャンパー抵抗を付け替える必要があります。
しゅうさんはジャンパー抵抗を付け替えて動作確認をしていました。

ってことで、マニュアル通り抵抗の付け替えをやろうと思ったのですが…
「めんどくせぇ~~」
とか内心思ってしまうわけです。(よくないですが…)技術的にできない作業ではありませんが、怠惰的感情面を抜きにしても、できることならば今後モーターやらトランジスタやら動作確認をする項目は残っているので、下手にいじることなく動作チェックできるならそれに越したことはないと思い別のピンから通信できないかとSTM32F446REのデータシートを探しました。
するとちゃんとあるではないですか!USART1ならば特にいじることもなくPA9をTX、PA10をRXとして指定できるそうです。しかもオスオスのジャンパー線だけで接続ができ、あまりにも自分に都合がよかったのでこれで行くことにしました。
こんな感じで配線しました。
続いて、STM32CubeIDEのほうで作業していきます。
Nucleoを指定しているとPinoutviewは左下のUSART2をModifiedしています。これをまずPinoutview右側にある「Connectivity」の中にあるUSART2を「Disable」と選択します。
すると下の写真のように黄色くなると思います。
※USART2は消さなくても問題はありませんが、分かりづらくなる気がしたので今回はあえて「Disable」としています。
そのあとUSART1を「Disable」から「Asynchronous」に選択すると緑色に代わって使えるようになります。
写真にパラメーター設定のチラッと見えていますがここはデフォルト値のままで今回は行きます。
ここまで触れてませんでしたが、UART接続は非同期式シリアル通信のみ、USART接続は同期式、非同期式シリアル通信どっちにも対応してます。(SynchronousもできるよってことでUSARTみたいですね。)
これで保存をするとCubeIDEのほうでコードを自動生成してくれるので。
データの送受信に関するコードを「USER CODE」の部分に追記していきます。
ここも基本諸先輩方のブログを参考に進めていきます。
送信プログラムは、順次処理モードの HAL_UART_Transmit関数
受信プログラムは、HAL_UART_Receive関数を使いました。
書き込みはSTLink側についてるUSBから前回のLチカ回同様に書き込み、その後先ほどのモジュール接続時の写真のように接続し、端末でScreenを立ち上げます。
このあたりWindowsであればTeraTermを使って確認すると思うのですが、開発環境としてubuntuを選択したのでubuntuにScreenをインストールし起動させます。
デフォルトでインストールされていると聞くのですが、インストールされていませんでした。
接続してるUSBとボーレートを指定してあげると立ち上がります。
$sudo screen /dev/ttyUSB0 115200
このようにNucleoのリセットボタンを押すとhelloと表示され、キーボードを入力するとちゃんと返ってきました!
このScreenを終了するときがわかりづらかったです。
Ctrl+a→k→(終了するかときかれるのでyと返す)→終了
これがわからず、いつものよくあるCtrl押しながらやるのかと思ったりでいろいろやっていました(笑)
とりあえずこれで無事にUART接続ができました!
次回は
時間かかっていますが、着実に前進しているはずです。
この調子で各種機能の確認を進めつつ、後回しにしたマウスの構成やデザインも少しずつ具現化しないといけませんね。
全然触れていませんが、ギヤ比やらなんやら向き合わなきゃいけなことが多いのです(汗)
とか考えるとこのペースじゃいけないですね…スピードアップできるように頑張ります。
それではっ
YUUKI