Raspbianにリアルタイムクロック(RTC)をインストールする方法


9

私が持っています:

  • Raspberry Pi with 2015-05-05-raspbian-wheezy
  • ds1307が接続されています(これはAdafruitボードで、プルアップ抵抗は取り付けられていません)。

方法:

  • ドライバーの構成
  • Piが起動時に実際にRTC時間を使用することを確認しますか?

私が知る限り、実際には最初の部分を実行しましたが、2番目の部分では運がありません。Adafruitの手順を含む、そこにある情報の多くは、これが原因で廃止されています。https://www.raspberrypi.org/forums/viewtopic.php?t = 97314

したがって、最初のステップ:raspi-configでI2cとドライバーを有効にし、/ boot / config.txt dtoverlay=i2c-rtc,ds1307の最後に追加します。ドライバーがあり、hwclock今は私のために機能します(i2cdetectを実行できないなど)。後で)。

次に、fake-hwclockを削除し、起動時に実際にrtcを読み取るように設定する必要があります。私はこのアドバイスに従うように努めてきました-これは私が見た他の事柄とほぼ一致しており、ごく最近です-https://www.raspberrypi.org/forums/viewtopic.php?p = 842661#p842661

(これは別のRTCの場合ですが、私は偽のhwclockなどを削除することについての2番目の部分だけに従っています)。

しかし、運が悪く、「コメントアウトされる行」は私のpiには存在しません。私のpiは1970年1月1日00:00に表示されhwclock -r、RTCが破損していると言います。RTCを設定してpiを再起動してから電源を切らなかった場合でも、起動時に破損したようです。

また、i2cdetectをまったく実行できませんでした。デバイス/ dev / i2c(something)が存在しない、そして実際には存在しないという不満があります...


暫定アップデート

OK、私はそれを確立しました:

  • 破損は時間/日付情報のみです。i2csetを使用してnvramにパターンを入力すると、その情報は再起動時に変更されませんが、年は0x66になります
  • config.txt ,ds1307の行からを削除するとdtoverlay=i2c-rtc,ds1307、RTCを破損することなくシステムが起動します。これは、ドライバー自体がデータを破損しているという考えをサポートしています。私はドライバのコードを見てきましたが、それは時間を経て、好ましくないものを変更します(たとえば、12時間形式から24時間形式に変更されます)。したがって、おそらく問題は、I2Cポートが実際に動作する準備ができていないときにドライバがインストールされていることです(おそらく、クロックが準備されていないためでしょうか?)
  • 起動後にこれを行うsudo sh -c 'echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device'と、rtc_ds1307ドライバーが読み込まれ、/ dev / rtc0が表示されます。そして、時間はまだ大丈夫です。そして、それはinitスクリプトを変更する方法の基礎として使用することができます
  • もう1つの楽しい詳細:hwclock -s/sys/..../new_deviceに書き込んだ直後にスクリプトで使用すると、失敗します。sleep 0.5間に何かがある必要があります。

だから、シャットダウンして起動できるシステムができたようです。正しい時刻になるでしょう-これはすぐに正しく書き上げます。


破損はntpdateの実行に関係している場合とそうでない場合があります... raspberrypi.org/forums/viewtopic.php?p=690492#p690492
greggo

私は、追加dtparam=i2c1=on1月にmicksulleyために働いたとしてのconfig.txtにraspberrypi.org/forums/viewtopic.php?f=28&t=97639 を再起動します- 。まだ/ dev / i2c *はなく、まだi2cdetectはありません。
greggo 2015年


@goldilocks-ありがとう、重要なパズルのピース。i2cdetectが機能し、1:0x68がUUとして表示されます。今日は後で他のことを試してみます。
greggo 2015年

1
note sudo invoke-rc.d hwclock.sh startは何もせず、/run/udev存在するため終了します。しかしsudo invoke-rc.d hwclock.sh show、クロックを読み取り、sudo invoke-rc.d hwclock.sh stopシステムクロックをハードウェアクロックにコピーします。
greggo 2015年

回答:


6

これが私がそれを機能させた方法です。

ここでのほとんどすべてはスーパーユーザーとして実行する必要があるため、 'sudo bash'を使用するか、すべての前にsudoを配置します(まだ表示されていない場合)。

次の基本的な手順が必要です。

  • 'i2c'ドライバーが存在しない場合は存在するように手配します。
  • rtc_ds1307の追加ドライバーがあります
  • 偽のhwclockを削除します。これは、時間を提供するネットワークがない場合に通常使用されるサブシステムです。システムのシャットダウン時にシステム時間をファイルに保存し、起動時に同じファイルからロードします。したがって、時間は正しくありませんが、再起動するたびにゼロに戻ることはありません(1970年1月1日)。RTCがインストールされていれば、ネットワークがなくても時刻はかなり正確に始まります。
  • システムが起動時にRTCから時刻を読み取るように手配します。

これは、イメージ2.0-05-05-raspian-wheezy、rev 2.0 'Pi 1'、および拡張コネクターに接続されたds1307 rtcのイメージであることに注意してください。それの一部または多くが他の状況に当てはまるはずです(しかし、おそらく古いラスピアには当てはまりません)。破損しているRTCの問題はds1307ドライバーに固有である可能性があるため、他のチップの方が簡単な場合があります。そしてその問題は将来のリリースで修正されるかもしれません。

また、これらの手順は、I2Cバス#1が使用されているモデル2 PCB向けに書かれています。rev1 PCB(P1の近くに8ピン 'P5'コネクタがない)がある場合、RTCをI2Cバス#0に接続します。そのため/i2c-1/、以下に表示されている場合は、/i2c-0/代わりに使用してください。

まず、raspi-configを実行します。[詳細オプション]の下に、I2Cを有効にする設定とI2Cドライバーの読み込みを設定します。それらを有効にします。

これで、原則として、/boot/config.txt:の下部に行を追加できます。これによりdtoverlay=i2c-rtc,ds1307、ds1307ドライブがロードされます。しかし、-いくつかが発見したように-ドライバーのロードは時計の内容を破壊し、その目的を無効にします。理由はわかりませんが、ドライバーのソースを確認したところ、起動時に時計が読み取られ、好ましくないものが見つかった場合(24時間ではなく12時間形式など)、書き込みでこれらの設定を「修正」します。そのため、I2Cが起動した直後にドライバーがロードされ、クロックが正しく設定されていないか、通信が破損している可能性があります。いずれにせよ、これは私が持っている構成では機能しないため、後でドライバーをロードします。

この時点で、再起動できます。使用lsmod | grep i2cすると、i2c_bcm2708ドライバがロードされているはずです(raspi-configで要求されたとおり)。

次に、次のコマンドを実行します。

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

または(まだスーパーユーザーでない場合):

sudo sh -c 'echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device'

sudo echo>スーパーユーザーである必要があるため、機能しません)。

これにより、rtc_ds1307ドライバーが読み込まれ、デバイスが作成されます/dev/rtc0。これで実行できるはずですhwclock

sudo hwclock -r

... RTCからの時間を表示します。時計がまだ初期化されていないため、エラーが発生する可能性があります。いずれにしても、これを設定します。

(1)システムクロックがを使用して設定されていることを確認しdateます。ネットワークに接続している場合は、すでに設定されているはずです。そうでない場合は、携帯電話またはポケット時計を取り出して、次のようなことを試してください

sudo date -s '18 nov 2015 22:20:24'

システムの時刻が適切に設定されている場合、タイムゾーンに合わせて正しく設定するように注意してください。

sudo hwclock -w

RTCにコピーします。

次に、hwclock -rが機能し、RTCに時刻が表示されます。複数回読んだ場合は、RTCが進んでいるのがわかります。

Wed 18 Nov 2015 22:48:41 EST  -0.181329 seconds
Wed 18 Nov 2015 22:48:53 EST  -0.013721 seconds

注:クロック値はUTCタイムゾーンに関連して保存されますが、現地時間で表示されます。

次のステップ:fake-hwclockを削除します。まず無効にして、hwclock.shが有効になっていることを確認します。

sudo update-rc.d hwclock.sh enable
sudo update-rc.d fake-hwclock remove

sudo apt-get remove fake-hwclock
sudo rm /etc/cron.hourly/fake-hwclock
sudo rm /etc/init.d/fake-hwclock

hwclock.sh起動時に何もしません-udevの存在を検出し、udevが起動作業を完了したと想定します-しかし、電源投入時にシステム時間をRTCに書き込むのに役立つ、何か有用なことを行います。したがって、ネットワークに接続すると、Pi時間はネットワークに同期し、シャットダウンするとRTCドリフトが修正されます。

あと1つ-電源投入時にRTCを読み取るように調整する必要があるため、システム時刻が設定されます。udevには、RTCドライバーがロードされていないため、それを実行しようとする試みが失敗するか、バイパスされます。

これを設定する方法は、これらの4行を上部/etc/rc.local(コメントの下部、右上)に追加することです。

echo 'setting up RTC'
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
sleep 0.5
hwclock -s

これにより、システムが起動するたびに、ドライバーが読み込まれ、システム時刻がハードウェアクロックから設定されます。「sleep 0.5」が存在するのは、hwclockコマンドがないとコマンドが機能しないことがわかったためです。書き込み/sys/class/i2c-adapter/i2c-1/new_device(/ dev / rtc0の作成を含む)によってトリガーされたアクションには、明らかに少し時間がかかります(おそらく0.5秒未満です)。

以上です。私はこの使用に本当に満足していません/etc/rc.local- rc.local実行される前に多くのことが発生し、実行前にクロックを設定する方がはるかに良いので、私はむしろそれをもっと早くセットアップしたいと思います。しかし、それは私のために働いています。より良い方法が見つかったら、この回答を更新します。

参照 https://www.raspberrypi.org/forums/viewtopic.php?t=97314 https://www.raspberrypi.org/forums/viewtopic.php?p=842661 https://www.raspberrypi.org/forums /viewtopic.php?t=85683 https://www.raspberrypi.org/blog/upcoming-board-revision/


RTCを注文し、RTCの投稿を読んでいました。これは、RTCについて言及しているこのサイトの数少ないものの1つです。RTCが届き、最新のRaspbian(Jessie)に追加dtoverlay=i2c-rtc,ds3231config.txtました。すべてがうまくいくようです。特別な設定は必要ありません。確かにこれは別のチップです(ただし、オンチップXtalと3.3Vで動作することを除いて、データシートはほとんど同じに見えます)。PSのhwclockニーズsudo
ミリウェイズ、2015

1
@Milliways /etc/rc.localはrootとして実行されます。ds3231が同じドライバーを使用しているかどうかは思い出せません。とにかく、ドライバーの読み込み時に発生する破損の原因がわからないのです。また、上記のコメントで述べたように、これらの問題の一部は、初期化中の競合状態(たとえば、rtcドライバーがi2cが適切にセットアップされる前にロードされる)が原因である可能性があり、 SDカード。私が初めてジェシーを走らせたとき、それはクラス4のカードにあり、それはひどく壊れていました。奇妙なエラー、そしてそれは無視されましたshutdown。クラス10で
問題ありませんでした

@Milliwaysですが、はい。ds3231を使用することを強くお勧めします。3.3vで動作し、はるかに正確です。それもこれらの面倒からあなたを救うならば、それは大きなボーナスです。
greggo

2

補足回答-I2Cツールによるトラブルシューティング

R2を機能させるために、i2c-toolsを使用してRTCを確認すると便利であることがわかりました。他のディスカッションで、これに関する多くの参照が見つかります。私はそれで見つけたものについての質問にいくつかの情報を追加しました。役に立つ場合に備えて、この回答に移動しました。

I2Cが有効(raspi-config)で、i2c-devモジュールがロードされている必要がありsudo modprobe i2c-devます。これはで強制できます。i2c-devRTCを機能させるために必要ではありませんが、i2c-toolsを使用するために必要です。

sudo apt-get install i2c-tools「i2cdetect」が存在しない場合は、を使用してi2c-toolsをインストールできます。

変更:あなたは牧師1枚のPCBを使用している場合 i2cdetect -y 1i2cdetect -y 0、すべての変更1 0x680 0x68i2cdumpコマンド。

できるよ i2cdetect -y 1

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --

...「68」は、デバイスがアドレス0x68でI2Cバス上でアドレス指定されていることに応答したことを示しています。rtc_ds1307ドライバーをロードした場合、ドライバーによって予約されているため、「UU」として表示されます。

コマンドi2cdump -y -f -r 0-6 1 0x68 cを使用して、時刻を含むds1307の最初の7つのレジスタをダンプできます(「-f」は、rtcドライバがインストールされている場合にのみ必要です。予約を上書きします)。

以下は、電源投入後にRTCがドライバのロードにより破損した場合に何が起こるかdtoverlay=i2c-rtc,ds307です。

hwclock -r 最初は時計の設定が壊れていると報告し、実際に年は「66」です。

pi@raspberrypi ~ $ sudo hwclock -r
hwclock: The Hardware Clock registers contain values that are either invalid (e.g. 50th day of month) or beyond the range we can handle (e.g. Year 2095).
pi@raspberrypi ~ $ sudo i2cdump -y -f -r 0-6 1 0x68 c
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 50 04 00 05 01 01 66                               P?.???f         
pi@raspberrypi ~ $ sudo i2cdump -y -f -r 0-6 1 0x68 c
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 52 04 00 05 01 01 66                               R?.???f         
pi@raspberrypi ~ $ sudo hwclock -w
pi@raspberrypi ~ $ sudo i2cdump -y -f -r 0-6 1 0x68 c
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 35 09 01 03 17 11 15                               5??????         
pi@raspberrypi ~ $ sudo i2cdump -y -f -r 0-6 1 0x68 c
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 37 09 01 03 17 11 15                               7??????         
pi@raspberrypi ~ $ sudo hwclock -r
Tue 17 Nov 2015 01:09:42 UTC  -0.384866 seconds
pi@raspberrypi ~ $ sudo i2cdump -y -f -r 0-6 1 0x68 c
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 46 09 01 03 17 11 15                               F??????         

i2cdumpからの7つの数値は次のとおりです:[秒、分、曜日、曜日、月、年]はすべてbcdなので、最終時刻は2015年11月11日、01:09:46 UTCです。

「破損した」時間は1-jan-66で、同じ値が表示されると報告した他の人を見てきました。


2

私はArch Linuxを備えた2つのRaspberry Pi 2モデルBで同様の問題を抱えていました。1つはTinyRTC(ds1307を使用)を使用し、もう1つはコンデンサRTC(ds3231を使用)を使用しています。

NTPDをデーモンとして実行すると、RTCの日付が両方とも破損し、2066/01/01に設定されました。

#hwclock --debug
hwclock from util-linux 2.27
Using the /dev interface to the clock.
Last drift adjustment done at 1420070400 seconds after 1969
Last calibration done at 1420070400 seconds after 1969
Hardware clock is on UTC time
Assuming hardware clock is kept in UTC time.
Waiting for clock tick...
/dev/rtc does not have interrupt functions. Waiting in loop for time from /dev/rtc to change
...got clock tick
Time read from Hardware Clock: 2066/01/01 00:01:12
Invalid values in hardware clock: 2066/01/01 00:01:12
Time since last adjustment is -1420070400 seconds
Calculated Hardware Clock drift is 0.000000 seconds
hwclock: The Hardware Clock registers contain values that are either invalid (e.g. 50th day of month) or beyond the range we can handle (e.g. Year 2095).

セットアップ

/boot/config.txtに追加しました

dtparam=i2c_arm=on
dtoverlay=i2c-rtc,ds1307

または

dtparam=i2c_arm=on
dtoverlay=i2c-rtc,ds3231

/etc/modules-load.d/raspberrypi.confに追加しました

i2c-bcm2708
i2c-dev

systemd-timesyncdを無効にしました

# timedatectl set-ntp false

NTPをインストールしました

# pacman -S ntp

どのように解決したか

サービスを開始する前にNTPDの単一のインスタンスを開始すると、システム時刻が更新され、RTCが設定されませんが、その後NTPDサービスを開始すると、RTCの日付が破損することなく更新されます。

許可の問題があると思いました。デフォルトのグループはオーディオです。

# ls -l /dev/rtc0
crw-rw---- 1 root audio 254, 0 Jan  1  1970 /dev/rtc0

/etc/udev/40-rtc-permissions.rulesを作成してテストしました

KERNEL=="rtc0", GROUP="ntp", MODE="0666"

でも役に立たなかったので削除しました。

自動的に行われないため、起動時にシステム日付も更新する必要がありました。

/etc/ntpd.serviceファイルに追加しました

ExecStartPre=-/usr/bin/hwclock -s
ExecStartPre=/usr/bin/ntpd -gq

NTPDサービスを有効にしました

# systemctl enable ntpd

日付は更新され、起動時に破損しません。

最初に起動した場合にNTPDデーモンがRTCを破損させる原因はわかりませんでした。誰かが私のソリューションを改善してくれれば幸いですが、これは私にとってはうまくいきます。


投稿ありがとうございます。私はこれを1日中Raspberry Pi 3で戦っています。あなたの投稿が最後に欠けていた最後のピースをまとめました。私はOSでFedberryを実行しており、ユニットをIPAサーバーとしてセットアップしようとしています(なぜですか?10ワットの無料IPA-美味しくて、充填量が少ないからです!)これで、電源障害に耐えられる稼働中のIPAサーバーを入手できました。手動介入なし。私はds1307 rtcを使用しており、特定したクロックのトラブルシューティングを行うときに同じ問題のいくつかに遭遇しました。最悪は起動時のRTCメモリの破損でした。dtparam = i2c_arm = onがトリックoだったかどうかはわかりません
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.