M5Stack M5Stamp Picoを触ってみた その1

概要

少し前に発売されたM5Stampを触ってみたのでわかってきたことを紹介します。

書き込みでの接触不良

上記のように穴に差し込んで書き込みを行っている場合、何回か抜き差しすると接触不良になってきます。結構な頻度でつけたり外したりをする場合には接触不良になることを覚えておいてください。

ピンソケットをつけた

こんな感じでピンソケットをつけてみました。M5Stamp Pico Mateも持っていますが、もったいないので手持ちの6ピンを2つと、3ピンを使っています。あとはMateには付属していませんが4ピンもGroveにところにつけてあります。

Groveはこんな感じに無理やりはんだ付けしています。ただジャンパケーブルで直接接続できたほうが便利なので、検証用M5Stampを作るのであれば増設おすすめです。

ケースを付けました。ソケットを付けたことで非常に接続が安定しました!

LCDを使ってみる

Nochiさんが素敵な実験していたので、私もパクってみました。

使ったのはM5StickCと同じ液晶でST7735Sになります。

waves 0.96インチ IPS 液晶ディスプレイ SPI 80x160ピクセル 65 k フルカラー モジュール ST7735
waves
¥940(2024/04/19 12:10時点)
80*160 ドット 0.96 インチ 65 k フルカラー IPS液晶モジュール

これかな。AliExpressだと400円前後から購入が可能です。

こんな感じでGrove端子にも干渉せずに接続が可能です。

真上から見てみるとGrove端子ははみ出ていますが、M5Stampの本体は液晶からはみ出ていません。

スケッチ例(Adafruit_ST7735)

#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>

Adafruit_ST7735 tft = Adafruit_ST7735(18, 19, 22, 25, 21); // cs, dc, mosi, sclk, rst
uint16_t color = 0;

void setup() {
  tft.initR(INITR_MINI160x80);
}

void loop() {
  tft.fillScreen(color);
  color += 0x0100;
}

Adafruit_ST7735を利用したサンプルです。非常にスッキリ。ただし、一番端っこ1ラインがずれて表示されています。

基本は上記と同じで、ピン番号とか調整してあります。

スケッチ例(LovyanGFX)

#include <LovyanGFX.hpp>

#define PIN_SCLK  25  // SCL 
#define PIN_MOSI  22  // SDA
#define PIN_RST   21  // RST
#define PIN_DC    19  // DC
#define PIN_CS    18  // CS
#define PIN_BLK   -1  // BLK

// SPI設定用の構造体を作成します。
struct LGFX_Config {
  // 使用するSPIを VSPI_HOST または HSPI_HOST で設定します。
  static constexpr spi_host_device_t spi_host = HSPI_HOST;

  // 使用するDMAチャンネルを 1か2で設定します。
  // 使用しない場合は省略するか0を設定します。
  static constexpr int dma_channel = 2;

  // SPIのSCLKのピン番号を設定します。
  static constexpr int spi_sclk = PIN_SCLK;

  // SPIのMOSIのピン番号を設定します。
  static constexpr int spi_mosi = PIN_MOSI;

  // SPIのMISOのピン番号を設定します。
  // SDカード等と共通のSPIバスを使う場合はMISOも必ず設定してください。
  // 使わない場合は省略するか-1を設定します。
  static constexpr int spi_miso = -1;

  // SPI通信のデータ長を指定します。
  // RaspberryPi用のLCD等を使用する場合に16を指定します。
  // 省略時は 8 です。大抵のパネルは8ですので、基本的には省略してください。
  static constexpr int spi_dlen = 8;
};

// 用意した設定用の構造体を、LGFX_SPIクラスにテンプレート引数として設定し、インスタンスを作成します。
static lgfx::LGFX_SPI<LGFX_Config> lcd;

// Panelクラスのインスタンスを作成します。
static lgfx::Panel_ST7735S panel;

void setup(void) {
  // パネルクラスに各種設定値を代入していきます。

  // 通常動作時のSPIクロックを設定します。
  // ESP32のSPIは80MHzを整数で割った値のみ使用可能です。
  // 設定した値に一番近い設定可能な値が使用されます。
  panel.freq_write = 20000000;

  // 単色の塗り潰し処理時のSPIクロックを設定します。
  // 基本的にはfreq_writeと同じ値を設定しますが、
  // より高い値を設定しても動作する場合があります。
  panel.freq_fill  = 27000000;

  // LCDから画素データを読取る際のSPIクロックを設定します。
  panel.freq_read  = 16000000;

  // SPI通信モードを0~3から設定します。
  panel.spi_mode = 0;

  // データ読み取り時のSPI通信モードを0~3から設定します。
  panel.spi_mode_read = 0;

  // 画素読出し時のダミービット数を設定します。
  // 画素読出しでビットずれが起きる場合に調整してください。
  panel.len_dummy_read_pixel = 8;

  // データの読取りの可否を設定します。読取り不可の場合はfalseを設定します。
  // ※ CSピンのないST7789等はfalseにしてください。
  // 省略時はtrueになります。
  panel.spi_read = true;

  // データの読取りMOSIピンで行うパネルの場合はtrueを設定します。
  // 省略時はfalseになります。
  panel.spi_3wire = false;

  // LCDのCSを接続したピン番号を設定します。
  // 使わない場合は省略するか-1を設定します。
  panel.spi_cs = PIN_CS;

  // LCDのD/Cを接続したピン番号を設定します。
  panel.spi_dc = PIN_DC;

  // LCDのRSTを接続したピン番号を設定します。
  // 使わない場合は省略するか-1を設定します。
  panel.gpio_rst = PIN_RST;

  // LCDのバックライトを接続したピン番号を設定します。
  // 使わない場合は省略するか-1を設定します。
  panel.gpio_bl  = PIN_BLK;

  // バックライト使用時、輝度制御に使用するPWMチャンネル番号を設定します。
  // PWM輝度制御を使わない場合は省略するか-1を設定します。
  panel.pwm_ch_bl = -1;

  // バックライト点灯時の出力レベルがローかハイかを設定します。
  // 省略時は true。true=HIGHで点灯 / false=LOWで点灯になります。
  panel.backlight_level = true;

  // パネルの色反転設定です。trueを設定すると色が反転します。(例:黒が白に、青が黄色に)
  // 省略時は false。画面の色が反転している場合は設定を変更してください。
  panel.reverse_invert = true;

  // パネルの色順がを設定します。  RGB=true / BGR=false
  // 省略時はfalse。赤と青が入れ替わっている場合は設定を変更してください。
  panel.rgb_order = false;

  // LCDドライバチップ内のメモリサイズ(幅と高さ)を設定します。
  // 設定が合っていない場合、setRotationを使用した際の座標がずれます。
  // (例:ST7735は 132x162 / 128x160 / 132x132 の3通りが存在します)
  panel.memory_width  = 132;
  panel.memory_height = 162;

  // パネルが実際に表示可能なピクセル数(幅と高さ)を設定します。
  // 省略時はパネルクラスのデフォルト値が使用されます。
  panel.panel_width  = 80;
  panel.panel_height = 160;

  // パネルのオフセット量を設定します。
  // 省略時はパネルクラスのデフォルト値が使用されます。
  panel.offset_x = 26;
  panel.offset_y = 1;

  // setRotationの初期化直後の値を設定します。
  panel.rotation = 0;

  // setRotationを使用した時の向きを変更したい場合、offset_rotationを設定します。
  // setRotation(0)での向きを 1の時の向きにしたい場合、 1を設定します。
  panel.offset_rotation = 2;

  // 設定を終えたら、lcdのsetPanel関数でパネルクラスのポインタを渡します。
  lcd.setPanel(&panel);

  // SPIバスとパネルの初期化を実行すると使用可能になります。
  lcd.init();
}

uint32_t count = ~0;
void loop(void) {
  // 外付けパネルは回転しながら描画
  lcd.startWrite();
  lcd.fillScreen(TFT_WHITE);

  lcd.setRotation(++count & 7);
  lcd.setColorDepth((count & 8) ? 16 : 24);

  lcd.setTextColor(random(65536));
  lcd.drawNumber(lcd.getRotation(), 16, 0);

  lcd.setTextColor(0xFF0000U);
  lcd.drawString("R", 30, 16);
  lcd.setTextColor(0x00FF00U);
  lcd.drawString("G", 40, 16);
  lcd.setTextColor(0x0000FFU);
  lcd.drawString("B", 50, 16);

  lcd.drawRect(10, 10, 20, 20, random(65536));

  lcd.endWrite();

  delay(500);
}

パネルの初期化があるのでちょっと長いです。ただしこちらであればほぼ完璧に液晶が操作可能です。

上記をピン番号とか整理して使っています。

ピンソケット版

ソケットを付けちゃうとこんな感じの接続になります。抜き差しをほとんどしていないM5Stampであれば問題ないのですが、すこしヘタっているピンの場合にはLCD接続をすると接触不良の影響を受けやすいのではんだ付けをしたほうがいいみたいです。

まとめ

4ドルの液晶とM5Stampを組み合わせて10ドルぐらいで液晶付きのESP32が手に入ります。ちょっとしたことだけ表示したい場合にはこの組み合わせは結構ありな気がします。

Grove経由で給電できるので、Wi-Fiを搭載していないマイコンとかにGrove経由で接続してUARTとかで転送するって場合にもちょっとした事が画面に表示できて便利そうですね。

続編

コメント