MCP3002はMicrochipのADコンバーターで、入力2ch、10bitで秋月で売られているものです。
このADコンバーターはSPIでデータを取得します。なので、SPIマスターにArduinoを使いました。
ADコンバーターから値を読み込むには、SPIで2byteのデータを送ります。送るデータの内容と送り方は、データシートのFigure 6.1あたりを見てください。
上の図を見ると、送るデータのうち設定するのは、3~5bit目のSGL、ODD、MSBFのみということがわかります。楽ですね!
1bit目は0です。2bit目はStartbitで、必ず1です。これは上図からわかります。
SGLビットとODDビットは、入力信号のうちどちらのch(0または1)を使うか、差動入力にするか、を設定します。設定の仕方は、データシートp13 Table5-1を参考にしてください。
MSBFビットは、1にするとデータがMSB(上位ビット)から、0にするとデータがLSB(下位ビット)から送られてきます。これは、データシートp13 5.1章の途中にある"If the MSBF bit is high, then the data will come
from the device in MSB first format and..."あたりを参考にしてください。
なので、例えばch0のデータを、上位ビットから順に送って欲しかったら、0b011101000、0b00000000と送るわけです。
ADコンバーターから値を読み込むには、SPIで2byteのデータを送ります。送るデータの内容と送り方は、データシートのFigure 6.1あたりを見てください。
(MCP3002 datasheet p15より抜粋) |
上の図を見ると、送るデータのうち設定するのは、3~5bit目のSGL、ODD、MSBFのみということがわかります。楽ですね!
1bit目は0です。2bit目はStartbitで、必ず1です。これは上図からわかります。
SGLビットとODDビットは、入力信号のうちどちらのch(0または1)を使うか、差動入力にするか、を設定します。設定の仕方は、データシートp13 Table5-1を参考にしてください。
MSBFビットは、1にするとデータがMSB(上位ビット)から、0にするとデータがLSB(下位ビット)から送られてきます。これは、データシートp13 5.1章の途中にある"If the MSBF bit is high, then the data will come
from the device in MSB first format and..."あたりを参考にしてください。
なので、例えばch0のデータを、上位ビットから順に送って欲しかったら、0b011101000、0b00000000と送るわけです。
以下Arduinoのコードです。
17行目は、取得した2つのデータを結合しています。highbyteが上位8bitなので、シフト演算で上位8bitになるようずらします。で、データは下位10bitだけなので、0x03FF=0b0000 0011 1111 1111との論理積を取っています。
SPI.setClockDividerは別にあってもなくても、DIV8でも128でも変わらないです…
このスケッチを書き込むと、こんな感じで、データがシリアルに送られてきます。
繋ぐのはSPIバスと電源だけですが、一応配線図を…
巷でArduino使いさんたちが使っている、Fritzingというエディタで、実体配線図を書いてみました。自信がないので接続するときは自分でちゃんとデータシート見てください:;(∩´﹏`∩);:
配線てD&Dでよかったんですね…部品なくて困ってた…
詰まった点。
1)SPI通信で、CS(Chip Select)が下がらない。
最初は0しか送られてこなくて、困った挙句ロジアナで見てみると、CSが上がったまま。データシートによれば、というか普通はCSが下がるとSPIバスで通信が行われるので、しょうがないので手動でCS(10)を制御しました。
で、そうするとデータは取得できるようになったのですが、逆にロジアナで見れなくなった…なんでだろう…
void setup(){ Serial.begin(9600); pinMode(10, OUTPUT); } void loop(){ //SPI通信を行い、ADコンバーターからデータを取得 SPI.begin(); //SPI.setClockDivider(SPI_CLOCK_DIV128); digitalWrite(10, LOW); byte highbyte = SPI.transfer(0b01101000); byte lowbyte = SPI.transfer(0x00); digitalWrite(10, HIGH); SPI.end(); unsigned int data = ((highbyte << 8) + lowbyte) & 0x03FF; //シリアル通信でパソコンに送る Serial.println(data); delay(500); }
17行目は、取得した2つのデータを結合しています。highbyteが上位8bitなので、シフト演算で上位8bitになるようずらします。で、データは下位10bitだけなので、0x03FF=0b0000 0011 1111 1111との論理積を取っています。
SPI.setClockDividerは別にあってもなくても、DIV8でも128でも変わらないです…
このスケッチを書き込むと、こんな感じで、データがシリアルに送られてきます。
シリアルモニタ |
繋ぐのはSPIバスと電源だけですが、一応配線図を…
巷でArduino使いさんたちが使っている、Fritzingというエディタで、実体配線図を書いてみました。自信がないので接続するときは自分でちゃんとデータシート見てください:;(∩´﹏`∩);:
配線図 |
配線てD&Dでよかったんですね…部品なくて困ってた…
詰まった点。
1)SPI通信で、CS(Chip Select)が下がらない。
最初は0しか送られてこなくて、困った挙句ロジアナで見てみると、CSが上がったまま。データシートによれば、というか普通はCSが下がるとSPIバスで通信が行われるので、しょうがないので手動でCS(10)を制御しました。
で、そうするとデータは取得できるようになったのですが、逆にロジアナで見れなくなった…なんでだろう…