過去の投稿日別表示

[ リスト | 詳細 ]

全1ページ

[1]

イメージ 1

このZS-042というモジュールは、リアルタイムクロック(RTC)のDS3231とEEPROMのAT24C32が載っている。
I2Cで、それぞれ別々にアクセスでき、時刻とともに計測データなどを記録するのに便利になってる。
I2Cのアドレスは、RTCが0x68、EEPROMが、何もしなければ0x57。
DS3231の精度は、±2ppm (0℃〜+40℃)となっていて、最大で年1分程度の狂いなので、そこそこの値段の腕時計と同じくらいになる。
また、消費電流は、時間を保持するだけなら1μAなので、ボタン電池が200mAhだとすると、20年くらいは計時し続ける計算になる。

 
DS3231は、電圧は、2.3−5.5V。推奨3.3V。
バックアップのバッテリ電圧は、2.3−5.5V。推奨3.0V。
ピンは、32K、SQW、SCL、SDA、VCC、GND。
(反対側にあるターミナルは、I2Cのカスケード用)
32Kは、FLAGをセットすることで、32KHzのパルスが出力される。
SQWは、FLAGでアラームをセットすることで、設定時刻になると
これもFLAGでセットされた周波数の方形波が出力される。
データの内容は、下記のようになる。
00h 秒:上4ビットの下3ビットが10の位、下4ビットが1の位。
01h 分:上4ビットの下3ビットが10の位、下4ビットが1の位。
02h 時:上4ビットが0、12/24=1、AM/PM、10の位、
または、  0、12/24=0、20の位、10の位、
               下4ビットが1の位。
03h 曜日:下3ビット。ユーザーが決める。
04h日:上4ビットの下2ビットが10の位、下4ビットが1の位。 
05h月:上4ビットの上1ビットが世紀、下1ビットが10の位、下4ビットが1の位。
06h年:上4ビットが10の位、下4ビットが1の位。 
07h-0Ah:ALARM 1
0Bh-0Dh:ALARM 2
0Eh-0Fh:制御/ステータス
10h:オフセット値
11h-12h:温度

Arduinoのライブラリ。DS1307用だけど使えるようだ。
http://www.pjrc.com/teensy/td_libs_DS1307RTC.html
PCの時刻をセットできるので便利。
DS1307とTIMEの両方をArduinoのライブラリに入れて、
サンプルの「settime」を実行すればPCの時刻がセットされる。

AT24C32は、32Kビット=4KバイトのEEPROM。
A0、A1,A2(写真の右下にある)は、短絡することでEEPROMの下位アドレスを変更できる。
デバイスアドレスは、1010、A2、A1、A0、R/W。(W=0、R=1)。
具体的には、何もしなければ0x57。A0を半田などで短絡させると最下位が0になるので、
アドレスは、0x56になる。これは、EEPROMを複数使う時に使い分けるためにあるので、
1つだけなら、何もしないで使える。
書き込みは、デバイスアドレス+ワードアドレス2バイト+データ
読み込みは、データなしで書き込んだ後に、デバイスアドレスでリードする。

使い方はこんな感じ。
EEPROMのデータアドレス0に”A”を書き込んで、
アドレス0を読みだして、シリアルに表示しているだけ

#include <Wire.h>
#define address 0x57

byte data;
void setup()
 Wire.begin();
 Serial.begin(9600);
 delay(1000); 

 //WRITE!!!!*******************************
 Wire.beginTransmission(address);
 Wire.write(0x00);      //First Word Address
 Wire.write(0x00);      //Second Word Address

 Wire.write(0x41);      //Write an 'A'

 delay(10);

 Wire.endTransmission();
 delay(10);

 //READ!!!!*********************************
 Wire.beginTransmission(address);
 Wire.write(0x00);      //First Word Address
 Wire.write(0x00);      //Second Word Address
 Wire.endTransmission();
 delay(10);

 Wire.requestFrom(address, 1);
 delay(10);
 data = Wire.read();
 Serial.write(data);      //Read the data and print to Serial port
 Serial.println();
 delay(10);
}

void loop()
{
}

この記事に

開く コメント(0)

開く トラックバック(0)

全1ページ

[1]


.


みんなの更新記事