背景
ProMicroとはArduino Leonardoの互換機になるプログラムを書き込めるモジュールです。LCDとは液晶画面のことです。
以前teensyというプログラムを書き込めるモジュールでLCDを動かしました。
同じことをProMicroでやろうとしたところ、思っていた以上に詰まりどころがあったので、備忘録を兼ねて利用方法を共有します。
使ったもの
- ProMicro
Arduino Leonardoの互換機になれるモジュールです。
スイッチサイエンスやalirexpressで買えます。
ピンヘッダの取り付けにはんだとハンダごてが必要です。 - LCD
320x240ピクセルのSPI接続のLCDです。
aliexpressで買いました。
今回はタッチ機能無しのものを使いましたが、タッチ機能あり版も同様の接続で使えるのだと思います。 - ProMicroにプログラムを書き込めるPC
Arduino IDEかPlatformIOをインストールしてください - レベル変換モジュール
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が初期化されていたので、プログラムで初期化する方法があるのかもしれませんが、今のところ分かりません。
プログラムでの初期化方法をご存じの方がいらっしゃれば、コメントなどで情報を共有していただけると嬉しいです。)
0 件のコメント :
コメントを投稿