M5Stackでできること 〜ADコンバータ「MCP3008」を使う

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


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


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

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