先日、M5Stackの電源ノイズについて調査しました(記事は こちら)。
スケッチに「M5.begin」の記述を追加すると、3V系電源に結構大きなノイズが乗ってしまうというものです。
M5Stackを使う上では、「M5.begin」はほぼ必須なので、3V系電源のノイズは回避できないものと考えていました。
M5Stackでは、35番、36番ピンをアナログ入力として使用できますが、これらの読み取り値が不安定なのが以前から気になっており、この電源ノイズが原因ではないか?と考えています。
M5Stackのアナログ入力を色々と活用したいのですが、これはちょっと残念な状況です。
と、一旦は諦めていたのですが、色々と調べているうちに、「M5.begin」には引数を指定できることを知りました。
M5Stackのドキュメント(こちら)に、以下のように記載されています。
「M5.begin」には4つの引数を設定でき、それぞれLCD、microSDカード、シリアルポート、I2Cの有効/無効を制御できるとのことです。
早速、これらの引数を変更して、電源ノイズを調査してみます。
M5.begin()なし
M5Stackにスケッチを書き込んだ上で、オシロスコープ「DSO Quad」を以下のように接続して、「3V3」-「G」間の電源ノイズを測定します。
まずは以下のとおり、「M5.begin」のないスケッチです。
#include <M5Stack.h>
void setup() {
}
void loop() {
}
結果は以下のとおりで、ノイズは30〜40mV程度です。
M5.begin()
次に、setupに「M5.begin()」だけを追加しました。
#include <M5Stack.h>
void setup() {
M5.begin();
}
void loop() {
}
結果は以下のとおりで、ノイズは120mV程度まで増大してしまいました。ここまでが、前回の調査内容です。
M5.begin(false, false, false, false)
次に、「M5.begin」の引数を全て「false」に変更しました。
#include <M5Stack.h>
void setup() {
M5.begin(false, false, false, false);
}
void loop() {
}
すると、ノイズは30〜40mV程度に戻りました。
M5.begin(true, false, false, false)
全ての引数を「false」にすると、ノイズを軽減できたので、次はひとつずつ「true」にしていって、ノイズを増大させている原因を特定します。
まずはひとつめ(LCD)のみ「true」にします。
#include <M5Stack.h>
void setup() {
M5.begin(true, false, false, false);
}
void loop() {
}
結果は以下のとおりで、ノイズはふたたび120mV程度まで増大してしまいました。
M5.begin(false, true, true, true)
LCDの制御が原因であることがわかったので、今度は逆に、LCD以外の全ての引数を「true」にしてみました。
#include <M5Stack.h>
void setup() {
M5.begin(false, true, true, true);
}
void loop() {
}
結果は以下のとおりで、ノイズは30〜40mV程度に抑えることができました。
つまり、LCDの表示機能さえ諦めれば、電源ノイズを抑えた状態でM5Stackを使用できることがわかりました。
効果確認
では、この状態で、アナログ入力信号がどのようになるか確認してみます。
「3V3」-「G」間に可変抵抗を接続し、その中間電位を「36」番につなぎます。
その状態で、以下のようなスケッチをM5Stackに書き込みます。
#include <M5Stack.h>
void setup() {
M5.begin(true, true, true, true);
Serial.begin(115200);
dacWrite(25, 0);
pinMode(36, INPUT);
}
void loop() {
Serial.println(analogRead(36));
delay(100);
}
シリアルプロッタで表示してみます。
次に、「M5.begin」のひとつめの引数を「false」に変更してみます。
#include <M5Stack.h>
void setup() {
M5.begin(false, true, true, true);
Serial.begin(115200);
dacWrite(25, 0);
pinMode(36, INPUT);
}
void loop() {
Serial.println(analogRead(36));
delay(100);
}
結果は以下のようになりました。
LCDを「true」にしている時には60程度だった振幅が、「false」にすることで、20程度まで低減できました。
M5StackでLCDを使わないのはもったいない気もしますが、これでアナログ入力を活用できるようになるかもしれません。
なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。
ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。