https://independence-sys.net/main/?p=3804 より参照
Arduino Unoとは以下のように接続します。ADT7310 – Arduino 3.3vでもうごくのでラズピコでもOK
CS – Pin10 SS(CS) chip select マイナス論理
SDI – Pin11 MOSI sdi: serial data in
SDO – Pin12 MISO sdo: serial data out
SCL – Pin13 SCK scl: serial clock line
VDD – 5V
GND – GND
Arduino UnoのMISO(Master In Slave Out)端子は、SPI通信でセンサー(スレーブ)からデータを受け取る(読み込む)ための入力端子 MOSIはMaster Out Slave Inの略で、
Arduino(マスター)からセンサや周辺機器(スレーブ)へデータを送信(出力)するための端子です。つまりtx,rxのようなクロス結合となっている。I2CはDaisy Chainで全然ちがう。
#include <SPI.h>/* * ADT7310での温度データ取得 * ADT7310 - Arduino * CS - Pin10 SS(CS) * SDI - Pin11 MOSI * SDO - Pin12 MISO * SCL - Pin13 SCK * VDD - 5V * GND - GND */int SSPin = 10; // Pin10をSS // 初期化void setup(void) { pinMode(SSPin, OUTPUT); Serial.begin(9600); // 以下の3行は呪文やな SPI.setBitOrder(MSBFIRST); //最上位ビット(MSB)から送信 SPI.setClockDivider(SPI_CLOCK_DIV128); //通信速度を遅く設定 SPI.setDataMode(SPI_MODE0); //CPOL(クロック極性):0 CPHA(クロックフェーズ):0 SPI.begin(); SetSSPin(LOW); // マイナス論理、0の間だけ通信可能となる// 本プログラムではループしつづけるのでSetSSPin(High)は不要 //ソフトウェアリセット SPI.transfer(0xFF); SPI.transfer(0xFF); SPI.transfer(0xFF); SPI.transfer(0xFF); SPI.transfer(0x54); // 測定開始(continuously read) delay(500); // 仕様上は、240msで開始} // メインループvoid loop(void) { uint16_t uiVal; float fVal; int iVal; uiVal = (uint16_t)SPI.transfer(0) << 8; // AD変換値 上位 uiVal |= SPI.transfer(0); // AD変換値 下位 uiVal >>= 3; // シフトで13bit化 //uiVal = 0x1fff; //確認テスト用 if(uiVal & 0x1000) { // 13ビットで符号判定 iVal = uiVal - 0x2000; // マイナスの時 (10進数で8192) } else{ iVal = uiVal; //プラスの時 } fVal = (float)iVal / 16.0; // 温度換算(摂氏) Serial.println(fVal, 4); // シリアル送信 delay(5000); //例として5秒待つ}/* * SSピンの設定 * Lowでマスタからの通信が有効(セレクト) * (Highではマスタから通信出来ない(無視される)セレクト解除の状態) */void SetSSPin(int val){ digitalWrite(SSPin, val); }