*

QtでRaspberryPi/GUI開発(11)-SPI通信をしてみた(その3)

公開日: : 最終更新日:2019/06/15 C言語, pigpio, RaspberryPi, 開発

どもです。
えー。
「Qtで…」とか書いておきながら、今回もやっぱりQtは出てきません。
そろそろ、「いい加減にしなければ」と考えています…。

前回のエントリでは、シフトレジスタとSPI通信により、LEDで送信した値を2進数表示する、ということをしました。
このエントリでは、主に「SPI通信によるデータの送信」について記載しています。
そのため、今回のエントリでは、「SPI通信によるデータの『送受信』」について記載します。

1.通信相手
通信相手には、「温度センサー」を選択しました。
選択した温度センサーは、「ADT7310」です。
※実際には、このセンサーが搭載された「MDK001」を使用します。

なお、このモジュールは、マルツで購入できます。

このセンサーの詳細な仕様は、ココに記載されています。
ざっくりとした性能/仕様を載せておきます。

温度分解能0.0625
温度範囲-55℃~150℃
電圧範囲2.7V~5.5V

2.接続
RaspberryPi3とMDK001(ADT7310)は、下表のように接続します。
ADT7310RaspberryPi3
VDD5V
SCLSCLK
SDOMISO
SDIMOSI
CSxSPI_CE0
GNDGND

RaspberryPi3の5VとGDNについては、実際には複数のピンが選択できます。
どのピンを使うかは、机のレイアウトなどと相談して決めてください。

3.環境と実装
開発の環境は、下記の通りです。

H/W:RaspberryPi3
MDK001(ADT7310搭載)
OS:Raspbian 9.4(stretch)
GPIO Library:pigpio

で、実際のコードは下記の通りです。

4.プログラムの内容
上記のプログラムで行っていることを、少し説明します。
まず、89行目の処理。

ADT7310では、CSxがLOWの場合にデータの送受信が可能となります。
そのため、CSxと接続されたSPI_CE0をLOWに設定しています。

次に、97行目からの処理。

一応、コード内にコメントとして書きましたが、「Shutdown mode」を抜けるためのコードです。
ADT7310には、「SHUTDOWN」という状態があります。
この「Shutdown mode」を抜ける処理がない場合、プログラムは実行する度にデータが読み取れる/読み取れない、という状態を繰り返します。
2回に1回しかちゃんとセンサー値を取得できません。
色々調べた結果、どうやらこの「SHUTDOWN」モードの有無が原因でした。
またADT7310の仕様書によれば、この「SHUTDOWN」モードを抜けるには、コマンド送信後一般的に1m秒程度かかるようです。
そのため、コマンド送信後にnanosleep()を実行しています。

110行目からは、センサー値の読出しの「事前処理」です。
具体的には、ADT7310を「CONTINUOUS READ MODE」に設定しています。
このモードに設定しておくことで、センサーから値を読み出すためにレジスタに読出し要求を書き込む、という手間が省略できます。

で、122行目~149行目までがセンサー値の読み取り、変換、表示を行っている処理になります。
ADT7310のセンサー値は、2バイトになっています。
spiRead()関数で2バイト分一気に読み出します。読み出すデータのサイズは、第3引数で指定します。
そのため、上記サンプルプログラムでは、spiRead()の第3引数には「2」を指定します。
読み出した2バイトのデータのうち、下位3ビットについては、温度情報ではありません。
そのため、この3ビットは削除しています。
また、最上位ビットは符号情報です。
この符号情報の扱い方は、仕様書内に記載された方法を参考にしています。
センサーの値から実際の温度を算出している部分(下記コード)ですが、これは整数部分と小数部分をそれぞれ別々に算出しています。

ADT7310の温度分解能はデフォルトでは「0.0625℃」となっています。
この「0.0625」という数値ですが、実は「1/16」です。
そのため、センサが出力した値をそのまま16で割ると測定した温度に変換できます。
しかし、センサから読み出した値は整数型であり、16で割ると小数点以下の値が取得できません。
そのため、小数部分を別途計算しています。
小数部分については、前述の分解能より、データを625倍した後、1000で割った値の「余り」が該当します。

最後に、「SHUTDOWN」モードです。
これは、152行目~154行目です。

ここでは、「0x08 0x60」という2バイトのデータをspiWrite()関数を使用してレジスタに送信しています。
これにより、ADT7310を「SHUTDOWN」モードに遷移させてます。

5.まとめ
今回は、SPI通信を使用したデータの読出しについて、実際の例を挙げながら書いてみました。
RaspberryPi3/pigpioでのSPI通信、特にデータの読出しについては、spiRead()で可能です。
読み出したいデータのサイズを第3引数に指定することで、データが指定したバッファの中に格納されます。
単純にデータを読み出すだけであれば、この関数でOKです。
データの送信と受信を同時に行う場合には、spiXfer()を使用する必要があります。

また、SPI_CExについては、HIGHにするのかLOWにするのかは、おそらく通信対象の仕様によるかと思います。
pigpioのSPI通信機能では対応してくれません。
これは、通信対象の仕様をよく調べて、適切なピン状態をアプリケーションで設定する必要があります。

以上、今回はSPI通信でのデータの読出しについて記載しました。
記事の内容自体は、何故かSPI通信とは関係ない部分が多くなってしまいましたが…。
RaspberryPi3のSPI通信による他デバイスからのデータ読出しについて、役に立てば嬉しいなあ、と思います。

ではっ。

関連記事

RasPi_Qt

Rasbianの新しいバージョンが出たので、クロス環境を更新してみた。(さらにその後)

どもです。 前回の投稿から、かなり時間が空いてしまいましたが、今回は前回の続きとして、「QtC

記事を読む

cygwin_my_image

Windows10/cygwinの音を消す

どもです。 最近、Windows10/cygwinで作業をする場面がありました。 このcyg

記事を読む

GitHub

C/C++のスタブを自動生成するツールを公開しました

どもです。 突然ですが、C/C++の単体テストで使用する「スタブ」を自動で生成するツールを公開

記事を読む

no image

Windows/EclipseでRaspberryPiのクロス環境を構築してみた

どもです。 今回は、Windows/EclipseでRaspberry Piのクロス環境を構築した

記事を読む

Arduino_Logo

ホールセンサーの種類と使い方

どもです。 今回のエントリは、表題にある「ホールセンサー」についてです。 1.「ホールセンサ

記事を読む

Arduino_Logo

Arduino nano(中華版)をセットアップしてみた

どもです。 突然ですが、「Arduino nano」互換(なのか?)の中華ボードを手に入れました。

記事を読む

toppers

C言語でEV3開発(24)-APIの実行時間を測定してみた。

どもです。 今回、以前から気になっていた、開発環境/プラットフォームであるTOPPERS HRP2

記事を読む

ADT7310_DHT11_eye_catch

温度センサの出力値の比較

どもです。 今回は、センサーの性能、測定結果を比較してみたので、それについて書きます。 1.

記事を読む

raspberry-pi

QtでRaspberryPi/GUI開発(9)-SPI通信をしてみた

どもです。 えー。 「Qtで…」とか書いておきながら、今回はQtは出てきません。 今回のエ

記事を読む

source_trail_eye_catch

Sourcetrailを試してみました

どもです。 つい最近、ソースコードの解析に役に立ちそうなツールを見つけたので、ここで少し紹介をしま

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

think_about_utest
VisualStudioで実行した単体テストの結果の出力(3)-テスト実行からレポート生成までをツールで自動化

どもです。 前々回、前回と、VisualStudio/C#での単

think_about_utest
VisualStudioで実行した単体テストの結果の出力(2)-出力ファイルの読める化

どもです。 前回の続きです。 前回は、VisualStud

think_about_utest
VisualStudioで実行した単体テストの結果の出力(1)-ファイルへの出力

どもです。 最近、VisualStudio/C#でよく開発してい

think_about_utest
単体テストの効率化を考える(6)-スタブの自動生成ツール

どもです。 「単体テストの効率化について考える」の6回目です。

think_about_utest
単体テストの効率化を考える(5)-スタブの自動生成への入力

どもです。 「単体テストの効率化について考える」の5回目です。

→もっと見る

PAGE TOP ↑