2017年3月8日水曜日

Arduino で MCP3204 を使って複数のセンサからデータを取得してみた

概要

MCP3204 は所謂、アナログデジタルコンバータでアナログの情報 (例えばセンサの情報) などを読み込むために使います
MCP3204 はアナログを読み込むチャネルが 4ch あり、12bit ( 0 - 4096 ) までの間でデータを取得することができます
今回は光センサと圧力センサの 2 つのアナログデータを MCP3204 1 つを使って読み込んでみたいと思います

環境

配線

まずは配線を紹介します
Arduino と MCP3204、光センサを接続します
arduino_with_mcp3204_circuit.jpg

ブレッドボード側だけアップにした配線も撮影しました
arduino_with_mcp3204_breadboard_circuit.jpg

配線の概要は以下の通り

  • MCP3204 DGND -> Arduino GND (黒ジャンパ)
  • MCP3204 AGN -> Arduino GND (黒ジャンパ)
  • MCP3204 CS chip select -> Arduino D10 (黄ジャンパ)
  • MCP3204 Din MOSI -> Arduino D11 (黄ジャンパ)
  • MCP3204 Dout MISO -> Arduino D12 (黄ジャンパ)
  • MCP3204 CLC clock -> Arduino D13 (黄ジャンパ)
  • MCP3204 Vref -> Arduino 5V reference voltage (that gives max adc reading) (赤ジャンパ)
  • MCP3204 Vdd -> Arduino 5V supply voltage, max 5.5V so Arduino 5V is fine (赤ジャンパ)

が MCP3204 と Arduino を接続するための配線です
MCP3204 のピンが何を示しているかは公式の回路図を見るとわかります

光センサは

  • 光センサ -> MCP3204 0ch
  • 光センサ -> Arduino 5V

に接続します

であとは FSR402 を MCP3204 の 2ch に接続します
10KΩの抵抗を挟んでから接続します、そうしないと FSR402 のアナログ値が安定しません、また GND に接続するのも忘れないでください
arduino_with_mcp3204_connected_fsr402.jpg

  • Arduino5V -> 10KΩ -> FSR402 (赤) -> MCP3204 2ch
  • Arduino GND -> FSR402 (青)

配線は以上です
写真だと複雑に見えますが組んでみるとそんなに複雑でもありません

スケッチ

MCP 3204 からデータを読み込むためのスケッチを紹介します

#include <SPI.h>

#define MCP3204_CS 10

void setup() {
  Serial.begin(9600);
  // Initializing SPI
  SPI.begin();
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(SPI_MODE1);
  SPI.setClockDivider(SPI_CLOCK_DIV8);

  delay(3000);
}
void loop() {
  int dt ;

  dt = ADC_analogRead(MCP3204_CS, 0);
  Serial.print("Analog CH0=");
  Serial.println(dt);
  dt = ADC_analogRead(MCP3204_CS, 2);
  Serial.print("Analog CH2=");
  Serial.println(dt);
  delay(1000);
}

int ADC_analogRead(int ss, int channel) {
  static char f;
  int d1 , d2;

  // Calling only once
  if (f != 1) {
    pinMode(ss, OUTPUT);
    digitalWrite(ss, HIGH);
    f = 1;
    delay(1);
  }
  // Reading a data from MCP3204
  digitalWrite(ss, LOW);
  d1 = SPI.transfer(0x06 | (channel >> 2));
  d1 = SPI.transfer(channel << 6);
  d2 = SPI.transfer(0x00);
  digitalWrite(ss, HIGH);

  return (d1 & 0x0F) * 256 + d2;
}

すいません、それぞれの細かい処理は SPI.h のリファレンスを読んでください
ポイントは ADC_analogRead メソッドでここの引数にチャネルを与えることでアナログ値を取得することができます
Arduino の 10 ピン (SS) を LOW にしている間 MCP3204 から値を取得することができます
その間に指定のビットからデータを読み込むことで値が取得できるみたいです ( 曖昧ですいません )

とりあえずこれで動作確認してみましょう

動作確認

スケッチを Arduino に書き込んでシリアルモニタを起動しましょう
以下のように表示されると思います
enter image description here

ch0 と ch2 の情報が連続で表示されると思います
光センサを手で覆って暗くすると ch0 の値が小さくなります
圧力センサを手で押すと ch2 の値が小さくなります

今回は ch0 と ch2 を使っていますが、ch1 と ch3 を使っても全然問題ないです
また、ch1 と ch3 を追加したい場合は loop メソッド内に ADC_analogRead(MCP3204_CS, 1);, ADC_analogRead(MCP3204_CS, 3); あたりを追記すれば動作すると思います

最後に

なぜこれをやったかというとアナログピンの消費を抑えたかったからです
光センサやFSR402 等の圧力センサを使うと、その値を取得するためにアナログピンを 1 つ消費します
そうなると複数のセンサを使う回路だと、すぐにアナログピンが尽きてしまい複数の Arduino を購入するなんてことになってしまいます

そんなときに MCP3204 や MCP 3208 があるとデジタルピン 4 ピンを消費する代わりに複数のアナログデータを取得することができます
ちょっとした Arduino 等のマイコンボードを使う時の技ですが、覚えておくとかなり重宝すると思います

で、更に今後やろうと思っているのが 16チャネル持っているアナログマルチプレクサを使って 16 チャネルからデータを読み込んでみたいと思っています
おそらく同じようなやり方でできると思ったので予行演習として今回は手元にあった MCP3204 を使って複数のアナログリードを実施した感じです

参考サイト

1 件のコメント: