以下の記事でArduino Unoで温度センサのADT7310を使ってみました。
Arduino UnoでSPI通信(その2)温度センサADT7310
以下の製品です。
ADT7310使用 高精度・高分解能 SPI・16Bit 温度センサモジュール
その続きで、Raspberry Piでも温度センサADT7310を使ってみました。その手順と結果についてです。
配線は以下です。
ADT7310 – Raspberry Pi
VDD – 5V
SCL – GPIO11 SCLK
SDO – GPIO9 MISO
SDI – GPIO10 MOSI
CS – GPIO8
GND – GND
Raspberry Piのソケットに接続しているのは以下の製品です。
Raspberry PiでSPIを有効にします。sudo raspi-configで設定を起動します。
5.Interfacing Optionsを選択します。
P4 SPIを選択します。
はいで有効にします。
ここではpythonでプログラムを書きました。SPIの通信は以下の Python Spidev を利用しました。
Python Spidev
Pythonが利用可能な状態だとして、適当なディレクトリ上で以下で導入できます。
$ git clone git://github.com/doceme/py-spidev
$ cd py-spidev
$ sudo python setup.py install
以下のようなプログラムを書きました。
#!/usr/bin/python # -*- coding: utf-8 -*- import spidev import time spi = spidev.SpiDev() spi.open(0,0) spi.mode = 0x03 #モード3 CPOL:1 CPHA:1 spi.max_speed_hz = 5000 spi.xfer([0xFF, 0xFF, 0xFF, 0xFF]) #ソフトウェアリセット time.sleep(0.5) spi.xfer([0x54]) #連続で読み込み開始 time.sleep(1) ret = spi.xfer([0xff,0xff]) #読み込み temp = ret[0]<<8 | ret[1] #上位と下位の読み込み temp = temp >> 3 #13ビッド化 if(temp >= 4096): #マイナスの場合 temp = temp - 8192 print "temparature:",temp / 16.0 print "stop:",spi.xfer([0x50]) #連続終了 spi.close()
プログラムとしては、Arduinoの場合と同様にSPIの初期設定をして連続モードで読み込んでいます。但し、ここでは1回だけ読み込んで終了しています。読み込み終了とクローズまで確認するためです。
詳細が必要な場合はお手数ですが、製品のデータシートを参照して下さい。
SPIのモード等は以下等を参照して下さい。
Arduinoリファレンス SPIの概要
あと、最初のソフトウェアリセット(0xFF)はないと不安定になります。不安定な動作になったらこれが必要です。
上のプログラムでは、xfer()のメソッドを使っていますが、xfer2()というメソッドもあります。xfer()では通常はdelayを指定してCSのアクティブとリリースを制御するようです。xfer2()はCSは常時アクティブになるようです。
ここでは特に複数のスレイブを制御することはないので、上のプログラムで動作しました。またxfer2()でも同様に動作しました。今回のような単独のスレイブの場合は、xfer2()を使っている例が多いように思いました。
より詳細が必要な場合は以下のPython Spidevの説明等を参照して下さい。
Python Spidev
ここでは何とか温度が取得出来たということでここまでにします。