概要
ESP32内臓のADC性能はいろいろわかってきたので、外付けユニットのADC性能を確認してみたいと思います。今回は8個のADC入力が可能なI/O拡張ユニット2になります。
製品
上記の製品になります。
もともとは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値 |
|---|---|---|
| 0 | 5 | 7 |
| 100 | 101 | 126 |
| 200 | 204 | 254 |
| 300 | 301 | 374 |
| 400 | 404 | 502 |
| 500 | 500 | 621 |
| 600 | 601 | 746 |
| 700 | 702 | 872 |
| 800 | 802 | 996 |
| 900 | 900 | 1,118 |
| 1,000 | 1,000 | 1,242 |
| 1,100 | 1,100 | 1,366 |
| 1,200 | 1,199 | 1,489 |
| 1,300 | 1,299 | 1,613 |
| 1,400 | 1,400 | 1,738 |
| 1,500 | 1,498 | 1,860 |
| 1,600 | 1,599 | 1,985 |
| 1,700 | 1,699 | 2,109 |
| 1,800 | 1,799 | 2,233 |
| 1,900 | 1,898 | 2,356 |
| 2,000 | 1,998 | 2,481 |
| 2,100 | 2,100 | 2,607 |
| 2,200 | 2,197 | 2,727 |
| 2,300 | 2,295 | 2,849 |
| 2,400 | 2,395 | 2,973 |
| 2,500 | 2,495 | 3,097 |
| 2,600 | 2,595 | 3,222 |
| 2,700 | 2,696 | 3,347 |
| 2,800 | 2,795 | 3,470 |
| 2,900 | 2,893 | 3,591 |
| 3,000 | 2,997 | 3,720 |
| 3,100 | 3,095 | 3,842 |
| 3,200 | 3,194 | 3,965 |
| 3,300 | 3,292 | 4,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や複数のサーボを制御する用途などの方が用途としては多いかもしれません。





コメント