Arduinoと戯れる!

Arduino 入門 Lesson 51 【Real Time Clock モジュール その2】

arduino-lesson51-00Arduino入門編
スポンサーリンク
子供と一緒に始める マイコンプログラム
Arduino 入門
Lesson 51
【Real Time Clock モジュール その2】

こにんちは、管理人のomoroyaです。

センサーの使い方の基本を学習する入門編。

 

世の中には、まだまだ色々なセンサーがあります。

これからも、色々なセンサーで遊んでいきます。

 

本記事はLesson 51 【Real Time Clock モジュール その2】です。

せっかくRTCモジュールを理解したのだからデジタル時計を作らないとですよね。

ということで、【Real Time Clock モジュール その2】です。

 

Lesson 50で学習しましたがもう一度。

RTCモジュールとは、時刻を告げることを目的とした電子デバイスが搭載されている時計。

その機能を実装したIC(集積回路)のこと。

この機能があれば、デジタル時計なんかも作れます。

組み合わせる対象は表示器であればなんでもOK。

例えば、入門編で解説している下記を使ってみるのもあり。

Arduino 入門 Lesson 16 【LCD モジュール編】
「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。本日はLesson 16 LCD モジュール編です。「1602 LCD モジュール」の使い方を学習します。LCDモジュールの使い方を学習できれば、他の電子部品で得…
Arduino 入門 Lesson 25 【4桁7セグメントLED編】
4桁7セグメントLEDは、1桁7セグメントLED4つを一つのモジュールにした電子部品です。基本的な原理は1桁7セグメントLEDと同じです。各桁に個別の値を表示させるためにはダイナミック点灯方式を採用する必要があります。本記事でダイナミック点…

 

本LessonではLesson 25で使用した「4桁7セグメントLED」を使ってデジタル時計を作ってみます。

 

本Lessonで使用する「Real Time Clock モジュール」は以下が同等品となります。
※搭載IC:DS1302 prime対応品 出荷元:Amazon

 

電池はCR2032 をご用意ください

 

Arduino入門編の解説にて使用しているArduinoは互換品です。

互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

正規品の本体単品がほしい方はこちらとなります。

 

スポンサーリンク

はじめに

本LessonはLesson 50で学習した内容とLesson 25で学習した内容の合わせ技になります。

 

4桁7セグメントLED」を使用します。

表示できるのは4桁のみ。

RTCモジュールに搭載されている「DS1302」から引っ張り出すデータは下記で示す「時レジスタ」「分レジスタ」のみ。

それ以外は、本Lessonでは使用しません。

  • 秒レジスタ:00~59
  • 分レジスタ:00~59
  • 時レジスタ:01~12(12時間制)/00~23(24時間制)
  • 日レジスタ:01~31
  • 月レジスタ:01~12
  • 曜日レジスタ:1~7
  • 年レジスタ:00~99
  • ライトプロテクトレジスタ

 

Lesson 50でもお伝えしましたがデータシートは下記で閲覧可能です。

秋月電子で「DS1302」を検索。

秋月電子通商 - 電子部品・半導体 【通販・販売】
株式会社秋月電子通商(電子部品の通販、販売)のページです…

 

もしくは、直接メーカーページを確認。(※メーカーページでDS1302で検索)

Attention Required! | Cloudflare

 

Lesson 51 目標

本Lessonの目標は以下です。

1.RTCモジュール、4桁7セグメントLEDの使い方を復習
2.RTCモジュールと4桁7セグメントLEDの2つを制御する
3.デジタル時計を作って遊ぶ

いつものように、遊ぶことが重要です。

 

動作の理屈を理解するためにはデータシートを読み込む必要があり!

回路がわからなくても遊べる、使える、作れるのがArduino の良いところ。

もちろん、データシート読めなくても遊べます。

 

準備

ではLessonの準備に取り掛かりましょう。

使用する電子部品は「RTCモジュール」「4桁7セグメントLED」「8bitシフトレジスタ」の3つ。

8bitシフトレジスタで使用するは「SN74HC595N」。

入門編としては、いつもより電子部品が多いですが楽しく遊んでいきましょう。

 

必要なもの

※ブレッドボードはセンサとUNOを直接つなぐ場合不要です。
※ジャンパワイヤーは「M-M」「M-F」を必要に応じて使い分けてください。

 

Jumper wire、抵抗は今後も頻繁に利用します。

Jumper wireはできれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。

短めが使いやすい場合も。

 

使用部品説明

RTCモジュール」の詳細は・・・
 ⇒ Arduino 入門 Lesson 50 【Real Time Clock モジュール】

4桁7セグメントLED」の詳細は・・・
Arduino 入門 Lesson 25 【4桁7セグメントLED編】

8bitシフトレジスタ」の詳細は・・・
Arduino 入門 Lesson 20 【8bitシフトレジスタによる複数LED制御編】

をご確認ください。

実物写真だけ載せておきます。

 

RTCモジュール「DS1302」 実物写真

RTCモジュールの実物写真。

Arduino 入門 Lesson 50 【Real Time Clock モジュール】

arduino-lesson50-01

 

4桁7セグメントLED 実物写真

こちらが「4桁7セグメントLED」の実物写真。

Arduino 入門 Lesson 25 【4桁7セグメントLED編】

arduino-lesson25-01

 

8bitシフトレジスタ 実物写真

こちらが「8bitシフトレジスタ」の実物写真。
型番:「SN74HC595N

Arduino 入門 Lesson 20 【8bitシフトレジスタによる複数LED制御編】

Arduino-lesson20-01

 

各電子部品 仕様

各電子部品の仕様も各Lessonにてご確認ください。

RTCモジュール」の仕様詳細は・・・
 ⇒ Arduino 入門 Lesson 50 【Real Time Clock モジュール】

4桁7セグメントLED」の仕様詳細は・・・
Arduino 入門 Lesson 25 【4桁7セグメントLED編】

8bitシフトレジスタ」の仕様詳細は・・・
Arduino 入門 Lesson 20 【8bitシフトレジスタによる複数LED制御編】

 

スケッチでRTCモジュールに搭載されている「DS1302」のRead/Writeを制御するためには「shiftOut関数」がとても便利です。

今一度、復習しておきましょう!

 

実践 回路作成とコード作成

本Lessonでは、「ライブラリ」を使用しないスケッチとなります。

これまでの復習を兼ねて一から見直しです!

 

最初に回路図を確認してください。

次に、回路図に合わせて部品を接続します。

最後にコードを書いて、デジタル時計を作っていきましょう。

 

Arduinoのピン配置を確認したい方は番外編02を参照してください。

 

回路図

RTCモジュール」「4桁7セグメントLED」「8bitシフトレジスタ」をそれぞれ接続していきます。

Arduinoはデジタル入出力ピンの8、9、10、11、12、13を使用。

あとは、5VGNDのみ。

 

回路図がこちら。

arduino-lesson51-01

 

こちらがブレッドボード図。

arduino-lesson51-02

 

回路図は「fritzing」を利用しています。

「fritzing」の使い方は下記を参照してください。

 

接続

下図に示すように、用意した部品を使用して接続しましょう。

部品は「RTCモジュール」「4桁7セグメントLED」「8bitシフトレジスタ」の3つ。

配線が、かなりややこしいですが・・・

Lesson 25の復習と思って接続していきましょう。

RTCモジュール」と接続するジャンパーワイヤーはF-Mを使用してます。

 

使用するポートは、デジタル入出力ピンの8、9、10、11、12、13、5V、GND。

穴に挿入しづらいときは、ラジオペンチなどを使用してください。

配線が、かなりごちゃごちゃしています・・・。

arduino-lesson51-03

 

コードの書き込み

接続が終わったら、USBケーブルを使用してUNOにプログラムを書き込んで行きましょう。

コードを書き終えたら、いつでも利用できるように「ファイル」⇒「名前を付けて保存」で保存しておきましょう。

コマンド説明

これまで学習してきた関数しか使いません。

新しいコマンドはなし

 

スケッチを見て、よくわからない場合は・・・

下記の記事にて「関数化」「shifutOut関数」について復習しておきましょう。

長いスケッチを描く場合、繰り返し使用するコードは関数化が必須です。

 

ライブラリを使わずにRead/Writeを制御するためには「shiftOut関数」がとて便利です。

 

サンプルコード

Lesson 50Lesson 25にて学習したスケッチを足し合わせてデジタル時計となるように手直し。

といったイメージのサンプルスケッチになります。

  • Lesson 50のスケッチにてレジスタから時間を取り出し
  • Lesson 25のスケッチを使って時間を「4桁7セグメントLED」に表示させる

といった具合。

 

上記をふまえて、下記サンプルスケッチを確認ください。

入門編にしては、いくばくか長いスケッチです。

これまでの組み合わせと思えば・・・何とかなる!

//Lesson 51 デジタル時計を作って遊ぶスケッチ
//https://omoroya.com/
//使用部品について解説しているLesson
//RTCモジュール:https://omoroya.com/arduino-lesson50/
//4桁7セグメントLED:https://omoroya.com/arduino-lesson25/
//8bitシフトレジスタ:https://omoroya.com/arduino-lesson20/

// Pin No. (for RTC Module)
const int clkPin = 8;  //DS1302:SCLKピン
const int datPin = 9;  //DS1302:I/Oピン
const int rstPin = 10; //DS1302:CEピン

// Pin No.(for 8bit shift register)
const int rclkPin  = 12;  // (12) ST_CP [RCLK] on 74HC595
const int srclkPin = 11;  // (11)  SH_CP [SRCLK] on 74HC595
const int dsPin    = 13;  // (13) DS [SER] on 74HC595
const int dig1 = 1;       // DIG1を1番ピンに割り当て
const int dig2 = 2;       // DIG2を2番ピンに割り当て
const int dig3 = 3;       // DIG3を3番ピンに割り当て
const int dig4 = 4;       // DIG4を4番ピンに割り当て

// 変数の設定
int tDelay = 1;   // 1ms遅延設定←ここの時間で4桁7セグメントLED表示調整

// seven_ledsをbyte型として定義
// 配列にDisplay表示用のデータ0~9と全消灯を設定
// 1 = LED on, 0 = LED off
byte seven_leds[12] =       { B11111100,  // 0
                              B01100000,  // 1
                              B11011010,  // 2
                              B11110010,  // 3
                              B01100110,  // 4
                              B10110110,  // 5
                              B10111110,  // 6
                              B11100000,  // 7
                              B11111110,  // 8
                              B11100110,  // 9
                              B00000001,  // D.P 
                              B00000000,  // OFF
                             };


//シフトレジスタ部分の関数
void funcShiftReg(int x)
{
  digitalWrite(rclkPin, LOW);                         //送信中のRCLKをLowにする
  shiftOut(dsPin, srclkPin, LSBFIRST, seven_leds[x]); //シフト演算を使って点灯するLEDを選択
  digitalWrite(rclkPin, HIGH);                        //送信終了後RCLKをHighにする
}

// Single-Byte Write関数 「時刻の初期値設定」
void s_b_write(int command, int data){
  pinMode(datPin,OUTPUT);                      //DAT(I/O)のOUTPUT指定
  digitalWrite(clkPin, LOW);                   //クロック "L" L始まりを確定させるため
  digitalWrite(rstPin, HIGH);                  //RSTピン(CE) "H" アクセスを許可
  shiftOut(datPin, clkPin, LSBFIRST, command); //コマンド送信(日時格納アドレス)
  shiftOut(datPin, clkPin, LSBFIRST, data);    //データ書き込み(設定日時のデータ)
  digitalWrite(rstPin, LOW);                   //RSTピン(CE) "L" アクセス終了
  pinMode(datPin, INPUT);                      //DAT(I/O)をINPUTへ戻す
}

//Single-Byte Read関数 「時刻の読み出し」
int s_b_read(int command){
  int bit = 0;
  int data = 0;
  digitalWrite(clkPin, LOW);                   //クロック "L" L始まりを確定させるため
  digitalWrite(rstPin, HIGH);                  //RSTピン(CE) "H" アクセスを許可
  shiftOut(datPin, clkPin, LSBFIRST, command); //コマンド送信(日時格納アドレス)
  //data(日時)の読み取り動作 8回繰り返し8bitぶん読み出す
  for (int i = 0; i < 8; ++i)                  //8回繰り返し
  {
    bit = digitalRead(datPin);                 //DAT(I/O)の値を読み取り
    //データの統合処理
    data |= (bit << i); //bitシフトさせて、前のデータとのORどり  //clkをH->Lさせてトグルさせる
    digitalWrite(clkPin, HIGH);                //クロック "H"
    delayMicroseconds(1);                      //クロック"H"期間 1usに設定
    digitalWrite(clkPin, LOW);                 //クロック "L"
  }
  digitalWrite(rstPin, LOW);                   //RSTピン(CE) "L" アクセス終了
  return(data);                                //戻り値
}

void setup()
{
  //PINモード設定 for shift register
  pinMode(rclkPin, OUTPUT);   //OUTPUT指定
  pinMode(dsPin, OUTPUT);     //OUTPUT指定
  pinMode(srclkPin, OUTPUT);  //OUTPUT指定
  pinMode(dig1, OUTPUT);      //OUTPUT指定
  pinMode(dig2, OUTPUT);      //OUTPUT指定
  pinMode(dig3, OUTPUT);      //OUTPUT指定
  pinMode(dig4, OUTPUT);      //OUTPUT指定
  digitalWrite(dig1, LOW);    //1番ピンをLOW DI1 OFF
  digitalWrite(dig2, LOW);    //2番ピンをLOW DI2 OFF
  digitalWrite(dig3, LOW);    //3番ピンをLOW DI3 OFF
  digitalWrite(dig4, LOW);    //4番ピンをLOW DI4 OFF
  
  //PINモード設定 for RTC Module
  pinMode(clkPin,OUTPUT);     //OUTPUT指定
  pinMode(rstPin,OUTPUT);     //OUTPUT指定

  //4桁7セグメントLED
  funcShiftReg(12);           //信号初期化
  
  //RTC Module 時刻の設定
  s_b_write(0x80,0x50); //秒の設定  ※50秒
  s_b_write(0x82,0x59); //分の設定  ※59分
  s_b_write(0x84,0x19); //時間の設定 ※19時
  s_b_write(0x86,0x26); //日付の設定 ※26日
  s_b_write(0x88,0x04); //月の設定  ※4月
  s_b_write(0x8c,0x21); //年の設定  ※21年
  s_b_write(0x8a,0x01); //曜日の設定 ※日曜日                 
}

void loop(){
  //時刻の読み出し
  int v_s    = s_b_read(0x81);//read 秒レジスタ
  int v_mi   = s_b_read(0x83);//read 分レジスタ
  int v_h    = s_b_read(0x85);//read 時レジスタ
  int v_date = s_b_read(0x87);//read 日レジスタ
  int v_mo   = s_b_read(0x89);//read 月レジスタ
  int v_y    = s_b_read(0x8d);//read 年レジスタ
  int v_day  = s_b_read(0x8b);//read 曜日レジスタ

  //4桁7セグメントLED 一桁表示のための数値変換
  int v_h1  = v_h  >> 4;
  int v_h2  = v_h  & 0b00001111;
  int v_mi1 = v_mi >> 4;
  int v_mi2 = v_mi & 0b00001111;
  
  //DIG1の表示
  delay(tDelay);
  digitalWrite(dig1, LOW); 
  digitalWrite(dig2, HIGH);
  digitalWrite(dig3, HIGH);
  digitalWrite(dig4, HIGH);
  //DIG1 10の位の時間を表示
  funcShiftReg(v_h1);
  delay(tDelay);
  funcShiftReg(11);

  //DIG2の表示
  delay(tDelay);
  digitalWrite(dig1, HIGH); 
  digitalWrite(dig2, LOW);
  digitalWrite(dig3, HIGH);
  digitalWrite(dig4, HIGH);
  //DIG2 1の位の時間を表示
  funcShiftReg(v_h2);
  delay(tDelay);
  funcShiftReg(11);

  //DIG3の表示
  delay(tDelay);
  digitalWrite(dig1, HIGH); 
  digitalWrite(dig2, HIGH);
  digitalWrite(dig3, LOW);
  digitalWrite(dig4, HIGH);
  //DIG3 10の位の分を表示
  funcShiftReg(v_mi1);
  delay(tDelay);
  funcShiftReg(11);

  //DIG4の表示
  delay(tDelay);
  digitalWrite(dig1, HIGH); 
  digitalWrite(dig2, HIGH);
  digitalWrite(dig3, HIGH);
  digitalWrite(dig4, LOW);
  //DIG4 1の位の分を表示
  funcShiftReg(v_mi2);
  delay(tDelay);
  funcShiftReg(11);
}

 

動作確認1

では、さっそく動作を確認していきます。

  1. 好きな時間に設定(スケッチ内で指定)
  2. 書き込み実行

4桁7セグメントLED」にスケッチにて設定した時刻が表示されます。

本Lessonでは19時59分50秒に設定

4桁7セグメントLED」の表示は「1959」となります。

10秒後「2000」へ変化し20時00分となることからデジタル時計になっていることが確認できます。

 

■19時59分表示

arduino-lesson51-04

 

■10秒後 20時00分に表示がかわる

arduino-lesson51-05

 

動作確認2

デジタル時計・・・。

4桁しかないため、時間と分の表示。

変化が少なくつまらない・・・。

 

ということで、分と秒に変更しのがこちら。

分と秒を「00」に設定。

またスケッチの下記の部分を変更ください。

変更前
//4桁7セグメントLED 一桁表示のための数値変換
int v_h1 = v_h >> 4;
int v_h2 = v_h & 0b00001111;
int v_mi1 = v_mi >> 4;
int v_mi2 = v_mi & 0b00001111;
変更後
//4桁7セグメントLED 一桁表示のための数値変換
int v_h1 = v_mi >> 4;
int v_h2 = v_mi & 0b00001111;
int v_mi1 = v_s >> 4;
int v_mi2 = v_s & 0b00001111;

 

変更後のスケッチの動作がこちら。

■00分00秒からスタート

gif動画のため、3秒のみ表示。

arduino-lesson51-06

 

Lesson 05で学習したプッシュボタンスイッチを追加すれば・・・。

ボタンを押したときにスタート、ストップもできます。

そう、タイマーのできあがりです!

プッシュボタンスイッチについては下記記事で解説しています。

 

まとめ

本Lessonは、以下を目標としました。

1.RTCモジュール、4桁7セグメントLEDの使い方を復習
2.RTCモジュールと4桁7セグメントLEDの2つを制御する
3.デジタル時計を作って遊ぶ

 

入門編の各Lessonを組み合わせることで少し発展させて遊ぶことができます。

1つ追加の電子部品を組み合わせるだけで、ちょっと面白くなります。

ぜひ挑戦してみてください。

 

Lesson 51 【Real Time Clock モジュール その2】 はここまで。

本Lessonは「4桁7セグメントLED」を使用しましたがLCDを利用するのもありです。

次回はLCDに表示させてみましょう。

 

次回、Lesson 52は 【Real Time Clock モジュール その3】。

LCD編。

Arduino 入門 Lesson 52 【Real Time Clock モジュール その3】
本記事はLesson 52 【Real Time Clock モジュール その3】です。LCD編もついでに学習していきましょう。LCDを使った方が表現の幅は広がりやすい。本LessonではLesson 16で使用した「1602 LCD モジ…

 

最後に

疑問点、質問などありましたら気軽にコメントください。

この電子部品の解説をしてほしい!などなどなんでもOKです。

リンク切れ、間違いなどあればコメントいただけると助かります。

 

Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。

 

Arduino入門編で使用しているUNOはAmazonにて購入可能です。

互換品とは言え、Arduinoはオープンソース。

複製して販売するのもライセンス的に問題なし。

 

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

学習用、遊び用、お試し用には安価な互換品がおすすめです。

 

 

上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。

 

Amazonでお得に買う方法

Amazonでお得に購入するなら、Amazonギフト券がおすすめです。

現金でチャージするたびに、チャージ額に応じたポイントが付与されます。

最大2.5%!!!(Amazonプライム会員ならさらにお得)

チャージ額(一回分)一般プライム会員
5,000円~19,999円0.5%1.0%
2,0000円~39,999円1.0%1.5%
40,000円~89,999円1.5%2.0%
90,000円~2.0%2.5%

さらに、初回チャージで2000ポイントもらえるキャンペーンも実施中!
※いつもは1000ポイント、今なら2000ポイントです!

\Amazonギフト券 2000ポイントキャンペーン/
Amazonチャージ 初回購入で2000ポイントキャンペーン

 

補足情報
コンビニ・ATM・ネットバンクが対象
購入は1円単位で可能

コメント

  1. omoroyaomoroya より:

    せっかくなのでデジタル時計組んでみました。

タイトルとURLをコピーしました