2019年10月13日日曜日

ProMicroで320x240のSPI接続するLCDを動かす方法


背景

ProMicroとはArduino Leonardoの互換機になるプログラムを書き込めるモジュールです。
LCDとは液晶画面のことです。

以前teensyというプログラムを書き込めるモジュールでLCDを動かしました。
同じことをProMicroでやろうとしたところ、思っていた以上に詰まりどころがあったので、備忘録を兼ねて利用方法を共有します。

使ったもの

  • ProMicro
    Arduino Leonardoの互換機になれるモジュールです。
    スイッチサイエンスalirexpressで買えます。
    ピンヘッダの取り付けにはんだとハンダごてが必要です。
  • LCD
    320x240ピクセルのSPI接続のLCDです。
    aliexpressで買いました。
    今回はタッチ機能無しのものを使いましたが、タッチ機能あり版も同様の接続で使えるのだと思います。
  • ProMicroにプログラムを書き込めるPC
    Arduino IDEPlatformIOをインストールしてください
  • レベル変換モジュール
    ProMicroは5V駆動ですがLCDは3.3Vで動くため、信号の電圧をこれで変換します。
    スイッチサイエンスで買いました。
  • 3.3Vレギュレータ
    LCDの電源のために3.3Vを作る装置です。
    秋月電子で買いました。
  • ブレッドボード
    はんだ付けせずに電子部品の信号線を引き出せる部品です。
    秋月電子スイッチサイエンスaliexpressで買えます。
  • ジャンパワイヤ
    ブレッドボードで引き出した信号線を接続する部品です。
    秋月電子スイッチサイエンスaliexpress買えます。

回路を作成

このように装置を接続します。


ProMicro 接続先
15 (SCLK) レベル変換High1
14 (MISO) レベル変換High2
16 (MOSI) レベル変換High3
10 (DC) レベル変換High4
VCC レベル変換HV, 3V3レギュレータ VIN
GND レベル変換GND, 3V3レギュレータGND, LCD GND

LCD 接続先
VCC 3.3Vレギュレータ VOUT(以後3V3)、レベル変換 LV
GND GND
CS GND
RESET 3V3
DC レベル変換Low4
MOSI レベル変換Low3
SCK レベル変換Low2
LED 3V3
MISO レベル変換Low1

利用対象のモジュールのピンをGNDにして値を送信することを通知するCS (Chip Select)ピンとResetピンもライブラリで制御できるのですが、レベル変換モジュールのピンの数が足りないため、今回はLCDのCSはGNDに、Resetは3V3にすることにしました。
CSを利用して複数のSPIデバイスを利用する場合は、CSもレベル変換モジュールで変換してLCDに接続してください。

接続するとこうなりました。


ライブラリを設定

ProMicroで今回動かそうとしているSPIのLCDには、Adafruitが公開しているライブラリを利用できます。
このライブラリをビルドするには1つライブラリをインストールしておく必要があるので、これら2つのライブラリをインストールしてください。

https://github.com/adafruit/Adafruit_ILI9341
https://github.com/adafruit/Adafruit-GFX-Library

Arduino IDEの場合は、2つ共ライブラリマネージャーからインストールできます。



PlatformIOの場合は、platformio.iniに下記の記述をすれば、利用できる状態になります。

lib_deps = 
  Adafruit ILI9341
  Adafruit GFX Library


プログラム

文字表示プログラムを作ってみました。
今回CSピンは使っていないので-1とし、DCピンを10としてLCDを利用します。

#include <Arduino.h>
#include <Adafruit_ILI9341.h>

const uint8_t TFT_CS = -1; // Not used
const uint8_t TFT_DC = 10;

Adafruit_ILI9341 tft(TFT_CS, TFT_DC);

void setup() {
  tft.begin();
  tft.fillScreen(ILI9341_BLACK);
  tft.setTextSize(2);
  tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
  tft.setRotation(3);
}

void loop() {
  tft.setCursor(0, 0);
  tft.println("Hello");
  tft.println("on LCD");
  tft.println("at " + String(millis()));
  delay(1000);
}

Arduino IDEでAdafruit ILI9341のサンプルプログラムを利用する場合は、上記のプログラムと同様にCSを-1、DCを10にすると、作り方を紹介した回路で動くと思います。

動作確認

回路とプログラムが間違っていなければ、プログラムを書き込むとLCDに文字が表示されます。


課題

LCDが初期化されない
この回路だとプログラムを書き換えてProMicroが再起動してもLCDは電源を入れ直さないと初期化されません。
多分RESETピンもProMicroで制御すれば初期化されるのだと思いますが、試していません。

TeensyでLCDを制御したときは、RESETピンを使わなくてもLCDが初期化されていたので、プログラムで初期化する方法があるのかもしれませんが、今のところ分かりません。
プログラムでの初期化方法をご存じの方がいらっしゃれば、コメントなどで情報を共有していただけると嬉しいです。)

まとめ

レギュレータやレベル変換モジュールが必要で、紹介した回路だとLCDが初期化されない課題はありますが、LCDをProMicroで動かせました。

参考

Topic: text overwrite on TFT Touch screen application

変更履歴

2019.11.29 platformioの設定ファイルを「platformio.ino」と間違えていたので、「platformio.ini」 に修正しました。

0 件のコメント :