今回はATM0130B3というカラーLCDパネルをSTM32マイコン搭載Nucleo-F401REボードに取り付けてみます。Arm MbedOS6環境。開発ツールにはKeil Studio Cloudを使用です。もともとはArduino Uno用のデモプログラムだったものをMbedOS6用に書き換えてます。
※「モダンOSのお砂場」投稿順Indexはこちら
ATM0130B3カラーLCDパネル(バックライト付)
240×240ドットの262K色1.3インチLCDです。秋月電子通商殿の以下のページから購入したものデス。
上記のページからは説明資料に加えて「Arduino業界」の標準機 Arduino Uno(MicroChip社AVRマイコン搭載)用のサンプルプログラムをダウンロードすることができます。そのまま Arduino Unoで動作させてみた件が以下に。
部品屋根性(73) ATM0130B3、カラー液晶ディスプレイ240×240バックライト付
次に、ESP32シリーズのRISC-Vコア搭載の Seeed社 XAIO ESP32C3に取り付けて動かした件が以下に。さすがに、Uno用のままのソースでは動かず微妙に修正してESP32C3に合わせてます。
鳥なき里のマイコン屋(164) RISC-VコアESP32-C3に、フルカラーLCD装着
上記2つはArduino環境でしたが、今回のNucleo-F401REとの接続は、「モダンOS」Arm Mbed OS6にて動作させてみようと思います。そしてビルドはKeil Studio Cloud利用です。これまたモダン?
パネルの接続
ST Microelectronics社製、Nucleo-F401REボードはArduinoと互換性のある配列のピンソケットを装備しているので、接続そのものはUnoのときとほぼほぼ一緒です。一番の違いは、ESP32C3との接続同様VDDIOも3.3Vとしておくこと(STM32F401REのIO電圧は3.3Vなので。) 今回実験用の回路図が以下に。
ソフトウエアの移植
以下はKeil Studio Cloudで秋月殿オリジナルのデモソフトを移植している様子です。秋月殿のソースなのでMbedOS6へ移植するときのポイントのみ以下に列挙します。
-
- CS、DC、RST端子など
チップセレクト(CS)、データ/コマンド(DC)、リセット(RST)はソフトウエアでGPIO制御です。秋月殿のオリジナルはArduinoなので以下の例のようにpinMode関数で出力設定し、
pinMode(SS, OUTPUT);
digitalWrite関数で実際に端子を上げ下げしてます。
digitalWrite(SS, HIGH);
これに対して Mbed OS6では、以下のようにGPIOオブジェクトのインスタンスを作成すると
DigitalOut SS(D10);
あとはオブジェクトに値を代入すればGPIO端子に現れます。
SS = 1;
-
- 遅延
Arduinoでは以下の例のようにすると引数に与えた数値ミリ秒だけ待ちます。
delay(100);
MbedOS6はマルチスレッドで並行動作可能なOSです。以下のようにすれば当該スレッド内で「待ち」が入ります。
ThisThread::sleep_for(100ms);
なお、100msでなく100sとかけば秒単位で待ちます。ただしマイクロ秒、ナノ秒単位の待ちも定義されてますがそれらはsleepではなく「スピン待ち」みたいなので関数は別です。
-
- SPIの初期化
秋月殿のオリジナルはArduino Uno用であったので、SPI.begin()せずに
spi_settings = SPISettings(8000000, MSBFIRST, SPI_MODE0);
などとセットしておいて、実際にSPI転送するところは
SPI.beginTransaction(spi_settings); ~この間に実際のSPI転送を記述する~ SPI.endTransaction();
で転送できてました。しかし、同じArduinoでもESP32系では多分複数のSPIを持っているためか、SPI.begin()は必須でした。最初のどこかで実行しておかないとESP32C3では動きませなんだ。なお、ESP32系の場合デフォルトのSPI端子のままであればSPI.begin()はそのままですが、別なSPIの場合はSCLK, MOSI、MISOを指定する必要があるようです。
Mbed OS6の場合は、以下のようにSPIのインスタンスを作っておいて
SPI spi(D11, D12, D13); //mosi, miso, sclk
以下のように初期化すれば使えるようです。
spi.format(8, 0); spi.frequency(1000000);
-
- SPIへの8ビットデータ書き出し
Arduinoでは以下のようです。勿論、先ほどのbegin end の間に挟みます。
SPI.transfer(data);
Mbed OS6では前述のようにインスタンスを定義した場合、
spi.write(data);
でOKです。
-
- コマケー話
Arduino環境とKeil Studio Cloudではコンパイラの環境が異なります。Arduinoでは以下のような関数を
void ATM0130::print(String str) {
以下のように呼び出しても
myATM0130.print("ATM0130B3 TEST\n");
特に文句は言われませんが、Keil Studio Cloudでは文句を言われます。Stringとc_strはちゃんと書かないとならんようです。知らんけど。
まあ上記のように「成り行き、テキトー」変更を施したところ、Mbed OS6用にKeil Studio CloudでビルドしたおブジェクトでATM0130B3にデモ画面を表示することができましたです。よかった、動いて。