01.M5Stack Basic単体でAD5ch
01.M5Stack Basic単体でAD5ch
ESP32のADC
ESP32でADCは18chありますが、M5Stack Basicのケースまでにpinが出ているのは、G2/25-26/35-36の5chです。AD/DA | G | 使用 | 記事 |
---|---|---|---|
ADC2_1 | 0 | 内部M-BUS-1 | PU |
ADC2_2 | 2 | pin横 | PD |
ADC2_0 | 4 | (TF Cardで使用) | PD |
ADC2_5 | 12 | 内部M-BUS-0 | PD |
ADC2_4 | 13 | 内部M-BUS-1 | IN P可 |
ADC2_6 | 14 | (LCD Driverで使用) | IN P可 |
ADC2_3 | 15 | 内部M-BUS-0 | PU |
ADC2_8 | 25 | pin横(Speakerで使用) | P可 |
ADC2_9 | 26 | pin横 | P可 |
ADC2_7 | 27 | (LCD Driverで使用) | IN P可 |
ADC1_4 | 32 | (LCD Driverで使用) | P可 |
ADC1_5 | 33 | (LCD Driverで使用) | P可 |
ADC1_6 | 34 | 内部M-BUS-1 | IN P不可 |
ADC1_7 | 35 | pin横 | IN P不可 |
ADC1_0 | 36 | pin横 | IN P不可 |
ADC1_1 | 37 | (ボタンCで使用) | IN P不可 |
ADC1_2 | 38 | (ボタンBで使用) | IN P不可 |
ADC1_3 | 39 | (ボタンAで使用) | IN P不可 |
DAC1 | 25 | ADC2_8と同pin | |
DAC2 | 26 | ADC2_9と同pin |
* Wi-Fiなどの無線使用時はADC2が利用できなく、利用すると再起動が必要らしいです。
* GPIO25は、M5回路図 https://github.com/m5stack/M5-Schematic/blob/master/Core/Basic/M5-Core-Schematic(20171206).pdf の6頁目より0.1uFを介してNS4148(3Wモノオーディオアンプ)の入力端子に接続されています。
ADC-V特性
https://qiita.com/tomorrow56/items/a2e0c9c03a9b0d057e10 に、M5StackのADC-V特性グラフが出ています。0.11VでAD=0となり、それ以下が測定できません。また、2.7V以上で線形でなくなっています。さらに3.2V以上で急に跳ね上がっています。グラフとスケッチ例より、(電圧値,AD値)は、(0.11,0), (1.0,1084), (2.0,2303), (2.7,3179), (3.0,3659), (3.2,4071), (3.3,4095)の点を通っている事がわかります。ここで、2点(AD1,V1),(AD2,V2)を通る直線式は、
(V-V1)/(AD-AD1)=(V2-V1)/(AD2-AD1)より
V=(V2-V1)(AD-AD1)/(AD2-AD1)+V1
となり、区間分けをして直線にみなせば、以下の式となります。
- 下の式ではAD=0でもV=0.11となってしまうので、ADが9以下ならV=0とします。
- (0.11,0)-(1.0,1084)の区間は、
V=(1.0-0.11)(AD-0)/(1084-0)+0.11
=0.89xAD/1084+0.11
=3.362/4095xAD+0.110 - (1.0,1084)-(2.0,2303)の区間は、
V=(2.0-1.0)(AD-1084)/(2303-1084)+1.0
=(AD-1084)/1219+1.0
=3.359/4095xAD+0.111 - (2.0,2303)-(2.7,3179)の区間は、
V=(2.7-2.0)(AD-2303)/(3179-2303)+2.0
=0.7x(AD-2303)/876+2.0
=3.272/4095xAD+0.160 - (2.7,3179)-(3.0,3659)の区間は、
V=(3.0-2.7)(AD-3179)/(3659-3179)+2.7
=0.3x(AD-3179)/480+2.7
=2.559/4095xAD+0.713 - (3.0,3659)-(3.2,4071)の区間は、
V=(3.2-3.0)(AD-3659)/(4071-3659)+3.0
=0.2x(AD-3659)/412+3.0
=1.988/4095xAD+1.224 - (3.2,4071)-(3.3,4095)の区間は、
V=(3.3-3.2)(AD-4071)/(4095-4071)+3.2
=0.1x(AD-4071)/24+3.2
=17.063/4095xAD-13.763 - 補正無しは、V=3.3/4095xAD+0
測定回路
3.3VとGND間に10kΩ±1%(茶黒黒赤 茶)の抵抗を6本直列接続し、その中間点(30kΩ点)を測定します。測定点とGND間には0.1uF(104)のコンデンサを接続します。ch | pin | 線色 |
---|---|---|
1 | 36 | 青 |
2 | 35 | 赤 |
3 | 26 | 橙 |
4 | 25 | 黄 |
5 | 2 | 緑 |
- | 3.3V | 白 |
- | GND | 黒 |
測定値
入力端子は、測定時以外はGNDに接続し、1入力ずつ測定点に接続しました。電圧値の1mVの位の値はふらふらしています。C1がopenの時は、10mVの位の値もふらふらしていました。補正式無し
ch | 電圧(V) | AD値 |
---|---|---|
1 | 1.521 | 1888 |
2 | 1.520 | 1886 |
3 | 1.534 | 1904 |
4 | 1.669 | 1902 |
5 | 1.534 | 1903 |
補正式有り
ch | 電圧(V) | AD値 |
---|---|---|
1 | 1.655 | 1883 |
2 | 1.658 | 1886 |
3 | 1.668 | 1898 |
4 | 1.669 | 1899 |
5 | 1.672 | 1903 |
結果
補正式により理論値に近い値が表示されました(1点ですが)。ch4の25pinはオーディオアンプICの入力に接続されているので、線を伸ばしてopenの場合はカチカチと音がします。また、3.3Vに接続した時は小さな音がします。無線(wifiとBluetooth)接続をせずに、スピーカも使用しない時、M5Stack Basicで5chのアナログ入力が出来そうです。参考
M5Stack用ADCユニット
- https://www.switch-science.com/catalog/5221/
- 16bit, 12V, 1ch, I2C
- ADS1100(TI)使用(アドレス変更はIC交換)
- 726円
M5Stack用電圧計ユニット
- https://www.switch-science.com/catalog/6740/
- 16bit, ±36V, 1ch, 絶縁5kV, 0.1%FS(個別校正済), I2C アドレス固定
- ADS1115(TI)使用
- 1,397円
回路図
回路図エディタは、BSch3V Ver.0.83.05 (2021/4/30)https://www.suigyodo.com/online/schsoft.htm#UPDATEFILES
を使用しました。パッケージ160504版をダウンロードし、アップデート版(0.53.5)を上書きします。bsch3v.exeを実行するだけで、インストールは不要です。マニュアルは、
https://www.suigyodo.com/online/manual/bsch3v/index.htm
にあります。
スケッチ
#include <M5Stack.h>
int chpin[5] = {36, 35, 26, 25, 2}; // ch1~5のpin番号
int AD[5] = {0, 0, 0, 0, 0}; // AD読取初期値
int ADmax = 4095; // ADの最大値 12bit 2^12-1
float V[5] = {0, 0, 0, 0, 0}; // 電圧算出初期値(V)
float Vmax = 3.3; // 電圧最大値 3300mV/4095=0.8mVきざみ
int i; // chのループ用
void setup() {
M5.begin(); //シリアルクリア,115200bps,LCD初期化,電源管理の初期化
delay(500); // 0.5秒待つ
M5.Lcd.setTextColor(WHITE); // 文字色
M5.Lcd.setTextSize(3); // 文字サイズ(1-7)
for (i = 0; i < 5; i++) { // ch1-5
pinMode(chpin[i], ANALOG); // アナログpinとする
}
}
void loop() {
M5.Lcd.fillScreen(BLACK); // 画面を塗りつぶす
for (i = 0; i < 5; i++) { // ch1~5
AD[i] = analogRead(chpin[i]); // アナログ入力
if (AD[i] < 10) { // 0.11V以下で0V近辺より
V[i] = 0.0;
} else if (AD[i] <= 1084) { // 1V以下の場合
V[i] = float(AD[i]) * 0.89 / 1084.0 + 0.11;//電圧に変換
} else if (AD[i] <= 2303) { // 2V以下の場合
V[i] = float(AD[i] - 1084) / 1219.0 + 1.0;
} else if (AD[i] <= 3179) { // 2.7V以下の場合
V[i] = float(AD[i] - 2303) * 0.7 / 876.0 + 2.0;
} else if (AD[i] <= 3659) { // 3V以下の場合
V[i] = float(AD[i] - 3179) * 0.3 / 480.0 + 2.7;
} else if (AD[i] <= 4071) { // 3.2V以下の場合
V[i] = float(AD[i] - 3659) * 0.2 / 412.0 + 3.0;
} else { // 3.2Vを超える場合
V[i] = float(AD[i] - 4071) * 0.1 / 24.0 + 3.2;
}
//V[i] = float(AD[i]) / float(ADmax) * Vmax; // 補正無しの場合
M5.Lcd.setCursor(10, i * 40 + 20); // 表示位置
M5.Lcd.printf("V%1d=%5.3fV (%04d)", i + 1, V[i], AD[i]);//電圧,AD値表示
}
delay(3000); // 3秒待つ
}