M5Stack用 I/O拡張ユニット2 U011-B

概要

ESP32内臓のADC性能はいろいろわかってきたので、外付けユニットのADC性能を確認してみたいと思います。今回は8個のADC入力が可能なI/O拡張ユニット2になります。

製品

M5Stack用 I/O拡張ユニット2(STM32F030)
STM32F030マイコンベースのM5Stack用I/O拡張ユニットです。I2C通信インターフェースを使用し、拡張I/Oを8基備えています。各I/Oはそれぞれ独立したデジタルI/OやADC、サーボ制御、RGB LED制御モードの設定に対応し...

上記の製品になります。

もともとはPCA9554PWを搭載したものがありましたが、利用しているチップをSTM32F030に変更したものがU011-BのI/O拡張ユニット2になります。

内部的にはSTM32F030とI2Cで通信をして、GPIOを操作しているユニットとなります。

GPIOは8ピンあります。

上部に5VとGNDも合わせて10ピンが出ています。

裏側はシンプルです。コネクタは赤いのでI2Cになります。

動作確認

#include "M5_EXTIO2.h"

M5_EXTIO2 extio;

void setup() {
  Serial.begin(115200);
  while (!extio.begin(&Wire, 26, 32, 0x45)) {
    Serial.println("extio Connect Error");
    delay(100);
  }
  extio.setAllPinMode(ADC_INPUT_MODE);
}

void loop() {
  for (uint8_t i = 0; i < 8; i++) {
    uint16_t adc = extio.getAnalogInput(i, _12bit);
    Serial.printf("CH:%d ADC: %d\n", i, adc);
  }
  delay(1000);
}

ATOM Liteを接続していますのでGroveのピンである26、32に変更してあります。これで8ピンのADCユニットとして利用可能でした。

SCPIへの組み込み

ADCの特性を測定したいので簡単ですがSCPI制御で取れるようにしました。

  // Analog In(IO2 RAW)
  scpi.RegisterCommand("ARIOIn#?",
                       [](SCPI_C commands, SCPI_P parameters, Stream& interface) {
                         int GpioPin = -1;
                         String command = String(commands.Last());
                         command.toUpperCase();
                         sscanf(command.c_str(), "%*[ARIOIN]%u?", &GpioPin);
                         interface.println(extio.getAnalogInput(GpioPin, _12bit));
                       });

初期化したあとに上記のコマンドをとりあえず割り当てました。

ADC検証

ほぼ一致しています。STM32F030すごいな、、、

入力電圧測定値ADC値
057
100101126
200204254
300301374
400404502
500500621
600601746
700702872
800802996
9009001,118
1,0001,0001,242
1,1001,1001,366
1,2001,1991,489
1,3001,2991,613
1,4001,4001,738
1,5001,4981,860
1,6001,5991,985
1,7001,6992,109
1,8001,7992,233
1,9001,8982,356
2,0001,9982,481
2,1002,1002,607
2,2002,1972,727
2,3002,2952,849
2,4002,3952,973
2,5002,4953,097
2,6002,5953,222
2,7002,6963,347
2,8002,7953,470
2,9002,8933,591
3,0002,9973,720
3,1003,0953,842
3,2003,1943,965
3,3003,2924,087

実際のデータです。きれいなデータですね。ESP32に慣れているとびっくりです。

ADC値のばらつき確認

1Vに対して平均を取らないで千個取得したものです。ESP32と比べて分散が少ないですね。ただし千個取得するのに16秒かかっています。ESP32内蔵ADCだと3.1秒だったので5倍ぐらい遅くなっています。I2C経由で取得するのでしかたないですね。

精度は高くなりましたが、ESP32側での平均処理がしにくいです。内臓と比べてI2Cだと通信速度が遅いので複数回取得するよりは生のデータをそのままつかったほうが良さそうですね。

ちなみに2Vのときの分布であまり変化していません。若干電圧が減っていますが配線の問題かもしれません。

3V入力です。あまり変わりませんね。

まとめ

ESP32内蔵ADCと比べると非常に優秀でした。ポテンションメーターなどの可変抵抗を8個並べてデータ入力する用途とかだと便利そうですね。

  • デジタルI/O
  • ADC入力
  • サーボ制御(PWM)
  • RGB LED制御

ただこのユニットは上記の4種類のGPIOに対応していますので、単純なGPIOや複数のサーボを制御する用途などの方が用途としては多いかもしれません。

コメント