[[Arduino勉強会]]

#contents

2016/01/03からのアクセス回数 &counter;

** LM73 [#qc8149fe]
I2Cの動作確認は、いつも使っている温度センサーLM73でテストしてみることにします。
((このLM73は、エレキジャックNo.8「一冊まるごとマイコン入門だ!」の付録です。))


LM73は入手が難しいとのご指摘がありますので、後ほど秋月で購入可能な温度センサーADT7410を使った例も示します。

プログラムの動作確認は自分が一番経験のある部品でするのが、良いと思うのです。



*** ピン接続 [#ua183185]
ピンの配置1番ピンから反時計回りに採番


| ピン番号 | 機能 | Arduinoのピン |h
| 1 | 未使用 | - |
| 2 | GND | GND |
| 3 | 3.3V | 3.3V |
| 4 | SCL | A5 |
| 5 | 未使用 | - |
| 6 | SDA | A4 |





Arduinoとの接続は以下の様になります。

&ref(Arduino_LM73.png);



*** スケッチ [#wf781ebb]
今回は、
[[初心者の電子の館>http://fromgoldenwells.blog.so-net.ne.jp/2008-12-30]]
のスケッチを使わせて頂きました。
Wireライブラリは古いバージョンだったので、少し修正しました。

#pre{{
#include "Wire.h"

#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.write((byte)0x04);  // Control/Status Registerを選択
  Wire.write(0x60);        // 14 bits modeにセットする
  ret=Wire.endTransmission();

  Wire.beginTransmission(LM73_ADDR);
  Wire.write(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()) {
    data = Wire.read();
  } else {
    Serial.println("Wire not available.");
  }
  if (Wire.available()) {
    data = (data << 8 )| Wire.read() ;
  }
   
  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. ");
}
}}

どういうわけか、シリアルモニターは9600ボーの半分4800ボーにセットしないと
文字化けしました。

&ref(9600baud.png);



不思議なことに4800ボーにセットすると正しく読み取れます。


&ref(4800baud.png);




** ESP8266でLM73を使う [#l150ee96]
ArduinoでのLM73の動作が確認できたので、LM73をESP8266に接続して同じスケッチを動かしてみます。

*** I2C用のピンについて [#u33c3cc6]
ネットで調べるとESP8266のI2C用のピンが色々変わっていて混乱していたところ、
macsbugさんの
[[ESP8266 と I2C>https://macsbug.wordpress.com/2015/10/23/esp8266-%E3%81%A8-i2c/]]
によると、0,2,4,5,12,13,14のすべてのピンの組み合わせでI2Cが動いたとの記事がありました。


今回は、SCL=IO14、SDA=IO4を使用することにしました。



| ピン番号 | 機能 | ESP8266のピンNo |h
| 1 | 未使用 | - |
| 2 | GND | 9 (GND) |
| 3 | 3.3V | 1 (3.3V) |
| 4 | SCL | 3(IO14) |
| 5 | 未使用 | - |
| 6 | SDA | 10(IO4) |


ESP8266のWireを使う場合、最初にI2Cに使用するピンをsetupでセットする必要があります。


#pre{{
void setup() {
     Wire.begin(4, 14);     // begin(SDA, SCL);のように指定
}}


** ESP8266でLBEDを使ってみる [#j38fae6b]
Arduino版LBEDは、I2CのWire関連をライブラリの外に出すことにしたので、
ESP8266版Arduino IDEでも使うことができるようになりました。

*** 秋月で購入できる温度センサーADT7410を使う [#d58f373c]
ADT7410とESP8266との接続には、ESP8266版lbeDuinoのD8(SDA)とD9(SCL)と
ADT7410のSDA、SCLをそれぞれ接続します。
ADT7410にモジュール内にプルアップの抵抗が付いていますが、今回はブレッドボードの4.7KΩの抵抗を付けてプルアップしています。

&ref(ESP8266_ADT7410.png);



ADT7410のライブラリには、
Tom Kreycheさんがmbed用に公開されている
[[ADT7410ライブラリ>https://developer.mbed.org/users/tkreyche/code/ADT7410/]]
を使わせてもらいます。

ADT7410ライブラリの修正箇所は、ADT7410.hのmbed.hのインクルード文をlbed.hに変更するだけです。
#pre{{
// #include "mbed.h"
#include "lbed.h"
}}

スケッチは、以下の様にします。たったこれだけでADT7410温度センサーが使えるようになります。

#pre{{
#include "Wire.h"
#include "lbed.h"
#include "ADT7410.h"

ADT7410 healthThemometer(D8, D9, 0x90, 400000);

void setup() {
  Wire.begin(4, 14); // Wire.begin();
  Serial.begin(9600);
  healthThemometer.setConfig(ONE_SPS_MODE);
}

void loop() {
  float temp = healthThemometer.getTemp();
  Serial.print("Current temperature is ");
  Serial.print(temp, 2);
  Serial.println(" C. ");
  wait_ms(1000);
}
}}


*** I2CLcdシールド [#ef840150]
ESP8266版lbeDuinoは、使えるピンが少ないので、Arduinoピン変換シールドを使って
D2をD12に、D3をD5に付け替えて実行します。


&ref(I2CLcd.png);






スケッチは、以下のとおりです。
#pre{{
#include "Wire.h"
#include "lbed.h"
#include "AQCM0802.h"

// D13番ピンにLEDを接続
DigitalOut     led(D13);
// D8番ピンSDA, D9番ピンSCL. ArduinoではハードI2Cを使用している。
AQCM0802     lcd(D8, D9);
// タクトスイッチ
DigitalIn     sw1(D5);
DigitalIn     sw2(D12);

void setup() {
     // ESP8266では、D8に4(SDA), D9に14(SCL)が接続されている
     Wire.begin(4, 14);    // Wire.begin();     sw1.mode(PullUp);
     sw2.mode(PullUp);
     lcd.setup();
     lcd.print("I2C LCD");
}

void loop() {
     led = !led;
     lcd.locate(0, 1);
     
     if (!sw1) {
          lcd.print("SW1 On ");
     }
     else if (!sw2) {
          lcd.print("SW2 On ");
     }
     else {
          lcd.print("All Off");
     }
     wait_ms(1000);
}

}}


*** BME280温度・湿度・気圧センサ [#m3d9bfae]
I2CLcdが動けば、その他のI2Cセンサも動くはずです。


&ref(BME820.png);





#pre{{
#include "Wire.h"
#include "lbed.h"
#include "AQCM0802.h"
#include "BME280.h"

// D13番ピンにLEDを接続
DigitalOutled(D13);
// D8番ピンSDA, D9番ピンSCL
AQCM0802lcd(D8, D9);
BME280sensor(D8, D9);

// タクトスイッチ
DigitalIn     sw1(D5);
DigitalIn     sw2(D12);

intlast_mode = 0;
chardegree = 0xdf;
void setup() {
     // ESP8266では、D8に4(SDA), D9に14(SCL)が接続されている
     Wire.begin(4, 14);    // Wire.begin(); 
     sw1.mode(PullUp);
     sw2.mode(PullUp);
     lcd.setup();
     sensor.setup();
     lcd.locate(0, 0); lcd.print("BME280");
     lcd.locate(0, 1); lcd.print("Demo");
     wait_ms(2000);
}

void loop() {
     led = ! led;
     if (sw1 == 1) {
        if (last_mode == 0)
            lcd.cls();
        lcd.locate(0, 0);
        lcd.print(sensor.getTemperature(), 2);
        lcd.print(degree); lcd.print("C");
        lcd.locate(0, 1);
        lcd.print(sensor.getHumidity(), 2); lcd.print("%");
        last_mode = 1;
    }
    else {
        if (last_mode == 1)
            lcd.cls();
        lcd.locate(0, 0);
        lcd.print(sensor.getTemperature(), 2);
        lcd.print(degree); lcd.print("C");
        lcd.locate(0, 1);
        lcd.print(sensor.getPressure(), 2); lcd.print("hPa");
        last_mode = 0;
    }
    wait_ms(1000);
}

}}


** ESP8266版LBEDソース [#u8fa0b69]
ESP8266版で使ったlbedライブラリのソースを添付します。
ユーザのArduino用ディレクトリ/librariesに以下を展開して、
lbeDuino, lbeDuinoUserをコピーしてください。


- &ref(Arduino_lbed.zip);





** まだ途中ですが公開します。 [#n5d14668]


#vote(おもしろかった[2],そうでもない[0],わかりずらい[0])
#vote(おもしろかった[3],そうでもない[0],わかりずらい[0])


皆様のご意見、ご希望をお待ちしております。勉強会で分からなかったこと等、お気軽に問い合わせて下さい。

スパム防止に画像の文字列も入力してください。
#comment_kcaptcha


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc