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分割されているので、変換は正常に行われているようです。つぎに、各信号のタイミング図を次に示します。