
【Arduino】CS端子のないST7789 TFTを動かす|3つの落とし穴とフリッカー対策
はじめに 240×240ドットのフルカラーTFT液晶が数百円で買えるようになりました。今回使ったのはST7789というドライバICを積んだ1.3インチのモジュールで、SPIで手軽につなげるのが売りです。ところが実際に配線してサンプルを流しても、最初はうんともすんとも言いませんでした。安い代わりに、この製品にはハマりどころがいくつか隠れています。 この記事では、まずその「動かない」の正体を先に片付けてから、配線・ライブラリ・サンプルコードへと進みます。後半では、数字をカウントアップ表示させたときに出るフリッカー(画面のチラつき)をどう抑えたか、というところまで扱います。 つまずくのはこの3か所 先に結論を書いておきます。私が買ったST7789モジュールが動かなかった原因は、次の3点に集約されました。ここさえ押さえれば、あとは素直に表示できます。 一つ目は、このモジュールにCS端子が無いことです。SPIというのは、1本のクロックとデータ線を複数の機器で共有し、CS(チップセレクト、どの相手と話すかを選ぶ信号)で通信相手を1台だけ指名する仕組みです。ところがCSが無いと相手を選び分けられないので、このディスプレイはSPIバスを独り占めする前提でしか使えません。試しにSDカードモジュールを同じSPIに相乗りさせたら、案の定ディスプレイは表示しなくなりました。ほかのSPI機器と一緒に使いたいなら、CS端子のある製品(ST7735 系など)を選んだほうが無難です。ST7735チップでもST7789と似た感覚でプログラミングできます。 二つ目は電源で、VCCは5Vに入れる必要がありました。3.3Vを与えると起動時に電圧が足りず、画面が一瞬ついてはすぐ落ちてしまいます。ただし紛らわしいのですが、電源が5Vでも信号線は3.3Vロジックです。Arduino Unoの出力は5Vなので、データ線を直結するのは本来おすすめできません(この点は配線のところで補足します)。 三つ目がSPI_MODE2です。SPIにはクロックの極性と位相の組み合わせでMODE0〜3の4種類があり、これが送受信側で食い違うと1ドットも表示されません。私の個体はMODE2でようやく通りました。初期化のところで1行指定するだけなので、表示されないときはまずここを疑うと早いです。 用意するもの ディスプレイのスペックは次のとおりです。IPSパネルなので視野角が広く、発色も素直でした。 項目 値 サイズ 1.3インチ 表示モード ノーマリーブラックIPS インタフェース SPI ドライバIC ST7789VW 外形寸法 27.78(W)× 39.22(H)× 3.0 ±0.1(T)mm 解像度 240×240ドット(RGB各8bit) 表示エリア 23.4(W)× 23.4(H)mm 使用温度 -20〜70℃ 重量 6.1g 同じ1.3インチのST7789モジュールは、ST7789 やTFTディスプレイ で検索すると見つかります。本体側はArduino Unoを使いました。 Arduino Unoとの配線 配線は次の写真のとおりです。バックライト制御のBLK(BKL)ピンは今回使いませんでした。CS端子は基板に出ていないので、当然どこにもつなぎません。 ピン割り当ては、Arduino UnoとESP32のそれぞれで次のようにしました。SDA・SCLはSPIのデータとクロックで、DCはデータとコマンドを切り替える線です。 ディスプレイ Arduino Uno ESP32 役割 BLK 未接続 未接続 バックライト制御 DC 8 2 データ/コマンド切替 RES 9 4 リセット SDA 11 23 SPIデータ入力 SCL 13 18 SPIクロック VCC 5V 5V 電源 GND GND GND GND 先ほど触れたとおり、電源は5Vですが信号は3.3Vロジックです。Arduino Unoの5V出力を各データ線に直結すると、ディスプレイ側の定格を超えて故障の原因になり得ます。とりあえず動作を試すだけなら直結でも表示はできてしまいますが、常用するならロジックレベル変換モジュールや分圧抵抗で3.3Vに落として接続するのが安全です。ESP32はもともと3.3Vロジックなので、この心配はありません。 ...








