Arduinoでエレキジャック付録のLM73を使う [電子工作]

Arduino で エレキジャック No.8 「一冊まるごとマイコン入門だ!」に付属の温度センター、LM73を動かしてみました。

(1) LM73基盤を完成させる

LM73は付録の基板上に既に固定されていますが、ピンが無いのでそのままではブレッドボードに刺さりません。記事の説明にある通り、ピンヘッダとバスコン用のコンデンサ(0.1μ)を半田付けします。
この作業に入るまでに、我が家には半田ごてが無かったのですが(最後に半田を使ってから20年ぐらい?)、そんな私でも見てくれが悪いですが何とか成功しました。

ブレッドボード上のLM73


よく見ると中央に「T731」のマーキングがあります。エレキジャックのp.164をみると「T730」と「T731」ではスレーブアドレスが異なるようです。今回は「T731」でフロート(無接続)なので、ステー部アドレスは 1001 100になります。

(2) ブレッドボードで Arduino と接続する。

ArduinoはI2Cをサポートしているので、マニュアルの通りSDAをアナログ・インプット4に、SCLをアナログ・インプット5に接続します。またそれぞれ 1KΩの抵抗でプルアップしています。このあたりは知識が不足しているので、接続などは心配なところですが、記事を参考にして何とか回路が組みあがりました。

(3) Arduinoプログラミング

ArduinoのCPU、ATmega168は石のレベルでI2Cをサポートしているようです。Arduinoでこの機能を使うために Wire ライブラリがそのまま利用できます。
Wireライブラリについてはあまり丁寧に書かれた資料が見つけられませんでした。一番参考になったのはやはり船田戦闘機さんのArduino日本語リファレンスでした。

下記が作成したソースファイルになります。

//
// LM73_test1
// sample program for reading LM73
// 
//   Figure.1 LM73を搭載したエレキジャックNo.8の基盤のイメージ図
//
//              --------------                           
//              |    LM73    |                           
//              |O          O|<-SDA                        
//              |    =--=    |                           
//         GND->|O   =  =   O|                           
//              |    =--=    |                           
//         VDD->|O    C1    O|<-SCL                          
//              |    -||-    |                           
//              |            |                           
//              --------------                           
//     
//  NOTE:
//  Arduino analog input 5 - I2C SCL
//  Arduino analog input 4 - I2C SDA
//

#include 

#define LM73_ADDR 0x4c          // 2進数なら 1 0 0 1   1 0 0

int ret;

void setup()                    // run once, when the sketch 
{
  Wire.begin();
  Serial.begin(9600);
  delay(1000); // デバック用
  
  Wire.beginTransmission(LM73_ADDR);
  Wire.send((byte)0x04);  // Control/Status Registerを選択
  Wire.send(0x60);        // 14 bits modeにセットする
  ret=Wire.endTransmission();

  Wire.beginTransmission(LM73_ADDR);
  Wire.send(0x00);        // 次の通信のため温度レジスターをセットする。
  ret=Wire.endTransmission();
  delay(100); // 次の読み取りまで念のため0.1秒間をあける
  
}

void loop()                     // run over and over again
{

  int data=0 ;

  Wire.beginTransmission(LM73_ADDR);
  ret=Wire.requestFrom(LM73_ADDR, 2);
  
  data = 0;
  if (Wire.available()) { // 1バイト目読み取り
    data = Wire.receive();
  } else {
    Serial.println("Wire not available.");
  }
  if (Wire.available()) { // 2バイト目読み取り
    data = (data << 8 )| Wire.receive() ;
  }
    
  ret=Wire.endTransmission();
  
  printdata(data); // シリアルへ温度データを送る
  delay(2000);

}
void printdata(int data){
  
  int data2;
  int data3;
  float data_f;
  
  boolean negative=false;

  if (data < 0 ) {  // マイナスならbooleanにtrueをセットしプラスに変換
    negative=true;
    data = -data; 
  }

  data2 = data >> 7; // 小数値切り捨て

  data_f = (float)(data >> 2 ) / 32;
  data_f = data_f - data2 ;

  data3 = data_f * 100 ;

  Serial.print ("Current temperature is "); 
  if (negative) {
    Serial.print("-");
  }
  Serial.print(data2);
  Serial.print(".");
  Serial.print(data3/10);
  Serial.print(data3 % 10);
  Serial.println(" C. ");

}



(4) 完成!

こちらが実行時のイメージです。LM73から取得したセンサーの値をシリアル経由でPCのコンソール(例では Arduino のIDE内のコンソール)に表示させています。

LM73_test.jpg

応用として取得した温度を7セグのLEDに表示させてみました。
鋭意バージョンアップ中なのでソースは割愛しますが、正しく温度が表示されているようです。

RIMG0906_small.JPG

Arduinoを使うことで、かなり簡単にここまでこぎつけることができました。


エレキジャック 2008年 10月号 [雑誌]

エレキジャック 2008年 10月号 [雑誌]

  • 作者:
  • 出版社/メーカー: CQ出版
  • 発売日: 2008/09/04
  • メディア: 雑誌



参考リンク

・Arduino日本語リファレンス
・温度センターLM73を使ってみる
・Keith's Electronics Blog ~Arduino I2C Expansion~





nice!(1)  コメント(0)  トラックバック(1) 
共通テーマ:趣味・カルチャー

nice! 1

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 1

-|SX-150キター! ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。