*

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通信による他デバイスからのデータ読出しについて、役に立てば嬉しいなあ、と思います。

ではっ。

関連記事

MY_MFC_LOGO

MFCプログラミング(4):Enter(ESC)キーでダイアログが閉じないようにする

どもです。 今回は、キーボード入力の処理、特にEnterキー/ESCキーでダイアログが閉じられるこ

記事を読む

python

VisualStudioCommunityでのPython開発環境構築

どもです。 最近、VisualStudioでのPython開発を始めました。 その際の環境構築に

記事を読む

MY_MFC_LOGO

MFCプログラミング(1):CFileまたはCStdioFileクラスを使用してファイル出力

どもです。 突然ですが、仕事でMFCを使用することになりました。 MFCはこれまで触ったことがな

記事を読む

toppers

C言語でEV3開発(27)-EV3にヒステリシス処理を実装してみた

どもです。 今回は、モーターから読み出した値に対するヒステリシス・フィルター処理です。 0.

記事を読む

think_about_utest

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

どもです。 「単体テストの効率化について考える」の6回目です。 1回目から5回目まではコチラ

記事を読む

no image

C言語でEV3開発(9)-opOUTPUT_SPEEDコマンド

どもです。 今回のエントリーでは、前回に引き続きEV3のモーターを動かしていきます。 ただし、単

記事を読む

SEN0193_0114_eye_catch

土壌湿度センサーの出力値の比較:SEN0114とSEN0193

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

記事を読む

OpenCvLogo

OpenCvによる画像サイズ変更

どもです。 最近、カメラの動画をOpenCvで加工する、ということに挑戦し始めました。 しか

記事を読む

toppers

C言語でEV3開発(18)-モードの遷移の設計-コマンド通信処理の準備

 どもです。  今回は、前回紹介したEv3とBluetoothで通信する機能を

記事を読む

iot_raspberrypi_gateway_001_eye_catch

IoT開発(7)
RaspberryPiをIoTゲートウェイにする(II)
VM上の開発環境にWEBサーバーをインストール

どもです。 このエントリは、前回の続きです。 今回は、前回のエントリで作成したVM上のRaspb

記事を読む

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="">

arduino_relay_switch_002_ae_g5v_drv_eye_catch
Arduinoでリレースイッチ(2)-AE-G5V-DRV

どもです。 前回の記事では、「フォトカプラリレー」を使用したLチ

tlp222af_001_eye_catch
Arduinoでリレースイッチ(1)-TLP222AF

どもです。 つい先日、やっとのことでリレースイッチを手に入れるこ

c_sharp_eye_catch
外部からMariaDbにアクセスする(2)-C#からMariaDbにアクセスする。

どもです。 前回のエントリで、外部からMariaDbにアクセスす

c_sharp_eye_catch
外部からMariaDbにアクセスする(1)-データベースの設定

どもです。 今回は、Linux上のMariaDbにWindows

think_about_utest
middle_unit
最小…よりも(ほんの)少し大きいテストフレームワーク

どもです。 今回は、単体テストのフレームワークについて書きます。

→もっと見る

PAGE TOP ↑