01.ATOM Lite単体でAD5ch


01.ATOM Lite単体でAD5ch

ADCピン

ATOM LiteのCPUは、ESP32­-PICO-­D4です。
(https://docs.m5stack.com/en/core/atom_lite)
ESP32でADCは18chありますが、ATOM Liteにpinが出ているのは、G25-26/32-34の5pinです。
AD/DAG使用
ADC2_10USBで使用?
ADC2_22(内部)
ADC2_04(内部)
ADC2_512(IRで使用)
ADC2_413(内部)
ADC2_614(内部)
ADC2_315(内部)
ADC2_825 裏右pin
ADC2_926 GROVE(3種)
ADC2_727 (RGB-LEDで使用)
ADC1_432GROVE(3種)
ADC1_533裏左pin
ADC1_634G23と100Ωで接続
ADC1_735(内部)
ADC1_036(内部)
ADC1_137(内部)
ADC1_238(内部)
ADC1_339(ボタンで使用)
DAC125ADC2で同じpin
DAC226ADC2と同じpin

ピン配列

ATOM Liteを正面から見ると以下のピン配列になっています。
3.33.3
2122
ch12519
5V23ch5
GG33ch4
32265VG
ch2ch3
ここで実験のchと線色を以下の様に決めました。
chpin線色
125
232
326
433
523
3.3V
GND
pinと無線以外の入力では、正面のボタンと左側面のリセットボタンが各1個あります。また、ホールセンサとタッチセンサがESP32に内蔵されています。出力は、RGB LEDと赤外線LEDが各1個あり、ブザーはありません。(ATOM Echoには、0.5Wスピーカ内蔵)したがって、測定結果をシリアルモニタに表示します。

回路図

「01.M5Stack Basic単体でAD5ch」と同じです。3.3VとGND間を10kΩ6直列で分圧し、その中間電圧を測定します。

ツールの設定

  • ボード:"M5Stack-ATOM"
  • Upload Speed:"1500000" (最高速)
  • Partition Scheme:"初期値"
  • Core Debug Level:"なし"
  • シリアル ポート:"COM□"

結果

上記より、5chのアナログ入力の測定が出来る様です。しかし、無線(wifiやBluetooth)を使用時は、ADC2(ここではG25とG26)が使えないそうです。

スケッチ

電圧補正式は、「01.M5Stack Basic単体でAD5ch」と同じです。

// ATOM Lite アナログ5ch入力
// ADC1_6のG34は、測定pinのG23と100Ωで接続
#include <M5Atom.h>           // ATOMを使用
int chpin[5] = {25, 32, 26, 33, 34}; // 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(true, false, true);//(LCD,PowerEnable=true,Serial)
  delay(500);                   // 0.5秒待つ
  pinMode(23, INPUT); // G34は測定pinG23と100Ωで接続のためopen
  for (i = 0; i < 5; i++) {     // ch1-5
    pinMode(chpin[i], ANALOG);  // アナログpinとする
  }
}
void loop() {
  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; // 補正無しの場合
    Serial.printf("%1d:%5.3fV(%04d) ", i + 1, V[i], AD[i]);//電圧,AD値表示
  }
  Serial.println("");
  delay(3000);  // 3秒待つ
}