TOP > カテゴリ > ロボット・電子工作・マイコン >

アナログピンを増設する「ADコンバータ」の使い方 [Arduino]

Arduino UNOのアナログピンはA0からA5ピンで合計6ピンあります。

今回の「ADコンバータ」(MCP3002)を使用すると2ピンが増設されて合計8ピンを使用する事が可能です。また、増設されたピンはSPI接続でアナログ値を取得する事が可能です。

※ADコンバータ(A/D変換)は「アナログからデジタルへ変換」の意味です。

使用部品・材料

総額で約730円です。(Arduino本体の値段を除く)

部品/材料値段備考
サンハヤト SAD-101 ニューブレッドボード¥500Amazon.com
10bit 2ch ADコンバータ MCP3002-I/P¥180秋月電子の通販コード(I-02584)
半固定ボリューム 10kΩ [103]¥50秋月電子の通販コード(P-08012)

配線図

アナログ入力はCH0とCH1ピンの2つあります。

次は公式データシートより(mcp3002.pdf)

通信用のフラグはスケッチから意味を読み取ってください。

SPI接続用のピン

マスターはArduino。スレーブはMCP3002です。

番号名称内容
13SCKSerial ClocK。データ転送の同期の為のマスターからのクロ ック信号。
12MISOMaster In Slave Out。スレーブからマスターへデータを送る。
11MOSIMaster Out Slave In。マスターからスレーブへデータを送る。
(10)SSSlave Select pin。スレーブ選択ピン。10ピン以外でも使用可能です。

SPI接続でデバイス間の通信をする場合は、このピンをLOWにしている間に行います。通信を終了する場合はHIGHにします。

このピン番号と名称はArduinoで使用されているものです。デバイスによって異なる場合があります。

スケッチ(プログラム)

シリアルモニターに2つのアナログ入力の結果を表示します。

CH0には5V電源をそのまま入力していますので常に1023ぐらいです。CH1は半固定抵抗器のつまみを動かすと値が変化するようにしています。

#include <SPI.h>
 
// SCK  : pin 13 (Serial ClocK)
// MISO : pin 12 (Master In Slave Out)
// MOSI : pin 11 (Master Out Slave In)
// SS   : pin 10 (Slave Select pin)

// 通信用のフラグ
const int START_BIT = 0x40; // 2進 1000000
const int CH0 = 0x20;       // 2進  100000 
const int CH1 = 0x30;       // 2進  110000 
const int MSBF = 0x08;      // 2進    1000 

void setup() {
  Serial.begin(9600); 
    
  // SPIの初期化
  // ※自動的に「SCK、MOSI、SSのピンの動作はOUTPUT」となり「SSはHIGH」となる
  SPI.begin();
  // SPI転送モード
  // クロック位相(CPOL) = 0 クロック極性(CPHA) = 0
  SPI.setDataMode(SPI_MODE0);
  // SPI送受信用のビットオーダー(MSBFIRST)
  SPI.setBitOrder(MSBFIRST);
  // SPIクロック分周器 4MHz = 16MHz/4 
  SPI.setClockDivider(SPI_CLOCK_DIV4);
}
 
void loop() {
  uint8_t hi,lo;
  uint16_t value;

  // CH0の読み込み
  digitalWrite(SS, LOW);
    hi = SPI.transfer(START_BIT | CH0 | MSBF); 
    lo = SPI.transfer(0x00); 
  digitalWrite(SS, HIGH);
  
  value = ((hi << 8) | lo) & 0x03FF;
  Serial.print("CH0 : ");
  Serial.print(value);
  Serial.print(" ");
  
  // CH1の読み込み
  digitalWrite(SS, LOW);
    hi = SPI.transfer(START_BIT | CH1 | MSBF); 
    lo = SPI.transfer(0x00); 
  digitalWrite(SS, HIGH);
  
  value = ((hi << 8) | lo) & 0x03FF;
  Serial.print("CH1 : ");  
  Serial.println(value);
  
  delay(250);
}

実行例

最後に

今回のようにアナログピンが不足している時に、180円のMCP3002でピンを増設する方法がありますが、250円でArduinoを作る方法もあります。





関連記事



公開日:2017年08月23日
記事NO:02537