M5Stamp C3 vs M5Stamp Pico
M5Stamp C3
M5Stamp Pico
ほぼ同時期にリリースされコンセプトも似ているので、PicoはC3からシリアル通信部分を抜いただけの物と最初思っていたのですが、しっかりスペック確認すると似て非なる物でした。M5系初心者の素人です。
コア | メモリー | |
M5Stamp Pico | ESP32-PICO-D4 : 240 MHz デュアルコア データーシート (英語版:なぜかスィッチサイエンスさんのHPからは中文にリンク) | 520 KB SRAM、4 MBフラッシュメモリ |
M5Stamp C3 |
ESP32-C3:32 bit RISC-V シングルコアプロセッサ(動作周波数160 MHz) | 384 KB ROM、400 KB SRAM、8 KB RTC SRAM、4 MBフラッシュ |
まずコア(CPU)が違っていました。スペック的には小型なPicoの方が性能良さそうです。ベンチマーク簡単に取ってみました。
ArduinoBenchmarkAllPlatforms https://github.com/ChrisMicro/ArduinoBenchmarkAllPlatforms
こちら使用してLEDは各々のLEDポートを指定。点灯しませんけどIOのテストだけなら問題ないでしょう。
PICO ベンチマーク
digitalWrite speed benchmark
=============================
number of tries: 100000 duration [us]: 12685 ==> speed [megaSamples/second] : 7.88
analogRead speed benchmark
=============================
number of tries: 100000 duration [us]: 6009333 ==> speed [kiloSamples/second] : 16.64
4th order float IIR speed benchmark
===================================
total number of samples: 15000 duration [us]: 4 ==> speed [kiloSamples/second] : 3750.00
Loops: 1000, Iterations: 1, Duration: 278 ms.
C Converted Single Precision Whetstones: 359.71 MIPS
C3 ベンチマーク
digitalWrite speed benchmark
=============================
number of tries: 100000 duration [us]: 33742 ==> speed [megaSamples/second] : 2.96
analogRead speed benchmark
=============================
number of tries: 100000 duration [us]: 4938376 ==> speed [kiloSamples/second] : 20.25
4th order float IIR speed benchmark
===================================
total number of samples: 15000 duration [us]: 183 ==> speed [kiloSamples/second] : 81.97
Loops;はエラーが出ており参考値 同じスケッチでやってますので、OS部分が違うわけです。
Loops: 1000, Iterations: 1, Duration: 8661 ms.
C Converted Single Precision Whetstones: 11.55 MIPS
E (23914) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
E (23914) task_wdt: – IDLE (CPU 0)
E (23914) task_wdt: Tasks currently running:
E (23914) task_wdt: CPU 0: loopTask
デジタルピンとしての入出力はPICOの方が早くアナログpinの性能はC3 四則演算するとC3 四則演算性能もPICOの方が優秀です。2022/11/29訂正。
簡単なスケッチで測定してみても
void setup() {
long t;
Serial.begin(115200);
Serial.println(“Sirial Bigin");
Serial.println(micros());//起動時間測定用
for (long i=0;i<60000;i++){
t++;
}
Serial.println(t);
Serial.println(micros());
}
void loop() {
delay(1);//これがないとC3が「Task watchdog got triggered. The following tasks did not reset the watchdog in time:」でエラー出します。ESP32系のOSでwatchdogタイマーが動く時間が足りなくなると出るようです。上のベンチマークでも高速でループ回るところでエラーだったと思います。
}
Pico 足し算ベンチマーク
6万回足し算
83 micro sec
起動時間
31330 micro sec
C3 足し算ベンチマーク
6万回足し算
2695 micro sec
起動時間
213001 micro sec
ます。
圧倒的にPicoの方が早いようです。実はなぜこんな測定してみたかというと、TCPで通信実験していたときに取りこぼすことがあったため実験してみました。過去にEtherNet+Arduinoで使えていた感じのデーターを取りこぼすため確認してみました。実際にはwifiの問題だったり、wifiの方がライブラリー的に複雑なためなのだと思いますが。
I/Oの数的に少ないため用途は限られますが、実装するときのことを考えるとより小型で高性能なPicoの方が良いかと考えてい
ピン配置
PicoはI2Cなどの基本配置がシールなどに印刷されていますが、C3には書かれていません。一体この違いは何なのでしょう?
各々のピン定義自体には書かれておりこれを使えと言うことなんでしょうけど、データーシート上はPicoもC3もどちらもハード的にはSPI等の割り当てを使っていないようで、IOをソフト的に使っているだけのようです。速度的にどんな物なのでしょうか。通常使用している分には問題は出ないと思うのですが、I2CでLCDなどの表示する際にソフト的なI2Cで明らかな遅延が発生するケースも過去にSEEED XIAOで経験しているため少し気になります。時間があればテストしてみたいと思います。
Pico の pin定義
#ifndef Pins_Arduino_h
#define Pins_Arduino_h#include <stdint.h>
#define EXTERNAL_NUM_INTERRUPTS 16
#define NUM_DIGITAL_PINS 40
#define NUM_ANALOG_INPUTS 16#define analogInputToDigitalPin(p) (((p)<20)?(esp32_adc2gpio[(p)]):-1)
#define digitalPinToInterrupt(p) (((p)<40)?(p):-1)
#define digitalPinHasPWM(p) (p < 34)
static const uint8_t TX = 1;
static const uint8_t RX = 3;static const uint8_t SDA = 21;
static const uint8_t SCL = 22;static const uint8_t G26 = 26;
static const uint8_t G36 = 36;
static const uint8_t G18 = 18;
static const uint8_t G19 = 19;
static const uint8_t G21 = 21;
static const uint8_t G22 = 22;
static const uint8_t G25 = 25;
static const uint8_t G1 = 1;
static const uint8_t G3 = 3;
static const uint8_t G0 = 0;static const uint8_t G32 = 32;
static const uint8_t G33 = 33;static const uint8_t SS = 19;
static const uint8_t MOSI = 26;
static const uint8_t MISO = 36;
static const uint8_t SCK = 18;#endif /* Pins_Arduino_h */
C3 の pin定義
#ifndef Pins_Arduino_h
#define Pins_Arduino_h
#include <stdint.h>
#define EXTERNAL_NUM_INTERRUPTS 22
#define NUM_DIGITAL_PINS 22
#define NUM_ANALOG_INPUTS 6
#define analogInputToDigitalPin(p) (((p)<NUM_ANALOG_INPUTS)?(esp32_adc2gpio[(p)]):-1)
#define digitalPinToInterrupt(p) (((p)<NUM_DIGITAL_PINS)?(p):-1)
#define digitalPinHasPWM(p) (p < EXTERNAL_NUM_INTERRUPTS)
static const uint8_t TX = 21;
static const uint8_t RX = 20;
static const uint8_t SDA = 8;
static const uint8_t SCL = 9;
static const uint8_t SS = 7;
static const uint8_t MOSI = 6;
static const uint8_t MISO = 5;
static const uint8_t SCK = 4;
static const uint8_t A0 = 0;
static const uint8_t A1 = 1;
static const uint8_t A2 = 2;
static const uint8_t A3 = 3;
static const uint8_t A4 = 4;
static const uint8_t A5 = 5;
#endif /* Pins_Arduino_h */
Picoの方が定義部分が一件多いのですが複数ピンを各々定義しているためですね。C3の方も再定義すればデジタル入出力としては全部使えるはずです
以上簡単に M5Stamp C3 と M5Stamp Pico の違いをまとめてみました
2022.11.19 追記
C3の方ではBluetooth classicが使えないようです。BluetoothSerial.h でコンパイルがとおりません。データーシート上もESP32-C3ではサポートされてません。