*

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

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

ではっ。

関連記事

toppers

C言語でEV3開発(20)-超音波センサと安全状態

どもです。 前回は、BluetoothでPCとEv3を接続してコマンドの送受信について書きました。

記事を読む

toppers

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

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

記事を読む

toppers

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

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

記事を読む

raspberry-pi

RaspberryPi3を購入しました

どもです。 突然ですが、「Raspberry Pi3 model B」を購入しました。 今回のエ

記事を読む

toppers

C言語でEV3開発(23)-モーターの性能確認

どもです。 今回は、EV3に付属しているモーター(Lモーター/Mモーター)の性能について調べてみた

記事を読む

raspberry-pi

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

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

記事を読む

eclipse_4.3_kepler

eclipse/CDTにおけるgdbでのデバッグ中に発生するpythonのエラー

どもです。 今回のエントリーは、Eclipse上でのデバッグの際に「pythonのエンコードエラー

記事を読む

no image

C言語でEV3開発(14)-opOUTPUT_TIME_SPEEDコマンド

どもです。 今回のエントリーは、モーターを動かすコマンドである「opOUTPUT_TIME_SPE

記事を読む

python

Ev3開発サポートツール(4)-Pythonによるグラフ表示

どもです。 前回のエントリーで、VisualStudioCommunityでのPythonの開発環

記事を読む

eclipse_oxygen

Linux/EclipseでRaspberryPiのクロス環境を構築してみた…がっ!

どもです。 前回のエントリでは、WindowsにRaspberryPi3のクロスコンパイル環境の構

記事を読む

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_Logo
ホールセンサーの種類と使い方(割込み編)

どもです。 前回に引き続き、今回もホールセンサーについてです。

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

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

Arduino_Logo
1台のarduinno nanoで割込みとSPIの同時使用

どもです。 先日手に入れたArduino nano(中華)で遊んでい

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

どもです。 突然ですが、「Arduino nano」互換(なのか?)

raspberry-pi
libpigpioでのRaspberryPi3とArduinoのSPI通信

どもです。 今回は、libpigpioを使用してRaspberryP

→もっと見る

PAGE TOP ↑