M5Stamp C3 vs M5Stamp Pico

M5Stamp C3

M5Stamp Pico

ほぼ同時期にリリースされコンセプトも似ているので、PicoはC3からシリアル通信部分を抜いただけの物と最初思っていたのですが、しっかりスペック確認すると似て非なる物でした。M5系初心者の素人です

 コアメモリー
M5Stamp PicoESP32-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の方が早く四則演算するとC3が圧倒的みたいです。

簡単なスケッチで測定してみても

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

PicoはI2Cなどの基本配置がシールなどに印刷されていますが、C3には書かれていません。一体この違いは何なのでしょう?

各々のピン定義自体には書かれておりこれを使えと言うことなんでしょうけど、データーシート上はPicoもC3もどちらもハード的にはSPI等の割り当てを使っていないようで、IOをソフト的に使っているだけのようです。速度的にどんな物なのでしょうか。通常使用している分には問題は出ないと思うのですが、I2CでLCDなどの表示する際にソフト的なI2Cで明らかな遅延が発生するケースも過去にSEEED XIAOで経験しているため少し気になります。時間があればテストしてみたいと思います。

Pico の 定義

#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 の 定義

#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 の違いをまとめてみました

電子工作

Posted by akiba