ラズベリーパイのSPIのクロックをオシロスコープで取得した画像。8bitセグメントになっている

しばらく活動できていなかったのですが、自作のEC計の検討はちゃんと進めていますよー
(ง°̀ロ°́)ง
前回までは2chでEC計を作製しました。
2CH必要な理由は電圧降下と電流を見るためでした。
自作のEC計で試材の抵抗値を求める方法を図解した様子。

ですが、問題が。。。(×_×;)
ECの値って温度の影響を受けるらしいんです。ということは温度補正が必要??
ということになりますね。

温度補正をするためには温度を取得する必要があります。
つまり今のMCP3002の2chでは足りない。。計3CH以上必要ということになります。

そりゃそうなんですけど、もう一回開発かー!!と叫びたくなります。ミニマリストという言葉は憧れますが、昔の自分は単純に調査が足りなかったなーと( ಠωಠ)

あきらめて4CHのADコンバーターMCP3004を使うことにしました。
毎度のことながらラズパイWiringPiを使って開発したのでご紹介しますね(ノ*’ω’*)ノ~

MCP3004はどんなもの?

MCP3004は秋月電子で簡単に手に入れることができる4CHのADCです。

10bitの分解能があり、EC計の用途には十分な分解能があります。MCP3002が2ch用で8chのMCP3008もあります。

スペックシートも簡単に手に入ります。これを見るとMCP3004/MCP3008は同じデータシートのようです。

ざっとみてみましたがMCP3008もほぼほぼ同じプログラムでいいようです。

ラズパイではどうやって動かす?

ラズパイからMCP3004と通信するにはSPIを使います。SPI通信には便利なWiringPiを使いましょう。
SPI通信に必要なプロトコルと使用するWiringPiのAPIについてご紹介します。

MCP3002の仕様書を確認してラズパイの設定を決めます。

ラズパイSPI通信プロトコルを確認します。

ラズパイのSPI通信は8bit単位で行われます。ここを理解していないと正しいデータを送れなくて結果として正しく通信できません。

実際にSPI通信をするときの波形を取得してみました。

黄色がSCLKでクロックです。8bit単位になっているのがわかると思います。

ラズベリーパイのSPIのクロックをオシロスコープで取得した画像。8bitセグメントになっている

この8bit単位というのは意外と重要なんです。というのもシーケンシャルにデータをやりとりする方法と8bitセグメント単位で送る方法ではSPI通信を行うときのデータ送受信のプロトコルが違うからです。

実は最初の実装でなんでかうまく通信できなくて波形を取得してみたらそうだった。。。ということがありました。みなさんは気をつけてくださいね。

スペックシートからプロトコルを確認します。

MCP3004のスペックシートをみてみましょう。

こちらが連続したクロックで通信する場合です。

microchipのサイトから引用

一方、8bitセグメントの方法だとまったく送るデータは同じでもクロックのタイミングが違うことがわかりますね。

microchipのサイトから引用

連続したクロックでは送受信のために16bitのバッファーがあればいいのですが、8bitセグメント単位の場合には24bitのバッファーが必要になります。

さっき見たようにラズパイは8bitセグメントなので24bitのバッファーを使うようにします。

仕様が分かったので次はプログラムを実装します(◍•ᴗ•◍)♡ ✧*。

親クラスをWiringPiで作ります。

ADコンバーターは色々なセンサーにつなげて使うので汎用的なクラスを作ってそこから継承させたほうが良さそうです。
ということでWiringPiを使って親クラスを作ります。

WiringPiで使用するSPIのAPIって?

WiringPiのサイトにSPIのライブラリの使い方が紹介されています。簡単に解説します。

APIを使うためにheaderの取り込み

WiringPiのAPIを使うには専用のライブラリを取り込む必要があります。まずこちらをincludeしましょう。

ラズパイの初期設定。wiringPiSPISetupで通信の設定

実際にSPIでデータのやり取りをする前にラズパイのSPIの設定をする必要があります。こちらのAPIを使用します。

ラズパイにはSPIのチャネルが2つあるのでchannelでどちらを使うのかを設定します。
通信速度はspeedで設定でき、500,000から32,000,000Hzの間で値を選ぶことができます。

ちなみに返り値はLinuxのFD(File Descriptor)です。-1の場合にはエラーとなります。

wiringPiSPIDataRWでSPIデータの送受信

次にwiringPiSPIDataRWを使って実際にデータを送受信します。

設定したchannelに対し、*data bufferを介して書き込み読み込みを行います。
送りたいデータをdata bufferに設定しこのコマンドを実行すると、データがdata bufferに上書きされて返ってきます。さきほどのMCP3004の仕様書でみたように後半の10bitにMCP3004からのデータが格納されるイメージです。

コンパイルの時はライブラリの指定を忘れずに

コンパイルの時には”-lwiringPi”と指定するのを忘れないようにしましょう。

実際にWiringPiを使ったサンプルプログラム

サンプルの親クラスはこちらです。

プログラム自体はすごいシンプルです。このクラスを継承して実際にEC計測と温度補正用のクラスを作ることになります。

まとめ

ADコンバーターMCP3004の基本クラスをWiringPiを使用して作製しました。
次回は実際にEC計測と温度測定のデモをお見せしたいとおもいます‎٩( ‘ω’ )و

記事を読んでいただいてありがとうございます。この記事がいいなと思ったら下記のSNSボタンのクリックをお願いします。励みになります😁