2026年8月10日月曜日

Arduino UnoでSPI通信 温度センサADT7310

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);
}