01.M5Stack Basic単体でAD5ch


01.M5Stack Basic単体でAD5ch

ESP32のADC

ESP32でADCは18chありますが、M5Stack Basicのケースまでにpinが出ているのは、G2/25-26/35-36の5chです。
AD/DAG使用記事
ADC2_10内部M-BUS-1PU
ADC2_22pin横PD
ADC2_04(TF Cardで使用)PD
ADC2_512内部M-BUS-0PD
ADC2_413内部M-BUS-1IN P可
ADC2_614(LCD Driverで使用)IN P可
ADC2_315内部M-BUS-0PU
ADC2_825pin横(Speakerで使用)P可
ADC2_926pin横P可
ADC2_727(LCD Driverで使用)IN P可
ADC1_432(LCD Driverで使用)P可
ADC1_533(LCD Driverで使用)P可
ADC1_634内部M-BUS-1IN P不可
ADC1_735pin横IN P不可
ADC1_036pin横IN P不可
ADC1_137(ボタンCで使用)IN P不可
ADC1_238(ボタンBで使用)IN P不可
ADC1_339(ボタンAで使用)IN P不可
DAC125ADC2_8と同pin
DAC226ADC2_9と同pin
* 表内で、IN=INPUT用, P可=PULL可, P不可=PULL不可, PU=PULLUP, PD=PULLDOWN とします。
* 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)のコンデンサを接続します。
chpin線色
136
235
326
425
52
3.3V
GND

測定値

入力端子は、測定時以外はGNDに接続し、1入力ずつ測定点に接続しました。電圧値の1mVの位の値はふらふらしています。C1がopenの時は、10mVの位の値もふらふらしていました。
補正式無し
ch電圧(V)AD値
11.5211888
21.5201886
31.5341904
41.6691902
51.5341903

補正式有り
ch電圧(V)AD値
11.6551883
21.6581886
31.6681898
41.6691899
51.6721903
理論上はV=3.3/2=1.65Vです。

結果

補正式により理論値に近い値が表示されました(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秒待つ
}