esp32で2.8 Inch TFT液晶とUSB HOST LIB使った
サンプルをくっつけた感じが強いのですが、使いました。
有線のキーボードを使って、TFTディスプレイに入力したキーを表示させました。
使用機器
配線
USBシールドはここから抜粋。 GPIO5 : SS, GPIO17 : INT, GPIO18 : SCK, GPIO19 : MISO, GPIO23 : MOSI
USBシールドの配線は上記のサイトで確認。ボードの裏を見るとMISOとCLKが逆に書かれているので注意する。困ったら、arduinoボードの配線を見て確認すれば良い。arduino用にシールドのピンが配置されているため。
TFTの配線はこの方を参考に
2.4 Inch TFT Display For ESP32macsbug.wordpress.com
たまたまピン配置が被らなかったので、これでいけた。変える場合はUSBホストの方はソースコードを直接いじることになる。tftの方はオブジェクトを生成するときに設定できる。
ソースコード
僕はusb hostとtftのライブラリはgithubから取ってきた。
GitHub - adafruit/Adafruit_ILI9341: Library for Adafruit ILI9341 displays
GitHub - felis/USB_Host_Shield_2.0: Revision 2.0 of USB Host Library for Arduino.
ライブラリーはここからcloneして、arduinoのlibrariesフォルダに入れればおk。
あとはこれらをまとめればいい。C++はあんまやったことないので、変なところは目をつむって欲しいですが。
// SPI #include <SPI.h> // TFT display module #include <gfxfont.h> #include <Adafruit_GFX.h> #include <Adafruit_SPITFT.h> #include <Adafruit_SPITFT_Macros.h> #include <Adafruit_GFX.h> #include <Adafruit_ILI9341.h> // USB HOST #include <hidboot.h> #include <usbhub.h> class KbdRptParser : public KeyboardReportParser { public: Adafruit_ILI9341 *tft; void PrintKey(uint8_t mod, uint8_t key); protected: void OnControlKeysChanged(uint8_t before, uint8_t after); void OnKeyDown (uint8_t mod, uint8_t key); void OnKeyUp (uint8_t mod, uint8_t key); void OnKeyPressed(uint8_t key); }; void KbdRptParser::PrintKey(uint8_t m, uint8_t key) { } void KbdRptParser::OnControlKeysChanged(uint8_t before, uint8_t after){ } void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key) { if(key==0x28){ (*(this->tft)).println(""); }else{ (*(this->tft)).print((char)OemToAscii(mod,key)); } } void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key){ } void KbdRptParser::OnKeyPressed(uint8_t key){ } USB Usb; HIDBoot<USB_HID_PROTOCOL_KEYBOARD> HidKeyboard(&Usb); KbdRptParser Prs; Adafruit_ILI9341 tft = Adafruit_ILI9341(13,14,27,26,12,25); void setup() { Serial.begin(115200); tft.begin(); tft.fillScreen(ILI9341_BLACK); yield(); tft.setCursor(0,0); tft.setTextColor(ILI9341_GREEN); tft.setTextSize(2); tft.setRotation(2); tft.println("Initialize USB..."); delay(1000); if(Usb.Init() == -1){ tft.println("USB initialization failed."); }else{ tft.println("OK"); } tft.println("Setting..."); HidKeyboard.SetReportParser(0,&Prs); Prs.tft = &tft; delay(500); tft.println("OK"); tft.setTextColor(ILI9341_WHITE); tft.println("Input Any String:"); } void loop() { Usb.Task(); }
こんな感じになる
ただし、今は改行しか実装してない。 横の自動改行はデフォルトで入っているので、あとは、縦のスクロールとフォントをなんとかしたいなと思ってる。 C++勉強しないとなぁという気持ちになっている。タッチ使えるんだけど、個人的にタッチは好きじゃないので、ジョイスティックとバイブレーションをUIとして実装したい。