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のピンアサインと回路図を次に示します。これらの資料は「Pro Micro & Fio V3 Hookup Guide」から取得しています。
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分割されているので、変換は正常に行われているようです。つぎに、各信号のタイミング図を次に示します。



