M5Stackで多数(5本)のアナログ入力信号を扱う必要が生じました。
M5Stackの端子でアナログ入力に使えるのは35番、36番ピンのふたつだけで、しかも読み取り値がやや不安定です(記事は こちら)。
また、「M5Stack用ADCユニット」もありますが、これひとつで扱える入力信号は1本だけです。
そのため今回、8chのADコンバータ「MCP3008」をM5Stackにつないでみることにしました。
M5Stackと「MCP3008」の接続はSPIインタフェースです。
こちら の記事を参考にさせていただき、「MCP3004(MCP3008)用ライブラリ」もそのまま使わせていただきました。
両者の接続は以下のとおりです。
スケッチはこちらです。
3秒ごとに8つのアナログ信号を読み取り、その値をLCD画面に表示するだけのものです。
#include <M5Stack.h>
#include "MCP3004.h"
const int MCP3004_CS = 2;
MCP3004 mcp3004(MCP3004_CS);
void setup() {
M5.begin();
SPI.begin();
mcp3004.begin();
M5.Lcd.setTextSize(2);
}
void loop() {
int a0 = mcp3004.read(0);
int a1 = mcp3004.read(1);
int a2 = mcp3004.read(2);
int a3 = mcp3004.read(3);
int a4 = mcp3004.read(4);
int a5 = mcp3004.read(5);
int a6 = mcp3004.read(6);
int a7 = mcp3004.read(7);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(0, 0);
M5.Lcd.printf("[A0] %d\n", a0);
M5.Lcd.printf("[A1] %d\n", a1);
M5.Lcd.printf("[A2] %d\n", a2);
M5.Lcd.printf("[A3] %d\n", a3);
M5.Lcd.printf("[A4] %d\n", a4);
M5.Lcd.printf("[A5] %d\n", a5);
M5.Lcd.printf("[A6] %d\n", a6);
M5.Lcd.printf("[A7] %d\n", a7);
delay(3000);
}
動作確認のため、可変抵抗で中間電位をつくり、それをMCP3008の5つのアナログ入力(CH0〜CH4)につなぎます(全てに同じ中間電位をつないでいます)。
のこり3つのアナログ入力(CH5〜CH7)はフローティングのままです。
結果はこちらです。
可変抵抗のつまみを回すと、A0〜A4の値が0〜1023の範囲で変動します。
また、A0〜A4の値はほぼ同じになります。
「M5Stack」と「MCP3008」をつなぐ配線本数が多いのでやや煩雑になりますが、これで多数のアナログ信号を扱えるようになりました。
なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。
ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。