esp32で2.8 Inch TFT液晶とUSB HOST LIB使った

サンプルをくっつけた感じが強いのですが、使いました。

有線のキーボードを使って、TFTディスプレイに入力したキーを表示させました。

使用機器

  • 2.8 Inch TFT液晶モジュール(ILI9341ドライバーのもの) これはどこで買ったか忘れました。

  • esp32 devkit C(秋月で買ったrev1)

  • GAOHOU USB shield

http://amzn.asia/d/f28pegx

配線

github.com

USBシールドはここから抜粋。 GPIO5 : SS, GPIO17 : INT, GPIO18 : SCK, GPIO19 : MISO, GPIO23 : MOSI

ht-deko.com

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 - adafruit/Adafruit-GFX-Library: Adafruit GFX graphics core library, this is the 'core' class that all our other graphics libraries derive from

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();
}

こんな感じになる

f:id:b1u3:20181021022108j:plain

ただし、今は改行しか実装してない。 横の自動改行はデフォルトで入っているので、あとは、縦のスクロールとフォントをなんとかしたいなと思ってる。 C++勉強しないとなぁという気持ちになっている。タッチ使えるんだけど、個人的にタッチは好きじゃないので、ジョイスティックとバイブレーションをUIとして実装したい。