はじめに
Raspberry Pi PicoはRTC(Real Time Clock)を内蔵していますがバッテリーバックアップされていないため、時刻を合わせていても再起動時にはリセットされてしまう。また、時刻の精度も悪いようです。
ここではMMbasicでの時刻の扱い方と外部RTCの接続とその利用を試した内容を記す。
PicoMiteの日付時刻取得と設定
PicoMiteは起動時および再起動時に時刻を2024年1月1日 0時0分0秒にセットされます。
MMBasicでは日付の情報はDATE$
関数で取得、DATE$=
コマンドで設定できます。また、時間はTIME$
関数で取得、TIME$=
コマンドで設定できます。
日時にかかわる関数、コマンドを以下に示す。
コマンドおよび関数 | 説明 |
---|---|
DATE$ | 内蔵クロックの日付をDD-MM-YYYY形式で取得する関数 |
DATE$=日付文字列 | 内蔵クロックの設定するコマンド 次のいずれかの形式で日付を指定する DD-MM-YY[YY]、DD/MM/YY[YY]、YY[YY]-MM-DD、YY[YY]/MM/DD |
TIME$ | 内蔵クロックの時間をHH:MM:SS形式で取得する関数 |
TIME$=時刻 | 内蔵クロックを設定するコマンド ”HH:MM:SS"の形式で指定する。MM:SSは省略でき、省略した場合は0となる。 |
DATETIME$(n) | エポックタイムnに対応する日付と時刻をDD-MM-YYYY HH:MM:DDの形式で返す関数 現在の日付と時刻はDATETIME$(NOW)で取得できる |
DAY\$(date\$) | date$で指定した日付の曜日を取得する関数 曜日は英語表記でえられる(例:Mondayなど |
EPOCH(DATETIME\$) | DATETIME\$で指定した日時のエポックタイムを取得する関数 DATETIME$の形式はDD-MM-YYYY HH:MM:SS、DD-MM-YY HH:MM:SS、YYYY-MM-DD HH:MM:SSのいずれか 現在の日時のエポックタイムはEPOCH(NOW)で取得できる |
これらのコマンドはコマンドプロンプトでも利用できる。
※エポックタイムは1970年1月1日 00:00:00 UTCからの経過秒数のこと。
日付と時刻の取得
現在の日付はDATE$
関数で、時刻はTIME$
関数で取得でき、PRINTコマンドでコンソールに出力できる。
> PRINT DATE$
01-01-2024
> PRINT TIME$
00:11:14
>
日付と時刻の設定
Raspberry Pi PicoのRTCは起動時に2024年1月1日 00時00分00秒にリセットされるため正しい時刻を扱いたいときは手動で設定するか後ほど述べる外部RTCを使って自動的に設定するかのいずれかになる。
日付の設定はDATE$=
コマンドを、時刻の設定はTIME$=
コマンドを使う。
たとえば、日付を2025年5月8日に、時刻を13時55分30秒に設定する場合はコマンドプロンプトで次のようにコマンドを実行する。
> DATE$="2024/05/08"
> TIME$="13:55:30"
> PRINT DATE$,TIME$
08-05-2024 13:56:10
外部RTCの接続
起動のたびに日時を手動で設定するのは面倒な場合、外部RTCを接続すれば自動的に日時が設定されるようにすればよい。
使用部品
外部RTCとしてAmazonで購入したWINGONEER 小型DS3231 AT24C32 I2Cモジュール用の高精度リアルタイムクロックモジュール,ボタン電池付き(A145)を使用しました。このRTCはPicoMiteがサポートしているクロックチップDS3231を使用しているので扱いが簡単です。
時刻の表示は以前使ったI2C接続のOLED、YUWENW OLEDディスプレイ 0.96インチ 2個入り OLEDモジュール I2C 128X64 4ピン ホワイト Arduinoに対応を使用しました。
いずれの部品もI2Cで接続します。
配線
RTCとOLEDを下図のように配線しました。いずれのデバイスのSDAとSCLは同じピンに接続します。
RTCに関連する設定
I2Cの設定
PicoMiteはサポートしているOLEDやRTCなどI2Cデバイスを接続するI2CピンをOPTIONコマンドでシステム用として設定しておきます。すでに設定している場合には不要です。
今回はSDAにGP14ピンを、SCLにGP15ピンを使用するので次のコマンドをコマンドプロンプトで実行して設定します。設定済みの場合にはエラーメッセージError : I2C already configured
が表示されます。
> OPTION SYSTEM I2C GP14,GP15
SSD1306チップのOLEDを使うので次のOPTIONコマンドをコマンドプロンプトで実行します。すでに設定されている場合はエラーメッセージError : Display already configured
が表示されます。
> OPTION LCDPANEL SSD1306I2C, LANDSCAPE
外部RTCの時刻設定
I2Cの設定ができたら外部RTCの時刻をRTC SETTIME
コマンドで設定します。次の構文に示すように日付、時刻を順にカンマで区切って並べます。
RTC SETTIME year, month, day, hour, minute, second
たとえば、2025年5月8日14時34分45秒に設定し、確認するコマンドは次の通りです。
> RTC SETTIME 2025, 5, 8, 14, 34, 45
> print date$, time$
08-05-2025 14:34:55
>
これでRaspberry Pi PicoのRTCと外部RTCの時刻が設定されます。
外部RTCの時刻取得
RTC SETTIME
コマンドで時刻を設定しても再起動するとRaspberry Pi PicoのRTCはリセットされてしまう。外部RTCから時刻を取得するRTC GETTIME
コマンドをコマンドプロンプトで実行するとRaspberry Pi PicoのRTCの時刻が更新されます。
このコマンドは手動で実行しますが次の設定によって起動時、再起動時に外部RTCから自動的に時刻を取得できます。
- サブルーチン
MM.STARTUP
にRTC GETTIME
コマンドを加える - コマンドプロンプトで
OPTION RTC AUTO ENABLE
コマンドを実行する
このオプション設定で起動時および毎時、RTCから自動的に時刻を読み込み設定される
RTCからの時刻同期の無効化するにはOPTION RTC AUTO DISABLE
コマンドを実行します。
時計的なプログラム
タイマ割り込みを使って日時のデータを読み取り、OLEDへ出力するプログラムを以下に示す。
SetTick 1000, DClock ' Define priodic interruput
CLS
Do
Pause 500
Loop
Sub DClock
' Create a date string in the format YYYY/MM/DD
datestr$ = Mid$(Date$, 7, 4) + "/" ' Get year
datesrt$ = datestr$ + Mid$(Date$, 4, 2) + "/" ' Get month
datestr$ = datestr$ + Mid$(Date$, 1, 2) ' Get date
Text 0, 0, datestr$,,4 ' Draw date string
Text 0, 16, Day$(Date$),,4 ' Draw day of the week
Text 0, 32, Time$,,4 ' Draw time
End Sub
Sub MM.STARTUP ' Code to run when the program starts
RTC GETTIME ' Get clock from RTC
End Sub
プログラム最後のサブルーチンMM.STARTUP
内にRTC GETTIME
コマンドがあるので再起動時に外部RTCから日時を取得されます。
実行結果
補足
Raspberry Pi Pico WやPico 2 WのWi-Fiに対応したファームウェアを使えばNTPから時刻を取得して内蔵RTCの時刻を設定できる。