本記事では、小さなシングルボードコンピュータ Raspberry Piとコンテックが販売しているRTC機能を備えたRaspberry Pi HATサイズ拡張ボードCPI-RASを組み合わせてどのようなことができるのか紹介します。
目次
Raspberry PiとRTC
Raspberry Piとは
Raspberry Piは、イギリスのRaspberry Pi 財団によって教育用のコンピュータとして開発された安価なシングルボードコンピュータです。コンピュータのハードウェア構造とソフトウェアの両方を安価に学べ、自分で好きなようにハードウェアを工作できる特徴があります。
技術コラム -「Raspberry Piとは?IoT開発に使われ始めている理由
」についても紹介しておりますので、そちらをご参照ください。
RTCとは
RTCとは、Real-Time Clockと呼ばれる時計機能を持ったデバイス(IC)を指します。基本的に水晶振動子とその発振回路で構成されます。水晶振動子は比較的温度特性にも優れ、周波数が安定しており月差も大きくありません。また非常に低消費電力である特徴を持ち、バックアップ用の電池と組み合わせることで時刻を長期間保持することができます。時計以外の機能として、アラーム、タイマー、EEPROM、SRAM等を備えたものもあります。
Raspberry Piは今までいくつかのハードウェアをリリースしてきており、初代モデルからRaspberry Pi 4まではRTC機能も持ったICを搭載しておらず※1、時計の機能はCPUによるシステムクロックのみです。
Raspberry Piの時計機能
まず、Raspberry Piの時計機能について説明します。Raspberry Pi はLinuxベースの Raspberry Pi OSで起動し、そのOSに備えたシステムクロックが時計として機能します。このシステムクロックはLinuxが起動中、つまり電源がOnの状態でしか有効にならないため、電源が切れるとリセットされます。
時刻がリセットされることでユーザーが再設定する面倒な操作をなくすため、電源Offから起動した時、Linuxではsystemd-timesyncdというサービスが次の優先順で時刻を取得し設定します。
ネットワーク上にあるNTPサーバーより時刻取得
RTCが保持している時刻取得
Linuxのシステムファイル内で持っている時刻取得
この時刻設定で、NTPサーバーより時刻の取得に失敗し、RTCの時刻も電池等で保持されていない場合、その時刻は正確なものではありません。よって Raspberry Pi 単体の場合NTPサーバーにアクセスできる環境でなければ自動で正確な時刻を設定されることはありません。
時刻に応じたアラーム機能
Raspberry Pi OSでは一般的なLinux で使われるcrontabやat等のコマンドを使うことで、アラームのようにプログラムを設定した時刻に動作させることができます。
crontabでは下記のコマンドでcrontabエディタを開きます。
crontabのエディタ内で下記のフォーマット仕様に従って記述すると、その該当時間になればコマンドが実行されます。
フォーマット:
分 時 日 月 曜日 [コマンド]
各パラメータ範囲
分: 0-59
時: 0-23
日: 1-31
月: 1-12
曜日: 0~6(SUN から SAT)、または 7(SUN)
※パラメータを*にすると全ての値に適用されます。
毎分実行する例
* * * * * コマンド
毎時0分実行する例
0 * * * * コマンド
毎日8:00実行する例
0 8 * * * コマンド
アラーム機能の動作例
アラーム動作の具体例として、Raspberry Piのオーディオ端子にアンプ内蔵スピーカー(USB電源供給)を繋げ、アラーム音を設定した時間に再生させる方法を紹介します。
ハードウェア構成
下記構成のようにUSB電源供給タイプのアンプ内蔵スピーカーのUSBをRaspberry PiのUSB端子に、オーディオ入力ケーブルをRaspberry Piのオーディオ端子と接続します。電源はRaspberry Piの電源用USB端子より供給します。
ソフトウェア構成
Raspberry Pi OSのsound-theme-freedesktopパッケージ※2にはアラーム音のogg形式のファイルがあり、ogg123※3というプログラムでこのファイルを再生することができます。
アラーム音ファイル:
/usr/share/sounds/freedesktop/stereo/alarm-clock-elapsed.oga
コマンド:
ogg123 /usr/share/sounds/freedesktop/stereo/alarm-clock-elapsed.oga
crontabで毎日 8:00にこのアラーム音を再生させる設定例を下記に示します。
crontab設定:
0 8 * * * ogg123 /usr/share/sounds/freedesktop/stereo/alarm-clock-elapsed.oga
このアラーム機能はRaspberry Piが動作中の時のみとなり、Raspberry Piの電源Off時にはアラーム機能は働きません。
※2
Raspberry Pi OSのディストリビューションによっては標準搭載されていません。
もし該当のパッケージがインストールされていない場合は、下記の方法でインストールしてください。
コマンド:
sudo apt install sound-theme-freedesktop
※3
ogg123のプログラムはインストールが必要です。もしogg123のプログラムを含むvorbis-toolsのパッケージインストールされていない場合は、下記の方法でインストールしてください。
コマンド:
sudo apt install vorbis-tools
Raspberry PiとRTCを搭載したCPI-RASとの組合せ
Raspberry PiとCPI-RASと組み合わせた場合、CPI-RASのボタンによってRaspberry Piの電源のOn/Off制御を行うことができます。さらに電源Off時には、電池でRTCの時計機能を動作し続けているので、アラームによって電源Onさせることもできます。
仕組みは、CPI-RAS上の省電力マイコンがRaspberry Piへの電源制御を行っており、CPI-RASのボタン同様にRTCが持つアラーム割込みが働いた時、その割込み通知が省電力マイコンに送られ、省電力マイコンはRaspberry Piの電源をOnします。
(CPI-RASへ電源供給がされていない場合は機能しません。)
この仕組みによって、Raspberry Piが電源Off状態だと何もできなかったRaspberry Piを起動するきっかけが生まれ、Raspberry Piを常時電源On状態にしなくてもアラーム機能を働かすことができます。またRaspberry Piの電源Off状態を作ることで何もしない時に対しての省エネ効果もあります。
電源の状態遷移
Raspberry Pi とCPI-RASを組合せ時の電源の状態遷移を説明します。
CPI-RASに電源を入れると初期状態では、そのままRaspberry Piが起動します。
CPI-RASのボタン長押し等でRaspberry Pi のみ電源Offをした後は、ボタン押下もしくRTCの割込み通知によってRaspberry Piの電源をOnにします。
Raspberry Pi のみ電源Offする場合は、Raspberry Piが動作中時にボタン長押しするとOSを強制終了しSDカード内のファイル破損する恐れがあります。安全に電源Offするには、OSのシャットダウンコマンド実行しモニターへの出力がなくなりSDカードへのアクセスが完全に切れた後にボタン長押しするか、CPI-RAS用ソフトウェアに含まれるCORAS(LNX) for ARMのライブラリ関数MT_SetPowerOff()とOSのシャットダウンコマンドを組合せて行います。
ライブラリ関数MT_SetPowerOff()は、電源Offタイミングをパラメータに設定して実行します。OSがシャットダウン状態になる時間※4を見込んで、この関数を実行しシャットダウンコマンドを実行します。
RTCアラーム設定
CPI-RASに搭載しているRTCデバイスはEPSON製RX8900を使用しており、このデバイスにはアラーム関連のレジスタを備えており、そのレジスタにアラーム情報を設定することで時刻アラームを発生させ割込み通知を送ることができます。
レジスタ詳細はEPSONのサイトにある「RX8900SA/CE アプリケーションマニュアル」にアラームレジスタ、アラーム割込み機能関連レジスタの記載がありますのでそちらをご参照ください。
CPI-RAS用ソフトウェアのRTCドライバの中にrx8900toolというツール※5があります。これはRTCドライバを経由してRTCのアラーム関連のレジスタを設定できるものです。
このツールを使ってアラーム時刻設定、アラームの有効無効、アラーム割込み通知の解除を行います。
アラーム時刻設定例(毎日8:00):
sudo rx8900tool set_alarm --everyday 01-08:00
アラーム有効:
sudo rx8900tool enable_alarm
アラーム無効:
sudo rx8900tool disable_alarm
アラーム割込み通知解除:
sudo rx8900tool clear_irq
CPI-RASはアラーム割込み通知があると、電源Offした後もその通知を検知しRaspberry Piを電源Onし続けます。アラーム通知で起動した後は必ずアラーム割込み通知解除を行ってから電源Offするようにしてください。
RTCアラーム機能の動作例
先ほどのRaspberry Piのオーディオ端子にアンプ内蔵スピーカーを繋いでアラーム音を再生する方法の応用として、CPI-RASを使った電源Off状態からアラーム機能を紹介します。
上記構成のようにRaspberry PiのHAT端子にCPI-RASを付属のスペーサーを使って組み立てます。USB電源供給タイプのアンプ内蔵スピーカーは先ほどの例と同じようにUSBとオーディオ入力ケーブルをRaspberry Piのオーディオ端子とUSB端子に接続します。
アラーム音の再生を先ほどと同じくcrontab行うとします。RTCで電源Off状態からRaspberry Pi OSを起動することはできますが、起動後crontabでアラーム音が再生されるまでは時間がかかります。
そこでRTCのアラーム設定は起動からアラームが再生されるまでの時間を考慮し、crontabで設定した時間より前に設定します。Raspberry Pi OSの起動時間はシステム状態にもよりますが、30秒~60秒くらいと考えRTCの設定時間はcrontabのアラームの設定時間より1~2分ほど前にします。
例として、毎日8:00にアラーム音を再生したいのであれば、RTCのアラーム時刻はその2分前とし毎日7:58します。(Raspberry Pi OSの起動が早ければ 7:59でも構いません)
ただ、RTCの時刻はUTC時間であり、Raspberry Pi OSが日本時間であれば-9時間の時差があるため、RTCのアラーム設定は 22:58に設定します。
crontab設定:
0 8 * * * ogg123 /usr/share/sounds/freedesktop/stereo/alarm-clock-elapsed.oga
アラーム時刻設定例(毎日23:28):
sudo rx8900tool set_alarm --everyday 01-23:28
sudo rx8900tool set_alarm enable_alarm
上記の設定をすることで、電源Off状態であってもRaspberry PiをRTCの割り込み通知によってCPI-RASが電源Onにするため、毎日8時にはアラーム音を再生することができます。
まとめ
Raspberry Pi でRTCを使った例で、通常は電源On状態にしか機能しないアラーム機能を電源Off時まで範囲を広げた内容をご紹介しました。
CPI-RASにはRaspberry Piの電源制御およびRTC以外にも下記の機能も備えています。
(詳細はCPI-RASデータシート、リファレンスマニュアルをご参照ください)
- CPI-RASの電源供給は8-24Vあることから他のHATサイズ拡張ボードにも電力を安定供給することができ、コンテックのHATサイズ拡張ボードにおいては最大8枚まで接続が可能
- デジタル入力2点、デジタル出力1chを備えRaspberry Piから制御が可能
- 8 - 28VDC電源(DC電源入力電圧に依存)と5VDC 電源の外部出力を備え、Raspberry Piから外部機器の電源制御が可能
これらの機能をアラーム機能と組み合わせると、時刻に合わせた他のHATボードの制御やCPI-RASの電源外部出力から供給を受ける外部機器のOn/Off制御等、幅広い応用も可能となります。
このようなアラーム機能の使い方に興味のある方はお試しいただければと思います。
補足:今回紹介したRTCアラームの仕組みはコンテックのエッジAIコンピュータ DX-U2000シリーズ
でも採用されており、DX-U2000シリーズが電源Off状態でもRTCのアラームを設定することで、その設定された時刻に電源Onすることが可能です。(RTCデバイスは同じEPSON製RX8900を使用していますがドライバ、ツール類が違うので使い方にご注意ください)
関連コンテンツ
技術コラムへ戻る