M5Stackの電源ノイズについて調査する(2)


先日、M5Stackの電源ノイズについて調査しました(記事は こちら)。

スケッチに「M5.begin」の記述を追加すると、3V系電源に結構大きなノイズが乗ってしまうというものです。
M5Stackを使う上では、「M5.begin」はほぼ必須なので、3V系電源のノイズは回避できないものと考えていました。

M5Stackでは、35番、36番ピンをアナログ入力として使用できますが、これらの読み取り値が不安定なのが以前から気になっており、この電源ノイズが原因ではないか?と考えています。
M5Stackのアナログ入力を色々と活用したいのですが、これはちょっと残念な状況です。

と、一旦は諦めていたのですが、色々と調べているうちに、「M5.begin」には引数を指定できることを知りました。

M5Stackのドキュメント(こちら)に、以下のように記載されています。

「M5.begin」には4つの引数を設定でき、それぞれLCD、microSDカード、シリアルポート、I2Cの有効/無効を制御できるとのことです。

早速、これらの引数を変更して、電源ノイズを調査してみます。

M5Stackにスケッチを書き込んだ上で、オシロスコープ「DSO Quad」を以下のように接続して、「3V3」-「G」間のノイズを測定します。


まずは以下のとおり、「M5.begin」のないスケッチです。

#include <M5Stack.h>

void setup() {
}

void loop() {
}

結果は以下のとおりで、ノイズは30〜40mV程度です。

次に、setupに「M5.begin()」だけを追加しました。

#include <M5Stack.h>

void setup() {
  M5.begin();
}

void loop() {
}

結果は以下のとおりで、ノイズは120mV程度まで増大してしまいました。ここまでが、前回の調査内容です。

次に、「M5.begin」の引数を全て「false」に変更しました。

#include <M5Stack.h>

void setup() {
  M5.begin(false, false, false, false);
}

void loop() {
}

すると、ノイズは30〜40mV程度に戻りました。

全ての引数を「false」にすると、ノイズを軽減できたので、次はひとつずつ「true」にしていって、ノイズを増大させている原因を特定します。
まずはひとつめ(LCD)のみ「true」にします。

#include <M5Stack.h>

void setup() {
  M5.begin(true, false, false, false);
}

void loop() {
}

結果は以下のとおりで、ノイズはふたたび120mV程度まで増大してしまいました。

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の使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。


このサイトで書いている、M5Stackシリーズ(M5Stack、M5StickCなど)に関するブログ記事を、「さとやまノート」という別のブログページに、あらためて整理してまとめました。

他のM5Stackシリーズの記事にも興味のある方は「さとやまノート」をご覧ください。