Raspberry PiはArduinoと違いADコンバータを内蔵していないため,アナログ値を取得するには外部のADコンバータから値を取得する必要があります.
研究室に転がっていたmcp3208を使ってアナログ値を計測していきます.
元にしたプログラムはhalherta さんの開発したこちらのプログラムです.ブログの方に詳しい回路図やmcp3008の仕様が書かれているので参考にしてください.
halherta さんのプログラムはmcp3008用なので,10bits の値しかとれません.mcp3008とmcp3208の仕様書を比べてみると,
送信ビットの桁を変えるだけで12bitsのデータが得られるようなので,mcp3x08のクラスでは,コンストラクタの引数にresolutionを加え,どの解像度のADコンバータでも対応できるようにしました(ただし,mcp3008やmcp3004でのテストは行なっていません).
また,いちいち送信用のビットを作成するのは面倒なので,クラス側で作成するようプログラミングしてあります.そのため,
mcp3x08Spi a2d("/dev/spidev0.0", SPI_MODE_0, 1000000, 8, 12);
std::vector<unsigned short> vals = a2d.getVals(0,7); // ch 0--7
の2文だけでデータを得ることができます.返り値は0–2^(resolution)のRawデータを格納したベクトルです. getval(m,n)
はチャンネルmからnの値を読み取ります.また,これだけだとつまらなかったので, futureを利用して,非同期でテキストファイルにログを書き出すようにしました.
ソースはこちらです.
コメント