ESP32-PICO-D4搭載M5Stamp Pico Mateを使ってみた

コンピュータ、組み込み

M5Stamp Pico Mateを入手しました。
マイコン基板の中では最小クラス、技適付きで無線も使えます。

紹介するもの

M5STamp Pico Mate (ESP32PICO)

特徴

Switch science や Ali Expressの公式ストアから購入できます。
小型でありながらGPIO、PWM、Analogの入出力に、通信もUART、I2C、SPI、さらに無線でBluetoothとWifiも使用できる。
USBコネクタがないので、スケッチの書き込みにはUSB-シリアルコンバータなどを使用します。

接続USBコネクタは無い(USB-シリアルコンバータを使用する。)
CPUXtensa dual-core 32bit LX6 240MHz
SRAM520KByte
フラッシュMemory4MB
GPIO12 (1本は入力のみ)
ADC5 (12bit 0 ~ 4095)
DAC2 (8bit 0 ~ 255)
PWM8 (8bit 0 ~ 255)
UART1(UART0 書き込み用)
I2C1
SPI1
ボタンReset (GPIO39)
LED1 WS2812 (GPIO22)
ピン配置

公式以外に載っていない機能ピンを追記したピン配置表を作りました。

公式のピンアサイン表です。

外観

皿ねじで上面カバーを留めています。
購入時はMACアドレスの書かれたシールで隠れています。

分解の注意
画像は付属のピンアサインシールを上面カバーに貼り付けて使用しています。
一度シールを貼って組み立てると、シールの粘着が立体アンテナに接着されてしまいます。
無理に引きはがすとシールが破れたり、アンテナが破損するのでゆっくり慎重にはがしてください。

400穴ブレッドボードでは、左右2列と3列使用することができます。

使ってみて

小さくてなんでもできる基板です。
複数のモジュールを同時に制御することは難しいですが、ウエアブル用途で携帯型のガジェットを開発するのには適していると思います。

スケッチの書き込みにUARTを配線するのは面倒ですが、慣れれてしまえばという感はあります。

準備

ライブラリ

ボードライブラリ

Arduino IDEのボードマネージャからESP32用のライブラリのインストールとボードの選択をします。

ボードマネージャのURLhttps://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
検索ESP
ボードライブラリesp32 by Espressif Systems バージョン x.x.x※
選択するボードツール > ボード > esp32 > ESP32 Dev Module
※ x.x.x Sep/2022 動作確認は2.0.5を使用しています

モジュールライブラリ

機能/モジュールライブラリ名検索確認時のバージョン
SSD1306Adafruit SSD1306 by AdafruitSSD13062.5.1
ST7735Adafruit ST7735 and ST7789
Library by Adafruit
ST77351.9.3
関連
SSD1306
ST7735
Adafruit GFX Library by AdafruitGFX1.11.3
WS2812Adafruit NeoPixel by AdafruitNEOPIXEL1.10.5

書き込み

USB-シリアルコンバータを使用します。
公式からも専用品が販売されていますが、汎用品で代用ができるので紹介します。

配線

USB-シリアルコンバータにFT232RL を使用します。
ジャンパピンは 3.3Vに設定します。

書き込みを行う場合、ダウンロードモードにするために、M5Stamp Pico MateのGPIO0 とGNDをショートさせてから、電源をOFF->ONします。
(画像緑のジャンパワイヤ)

M5Stamp Pico Mate配線FT232RL
3V3VCC
GNDGND
GPIO1 (UART0 TX)RX
GPIO3 (UART0 RX)TX

書き込みが終了し、スケッチを動かす場合は緑のジャンパワイヤを外して、電源をOFF->ONします。

基本スケッチ

M5Stamp Mate PicoはUSBコネクタがないため、電源とスケッチの書き込み用としてUSB-シリアルコンバートを配線しています。
USB-シリアルコンバータ以外に行う配線の説明のみを行います。

LEDチカ

説明

基板上のLEDを点滅させます。

スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
全般で使用できます。

【スケッチの説明】
GPIO ピンを指定して1秒周期(500ms 点灯、500ms 消灯)の点滅を行います。

【ライブラリ】

【準備】
指定ピン - 保護抵抗(約200Ω) - LED Anode, LED Cathode - GND
抵抗値は使用するLEDにより適切な抵抗値を求めてください。

【バージョン情報】
2022/10/24 : 新規
**********************************************************************/
// M5Stamp Pico MateのdigitalWriteで設定できるピン
//  1, 3, 26, 18, 19, 21, 22, 25, 32, 33 //DigitalWrite
#define LED 26       //基板実装LED

void setup()
{
  pinMode(LED, OUTPUT);  //ピン出力設定
}

void loop()
{
  digitalWrite(LED, HIGH);
  delay(500);

  digitalWrite(LED, LOW);
  delay(500);
}
結果

LEDが点滅しました。

PWM

説明

PWMとDACを使ってLEDのフェード点灯(ゆっくり点灯)とフェード消灯(ゆっくり消灯)を行います。

スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
ESP系 DAC 出力が搭載されている基板で使用できます。
ピン出力については使用されるマイコン基板のピンアサイン表などを確認してください。

例 : NODEMCU ESP32

【スケッチの説明】
DA 出力と、PWM出力でのフェード点灯(ゆっくり点灯)とフェード消灯(ゆっくり消灯)を行います。

【ライブラリ】

例 esp32 > ESP32 Dev Module

【準備】
指定ピン - 保護抵抗(約200Ω) - LED Anode, LED Cathode - GND
抵抗値は使用するLEDにより適切な抵抗値を求めてください。

PWM と DAC の2系統準備します。

【バージョン情報】
2022/10/26 : 新規
**********************************************************************/
// ESP32-WROVER-DEVのanalogWriteで設定できるピン (0 - 255)
// 15, 2, 0, 4, 5, 18, 19, 21, 3, 1, 22, 23, 13, 12, 14, 27, 26 //PWM (8bit 0 - 255)
//dacWriteで設定できるピン (0 - 255)
// 25,26  //DAC

#define DAC 25        //DA 出力は 25th pin
#define PWM 27        //PWM 出力は 27th pin

void setup()
{
  pinMode(DAC , OUTPUT);
  pinMode(PWM , OUTPUT);
}

void loop()
{
  for(int i = 0; i < 256; i ++)
  {
    analogWrite(PWM, i);
    dacWrite(DAC, i);
    delay(2);
  }

  for(int i = 0; i < 256; i ++)
  {
    analogWrite(PWM, 255 - i);
    dacWrite(DAC, 255 - i);
  delay(2);
  }
}
結果

同じ抵抗と同色のLEDで出力の違いを確認しました。
PWM制御(analogWrite)ではゆっくり点灯、ゆっくり消灯がきれいに見えています。
DAC制御(dacWrite)ではLEDの発光電圧になるまでは消灯していますが、点灯後はゆっくり点灯とゆっくり消灯が確認できます。

ADC

説明

M5Stamp Pico Mateにはアナログ出力があります。
出力したアナログ信号をADCで読み取ります。

DACは8bit(0~255)で設定して最大で3.3V出力します。
ADCは12bit(0~4095)の最大3.3Vを読み出します。

配線

GPIO25 と GPIO36を直接配線します。

スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
ESP系 DAC 出力が搭載されている基板で使用できます。
ピン出力については使用されるマイコン基板のピンアサイン表などを確認してください。

例 : NODEMCU ESP32

【スケッチの説明】
DA 出力で出力した電圧をADで読み取り、UARTに出力します。

【ライブラリ】

例 esp32 > ESP32 Dev Module

【準備】
指定ピン(DAC) - 指定ピン(ADC)

【バージョン情報】
2022/10/24 : 新規
**********************************************************************/
// M5Stamp Pico MateのanalogWriteで設定できるピン (0 - 255)
//  26, 36, 25, 32, 33             //AnalogRead (12bit 0 - 4095)
//dacWriteで設定できるピン (0 - 255)
// 25,26  //DAC

#define DAC 25
#define ADC 36

void setup()
{
  Serial.begin(115200);

  pinMode(DAC, OUTPUT);
  pinMode(ADC, INPUT);
}

void loop()
{
  int iADC = 0;
  //アナログ出力を、アナログ入力で読み取ります。
  //結果はCOM出力します。
  for(int i = 0; i < 256; i ++)
  {
    dacWrite(DAC, i);
    iADC = analogRead(ADC);
    Serial.printf("(DAC, ADC) = %d, %d\r\n", i, iADC);
    delay(2);
  }

  for(int i = 0; i < 256; i ++)
  {
    dacWrite(DAC, 255 - i);
    iADC = analogRead(ADC);
    Serial.printf("(DAC, ADC) = %d, %d\r\n", 255 - i, iADC);
    delay(2);
  }
}
結果

結果を波形にしました。
横軸はデータ数(index)です。
縦軸左は設定したDA値、縦軸右が読み取ったAD値。

設定に対して読み取ったAD値は湾曲しています。
読み出したAD値は3613(AD)でした。

ここからは参考の考察

3.3Vが4095(AD)だとして、1bitあたりの分解能を求めると
3.3V / 4096 = 約0.8mV/bit となるので、0.8mV/bit × 3613(AD)では2.91Vとなります。

DAで出力した値をオシロスコープ(HDS272)で読み出してみました。
設定に対して直線的ですが、3.3Vの出力はありませんでした。
ラインAの読み取り値は2.82Vでしたので、ADCの読み取りは誤差はありますが概ねあっているようです。

M5Stamp Pico Mate のDACは最大2.8V程度の出力で、ADCは電圧に対しては湾曲した読み取りを行うようです。

UART(省略します)

省略します。
UART0として使用はできます。

I2C(SSD1306)

説明

M5Stamp Pico MateにはI2Cがないので、ソフトウエアI2Cを使用しSSD1306の表示をします。

図形の描画やそのほかの命令はArduinoサンプルスケッチを参照してください。
ファイル(F) > スケッチ例 > Adafruit SSD1306 > ssd1306_128x64_i2c

配線
M5Stamp Pico Mate配線SSD1306(0.96inch)
3.3VVCC
GNDGND
GPIO22SCL
GPIO21SDA
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
デフォルトでI2Cが設定されている基板で利用できます。

例 : NODEMCU ESP32

【スケッチの説明】
SSD1306 OLEDの制御をします。

【ライブラリ】
例 esp32 > ESP32 Dev Module

【準備】
マイコン基板 <-> SSD1306
3V3 <-> VCC
GND <-> GND
SDA <-> SDA
SCL <-> SCL

【バージョン情報】
2022/10/24 : 新規
**********************************************************************/
//M5Stamp Pico Mateでは I2C SDA(21), SCL(22)

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128                //解像度 128 x 64 で使用します。
#define SCREEN_HEIGHT 64                //SCREEN_HEIGHTは 32 に設定することができます。

#define OLED_RESET     -1               //使用しないので -1を設定する。
#define SCREEN_ADDRESS 0x3C             //I2Cアドレスは 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
                                        //表示制御にはAdafruit製 SSD1306を使用する。
                                        
void setup()
{
  

  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    for(;;);
  }

  display.clearDisplay();               //何か表示されている場合に備えて表示クリア

  display.setTextSize(2);               //フォントサイズは2(番目に小さい)
  display.setTextColor(SSD1306_WHITE);  //色指定はできないが必要
  display.setCursor(20, 5);            //テキストの表示開始位置
  display.print(F("TAMANEGI"));         //表示文字列
  display.setCursor(25, 25);
  display.print(F("M5Stamp"));
  display.setCursor(10, 45);
  display.print(F("Pico Mate"));

  display.display();                    //バッファ転送(表示)
}

void loop()
{
}
結果

SSD1306のサンプルスケッチが動作しました。

SPI(ST7735)

説明

SPIを使ってST7735(LCD 1.8inch)モニタのサンプルを動作させます。
M5Stamp Pico Mate にはSPIが2系統あるので、それぞれの配線とサンプルを掲載します。

図形の描画やそのほかの命令はArduinoサンプルスケッチを参照してください。
ファイル(F) > スケッチ例 > Adafruit ST7735 and ST7789 Library > graphicstest

配線

VSPIを使用する場合の配線

M5Stamp Pico Mate配線ST7735(1.8inch)
3.3VVCC
3.3VLED
GNDGND
GP22Reset
GP21AO(DC)
GP18(SPI SCK)SCK
GP26(SPI MOSI)SDA
GP19(SPI CS)CS
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
M5Stamp Pico Mate 基板で動作します。

【スケッチの説明】
ST7735 LCDの表示制御します。
H/W SPIを使用するための方法についてサンプル記載します。

【ライブラリ】
例 esp32 > ESP32 Dev Module

【準備】
マイコン基板 <-> ST7735
3V3           <-> VCC
GND           <-> GND
GPIO19(CS)    <-> CS
GPIO22(Reset) <-> Reset
GPIO21(DC)    <-> AO
GPIO26(MOSI)  <-> SDA
GPIO18(SCK)   <-> SCK

【バージョン情報】
2022/10/24 : 新規
**********************************************************************/

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

#define TFT_CS          19  // CS
#define TFT_RST         22  // Reset 
#define TFT_DC          21  // DC
#define TFT_MOSI        26  // MOSI
#define TFT_SCK         18  // SCK

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

//S/W SPIはこちら。遅いが任意のピンを使用できる。
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCK, TFT_RST);

void setup(void) 
{
  SPI.begin(TFT_SCK, -1, TFT_MOSI, TFT_CS);   //H/W SPIを使用する場合こちらでピン番号を指定する。
                                              //S/W SPIで使用する場合はコメントアウトする。
  

  tft.initR(INITR_BLACKTAB);                  //Init ST7735S初期化
  
  tft.fillScreen(ST77XX_BLACK);               //背景の塗りつぶし

  //テキスト表示
  tft.setRotation(3);                         //画面回転
  tft.setTextSize(3);                         //サイズ

  tft.setCursor(0, 20);                      //カーソル位置                      
  tft.setTextColor(ST77XX_RED);              //赤
  tft.printf("TAMANEGI\n");

  tft.setTextColor(ST77XX_GREEN);            //緑
  tft.printf("TAMANEGI\n");

  tft.setTextColor(ST77XX_BLUE);             //青
  tft.printf("TAMANEGI\n");

  tft.setTextColor(ST77XX_YELLOW);           //黄
  tft.printf("TAMANEGI\n");
}

void loop()
{
}
結果

ST7735のサンプルスケッチが動作しました。

WS2812

説明

1秒ごとに、LEDの色を変化させます。
赤->緑->黄->青->紫->水->白

スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【スケッチの説明】
M5Stamp Pico Mate の実装WS2812を制御します。

WS2812を点灯させます。
1秒間隔で、赤->緑->黄->青->紫->水->白 の順で点灯させます。

【ライブラリ】
Adafruit NeoPixel by Adafruit 1.10.6

【準備】


【バージョン情報】
2022/8/9 : 新規
2022/10/23 : YD-RP2040 実装WS2812 のサンプルプログラムを GP27にピン番号を変更
**********************************************************************/

#include <Adafruit_NeoPixel.h>

#define DIN_PIN 27            // NeoPixel の出力ピン番号はGP27
#define LED_COUNT 1           // LEDの連結数
#define WAIT_MS 1000          // 次の点灯までのウエイト
#define BRIGHTNESS 128        // 輝度
Adafruit_NeoPixel pixels(LED_COUNT, DIN_PIN, NEO_GRB + NEO_KHZ800);

void setup()
{
  pixels.begin();             //NeoPixel制御開始
}

void loop()
{
  pixels.clear();
  
  //pixels.Color(Red, Green, Blue)で、パレット情報を作成する。
  //赤点灯
  pixels.setPixelColor(0, pixels.Color(BRIGHTNESS, 0, 0));
  pixels.show();
  delay(WAIT_MS);

  //緑点灯
  pixels.setPixelColor(0, pixels.Color(0, BRIGHTNESS, 0));
  pixels.show();
  delay(WAIT_MS);

  //赤 + 緑 で 黄点灯
  pixels.setPixelColor(0, pixels.Color(BRIGHTNESS, BRIGHTNESS, 0));
  pixels.show();
  delay(WAIT_MS);

  //青点灯
  pixels.setPixelColor(0, pixels.Color(0, 0, BRIGHTNESS));
  pixels.show();
  delay(WAIT_MS);

  //赤 + 青 で 紫点灯
  pixels.setPixelColor(0, pixels.Color(BRIGHTNESS, 0, BRIGHTNESS));
  pixels.show();
  delay(WAIT_MS);

  //緑 + 青 で 水点灯
  pixels.setPixelColor(0, pixels.Color(0, BRIGHTNESS, BRIGHTNESS));
  pixels.show();
  delay(WAIT_MS);

  //赤 + 緑 + 青 で 白点灯
  pixels.setPixelColor(0, pixels.Color(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS));
  pixels.show();
  delay(WAIT_MS);
}
結果

WS2812のサンプルスケッチが動作しました。
画像は7色中の赤点灯時の様子です。
上面カバーとシールで分かりにくいですが、隙間からの漏光で確認できます。

コメント

タイトルとURLをコピーしました