M5Stackでは、35番、36番ピンをアナログ入力として使用できますが、これらの読み取り値が不安定なのが気になっています。
先日調査したとおり、M5Stackの3V系電源は、スケッチに「M5.begin()」を追加すると、結構大きなノイズが乗ってしまうのですが、これが原因でアナログ信号が不安定になっているのではないか?と考えています。
今回は、「M5Stack用ADCユニット」を使って、安定したアナログ信号を読み取ることができないか、調査します。
実験のために、以下のような回路を組みました。
M5Stackから取り出した「3V3」と「G」から、可変抵抗で任意の電圧を作り、それをM5Stackの「36」と、ADCユニットの「+」につなぎます。
M5Stackの「G」は、ADCユニットの「-」にもつなぎます。
ADCユニットのGroveポートは、M5StackのGroveポートAにつなぎます。
スケッチは以下のとおりです。
M5Stackの3V系電源に、通常使用時と同様のノイズが乗るよう、「M5.begin()」を追加しています。
あとは、ADCユニットで取り込んだアナログ値(I2C)と、36番ピンから取り込んだアナログ値(analogRead)を、一定時間毎にシリアルポートに出力しているだけです。
両者の値を大まかに揃えるために、ADCユニットで取り込んだアナログ値は2で割っています。
#include <M5Stack.h> #include <Wire.h> #include "ADS1100.h" ADS1100 ads; void setup() { M5.begin(); Serial.begin(115200); dacWrite(25, 0); //disable the speak noise ads.getAddr_ADS1100(ADS1100_DEFAULT_ADDRESS); // 0x48, 1001 000 (ADDR = GND) ads.setGain(GAIN_ONE); // 1x gain(default) ads.setMode(MODE_CONTIN); // Continuous conversion mode (default) ads.setRate(RATE_8); // 8SPS (default) ads.setOSMode(OSMODE_SINGLE); // Set to start a single-conversion ads.begin(); pinMode(36, INPUT); } void loop() { int8_t address = ads.ads_i2cAddress; Wire.beginTransmission(address); byte error = Wire.endTransmission(); if (error == 0) { int16_t result = ads.Measure_Differential(); Serial.print(result/2); Serial.print(","); Serial.println(analogRead(36)); } delay(100); }
読み込んだ値をシリアルプロッタに表示させました。
青がADCユニットで読み込んだ値、赤が36番ピンからanalogReadで読み込んだ値です。
ときどき可変抵抗のつまみを動かして、アナログ値を変更させています。
36番ピンには結構なノイズが乗っていますが、ADCユニットからは安定したアナログ値を読み取ることができています。
安定したアナログ信号が必要な用途には、このADCユニットは有用だと思います。
なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。
ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。
このサイトで書いている、M5Stackシリーズ(M5Stack、M5StickCなど)に関するブログ記事を、「さとやまノート」という別のブログページに、あらためて整理してまとめました。
他のM5Stackシリーズの記事にも興味のある方は「さとやまノート」をご覧ください。