BeagleBone Black のハードウェアハック(2)Hacking BeagleBone Black, part 2
BeagleBone Blackにリアルタイムクロック(RTC)を付けます。
1. リアルタイムクロック
BeagleBone Blackにはリアルタイムクロック(時計)がありません。電源を切ってしまうと、時刻が分からずに、同じ時刻からスタートしてしまいます。普通のパソコンでは電池でバックアップされた時計を内部に持っており、起動時にも時刻が分かるようになっています。BBBはコストダウンのためか、この仕組みを持っていません。
Unix(Linux)では時刻でファイルの古い新しいを判断したりしているため、絶対時刻を設定しないと何かと不便です。
そこで、BBBではネットワークがつながっている場合には、ntp(Network Time Protocol)を使って他のホストから時刻を聞いて、自分の内部の時計を設定します。
BBB# /usr/bin/ntpupdate pool.ntp.org
ネットワークをつながない場合には時刻を知る術がありません。そこで今回はハードウェアハック第一弾としてBBBにRTCを接続してみました。
元ネタは、AdafruitのチュートリアルAdding a Real Time Clock to BeagleBone Blackです。
2. 回路
回路図を示します。I2CインタフェースをI2Cバスに、時計用の水晶を対応する端子につなぐだけです。
電源としては本体の5Vラインから引きます。また、バッテリーバックアップ用にボタン電池を繋ぎます。
また、回路図に入っていませんが、電源とグランドの間にパスコンを入れた方が良いでしょう。
パーツリストを示します。全てのパーツが秋月で揃います。
名称 | 規格 | 数量 | 備考 |
リアルタイムクロック | DS1307+ | 1個 | 通販コード I-06949 |
水晶発振子 | 32.768KHz | 1個 | |
ボタン電池 | CR2032 | 1個 | |
ボタン電池基板取付用ホルダー | CR2032用 | 1個 | 通販コード P-00706 |
基板 | BeagleBone・ユニバーサルプロトケープ | 1個 | |
ピンヘッダ | 2列46ピン | 2個 | |
コンデンサ | 積層セラミック 0.1uF | 1個 | パスコン用 |
今回はケースに入れる都合で、基板の裏側にパーツがを配置しました。本体基板のパーツ、特にUSBコネクタと干渉しない位置にICと電池ホルダーを取り付けます。
実装高さの都合でICソケットは使いませんでした。
普通は基板の表にパーツを配置すると思いますが、この場合には、本体基板との部品の干渉について気にする必要はありません。
3. 動作確認
チュートリアルに従ってi2cdetectで動作の確認をします。
BBB# i2cdetect -y -r 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- UU UU UU UU -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
ID=68番としてI2Cバス上でICが検出できれば成功です。
バックアップ用の電池を入れておかないとRTCチップは動作しない様です。必ず、基板を差し込む前に電池を入れておいて下さい。
4. ソフトウェア設定
ソフトウエアの設定方法は、チュートリアルの通りです。
(1) I2Cデバイスとして認識させる。
BBB# mkdir /usr/share/rtc_ds1307
(2) 起動用シェルスクリプトを作成 /usr/share/rtc_ds1307/clock_init.sh
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device hwclock -s -f /dev/rtc1 hwclock -w
(3) サービス登録用ファイルを作成 /lib/systemd/system/rtc-ds1307.service
[Unit] Description=DS1307 RTC Service [Service] Type=simple WorkingDirectory=/usr/share/rtc_ds1307 ExecStart=/bin/bash clock_init.sh SyslogIdentifier=rtc_ds1307 [Install] WantedBy=multi-user.target
(4) サービスを有効にする
BBB# systemctl enable rtc-ds1307.service
リブートして動作の確認をします。時刻が設定されていれば成功です。
(続く)