Arduino Uno R3用の「バニラ味」シールドボードに2行8文字の文字表示LCDを搭載したもの。Arduino Uno R3からUno R4、そしてSTM32 Nucleo F072RBとピンソケットの上を流れ流れてまいりました。今回接続のNucleo F401REボードでそろそろ落ち着くのか?
※「やっつけな日常」投稿順 Index はこちら
手元のNUCLEOボード揃ぶみ
以下写真は、手元にあるST Microelectronis社製NUCLEOボードです。赤丸つけた型番を見なければまったく同じボードが3枚並んでいる感じです。
ボードの左右の端には2列のピンヘッダと、1列のピンソケットが並んでます。ピンヘッダの方がST社の独自規格のMolphoコネクタです。搭載マイコンのほぼ全ての機能にアクセスできる筈のもの。一方内側にならんでいるピンソケットが
Arduino Unoシリーズと端子機能「ほぼ同等」
のArduinoソケットです。端子的には同等の機能の端子がまったく同じ配置で出力されているのですが、Arduino Unoシリーズとの最大の差異はIO電圧です。Arduino Unoは5V、NUCLEOは3.3Vです。
さて見た目はソックリなNUCLEO(正確にはNucleo-64、64ピンのマイコンを搭載しているシリーズなので)ですが、ボードに搭載しているマイコンは異なります。手元3機種のメモリ容量と最高動作周波数を表にしたものが以下に。
ボード | MCU | Flash | SRAM | Max Freq. |
---|---|---|---|---|
NUCLEO-F072RB | STM32F072RB | 128KB | 16KB | 48MHz |
NUCLEO-F401RE | STM32F401RE | 512KB | 96KB | 84MHz |
NUCLEO-F446RE | STM32F446RE | 512KB | 128KB | 180MHz |
こうしてみると前回使用のNUCLEO-F072RBがかなり「低スペック」であることが分かります。特にSRAM容量が小さいデス。これはArduino環境のようなほぼ「ベアメタル」な開発であれば、お値段考えればありか、と思いますが、Mbed OS6のようなRTOS前提だとチトツライです。そういえば昔、Keil Studio Cloudの初期のころ、NUCLEO-F072RBではOS6のRTOSモードは非推奨だった気がします。最近はフットプリント小さくなったのか何も言われんけど。。。
また、NUCLEO-F072RBのSTM32 F0シリーズはArm Cortex-M0コアを搭載です。まあArmコアとしては「プレイン・バニラ味」。一方、F401RE、F446REなどのSTM 32 F4シリーズとなるとArm Cortex-M4コア登載です。単精度ながら浮動小数演算器を搭載、各種性能なども多いに向上している筈の品種です。ちょっとした信号処理くらい余裕だったりする。
まあ、ST社のホームページに行くとこの他にもNUCLEOボードどもがごちゃまんと並んでおります。
LCDボードはNUCLEO F401REに載せ替え
Arm社純正RTOS、Mbed OS6を使っての運用を考え、結局LCDボードはNUCLEO F401REに載せ替えることにいたしました。載せ替えは簡単。ハード的にはF072RBのコネクタから引き抜いて、F401REのコネクタに差し込むだけ。
ソフト的にはArm Keil StudioのCloud環境上の前回使用のプロジェクトはそのままに、Build targetをNUCLEO-F401REに変更するだけ(ボードそのものは差し込めば自動で認識され、Nucleo F401REとConnected deviceに表示がでます。)こんな感じ。
実は前回久しぶりにKeil Studio Cloudでビルドしたときに気づいたのが以下です。ビルドの末尾に使用FlashサイズとMemoryサイズ(SRAMのことだと思われる)が表示されることです。以前のArmのWeb開発環境が「ディスコン」になってKeil Studio Cloudになったころはどこ探してもこういう情報が出てこなかったです(以前のWeb開発環境では棒グラフで詳細な使用状況が見えたのに。)一歩前進した感じ? ただしFlashの使用容量は参考になるけど、Memory(SRAM)の使用容量はRTOS使うと常に全容量使っている(RTOSの支配下にあるということだと思います)表示になります。トホホ。。。まあRTOSにいろいろAPIがあったので、実使用量はAPI使えってことなのかな?後で調べてみます。
ソースに1行追加
上記で前回コードそのままでビルドしてF401REに書き込んだところ、表示の1文字目が一文字落ちてしまいました。多分初期化後のI2Cの通信開始が早すぎてLCD側が追従しきれてない感じデス。そこで main.cpp に以下のように1行
sleep_for(1000ms)
を加えました。1000msは長大すぎるけれど、絶対動くであろう数字デス。後で初期化関数の方にもっと短い値コッソリ潜ませておくか。
NUCLEO-F401REへの換装は出来。次回からは「モダンOS」のシリーズだな。