2012年8月13日月曜日

Arduino と GR-SAKURA I2C編1 秋月RTCモジュール

 以前に Arduinoで試した秋月のI2C接続RTCモジュールをGR-SAKURAで試してみました。ソース(スケッチ)もほぼそのままで動きました。



 ソースはこんな感じ。

#define RXDUINO

#ifdef RXDUINO
#include <rxduino.h>
#else
#include <Arduino.h>
#endif

#include <Wire.h>

#define RTC_ADDRESS (0xa2 >> 1)

int rtc[16];

void setup() {
    
    // シリアルポートを9600bpsで開始。
    Serial.begin(9600);
    // 受信バッファにデータが入るまで待機。
    while (Serial.available() == 0);        
    Serial.println("Initializing...");
    // 一旦、受信バッファにデータがあれば、
    if (Serial.available() > 0) {
        // 読み込んで、廃棄。
        char c = Serial.read();
    }
    Serial.println("Initializing RTC unit...Please wait...");
    delay(1000);
    
    // Bus-MasterとしてI2Cを開始。
    Wire.begin();
    
    // RTCへの送信準備開始。
    Wire.beginTransmission(RTC_ADDRESS);
    // はじめにアドレス0x00を指定。次からはオートインクリメント。
    Wire.write(0x00);
    // コントロールレジスタ1。
    Wire.write(0x00);
    // コントロールレジスタ2。
    Wire.write(0x00);
    // 秒レジスタ。とりあえず、58秒。
    Wire.write(0x58);
    // 分レジスタ。とりあえず、59分。
    Wire.write(0x59);
    // 時レジスタ。とりあえず、23時。
    Wire.write(0x23);
    // 日レジスタ。とりあえず、13日。
    Wire.write(0x13);
    // 曜日レジスタ。とりあえず、月曜日。
    Wire.write(0x01);
    // 月レジスタ。とりあえず、8月。
    Wire.write(0x08);
    // 年レジスタ。取りあえず、12年。
    Wire.write(0x12);
    // アラーム設定。なし。
    Wire.write(0x00);
    Wire.write(0x00);
    Wire.write(0x00);
    // Clock出力設定。1Hz。
    Wire.write(0x83);
    // キューの送信。通信終了。
    Wire.endTransmission();    
    
    delay(20);
    Serial.println("RTC Initialized.");
}

void loop() {
    
    // I2C通信開始。
    Wire.beginTransmission(RTC_ADDRESS);
    // レジスタアドレス0x00を指定。
    Wire.write(0x00);
    // キューの送信。
    Wire.endTransmission();
    
    // データ要求。
    Wire.requestFrom(RTC_ADDRESS, 16);
    // データ受信。
    for (int i = 0; i < 16; i++) {
        while (Wire.available() == 0);
        rtc[i] = Wire.read();
    }
    
    // (西暦)年。以下、数値類はBCD。
    Serial.print("20");
    Serial.print(rtc[8], HEX);
    Serial.print("/");
    // 月。下位9bit。
    Serial.print(rtc[7] & 0x1f, HEX);
    Serial.print("/");
    // 日。下位10bit。
    Serial.print(rtc[5] & 0x3f, HEX);
    Serial.print(" ");
    // 曜日。
    switch (rtc[6] & 0x07) {
        case 0:
            Serial.print("Sun");
            break;
        case 1:
            Serial.print("Mon");
            break;
        case 2:
            Serial.print("Tue");
            break;
        case 3:
            Serial.print("Wed");
            break;
        case 4:
            Serial.print("Thr");
            break;
        case 5:
            Serial.print("Fri");
            break;
        case 6:
            Serial.print("Sat");
            break;
        default:
            Serial.print("   ");
            break;
    }
    Serial.print("   ");
    // 時。
    Serial.print(rtc[4] & 0x3f, HEX);
    Serial.print(":");
    // 分。
    Serial.print(rtc[3] & 0x7f, HEX);
    Serial.print(":");
    // 秒。
    Serial.print(rtc[2] & 0x7f, HEX);
    Serial.println();
    
    delay(200);
    
}

このI2C RTCモジュールは3.3Vでも5Vでも動く(基本は3.3V用かな?)ので電源電圧も気にしない(3.3Vから取らなきゃだめだけど)でいいので、Arduino、GR-SAKURA(RaXino)でもどちらでも使えていいですね。I2C接続タイプのものはそういうのが多いのかな?というか、だんだんと低電圧化しているんだろうけど、自分はRaXino使うまでは5Vマイコンばっかりだったから、慣れないです。そのうち、5Vを3.3V系に突っ込んで、なにか壊したりしそうな予感。