Wire(I2C)はArduino 1.0では修正が必要
Arduino IDEが新しくArduino 1.0になりました。また、Arduino Uno R3が発売されピンソケットのピン数が増え、I2CのSCL、SDAがA4、A5のアナログ入力端子以外にもSCL、SDA用に専用の端子が追加されました。
次の写真は、Arduino Uno R3を使用したリアルタイム・クロックRTC-8564NBの時刻設定のテスト回路です。
Arduinoから出ている黄色と緑のラインがSDA(黄)、SCL(緑)がR3のボードになってから新しく追加されたWireライブラリで使用されるSDAとSCL端子から引き出されているI2Cの信号線です。
Arduino Uno R3の裏面の様子
Arduino Uno R3の裏面の表示を次に示します。ピンソケットの左端にSDA、SCLの新しく追加された端子の表示があります。
ボードのモデルがUNO R3との表示もあります。
今まで作成したスケッチもWire(i2C)のライブラリのsend関数とrecieve関数を使用していたものは、
send --> write
recieve --> read
に変更しなければなりません。
今回は、R3のボードで追加された新しいSCLとSDAの端子を利用し、Arduino 1.0で新しくなったWireライブラリを使用してみます。
RTC-8564NBの読み書き
Arduino 1.0の新しくなったWire(I2C)ライブラリ用にスケッチを修正します。修正してArduino 1.0で動作確認したスケッチを次に示します。
RTC-8564の2~8までのアドレスのレジスタを呼び出し、その下位4ビットをHEX表示で表示しその値をカウントアップした値を書き込み、再度読み出し表示していますヘッダ・ファイルの読み込み、変数などの定義部 LiquidCrystal.h およびWire.h のヘッダ・ファイルを呼び出します。
次に、RTC8564_ADDRESSにRTCのI2Cのアドレス0x51を設定しています。byte adr0=0;はWire.write()関数でレジスタ・アドレスに0を指定するとき直接数値を指定するとデータの型のエラーが出るため、byte型の変数adr0を定義し初期値として0をセットし0の定数として利用しています。
#include <LiquidCrystal.h>RTCの値を1バイト読み出す関数#include <Wire.h> byte RTC8564_ADDRESS=0x51;
byte indata;byte adr0=0;
LiquidCrystal lcd(2,3,4,5,6,7);
RTC8564からデータを1バイト読み取る関数です。関数の型はbyte型です。RTC8564のアドレスを指定し、I2CインターフェースでRTC8564にアクセスしdata_noにセットされたアドレスを指定して該当レジスタが読み書きできるようにします。その後、該当レジスタの値を読み出します。
byte get_RTC8564_data(byte data_no){
Wire.beginTransmission(RTC8564_ADDRESS);
Wire.write(data_no); // sendをwriteに変更
Wire.endTransmission();
byte n=1;
Wire.requestFrom(RTC8564_ADDRESS,n);
return Wire.read(); // recieve をreadに変更
}
RTCのレジスタに値をセットする関数
data_noで指定したRTC8564のレジスタに1バイトのset_dataを書き込む関数です。RTC8564のアドレスを指定してI2C通信を開始し、RTC8564にレジスタ・アドレスと書き込みデータを1バイト書き込み完了しています。
void set_RTC8564(byte data_no,byte set_data){
Wire.beginTransmission(RTC8564_ADDRESS);
Wire.write(data_no); // sendをwriteに変更
Wire.write(set_data); // sendをwriteに変更
Wire.endTransmission();
}表示位置を指定してLCDに1文字データを書き込む関数
byte pos_col,byte pos_rowで指定された16文字2行表示のLCDモジュールに1バイトのデータを表示する関数。書き出すデータはp_dataにセットしてこの関数に渡す。blink_modeを1にすると表示を指定した場所が点滅します。
void lcd_print_set(byte p_data,byte pos_col,byte pos_row,byte blink_mode){
lcd.setCursor(pos_col,pos_row);
if( blink_mode==1){
lcd.blink();}
else{
lcd.noCursor();
}
lcd.print(p_data,HEX);
lcd.setCursor(pos_col,pos_row);
} 以下はプログラム本体部分
void setup(){
lcd.begin(16,2);
Wire.begin();
Wire.beginTransmission(RTC8564_ADDRESS);
Wire.write(adr0); // sendをwriteに変更
Wire.write(adr0); // sendをwriteに変更
Wire.endTransmission();
}
void loop(){
for (byte i=2;i<9;i++){
lcd.setCursor(0,1);
lcd.print("Radr");
lcd_print_set(i,6,1,0);
indata=get_RTC8564_data(i)& 0x0F;
lcd.setCursor(9,1);
lcd.print("R");
lcd_print_set(indata,12,1,1);
delay(3000);
indata++;
set_RTC8564(i,indata);
indata=get_RTC8564_data(i)&0x0F;
lcd.setCursor(9,1);
lcd.print("W");
lcd_print_set(indata,12,1,0),
delay(3000);
}
delay(3000);
} 次回、実際の動作確認を行います。





コメントする