複数のアナログセンサで採取したデータを、M5Stackのひとつのアナログ入力端子で読み込みたい事案がありました。
M5Stack Basic V2.7(Yahoo!ショッピング)制御信号などのない単純なアナログセンサを、有効にしたり無効にしたりできる良い方法がないか考えていたところ、「pinMode」関数で「OUTPUT_OPEN_DRAIN」というモードを指定できることを知りました。
これは、端子をバスラインにつなぐ時などに使用する設定のようで、「LOW」のときにはGND電位(0V)を出力しますが、「HIGH」のときにはハイインピーダンス状態(Hi-Z、フローティング)となります。
これをうまく使えば、複数のアナログセンサからひとつだけを選択し、その採取値を読み込むことができそうなので、早速試してみることにしました。
3つの光センサ(CDSセル)を使って試してみます。
このように3つの光センサとM5Stackをつなぎます。
「WL0〜2」を「pinMode(OUTPUT_OPEN_DRAIN)」指定します。
「WL0〜2」をすべて「HIGH」にすると、「WL0〜2」すべてがフローティングになりますので、光センサは全て無効になり、「AIN」はプルアップにより電源電圧になります。
例えば「WL1」のみを「LOW」にすると、「WL1」の光センサ(Cds1)だけが有効になり、「AIN」はCds1の抵抗値(=明るさ)に応じた電圧になります。
このように、「WL0〜2」のいずれか1本のみを「LOW」にすることで、3つの光センサの採取データをM5Stackで読み込むことができます。
作成したスケッチはこちらです。
#include <M5Stack.h>
const int AIN = 35;
const int WL[3] = {16, 17, 5};
void setup() {
M5.begin();
pinMode(AIN, INPUT);
for(int r=0; r<3; r++) {
pinMode(WL[r], OUTPUT_OPEN_DRAIN);
digitalWrite(WL[r], HIGH);
}
}
void loop() {
M5.update();
if(M5.BtnA.wasPressed()) {
M5.Lcd.fillRect(10, 220, 300, 20, BLACK);
M5.Lcd.fillRect(10, 220, 100, 20, RED);
digitalWrite(WL[0], LOW);
digitalWrite(WL[1], HIGH);
digitalWrite(WL[2], HIGH);
}
if(M5.BtnB.wasPressed()) {
M5.Lcd.fillRect(10, 220, 300, 20, BLACK);
M5.Lcd.fillRect(110, 220, 100, 20, RED);
digitalWrite(WL[0], HIGH);
digitalWrite(WL[1], LOW);
digitalWrite(WL[2], HIGH);
}
if(M5.BtnC.wasPressed()) {
M5.Lcd.fillRect(10, 220, 300, 20, BLACK);
M5.Lcd.fillRect(210, 220, 100, 20, RED);
digitalWrite(WL[0], HIGH);
digitalWrite(WL[1], HIGH);
digitalWrite(WL[2], LOW);
}
M5.Lcd.fillCircle(160, 110, 60, M5.Lcd.color565((int)(255-analogRead(AIN)/16), 0, 0));
}
「WL0〜2」は「pinMode(OUTPUT_OPEN_DRAIN)」指定し、初期状態では3ピンとも「HIGH」にします。
「ボタンA」「ボタンB」「ボタンC」を押すと、それぞれ「WL0」「WL1」「WL2」のみが「LOW」、その他の端子は「HIGH」になります。
採取したアナログ値によって、色を変化させて円を描画します(色をなめらかに変化させる方法についての記事は こちら)。
結果はこちらです。
初期状態ではセンサに無反応、ボタンAを押すと一番上のセンサのみに反応して表示が変わります。
ボタンB、ボタンCを押した時も同様です。
なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。
ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。
M5Stack Basic V2.7(Yahoo!ショッピング)