編集履歴一覧に戻る
shigobuのアイコン画像

shigobu が 2023年03月14日15時54分16秒 に編集

TFT_eSPIライブラリについて追記

本文の変更

# ATM0130B3 秋月電子で購入できる小型液晶モニタ。SPI制御だからGPIOが余っている限り複数接続して個別に制御ができる。制御チップは「ST7789」なので、「[Adafruit-ST7735-Library](https://github.com/adafruit/Adafruit-ST7735-Library)」が使える。今回、複数接続で使用する際につまったことがあったので共有したい。 # 開発環境 使用マイコンは「Raspberry Pi pico」、IDEは「Arduino IDE」で、ボードパッケージはEarle F. Philhower, III氏作成のものを使用した。 # 回路図 回路図にあるように、MOSI・SCK・D/C・/RES 信号を共通にしていて、CS信号を個別に接続している。 ![回路図](https://camo.elchika.com/aac74862a8eab46764804a9be86a4a75608e0fc2/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33646436646464392d626266392d343865302d396437302d6134313133343436333130322f37303036373334632d353566622d346362332d616334392d363538666138343234326466/) 液晶端子のピン番号が逆になっているが、フラットケーブルのコネクタの「FH12-12S-0.5SH」に合わせたピン番号になっている。 # ソースコード ```arduino #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」なら在庫が有ったので、これを使った。このコネクタは、電極を下向きに刺すコネクタである。 ![FH12-12S-0.5SH](https://camo.elchika.com/e782aecf7b0dd90315a563949978b4be77aed6e7/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33646436646464392d626266392d343865302d396437302d6134313133343436333130322f64633137636434642d393633652d343333622d383066332d376135323437316566363132/) # まとめ - [Adafruit-ST7735-Library](https://github.com/adafruit/Adafruit-ST7735-Library) が使える - 複数接続する場合、ライブラリのリセットピンは-1を指定し、自前でリセット信号をトグルする。 - 複数接続する場合、CSピンの初期化を行う。

+

# Raspberry Pi pico なら TFT_eSPI ライブラリが便利 母艦がRaspberry Pi pico や esp32 とかなら、[TFT_eSPI ライブラリ](https://github.com/Bodmer/TFT_eSPI) Spritesっていう描画バッファ?みたいなのが使えて、チラつきの無い高速描画ができるらしい。 フォントも、TrueTypeフォント(を変換したもの)が使用できるし、日本語フォントも含めることができるらしい。