LoginSignup
6
2

More than 3 years have passed since last update.

Arduino-ESP32で2.8インチTFT液晶ボードとその内蔵SDスロットを使用する

Last updated at Posted at 2019-09-26

概要

ESP32とSDカードスロット内蔵の液晶ボード(Amazonで1500円くらいで購入)を使用して、簡単なアプリケーションを作成しました。

SDカードから読み出したテキストファイルの内容を液晶ボードのLCDに表示させました。

※開発環境はArduino-ESP32を使用しました

写真:今回使用した液晶ボード
tft.png

使用したもの

結線

以下の通りにESP32と液晶ボードを結線します

LCD

ESP32 LCD
VOUT VCC
GND GND
IO5 CS
IO16 RES
IO17 DC
IO23 MOSI
IO18 SCK
3V3 LED
IO19 MISO

SD

ESP32 SD 備考
IO14 SD_SCK 10kの抵抗を使用して3.3Vでプルアップする(参考記事
IO2 SD_MISO 10kの抵抗を使用して3.3Vでプルアップする(参考記事
IO15 SD_MOSI 10kの抵抗を使用して3.3Vでプルアップする(参考記事
IO13 SD_CS 10kの抵抗を使用して3.3Vでプルアップする(参考記事

スケッチの書き込み+動作確認

スケッチのLCD表示にはTFT_eSPI(ライブラリ)、SDカードにはarduino-esp32のSDカードライブラリを使用しました。また、ESP32のSPIは「VSPI:LCD表示 HSPI:SDカード」のように使用しました。

スケッチ書き込みのポイントは、スケッチを書き込む前後でIO2を(上記の「結線」の10kΩプルアップ抵抗と)抜き差しする点です。
これは、スケッチ書込みのブートモードとするためにはブート時にIO2をLowにする必要があるためです。

図:IO2を切り離す
プルアップ説明2.png

それでは実際の手順は以下の通りです。

  1. TFT_eSPI(ライブラリ)の使用準備を行う
     →下記の「TFT_eSPIの使用準備」参照

  2. テキストファイル(実際に使用したファイル)を入れたSDカードを液晶ボードに挿入する

  3. PCとESP32を接続しているUSBケーブルを抜いてIO2を(プルアップ抵抗から)切り離す

  4. USBを繋いでスケッチをESP32に書き込む(スケッチはgithubに置きました)
    ※Arduinoの設定は以下の通りにしました
    Arduino設定.png

  5. USBケーブルを抜いてIO2を(プルアップ抵抗と)接続する

  6. USBケーブルを接続する

  7. ESP32のアプリが立ち上がり、ファイル名とその中身が5秒ごとに交代でLCDに表示される

TFT_eSPIの使用準備

デフォルトの状態ではこの接続方法でTFT_eSPI(ライブラリ)を使用できません。以下の通りにTFT_eSPI/User_Setup.hを編集します。(参考元の記事)

※TFT_eSPIを使用する他のボードへ影響があるかもしれません。ファイルのバックアップ等を行い、実施は自己責任でお願いします。

図:編集対象のファイル
該当ファイル.png

1.使用しない定義をコメントアウトする

以下の3行をコメントアウトする

#define TFT_CS PIN_D8
#define TFT_DC PIN_D3
#define TFT_RST PIN_D4

※「// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP8266 SETUP ######」のすぐ下の辺りにある

2. ポートの割り当てを有効にする

以下の「#define~」の各行をコメント化解除。また、TFT_CSを5、TFT_DCを17、TFT_RSTを16に変更

// For ESP32 Dev board (only tested with ILI9341 display)
// The hardware SPI can be mapped to any pins

//#define TFT_MISO 19
//#define TFT_MOSI 23
//#define TFT_SCLK 18
//#define TFT_CS 15 // Chip select control pin
//#define TFT_DC 2 // Data Command control pin
//#define TFT_RST 4 // Reset pin (could connect to RST pin)

※「// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP ######」のすぐ下の辺りにある

3. SPIの周波数を変更する

以下のコードをコメントアウトする

#define SPI_FREQUENCY 27000000 // Actually sets it to 26.67MHz = 80/3

以下のコードのコメントアウトを解除する

// #define SPI_FREQUENCY 40000000 // Maximum to use SPIFFS

※「// Section 4. Other options」のすぐ下あたりにある

スケッチの説明

ポイント1

1つ目のポイントは、SDカードとの接続(SD.begin)を繰り返している点です。

simple_display_sd_data.ino (再接続を行う部分)
  //retry establishing SD connection
  if (sdHasError) {
    //retry establishing SD connection
    spiSD.begin(SD_CLK, SD_MISO, SD_MOSI, SD_SS);
    if(!SD.begin( SD_SS, spiSD, SDSPEED)){
     Serial.println("Card Mount Failed");
    }
    Serial.println("Card Mount Succeeded");
    sdHasError = false;
  }

実はこのスケッチでは、電源ON直後の初回のSDカードとの接続が失敗します。しかし、リセット後や2回目のSDアクセスには成功します。

おそらくそれは、IO2がデフォルトでは内蔵プルダウンになっていること、そしてESPr® Developer 32のボード上でIO2が10kΩでプルダウンされていることによって、MISO(IO2)の信号レベルが上がり切らず、ピンをSPIのMISO設定(入力=内蔵プルアップ)にした後では上がり切るのでデータの判別ができるようになると予想しています。

必要であれば回路に手を加えたりコードで対応したりしますが、いまのところ困っていないので、現状では失敗時に再びSDとの接続を行うことにしています。

ポイント2

2つ目のポイントはSDカードのアクセスにESP32のHSPIを使用している事です。

arduino-esp32のSDカードライブラリではVSPIを使用していますが、上記の結線のようにVSPIはLCDに使用しています。

そこで、ESP32が持つ別のSPIであるHSPIを使用することにしました。

しかし、arduino-esp32のSDカードライブラリでHSPIをそのまま使用できず、最終的にgithubのissuesを参考にコードを作成することで実現できました。

ポイント3

最後のポイントは、CPUの周波数(CPU Frequency)です。当初は160MHzにしていたところ、アプリケーションが時々立ち上がらないことがありました。そこでArduino IDEの設定値をいろいろ変えてみたところ、周波数を240MHzにすることで解消できました。

終わりに

やってみたらスムーズに行かないところが結構ありましたが、1つのボードにLCDとSDカードが載っているのは、やはり便利です。(実はタッチ検出もできますが、まだやっていません・・・)

今回スムーズに行かない要因の1つに、ESP32のIO2が扱いづらい事がありました。SDカードとの通信にIO2を使用する場合、上記の方法のようにスケッチの書き込みの前後でIO2をプルアップ抵抗から抜き差しする必要があります。

そこで、HSPIをリマッピングしたり(※1)、VSPIのみを使用してLCDとSDカードを制御する(※2)をすると、もっと使い勝手が良くなるかもしれません。(本当にできるかは確認していませんが)

※1:スイッチサイエンスの記事の「SPI通信」の項目が参考になります
※2:SPIの仕様上、CSを分けていればデータ線を共有できるはず

見ていただいてありがとうございました。
тнайк чoμ_〆(・ω・。)

参考記事

更新履歴

  • 2019-09-26:新規作成
6
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2