\ AmazonにてArduino UNO R4 発売中!! /

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

arduino-lesson52-00 Arduino入門編
記事に広告(アフィリエイト広告)が含まれています。
スポンサーリンク
子供と一緒に始める マイコンプログラム
Arduino 入門
Lesson 52
【Real Time Clock モジュール その3】

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

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

補足
回路図の接続が一部抜けていたので修正しました。

 

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

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

 

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

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

せっかくなので、LCD編もついでに学習してしまいましょう。

LCDを使った方が表現の幅は広いと考えます。

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

 

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 16で使用した「1602 LCD モジュール」を使ってデジタル時計を作ってみます。

 

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

 

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

 

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

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

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

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

 

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

 

スポンサーリンク

はじめに

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

 

1602 LCD モジュール」を使用します。

表示できるのは16文字、2行。

「4桁7セグメントLED」に比べれば、色々と表示できます。

LCD編では、「DS1302」から下記のデータを引っ張り出します。

1行目表示:「年レジスタ」「月レジスタ」「日レジスタ」「曜日レジスタ
2行目表示:「時レジスタ」「分レジスタ」「秒レジスタ

まあ、全部ですね・・・。

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

 

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

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

404- ページが見つかりません。

 

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

ミックスド・シグナルおよびデジタル信号処理IC | アナログ・デバイセズ

 

Lesson 52 目標

本Lessonの目標は以下です。

1.RTCモジュール、1602 LCD モジュールの使い方を復習
2.RTCモジュール、1602 LCD モジュールの2つを制御する
3.LCDを使ったデジタル時計を作って遊ぶ

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

 

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

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

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

 

準備

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

使用する電子部品は「RTCモジュール」「1602 LCD モジュール」「ポテンショメータ」の3つ。

LCDモジュールの輝度調整にポテンショメータ、いわゆる「可変抵抗器」「半固定抵抗器」などがあると便利です。

入門編としては、Lesson 51に続いて接続がちょっと面倒ですが楽しく遊んでいきましょう。

 

必要なもの

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

 

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

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

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

 

抵抗も単品で揃えるよりはセットをおすすめします。

 

抵抗、LEDなどを個別でセット品を購入しても、そんなに使わない!

という方は、「電子工作基本部品セット」が使い勝手が良い。

 

使用部品説明

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

1602 LCD モジュール」の詳細は・・・
Arduino 入門 Lesson 16 【LCD モジュール編】

可変抵抗器」「半固定抵抗器」の詳細は・・・
Arduino 入門 Lesson 12 【ポテンショメータ編】

をご確認ください。

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

 

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

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

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

arduino-lesson50-01

 

1602 LCD モジュール 実物写真

こちらが「1602 LCD モジュール」の実物写真。

Arduino 入門 Lesson 16 【LCD モジュール編】

 

Arduino-lesson16-02

 

ポテンショメータ 実物写真

こちらが「可変抵抗器」「半固定抵抗器」の実物写真。
※ポテンショメータ

Arduino 入門 Lesson 12 【ポテンショメータ編】

Arduino-lesson09-03

 

各電子部品 仕様

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

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

1602 LCD モジュール」の詳細は・・・
Arduino 入門 Lesson 16 【LCD モジュール編】

可変抵抗器」「半固定抵抗器」の詳細は・・・
Arduino 入門 Lesson 12 【ポテンショメータ編】

 

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

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

 

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

Lesson 51と同じく、RTCモジュールは「ライブラリ」を使用しないスケッチとなります。

本Lessonも復習を兼ねて一から見直しです!

1602 LCD モジュール」はArduino標準ライブラリを利用します。

 

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

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

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

 

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

 

回路図

RTCモジュール」「1602 LCD モジュール」「ポテンショメータ」をそれぞれ接続していきます。

Arduinoはデジタル入出力ピンを使用。

  • RTCモジュール:2、3、4
  • 1602 LCDモジュール:7、8、9、10、11、12

あとは、5VGNDのみ。

 

回路図がこちら。

arduino-lesson52-01

 

 

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

arduino-lesson52-02

 

 

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

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

 

接続

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

部品は「RTCモジュール」「1602 LCD モジュール」「ポテンショメータ」の3つ。

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

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

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

 

使用するポートは、デジタル入出力ピンの

  • RTCモジュール:2、3、4
  • 1602 LCDモジュール:7、8、9、10、11、12

あとは電源である5V、GND。

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

arduino-lesson52-circuit

 

コードの書き込み

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

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

 

コマンド説明

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

新しいコマンドはなし

 

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

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

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

 

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

 

サンプルコード

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

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

  • Lesson 50のスケッチにてレジスタから時間を取り出し
  • Lesson 16のスケッチを使って時間を「1602 LCD モジュール」に表示させる

といった具合。

 

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

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

本Lessonのスケッチ少し工夫がいります。

スケッチのポイント
9以下の一桁の数値を2桁表示にするにはどうするか?
9」ではなく「09」と表示したい!

 

例えば・・・

数値の10・・・LCDに「10」とそのまま表示
数値の1 ・・・LCDに「01」と表示されず「」と表示

上記は、なかなか問題でしてLCDの表示がずれてしまうということに繋がります。

できれば「00:00:00」と常に2桁表示で9以下の数値も「0X」というように2桁表示で表示させたいわけです。

色々な描き方があると考えます。

本Lessonでは

  • 10の位、1の位を一桁の数値に変換
  • 10の位、1の位を別々に表示する

ことで解決しました。

//Lesson 52 デジタル時計を作って遊ぶスケッチ(for 1602 LCDモジュール)
//https://omoroya.com/
//使用部品
//RTCモジュール:https://omoroya.com/arduino-lesson50/
//1602 LCDモジュール:https://omoroya.com/arduino-lesson16/
//ポテンショメータ:https://omoroya.com/arduino-lesson12/

//1602 LCDモジュール用ライブラリ
#include <LiquidCrystal.h>

// 変数の生成とPINの割り当て(for 1602 LCD Module)
// rs:7 en:8 d4:9 d5:10 d6:11 d7:12 に対応
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

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

// 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()
{
  // LCDの行と列を設定
  lcd.begin(16, 2);
  lcd.print("omoroya (^^)");
  // 2行目の表示
  lcd.setCursor(0, 1);
  lcd.print("Start Clock!");
  delay(2000);
  lcd.clear(); //LCDの表示を消し、カーソルを左上隅に配置。
  
  //PINモード設定 for RTC Module
  pinMode(clkPin,OUTPUT);                           //OUTPUT指定
  pinMode(rstPin,OUTPUT);                           //OUTPUT指定
  
  //RTC Module 時刻の設定
  s_b_write(0x80,0x50);   //秒の設定  ※50秒
  s_b_write(0x82,0x59);   //分の設定  ※59分
  s_b_write(0x84,0x23);   //時間の設定 ※23時
  s_b_write(0x86,0x03);   //日付の設定 ※03日
  s_b_write(0x88,0x05);   //月の設定  ※05月
  s_b_write(0x8c,0x21);   //年の設定  ※21年
  s_b_write(0x8a,0x02);   //曜日の設定 ※月曜日                 
  pinMode(datPin, INPUT); //時刻設定後 INPUT指定
}

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 曜日レジスタ

  //10の位を0表示させるために一桁表示の数値変換
  int v_s1    = v_s >> 4;
  int v_s2    = v_s & 0b00001111;
  int v_mi1   = v_mi >> 4;
  int v_mi2   = v_mi & 0b00001111;  
  int v_h1    = v_h >> 4;
  int v_h2    = v_h & 0b00001111;
  int v_date1 = v_date >> 4;
  int v_date2 = v_date & 0b00001111;
  int v_mo1   = v_mo >> 4;
  int v_mo2   = v_mo & 0b00001111;
  int v_y1    = v_y >> 4;
  int v_y2    = v_y & 0b00001111;
  
  /* Display 表示 */
  /* 年.月.日 曜日 */
  lcd.setCursor(0, 0);   //1列目1行目に表示
  lcd.print("20  /  /"); //ディスプレイに.を表示
  //year
  lcd.setCursor(2, 0);   //3列目1行目に表示
  lcd.print(v_y1);       //年表示 10の位
  lcd.setCursor(3, 0);   //4列目1行目に表示
  lcd.print(v_y2);       //年表示  1の位
  //month
  lcd.setCursor(5, 0);   //6列目1行目に表示
  lcd.print(v_mo1);      //月表示 10の位
  lcd.setCursor(6, 0);   //7列目1行目に表示
  lcd.print(v_mo2);      //月表示  1の位
  //date
  lcd.setCursor(8, 0);   //9列目1行目に表示
  lcd.print(v_date1);    //日表示 10の位
  lcd.setCursor(9, 0);   //10列目1行目に表示
  lcd.print(v_date2);    //日表示  1の位
  //day of week
  lcd.setCursor(11, 0);  //12列目1行目に表示
  switch (v_day) {
  case 1:
    lcd.print("Sun.");   //日曜日
    break;
  case 2:
    lcd.print("Mon.");   //月曜日
    break;
  case 3:
    lcd.print("Tue.");   //火曜日
    break;
  case 4:
    lcd.print("Wed.");   //水曜日
    break;
  case 5:
    lcd.print("Thu.");   //木曜日
    break;
  case 6:
    lcd.print("Fri.");   //金曜日
    break;
  case 7:
    lcd.print("Sat.");   //土曜日
    break;
  }
  
  /* 時:分:秒 */
  //hour
  lcd.setCursor(0, 1);  //1列目2行目に表示
  lcd.print("  :  :");  //ディスプレイ表示
  lcd.setCursor(0, 1);  //1列目2行目に表示
  lcd.print(v_h1);      //時間表示 10の位
  lcd.setCursor(1, 1);  //2列目2行目に表示
  lcd.print(v_h2);      //時間表示  1の位
  //minutes
  lcd.setCursor(3, 1);  //4列目2行目に表示
  lcd.print(v_mi1);     //分表示 10の位
  lcd.setCursor(4, 1);  //5列目2行目に表示
  lcd.print(v_mi2);     //分表示  1の位
  //seconds
  lcd.setCursor(6, 1);  //7列目2行目に表示
  lcd.print(v_s1);      //秒表示 10の位
  lcd.setCursor(7, 1);  //8列目2行目に表示
  lcd.print(v_s2);      //秒表示  1の位
}

 

動作確認

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

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

1602 LCD モジュール」にスケッチにて設定した時刻が表示されます。

本Lessonでは「2021年5月3日(月)23時59分50秒」に設定。

10秒後に「2021年5月4日(火)00時00分00秒」に変われば成功です。

 

初期表示

  • omoroya表示

arduino-lesson52-04

 

時計表示スタート

  • 1行目:「2021/05/03 Mon.
  • 2行目:「23:59:50

arduino-lesson52-05

 

■10秒後

  • 1行目:「2021/05/04 Tue.
  • 2行目:「00:00:00

59秒 → 00秒 に変わる瞬間の写真を2枚。

arduino-lesson52-06

arduino-lesson52-07

 

スケッチの注目箇所である9以下の数値も「00」と2桁表示され大成功です。

LCDモジュールを使った自作のデジタル時計の完成です。

 

まとめ

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

1.RTCモジュール、1602 LCD モジュールの使い方を復習
2.RTCモジュール、1602 LCD モジュールの2つを制御する
3.LCDを使ったデジタル時計を作って遊ぶ

 

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

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

本Lessonの時刻初期設定はスケッチの中で設定しています。

以下に挑戦してみるのも面白いと考えます。

  • プッシュボタンスイッチなどを追加
  • 時刻の初期設定もブレッドボード上でできるようにする

 

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

本Lessonは「1602 LCD モジュール」を使用しましたがLCDは他にも色々あります。

基板に組み上げて、本格的な「デジタル時計」を作って遊ぶのもあり。

 

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

本Lessonで描いたスケッチを半分以下にします。

Arduino 入門 Lesson 53 【Real Time Clock モジュール その4】
本記事はLesson 53 【Real Time Clock モジュール その4】です。その3まではライブラリを使わずにデジタル時計をくみ上げました。ライブラリを使うとスケッチ短くてすみます。ということで、本Lessonではライブラリを使っ…

 

最後に

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

この電子部品の解説をしてほしい!などなどなんでも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%

さらに、初回チャージで1000ポイントもらえるキャンペーンも実施中!

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

 

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

コメント

  1. 小室けい より:

    LCDの5番ピンR/WとGNDの接続が必要ではないでしょうか?

    • omoroya omoroya より:

      コメントありがとうございます。
      たしかに、R/W – GNDの結線が抜けていますね。
      ご指摘ありがとうございます!
      回路図修正しておきました。
      キャッシュにたまっている場合がありますのでリロードお願いします。

  2. 慎太郎 より:

    いつもお世話になっております。
    LCD 1602 Module の5V(A)に、さっさてませんでした。(ブレットボード図)

    • omoroya omoroya より:

      コメントありがとうございます。
      確かに、アノード端子に接続がないですね。
      修正しました。

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