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/DA | G | 使用 |
ADC2_1 | 0 | USBで使用? |
ADC2_2 | 2 | (内部) |
ADC2_0 | 4 | (内部) |
ADC2_5 | 12 | (IRで使用) |
ADC2_4 | 13 | (内部) |
ADC2_6 | 14 | (内部) |
ADC2_3 | 15 | (内部) |
ADC2_8 | 25 | 裏右pin |
ADC2_9 | 26 | GROVE(3種) |
ADC2_7 | 27 | (RGB-LEDで使用) |
ADC1_4 | 32 | GROVE(3種) |
ADC1_5 | 33 | 裏左pin |
ADC1_6 | 34 | G23と100Ωで接続 |
ADC1_7 | 35 | (内部) |
ADC1_0 | 36 | (内部) |
ADC1_1 | 37 | (内部) |
ADC1_2 | 38 | (内部) |
ADC1_3 | 39 | (ボタンで使用) |
DAC1 | 25 | ADC2で同じpin |
DAC2 | 26 | ADC2と同じpin |
ピン配列
ATOM Liteを正面から見ると以下のピン配列になっています。
| | 3.3 | 3.3 |
| 21 | 22 | |
ch1 | 25 | 19 | |
| 5V | 23 | ch5 |
G | G | 33 | ch4 |
| 32 | 26 | 5V | G | |
ch2 | ch3 | | |
ここで実験のchと線色を以下の様に決めました。
ch | pin | 線色 |
1 | 25 | 青 |
2 | 32 | 赤 |
3 | 26 | 橙 |
4 | 33 | 黄 |
5 | 23 | 緑 |
- | 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秒待つ
}