raqwel’s diary

Web系で働いている駆け出しエンジニアの備忘録です。

Raspberry PiでAD変換するのにMCP3002を使おうとする話(データシート読み取り編)

昨日から続けて更新です(珍しい)

ちなみに昨日の現象は、ハンダをやり直したら何もなかったかのように正常に動き出しました()

Lチカも無事に済んだところで、次はAD変換でセンサの値を読み取ろうと思います。

raqwel.hatenablog.com

センサは以下の物を使おうかなと思っています。

www.switch-science.com

これを購入した時は「Raspberry Piに直接挿してAD変換行けるっしょ」と思っていたのですが、

家に帰って調べていたらRaspberry PiにはAD変換用のピンが無いことに気づきました(今までArduinoしか触っていなかった弊害がこんなところで・・・)

  ということでAD変換変換用にMCP3002を購入。

回路とコードはネットで探せばごまんとあるのですが、せっかくなのでデータシートを読んで、Raspberry Pi上でどう使えば良いのかを調べていました。

 

Raspberry PiでMCP3002を使ってAD変換するために(データ送信編)

Raspberry PiPythonを使ってSPI通信をする時は「py-spidev」を使うのがポピュラーのようです。これを使って行こうと思います。

GitHub - doceme/py-spidev

そして次はこれをどう使うか、というところです。

そこで次にMCP3002のデータシートと合わせて読んでみます。ピン配置やピンの繋げ方は省略です。

このMCP3002にはセンサからの入力を読み取るチャンネルが2つあります。

その指定はどのようにやるのでしょうか。

データシートを読んだところ、「5.0 SERIAL COMMUNICATIONS」にそれっぽい図がありました。

f:id:raqwel:20171126172427p:plain

これを見ると、どうも「SINGLE ENDED MODE」の際に[SGL/DIFF, ODD/SIGN] = [1,0]ならばチャンネル「0」、[1,1]ならチャンネル「1」になることが読み取れます。 ちなみに、この「SINGLE ENDED MODE」は「SGL/DIFF」が「1」ならばこのモードになるそうです。

ではこれをどのようにMCP3002に伝えるのか、というところですが、ここで「py-spidev」を使います。このツールのxfer2()を使うとデータを送信出来るみたいです。

xfer()もありますが、これらの違いはCSのactiveしっぱなしにするかどうかという点です。おそらくxfer2の方で大丈夫です。

xfer2で上の命令を送る前にそもそもどのような形式で送信するとよいのでしょうか。その答えは以下の図を参考にすると良さそうです。 f:id:raqwel:20171126180016p:plain

この図の「MCU Transmitted Data」を見るとわかります。

ここを見るとSGL/DIFF, ODD/SIGNというのが出てきました。ということはその部分には[1, 0]が入りそうです。
残りのStartとMSBFについてですが、Startに関しては1を入力すると良いそうです。 MSBFに関してですが、データシートを見ると、「1」だとデータを取得してくれるようです。
ということで送信すべきデータは「x1101xxxx」となります。 xはDon't Careの部分です。気にしないということなので、0を入れておきます。 そのため最終的に送信すべきデータは
011010000 00000000
という様になり、これを16進数に直して0x68, 0x00となります。
そのため、送信するにはxfer2(0x68, 0x00)と設定します。

これで送信する部分は良さそうです。次に受信されるデータはどうなるかについてですが、ちょっと長くなったので一旦区切ろうかと思います。 送信の次はMCP3002から受信したデータはどうなるかを書こうと思います。