ATM0130B3
秋月電子で購入できる小型液晶モニタ。SPI制御だからGPIOが余っている限り複数接続して個別に制御ができる。制御チップは「ST7789」なので、「Adafruit-ST7735-Library」が使える。今回、複数接続で使用する際につまったことがあったので共有したい。
開発環境
使用マイコンは「Raspberry Pi pico」、IDEは「Arduino IDE」で、ボードパッケージはEarle F. Philhower, III氏作成のものを使用した。
回路図
回路図にあるように、MOSI・SCK・D/C・/RES 信号を共通にしていて、CS信号を個別に接続している。
液晶端子のピン番号が逆になっているが、フラットケーブルのコネクタの「FH12-12S-0.5SH」に合わせたピン番号になっている。
ソースコード
#include <Adafruit_GFX.h>
#include <Adafruit_ST7789.h>
#include <SPI.h>
#define TFT_CS_1 4
#define TFT_CS_2 5
#define TFT_CS_3 6
#define TFT_CS_4 7
#define TFT_RST 1
#define TFT_DC 0
//リセットピンに-1を設定し、リセットは自前で実装
Adafruit_ST7789 tft1 = Adafruit_ST7789(TFT_CS_1, TFT_DC, -1);
Adafruit_ST7789 tft2 = Adafruit_ST7789(TFT_CS_2, TFT_DC, -1);
Adafruit_ST7789 tft3 = Adafruit_ST7789(TFT_CS_3, TFT_DC, -1);
Adafruit_ST7789 tft4 = Adafruit_ST7789(TFT_CS_4, TFT_DC, -1);
const int BACKLIGHT_PWM = 10;
float p = 3.1415926;
void setup() {
Serial.begin(115200);
pinMode(TFT_RST, OUTPUT);
//液晶のリセットピンをトグル
digitalWrite(TFT_RST, HIGH);
delay(100);
digitalWrite(TFT_RST, LOW);
delay(100);
digitalWrite(TFT_RST, HIGH);
delay(200);
pinMode(BACKLIGHT_PWM, OUTPUT);
analogWrite(BACKLIGHT_PWM, 255);
//CSピンの初期化
pinMode(TFT_CS_1, OUTPUT);
pinMode(TFT_CS_2, OUTPUT);
pinMode(TFT_CS_3, OUTPUT);
pinMode(TFT_CS_4, OUTPUT);
digitalWrite(TFT_CS_1, HIGH);
digitalWrite(TFT_CS_2, HIGH);
digitalWrite(TFT_CS_3, HIGH);
digitalWrite(TFT_CS_4, HIGH);
SPI.setRX(16);
SPI.setTX(3);
SPI.setSCK(2);
tft1.init(240, 240);
tft2.init(240, 240);
tft3.init(240, 240);
tft4.init(240, 240);
tft1.fillScreen(ST77XX_RED);
tft2.fillScreen(ST77XX_RED);
tft3.fillScreen(ST77XX_RED);
tft4.fillScreen(ST77XX_RED);
tftPrintTest(&tft1);
tftPrintTest(&tft2);
tftPrintTest(&tft3);
tftPrintTest(&tft4);
}
void loop() {
//省略
}
void tftPrintTest(Adafruit_ST7789 *tft) {
//省略
}
リセットを自前で実装する
重要な部分は、Adafruit_ST7789オブジェクトを作成する際に、リセットピン番号を「-1」に設定しリセットを無効にしている点である。今回の回路では、リセット信号を共通にしているため、すべての液晶で同時にリセットがかかってしまう。ライブラリのリセットはinit関数で行われているので、一個目のinit関数のあとに二個目のinit関数を呼ぶと、すべての液晶をリセットするので、一個目の液晶もリセットされてしまう。一個目の初期化が無かったことになってしまう。
したがって、ライブラリにリセットさせないで、自前でリセットをする必要が有る。
CSピンの初期化を行う
CSピンは、ライブラリで制御する設定にしているので、本来初期化は不要のはずである。ライブラリのサンプルを見ても初期化は行っていない。しかし、今回の複数接続した回路ではCSピンを初期化しないと正常に動作しなかった。
コネクタ
接続端子は、フラットケーブルになっているので、専用のコネクタが必要である。ピッチ変換基盤付きキットには、「FH12A-12S-0.5SH」が基盤に実装されている。これは、フラットケーブルの電極が上になるように刺すコネクタである。自前で基盤を作成する場合は、業者に基板実装を依頼するのが便利である。今回、JLCPCBのPCBAを使用してみた。JLCPCBには、「FH12A-12S-0.5SH」の在庫が無く、「FH12-12S-0.5SH」なら在庫が有ったので、これを使った。このコネクタは、電極を下向きに刺すコネクタである。
まとめ
- Adafruit-ST7735-Library が使える
- 複数接続する場合、ライブラリのリセットピンは-1を指定し、自前でリセット信号をトグルする。
- 複数接続する場合、CSピンの初期化を行う。
Raspberry Pi pico なら TFT_eSPI ライブラリが便利
母艦がRaspberry Pi pico や esp32 とかなら、TFT_eSPI ライブラリが便利。
Spritesっていう描画バッファ?みたいなのが使えて、チラつきの無い高速描画ができるらしい。
フォントも、TrueTypeフォント(を変換したもの)が使用できるし、日本語フォントも含めることができるらしい。
投稿者の人気記事
-
shigobu
さんが
2023/03/05
に
編集
をしました。
(メッセージ: 初版)
-
shigobu
さんが
2023/03/14
に
編集
をしました。
(メッセージ: TFT_eSPIライブラリについて追記)
-
shigobu
さんが
2023/03/14
に
編集
をしました。
(メッセージ: 脱字を修正)
ログインしてコメントを投稿する