ebayで購入したPro Micro にAD変換器「MCP3208」を接続し、アナログ/デジタル変換したデータをUSBでパソコンに取り込めるようにしました。MCP3208は、 12ビット, 8 チャンネル, SPIインタフェースを持つアナログ/デジタル変換器で、「Raspberry PiでADC「MCP3208」のspi接続 」で使用したものを使います。

Pro MicroとAD変換器「MCP3208」の接続

次のように各ピンを接続します。変換する電圧は、「3.3V」「1.6V」「0V」とし、Vref は「3.3V」としました。左側のピン番号がMCP3208で右側のピン番号がPro Microです。Pro Microもいろいろなバージョンがあるようなので、SPI信号「MOSI」「MISO」「clock」を確認して、それぞれ「D16」「D14」「D15」を変更してください。

  • 1 3.3V
  • 2 1.6V
  • 3 0V
  • 9 DGND -> GND
  • 10 CS chip select -> D10
  • 11 Din MOSI -> D16
  • 12 Dout MISO -> D14
  • 13 CLC clock -> D15
  • 14 AGN -> GND
  • 15 Vref 3.3
  • 16 Vdd 3.3

実際にブレッドボード上にPro MicroとAD変換器「MCP3208」を結線した画像を次に示します。

Pro MicroにAD変換器「MCP3208」を接続

Pro Microのピンアサインと回路図を次に示します。これらの資料は「Pro Micro & Fio V3 Hookup Guide」から取得しています。

Pro Microのピンアサイン

Pro Microの回路図

MCP3208用spiインタフェースソフト

Pro MicroでAD変換器「MCP3208」をSPIインタフェースで接続し、USBでパソコンにアナログ/デジタル変換した結果を送信するプログラムを次に示します。 read_adc関数でパラメータで変換するチャンネル指定し、MCP3208に対してコマンドを発行してデータを取得する。コマンドの仕様については、「Raspberry PiでADC「MCP3208」のspi接続 」もしくはMCP3208のデータシートおよびを参照してください。

MCP3208.ino

#define SELPIN 10   //Selection Pin 
#define DATAOUT 16  //MOSI 
#define DATAIN  14  //MISO 
#define SPICLOCK 15 //Clock 
int readvalue;

void setup() {
  //set pin modes
  pinMode(SELPIN, OUTPUT);
  pinMode(DATAOUT, OUTPUT);
  pinMode(DATAIN, INPUT);
  pinMode(SPICLOCK, OUTPUT);
  //disable device to start with
  digitalWrite(SELPIN, HIGH);
  digitalWrite(DATAOUT, LOW);
  digitalWrite(SPICLOCK, LOW);

  Serial.begin(9600);
}
int read_adc(int channel) {
  int adcvalue = 0;
  byte commandbits = B11000000; //command bits - start, mode, chn (3), dont care (3)

  //allow channel selection
  commandbits |= ((channel - 1) << 3);

  digitalWrite(SELPIN, LOW); //Select adc
  // setup bits to be written
  for (int i = 7; i >= 3; i--) {
    digitalWrite(DATAOUT, commandbits & 1 << i);
    //cycle clock
    digitalWrite(SPICLOCK, HIGH);
    digitalWrite(SPICLOCK, LOW);
  }
  digitalWrite(SPICLOCK, HIGH);   //ignores 2 null bits
  digitalWrite(SPICLOCK, LOW);
  digitalWrite(SPICLOCK, HIGH);
  digitalWrite(SPICLOCK, LOW);
  //read bits from adc
  for (int i = 11; i >= 0; i--) {
    adcvalue += digitalRead(DATAIN) << i;
    //cycle clock
    digitalWrite(SPICLOCK, HIGH);
    digitalWrite(SPICLOCK, LOW);
  }
  digitalWrite(SELPIN, HIGH); //turn off device
  return adcvalue;
}
void loop() {
  readvalue = read_adc(1);
  Serial.println(readvalue, DEC);
  readvalue = read_adc(2);
  Serial.println(readvalue, DEC);
  readvalue = read_adc(3);
  Serial.println(readvalue, DEC);
  Serial.println(" ");
  delay(250);
}

Pro MicroによるAD変換結果

TeratermによりPro MicroからのAD変換結果を受け取ると(私の環境では、COMポート14/9600BPSでした)、次のようなデータが繰り返し表示されます。

3639
1895
149
3639
1892
149
3639
1893
149

変換したデジタル値がほぼ2分割されているので、変換は正常に行われているようです。つぎに、各信号のタイミング図を次に示します。

AD変換タイミング図