鳥なき里のマイコン屋(164) RISC-VコアESP32-C3に、フルカラーLCD装着

Joseph Halfmoon

前回はRISC-VコアのESP32 SoCを搭載したSeeed Xiao ESP32C3のLチカをAruduino IDE2.0で実施。今回はお求めやすいながらも240 x 240サイズのフルカラーLCD、ATM0130Bを取り付けてデモ画面を光らせてみたいと思います。UnoやIDE1.0との微妙な違いがあるのよ。

※「鳥なき里のマイコン屋」投稿順Indexはこちら

カラーLCD(バックライト付)ATM0130B3

今回使用のカラーLCDは1.3インチサイズながら240×240ドットでフルカラー(262K色表示)SPI接続のディスプレイです。バックライトもついているのでとても見やすいです(とは言え文字を表示すると年寄には小さすぎますが。)例によって秋月電子通商殿の以下のページから購入したもの。

ATM0130B3使用フルカラー液晶コントロールキット

上記のページからは説明資料に加えて、「Arduino業界」の標準機 Arduino Uno(MicroChip社AVRマイコン搭載)用のサンプルプログラムをダウンロードすることができます。

ダウンロードしたサンプルプログラムを実際にArduino Uno上で動作させてます。その記事が以下に。なお以下の時点で使用していたのはArduino IDE1.0でした。

部品屋根性(73) ATM0130B3、カラー液晶ディスプレイ240×240バックライト付

今回このディスプレイをSeeed Xiao ESP32C3に接続してみます。プラットフォームは Arduino であるので、うまくいけば秋月殿のサンプルプログラムは無修正にて動くんじゃないかい、と期待しました。しかし微妙に修正必要でしたな。

ATM0130B3とSeeed Xiao ESP32C3の接続

接続回路図が以下に。Seeed Xiao ESP32C3は、SAMD21マイコン搭載のオリジナル機種? Seeed Xiao とほぼほぼピン互換です。また Arduino との互換性も配慮されているので楽といえば楽ですが、AVR版のArduino Unoとは違うところもありです。

一番は信号電圧です。ATM0130B3は3.3V電源で動作するのですが、IO電圧は5Vにも対応しています。Arduino Unoは5VIOなので、ATM0130B3のVDDIO端子には5Vを与えますが、ESP32C3は3.3VIOなのでVDDIOも3.3Vです。

ESP32系デバイスは複数のSPIを搭載していたりしますが、Seeed Xiao ESP32C3の場合SPIの端子はプライマリな一組だけです。SCKとMOSI(今回はMISOは使わない)は決め打ち。他にデジタル制御端子3本は適当に取りやすいところから接続しました。だた、XIAOは端子が少ないので取り付けるデバイスによっては後々移したりしないとならないかもです。ATM0130_ESP32C3_DUT_Schematic

秋月殿のサンプルプログラムの移植

秋月殿のサンプルプログラムのソースは、ATM0130というクラス定義のファイル(.h と .cpp)と、デモ画面を作る .ino ファイルに分かれてます。このATM0130というクラスさえ移植できれば、この中にいろいろな描画用関数が含まれているので、いかようにも画面は作れそうです。

今回微妙に引っかかった点が2つ。

    1. ATM0130.h内で Arduino.h のインクルードが必要だった
    2. ATM0130の初期化関数内で SPI.begin() しないとならなかった

1の方は、ビルドの環境を Arduino IDE 1.0から2.0に変えているためかと思われます。2.0環境では.inoでないファイルでは 基本的な定義が読み込まれておらないようです。 そのままだとATM0130クラス内でエラーが出まくります。それらエラーは ATM0130.hの先頭部でArduino.hをインクルードすれば消えました。

2の方は、修正せずともビルドは通って書き込みまでできます。ただ画面が真っ暗(バックライトは点灯)で何も表示されません。端子をあたって調べたところソフト制御の3端子は生きているのにSCKはピクリとも動かないのでハードウエアSPIの設定不良と見ました。そこでATM0130クラスのbegin()関数の中に、SPI自体のSPI.begin()を挿入したところ正常に動作するようになりました。これはAVRマイコンとESP32C3とペリフェラルの初期化方法が異なるためのようです。

他に勝手修正が以下3点。これらは修正せずとも動きそうですが当方の好みということで。

    1. 秋月殿のオリジナルはCS端子をArduino定義ファイルのSSに向けて固定だった。どうせCSはソフト制御なので後のことを考えて変更可能とした。
    2. 秋月殿のオリジナルはハードウエアSPIの制御する端子までpinModeで設定していたが、ESP32のハードウエアSPI側のドライバで設定されているようなので余計な設定を外した。
    3. 秋月殿のオリジナルはSPIクロック8MHzだった。ESP32のドライバソースを見るとデフォルト1MHzと控えめだったので、それに合わせて1MHzとした。

まずはATM0130.h、ヘッダファイルの変更部分。右が変更ソースです。最初のところで<Arduino.h>インクルードしています。これが大事。2番目は、ATM0130のコンストラクタの引数を2つ(DCとRST端子)から3つ(DC、RST、SS端子)に変更したところ。ATM0130h_diff0

ヘッダファイルの末尾付近、DC端子用のdat_cmd, RST端子用のreset変数の次にSS端子用のss_L変数追加してます。

ATM0130h_diff1

上記ヘッダに対応する ATM0130.cpp 本体。最初はATM0130のコンスタクタ。上記で説明したとおり、2端子対応から3端子対応に勝手変更したのでその修正。以降 秋月殿のオリジナルでは SS と書かれているキメウチ部分は、ss_L変数を参照するように書き換えであります。

もっとも大事な変更が ATM0130::begin(void)の先頭に SPI.begin()を追加したこと。UnoではSPI.begin()しなくても動作していたのですが、ESP32C3ではこれを抜かすとSPIのハードが動いてくれませぬ。

ATM0130cpp_diff0

なお、digitalWrite(SS, ~という記述は各所に多数あり、ここのSS端子キメウチをss_L変数で可変とする修正は以下同文で複数個所やっております。

ビルド、書き込み、動作確認

Arduino IDE2.0上でビルド後、Seeed Xiao ESP32C3ボードに書き込んでいるところが以下に。前回もありましたが、Arduino IDE2.0は、Seeed Xiao ESP32C3が接続されたことを検出はするのですが、他のボードに勘違いすることがあるみたいです。同じRISC-V系統ならまだしもですが、XtensaコアのESP32S2系に間違えることもあったです。接続したら正しく認識されているか確認してます。間違えているときは上部のプルダウンメニューから XAIO_ESP32C3を手動で選択し、右下のステータスでCOMポートとつながっていることを確認です。

downloadOK

書き込めば、冒頭のアイキャッチ画像のように、LCD上にデモパターンが表示されます。結構いい感じで表示できるんでないかい。

鳥なき里のマイコン屋(163) RISC-VコアESP32、Arduino2.0で吉例Lチカ へ戻る

鳥なき里のマイコン屋(165) 特価品(見切り品?)、GR-CITRUS入手、なんとかLチカ へ進む