概要
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や複数のサーボを制御する用途などの方が用途としては多いかもしれません。
コメント