Raspberry Pi でアナログ値を計測する

C/C++

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を利用して,非同期でテキストファイルにログを書き出すようにしました.

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-18-20-08-54

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-18-20-09-32

ソースはこちらです.

コメント

タイトルとURLをコピーしました