[IchigoJam メニューへ戻る]

ボクにもわかる
IchigoJam用サンプルプログラム
I2C接続RTCを使った置き時計の製作

IchigoJamにRTCを搭載した様子
IchigoJamにRTCを搭載した様子

はじめに

 このページでは maxim integrated 製のI2C接続RTC IC DS1307を使った置き時計を製作するためのハードウェア製作とIchigoJam用サンプルプログラムについて紹介します。合計3つのハードウェア製作例を紹介しますが、何れも同じRTC ICを用います。

本ページ内のコンテンツ



RTC DS1307 [DS1307+]

 DS1307は、Maxim Integrated 社のI2C接続のリアルタイムクロックICです。ICは秋月電子通商などで300円前後で販売されています。
 電源電圧は通常動作用に5V、バックアップ動作用に3Vの両方が必要です。
 このICは動作電圧がバックアップ電池の電圧の1.3倍を超えた時に通常動作を行い、1.3倍以下の条件でバックアップ動作に切り替わります。また、通常のバックアップ用リチウム電池3Vの初期電圧が3.3Vなので、マージンを含めて4.5V以上の動作電圧が必要となります。


ハードウェアの製作

 ここではブレッドボード上に製作します。本ICのピン配列を下表に示します。

Pin 接続 Pin 接続
1 クリスタル1 8 電源(+5V)
2 クリスタル2 7
3 電源(+3V) 6 I2C_SCL
4 GND 5 I2C_SDA

 クリスタルにはRTC用として販売されている32.768kHzのタイプを使用します。極性はありません。
 3V電源にはスーパーキャパシタ(電気二重層コンデンサ)とIchigoJamの3.3V電源を使用します。キャパシタをRTC IC DS1307の3番ピンと4番ピンとの間に接続します。極性があるので+側を3番ピンにします。また同じ3番ピンにダイオードのカソード側(バー表示のある方)を接続し、アノード側をIchigoJamのVCCへ接続します。直列に100〜1kΩくらいの抵抗を入れた方が安全です。(実験では省略)
 I2C_SCLはIchigoJamのEX1端子へ、I2C_SDAはIN3端子へ接続します。またプルアップ抵抗10kΩを電源に接続します。

ブレッドボードの様子
ブレッドボードの様子

IchigoJam RISC-V版 では、I2C_SCLとI2C_SDAの配列が変更になります。
CN5から配線するなどの修正が必要です。(2021/5/16 追記)


部品・ジャンパー線・接続図
1 2 3 4 5 接続 接続 6 7 8 9 10
1       X'
L
1 クリスタル1 電源(+5V) 8       +5
2       2 クリスタル2 7        
3 C   D   3 電源(+3V) I2C_SCL 6   C
K
R  
4   G
N
D
4 GND I2C_SDA 5 B R
5         EX1    
6       IN1        
7       IN2        
8     B IN3        
9       IN4        
10       VCC        
11         GND VCC      

IchigoJam U 用ブレッドボードの製作

 IchigoJam接続用ブレッドボードの製作方法についても紹介しておきます。このアイデアはIchigoJam-FANグループの新嶋修さんの情報を元にしました。製作を容易にするためのアイデアは当サイト独自のものです。
 まずL字のピンヘッダを2列のピンソケットに図のように装着します。このとき、(将来も含めて)必要なピンだけにしておきます。あまりピンが多いと、ブレッドボード上の部品を置くスペースが無くなってしまうからです。

ブレッドボードの様子
ピンヘッダ(左)とブレッドボードの裏面(右)

 2列のピンソケットに挿した状態のままで、ピンヘッダの両端ピンの半田付けを行います。その後に、他の全ピンの半田付けを行います。半田付け時にブレッドボードのプラスチックが溶けないように半田こての温度調節には十分に留意します。

ブレッドボードの様子
IchigoJam U 用ブレッドボードの製作の様子(半田付け後)

(準備)RTCに時刻を書き込む

 RTCのバックアップ用の電源入力に3.3V、通常動作用電源入力に5Vを入力し、下記のプログラムを動かします。
 IchigoJamに接続したキーボードから、年、月、日、時、分、秒の値を入力するとRTCに日時が書き込まれ、RTC内で時刻のカウントを開始します。

1 cls:?"SET RTC"
100 ?"---INPUT---":P=#707
110 ?"YEAR 20";:inputI:gosub700
120 ?"MONTH  ";:inputI:gosub700
130 ?"DAY    ";:inputI:gosub700
140 ?"HOUR   ";:inputI:gosub700
150 ?"MINUTE ";:inputI:gosub700
160 ?"SECOND ";:inputI:gosub700
200 ?"---SET RTC---"
210 poke#700,0:poke#704,0
220 ifi2cw(#68,#700,1,#701,7)?"ERROR"
230 END
700 'BCD ENC
710 I=I/10*16+I%10:pokeP,I
720 P=P-1
730 ifP=#704thenP=#703
740 ?hex$(I,2)
750 return


時刻表示を行う

 時刻を書き込んだら下記のプログラムを動かして動作確認してみて下さい。

new
1 'RTC
10 cls
100 lc0,0:poke#700,0
110 ifi2cr(#68,#700,1,#701,7)?"E"
120 A=#707:gosub700:?"/";
130 A=#706:gosub700:?"/";
140 A=#705:gosub700:?
150 A=#703:gosub700:?":";
160 A=#702:gosub700:?":";
170 A=#701:gosub700:?
180 wait59
190 goto100
700 'PRINT
710 S=peek(A)
720 ifA=#701letS,S&#7F
730 ifA=#702letS,S&#7F
740 S=S/16*10+S%16:ifS<10?"0";
750 printS;:return

 VIDEO 5で動かすとより大きく表示できますが、その場合は、行番号140と170の末尾の「?」を削除してください(20201/05/16・Facebook IchigoJam-FANグループ・志賀さんからのご指摘をもとに追記・動作確認済)。


 下記はI2C接続の小型液晶に対応したバージョンです。小型液晶への出力と、テレビ画面への拡大表示に対応しました。 テレビ表示部の高速化にはIchigoJam-FANグループのRuria Amanagiさんのアイデアを使わせていただきました。(それでも1回の表示に2秒ほどかかります。)

new
1 'RTC
10 cls:gosub800
100 lc0,0:poke#700,0
110 ifi2cr(#68,#700,1,#701,7)?"E"
120 A=#707:gosub700:?"/";
130 A=#706:gosub700:?"/";
140 A=#705:gosub700:?
150 A=#703:gosub700:?":";
160 A=#702:gosub700:?":";
170 A=#701:gosub700:?
180 gosub800:gosub950
190 goto100
700 'PRINT
710 S=peek(A)
720 ifA=#701letS,S&#7F
730 ifA=#702letS,S&#7F
740 S=S/16*10+S%16:ifS<10?"0";
750 printS;:return
800 'LCD INIT
810 poke#700,64,0,2,#C0,57,17,#70,86,#6C,56,12
820 ifi2cw(62,#701,1,#704,5)?"E"
830 wait12
840 ifi2cw(62,#701,1,#709,2)?"E"
900 'LCD OUT
910 ifi2cw(62,#701,1,#702,1)+i2cw(62,#700,1,#900,8)+i2cw(62,#701,1,#703,1)+i2cw(62,#700,1,#920,8)?"E"
920 return
950 'TV OUT
960 let[0],#80,#8A,#85,#8F:lc0,4:forY=0to15:forX=0to7
970 C=peek(vpeek(X,Y/8)*8+Y%8):?chr$([C>>6&3],[C>>4&3],[C>>2&3],[C&3]);
980 next:next:return


時刻表示プログラムの解説

 上記のプログラムは命令を詰めていたり省略していて読みにくいので、展開したプログラムを以下に示します。展開しても分かりにくいのですが、多少、理解が深まると思います。

new
1 'RTC
10 cls:gosub 800                           :' I2C液晶を初期化する
100 locate 0,0:poke #700,0                 :' カーソルを左上へ移動
110 if i2cr(#68,#700,1,#701,7) print"E"    :' RTCから日時を取得
120 A=#707:gosub 700:print"/";             :' 年を表示(一時的に700行へ)
130 A=#706:gosub 700:print"/";             :' 月を表示
140 A=#705:gosub 700:print                 :' 日を表示して改行
150 A=#703:gosub 700:print":";             :' 時を表示
160 A=#702:gosub 700:print":";             :' 分を表示
170 A=#701:gosub 700:print                 :' 秒を表示して改行
180 gosub 800:gosub 950                    :' 液晶とテレビへ表示転送
190 goto 100                               :' 行番号100に戻る
700 'PRINT                                 :' 表示処理
710 S=peek(A)                              :' 変数Sに読み値を代入
720 if A=#701 then S=S & #7F               :' 不要ビットの削除
730 if A=#702 then S=S & #7F               :' 不要ビットの削除
740 S=S/16*10+S%16:if S<10 print"0";       :' 数値に変換。10未満なら0表示
750 print S; :return                       :' 数値を表示し元の行に戻る
800 'LCD INIT                              :' I2C液晶の初期化
                      〜省略〜
900 'LCD OUT                               :' I2C液晶へ表示を転送
                      〜省略〜
950 'TV OUT                                :' テレビに大きな文字を表示
                      〜省略〜

 行番号110のi2cr命令でI2C通信でRTCから時刻を取得します。引数の#68はRTCの7ビットI2Cアドレスです。同じアドレスのデバイスをI2C接続することは出来ません。次の#700はIchigoJamのメモリー(仮想)アドレスです。#700に書かれた値がRTCへコマンドとして送られます。その次の1はコマンドのバイト数です。この場合は1バイトです。行番号100の部分で予めアドレス#700に0を書き込んでいるので、この時のコマンドは「0」です。次の#701はI2Cで読み取った値を保存するIchigoJam側のメモリーアドレスです。次の7は、その受信バイト数です。RTCから7バイトを受信し、メモリーアドレス#701〜#707に保存します。I2C通信でエラーが出た場合は「E」を表示します。
 行番号120では変数Aに表示対象のメモリーアドレス#707を代入し、行番号700のサブルーチンへジャンプします。
 行番号710ではメモリアドレスAの値を変数Sに代入します。行番号720〜740は不要なビットを除去し、10進数に変換します。行番号740の「S=S/16*10+S%16」はRTCから読み取った値を10進数に変換する数式です。
 このRTCでは16進数のまま表示すると適切な数字が得られるようになっています。例えば10進数で「15」という数字を16進数で「#15」すなわち値としては「21」を用います。行番号740の式は、この「21」を適切な「15」に戻しています。例えば、以下のように16進数のまま表示しても同じ結果が得られます。

740 ?hex$(S,2);:return

 ただし、変数Sは適切な10進数になっていないので、プログラムを拡張してアラーム機能や時刻管理などを行う場合や加減算を行う場合などは元の変換式が必要です。


高速化

 表示に約2秒を要してしまうので、秒の表示が2秒毎に変化します。これを高速化する方法はいくつかあります。一つは変更部分だけを書き換える方法です。少し手間がかかりそうです。
 あるいは「秒」を小さな文字で表示する方法もあるでしょう。これだと簡単です。プログラムを書き換えてみましょう。行番号160の「?":";」の部分を「lc 30,18」に変更し、行番号180の「gosub 950」を「if S=0 gosub 950」に書換えてみましょう。

160 A=#702:gosub 700:lc30,18
180 gosub 800:ifS=0gosub950

低消費電力化

 上記の置き時計プログラムはI2C接続の小型液晶(AE-AQM0802)にも対応しています。このような液晶に接続した場合は、IchigoJamをより低消費電力で動かしたいと思うでしょう。さらに腕時計への応用も期待できます。
 下図はRTCの7番ピンのSQW端子から1秒周期の方形波を出力、SQW端子をプルアップ(10kΩ)し、直列コンデンサ(0.1uF)を経由することで細い負論理パルスに変換し、そのパルスをIchigoJamのBTNに入力した時の回路例です。ブレッドボードの手前の方にあるのがBTN信号用パルスに変換するためのコンデンサです。

低消費電力化実験の様子
低消費電力化実験の様子

 下記はRTCから日時を取得して液晶に表示してからSLEEPを実行するプログラムです。プログラムを入力し終えたらファイル番号0に保存してください。最初に実行する時は(液晶の初期設定(行番号830〜850)を実行するために)IchigoJamのボタンを押したまま実行し、LEDの点灯(またはブザーやテレビ表示)を確認してからボタンを放してください。
 その後、1秒周期に自動で起動してはスリープする処理を繰り返します。この繰り返し動作によってIchigoJamの消費電流(約15mA)を5分の1の3mA程度に抑えることが出来ます。(IchigoJamの起動時間が200ms、1秒間隔で繰り返す)
 しかし、I2C液晶の消費電流が1mAほどあるので、平均消費電流は4mA程度、コイン電池CR2032で動かすと、2日くらいの連続動作期間となります(試算)。

new
1 'RTC for LCD
10 cls:video0
100 lc0,0:poke#700,0
110 ifi2cr(#68,#700,1,#701,7)?"E"
120 A=#707:gosub700:?"/";
130 A=#706:gosub700:?"/";
140 A=#705:gosub700:?
150 A=#703:gosub700:?":";
160 A=#702:gosub700:?":";
170 A=#701:gosub700:?
180 gosub800
190 ifbtn()goto190
200 sleep
700 'PRINT
710 S=peek(A)
720 ifA=#701letS,S&#7F
730 ifA=#702letS,S&#7F
740 S=S/16*10+S%16:ifS<10?"0";
750 printS;:return
800 'LCD+RTC INIT
810 poke#700,64,0,2,#C0,57,17,#70,86,#6C,56,12,#07,#10
820 ifbtn()=0goto900
830 led1:beep:video1:?"INIT"
840 ifi2cw(62,#701,1,#704,5)?"E"
850 ifi2cw(#68,#70B,1,#70C,1)?"E"
860 ifbtn()goto860
870 wait10:led0
900 'LCD OUT
910 ifi2cw(62,#701,1,#709,2)?"E"
920 ifi2cw(62,#701,1,#702,1)+i2cw(62,#700,1,#900,8)+i2cw(62,#701,1,#703,1)+i2cw(62,#700,1,#920,8)?"E"
930 return

 今後の課題は1秒ごとの起動と、液晶の消費電流です。起動間隔を広げる(起動頻度を下げる)には、例えば、RTC-8564NBのような高機能なRTCへの変更し、1分間隔で動作させる方法があります。この場合、IchigoJam動作時の消費電力が上例の1/60となります。(引き換えに秒表示が出来なくなる)
 しかし、液晶の消費電流の方は今のところ対策がありません。例えば、動作周波数を下げても、あまり電流は下がりません。通常の(I2Cではない)キャラクタ液晶であれば電源をオープンにしても1分くらいは表示を維持するのですが、このキャラクタ液晶は電源をオープンにした瞬間に表示が消えてしまいます。さらに、腕時計に適したサイズの他の液晶も見当たりません。
 したがって、充電式にしたり、太陽電池と併用するなども検討する必要があるでしょう。



RTC モジュール(I2C) [M1307-12P]

 aitendo等で販売されている400円前後の格安 RTC モジュールを使用した例についても紹介します。冒頭で紹介したRTC IC DS1307と、32.768kHzのクリスタル、32KbitのEEPROM、コイン電池ホルダが予め実装された状態でモジュール化されています。ピンソケットは自分で実装する必要があります。単価が300円前後のRTC IC DS1307が実装されていて400円というのは、とてもお買い得です。

格安 RTC モジュールを使った置き時計の製作例
格安 RTC モジュールを使った置き時計の製作例
(青色の基板がRTCモジュール)

 EEPROMが搭載されている点も便利です。本モジュールのEEPROMにIchigoJamのプログラムを4本まで保存することが出来るからです。ファイル番号100〜103に保存が可能で、104以降は100〜103と同じ領域に上書きされると思います。上記の時計用プログラムを保存しておけば、他のIchigoJamに付け替えた時に実行しやすくなるでしょう。なお、既に別のEEPROMを取り付けてある場合、本RTCモジュールとアドレスが干渉する場合があります。不明な場合はどちらかを取り外しておきましょう。

 ハードウェアの製作方法は、RTCモジュールのSCL、SDA、VCC、GNDの4線をIchigoJamに接続するだけです。前述の例と同様に、SCLはEX1に、SDAはIN3に、そしてVCCは5Vの電源に接続します。拡張IOには5Vがありませんが、IchigoJam UであればCN5の一番上のピンが5Vです。

aitendoで購入した格安 RTC モジュール
aitendoで購入した格安 RTC モジュール

 本RTCモジュールを購入してから気づいたことがあります。裏面のコイン電池ホルダーにはリチウムコイン電池ではなく、充電式のリチウムイオンを取り付けるようになっているようです。電池のサイズは2032型(直径20mm・厚み3.2mm)です。私の場合はキーホルダー型のソーラーLEDに内蔵されていたものを取り出して使用しました。
 通常のリチウムコイン電池を使用するには、抵抗R4〜R6を取り外して、R6をジャンパ線でショートにします(2016/7/7・追記)
 

格安 RTC モジュールの裏面には2次電池を実装する
格安 RTC モジュールの裏面には2次電池を装着

 少し心配なことは充電時に4.7Vくらいの電圧がかかってしまうことです。適切に使用するにはツェナーダイオードをダイオードD1の入力側とGNDとの間に追加しておく必要がありそうです。
 下図はチップ抵抗R1を取り外し、R1の右側の端子からD1の右側の端子に向かって4.3Vのツェナーダイオードを順方向に半田付けし、基板左上のセンサ用U1の1番ピンと2番ピンをジャンパーでショートした改造例です。これで充電電圧を4.2V程度に抑制することが出来ると思います。

格安 RTC モジュールの裏面には2次電池を実装する
格安 RTC モジュールの裏面には2次電池を装着

 本モジュールは4.0V程度にまで充電したリチウムイオン電池を取り付けるとRTC IC DS1307に3.0Vが印加されるように設計されているようです。仕組みは電圧を510kΩと1.5MΩの大きな抵抗で分圧しただけです。小規模な回路でかつ消費電流を抑えるためだと思います。
 課題もあります。手で触った時や配線などを外すときの微小な電流に影響し、バックアップが消えてしまう場合がありました。機器に接続した状態で電源を切る程度では問題なさそうですが、頻繁に付け替えて利用するようなケースは想定されていなかったようです。

 ソフトウェアの製作方法についてはRTC IC DS1307と同様につき「(準備)RTCに時刻を書き込む(当ページ内)」あたりからご覧ください。

 以上のとおり価格、機能を考えるとお奨めの商品です。※注意:リチウムイオン電池の取り扱いについては十分な知識が必要です。自信のない方は取り付け無いようにしてください。




GROVE RTC モジュール (お奨めいたしません)

 GROVE RTCを2台、購入しましたが2台とも異常発熱し、使い物になりませんでした。また、発熱しない状態の時も1時間に1分ほど早く進むことも判明。(一般的にRTCの時刻が異常に進むのはノイズの影響です。)
 もともと、このページでは同製品を奨めようとしていたのですが、このような状態のものが2台も続いたため、方針を変更し、ブレッドボードや他のモジュールで製作することにしました。
 ※注意:少なくとも私が入手した同製品は火災や火傷・事故の懸念がある危険な状態でした。十分にご注意ください。(参考情報:https://www.switch-science.com/catalog/826/)

Personal ComputerにRTCを内蔵した様子
BASICパソコンにRTCを内蔵した様子(断念)

掲載情報について

  • こどもパソコンIchigoJamを用いた電子工作、応用回路、BASICプログラムを紹介しています。
  • 当ページの著作権は国野亘が所有します。
  • 概ね20歳以下を対象にした教育目的での利用については複製・改変・再配布が可能です。
  • FacebookグループIchigoJam-FANでの利用については複製・改変・再配布が可能です。
  • 複製・改変を行う場合は、合理的な手段による著作権表示が必要です。
  • IchigoJamは株式会社jig.jpの登録商標です。当ページはjig.jp社の作成物ではありません。
  • 当ページの背景画像はライセンス CC BY https://pcn.club/ に基づいて改変したものです。
  • 背景画像のIchigoJamロゴは CC BY https://ichigojam.net/ に基づいて改変したものです。
  • 当ページの作成にあたりFacebookグループIchigoJam-FANの情報を参照しました。
  • 当ウェブサイトの内容や情報については、ご自身の責任でご利用ください。
    製作品などで事故が発生した場合であっても当方は一切の補償をいたしません。

IchigoJam メインメニューへ戻る