に関する記事 GPSのPPS信号を使った Stratum-1 NTPサーバの作り方 [1] コメントを追加 [2] GPSのPPS信号を使うと非常に高精度なNTPサーバが作れるそうなので 実際にを使ってやってみました GP Sモジュールは測位計算をする時に非常に正確な時刻を得ることができます これを利用してGPSモジュールの中にはPPS 信号を出力するものがあります PPSはPulse Per Secondの略で 正確に1秒間隔で出力されるパルス信号のことです 詳細な手順は後回しにして まずはどれくらい正確な時刻が得られたのかをお見せします Internet上のNTPサーバを使うと 数ms程度の精度だったのがに接続したGPSのPPSを使うと数μs程度の精度が得られました 以下のグラフは と TS-109 NAS)のそれぞれでNTPサーバを動かし 上位のNTPサーバとの時刻オフセット をMRTGを使って表したグラフです MRTGがマイナスの値を扱えないので 5ms のオフセットをかけてあります つまり 中央の5msのラインより上がプラスのオフセット 下がマイナスのオフセットです まず NTPサーバとして ntp.nict.jp を指定した時の時刻オフセットです TS-109はサーバとしてntp.nict.jpとRaspberry Piと両方を指定していました だいたい数ms程度のオフセットに収まっていることがわかります ネット上のNTPサーバを使っても百分の一秒程度の精度が得られるのですが PPSを使うとさらに高精度な時刻同期をする Page 1 of 15 -- サイト内検索 -- -- プライバシーポリシー --
ことができます 以下のグラフはNTPの参照クロックとしてNICTのサーバからPPSへと変更したときの時刻オフセットです 22時30分頃にNTPサーバを入れ替えたり ntp.conf を書き換えたりの作業をしたせいでオフセットが突出している箇所が ありますが それより右の平らな部分ではPPSを使った時刻同期に変わっています これはPPS使用時の時刻オフセットを別のスケールで測定したグラフです の方は 20μsのオフセット TSー109の方は500μsのオフセットをかけてあります Raspberry Piは直接PPSを使用しているので数μsのオフセット値が得られています TS-109の方は を上位サーバとして参照していますが こちらは100μs程度の精度です GPSモジュールのPPS信号を使うと ほぼ数μs程度の精度で時刻同期をすることができました 以下が詳細な手順です 概要 使用したGPSモジュールは Adafruit Ultimate GPS Breakout [3]というものです これにGPS外部アンテナ [4] を接続して使っています GPSモジュールのシリアル出力はUARTに入力しています では/dev/ttyAMA0からデータを取り込みます GPSモジュールのPPS信号はのGPIO 18につなげています に最初から入っているNTPサーバではPPSと同期できないので NTPサーバもビルドする必要があります [追記:2018/01/29] 最新の OS (4.9..59+) では ntp が入っていないので 自分で入れる必要がありました 以下のコマンドを実行します $ sudo apt-get install ntp 以下のページを参考にしました 書いてあることをほぼなぞるだけでできてしまいました http://www.satsignal.eu/ntp/raspberry-pi-ntp.html [5] GPS無しでNTPサーバを動かす まず GPS無しでNTPサーバを動かしてみます ntp.conf を編集します Page 2 of 15
$ sudo nano /etc/ntp.conf 次の1行を加えるだけです server ntp.nict.jp iburst NTPサーバを再起動します $ sudo /etc/init.d/ntp restart NTPサーバの動作をチェックします $ ntpq -p remote refid st t when poll reach delay offset jitter ============================================ *ntp-a2.nict.go..nict. 1 u 17 64 377 6.547 0.940 0.894 こんなような出力がでればOK. この状態で1日動かしてMRTGでデータをとりました PPS無しのGPSを使ってNTPサーバを動かす 次に PPSは使わずにGPSを接続してNTPサーバを動かします GPSモジュールは通常 NMEA0183というフォーマットで時 刻や位置などの測位結果をテキストのメッセージとして出力しています これを使ってNTPの同期をとることができます PPSは1秒おきのパルスに過ぎないのでPPSだけでは時刻はわかりません GPS+PPS またはインターネットのNTPサーバ PPS)という組合せによって GPSで秒単位の時刻を取得し それとの差分をPPSのパルスで知ることによって正確な時刻同 期を行うことができます まず GPS関連のツールをインストールします $ sudo apt-get install gpsd gpsd-clients python-gps 上述のように 私はGPSの出力をUARTに入力しているので ではGPSの入力が /dev/ttyama0 になります gpsd を以下のように起動します $ sudo gpsd /dev/ttyama0 -F /var/run/gpsd.sock GPSが動いているか確認します $ cgps -s GPSの動作確認は gpsmon でもOK ntp.conf の編集をします $ sudo nano /etc/ntp.conf 以下の2行を追加します server 127.127.28.0 minpoll 4 maxpoll 4 fudge 127.127.28.0 refid GPS stratum 15 NTPを再起動して 確認します Page 3 of 15
$ sudo /etc/init.d/ntp restart $ ntpq -p remote refid st t when poll reach delay offset jitter ============================================= SHM(0).GPS. 15 l 4 16 377 0.000 330.130 354.492 *ntp-a2.nict.go..nict. 1 u 58 64 377 6.504 0.867 0.404 こんなような出力ならOK. SHMはShared Memoryの略です 127.127.28.0 というのはNTPの参照クロックとしてPPSを使用するという意味です 他 にどのような参照クロックがあるのかは以下のページでわかります ちなみに後でPPSを使う時にType22を追加します http://www.eecis.udel.edu/~mills/ntp/html/refclock.html [6] ついでに gpsd の設定をしておきます $ sudo nano /etc/default/gpsd 以下のようにします START_DAEMON="true" USBAUTO="true" DEVICES="" GPSD_OPTIONS="/dev/ttyAMA0" GPSD_SOCKET="/var/run/gpsd.sock" PPSを使ったNTPサーバを動かす /etc/modules に次の1行を追加します pps-gpio /boot/config.txt に次の1行を加えます dtoverlay=pps-gpio,gpiopin=18 を再起動します モジュールがロードされたことを確認します $ lsmod grep pps pps_gpio 2993 1 pps_core 8756 2 pps_gpio PPSが有効になったかどうか確認します $ dmesg grep pps [ 4.384297] pps_core: LinuxPPS API ver. 1 registered [ 4.386474] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti [ 4.416234] pps pps0: new PPS source pps.-1 [ 4.418431] pps pps0: Registered IRQ 178 as PPS source pps tools をインストールします $ sudo apt-get install pps-tools PPS をテストします Page 4 of 15
$ sudo ppstest /dev/pps0 trying PPS source "/dev/pps0" found PPS source "/dev/pps0" ok, found 1 source(s), now start fetching data... source 0 - assert 1388146614.000084899, sequence: 381 - clear 0.000000000, sequence: 0 source 0 - assert 1388146615.000082106, sequence: 382 - clear 0.000000000, sequence: 0 source 0 - assert 1388146616.000084314, sequence: 383 - clear 0.000000000, sequence: 0 source 0 - assert 1388146617.000081521, sequence: 384 - clear 0.000000000, sequence: 0 source 0 - assert 1388146618.000081728, sequence: 385 - clear 0.000000000, sequence: 0 source 0 - assert 1388146619.000080936, sequence: 386 - clear 0.000000000, sequence: 0 source 0 - assert 1388146620.000081143, sequence: 387 - clear 0.000000000, sequence: 0... 次に PPSが使えるNTPサーバをビルドします $ mkdir ntp $ cd ntp $ sudo apt-get install libcap-dev $ wget http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2.8p7.tar.gz [7] $ tar xvfz ntp-4.2.8p7.tar.gz $ cd ntp-4.2.8p7 $./configure --enable-linuxcaps $ make $ sudo make install NTPサーバーを新しく作ったものに入れ替えます $ sudo /etc/init.d/ntp stop $ sudo cp /usr/local/bin/ntp* /usr/bin/ $ sudo cp /usr/local/sbin/ntp* /usr/sbin/ $ sudo /etc/init.d/ntp start /etc/ntp.conf に以下の2行を追加します server 127.127.22.0 minpoll 4 maxpoll 4 fudge 127.127.22.0 flag3 1 refid PPS それから PPSを使うためには他のサーバーに prefer 指定が必要とのことなので NICTのサーバの後ろに prefer を付けます server ntp.nict.jp iburst prefer NTPサーバを再起動して ntpq -p してみるとこんなふうになっているはずです remote refid st t when poll reach delay offset jitter ============================================ SHM(0).GPS. 15 l 15 16 377 0.000 11.207 21.121 opps(0).pps. 0 l 14 16 377 0.000-0.002 0.002 *ntp-a2.nict.go..nict. 1 u 21 64 377 6.501 0.258 0.914 さらに ntpq -c rv の出力はこんな感じ associd=0 status=0115 leap_none, sync_pps, 1 event, clock_sync, version="ntpd 4.2.8p3@1.3265 Mon Jul 13 11:28:54 UTC 2015 (3)", processor="armv6l", system="linux/3.18.11+", leap=00, stratum=1, precision=-18, rootdelay=0.000, rootdisp=1.075, refid=pps, reftime=d94e2d5d.88677330 Mon, Jul 13 2015 21:28:13.532, Page 5 of 15
clock=d94e2d62.c11182ca Mon, Jul 13 2015 21:28:18.754, peer=19590, tc=4, mintc=3, offset=0.008924, frequency=-19.734, sys_jitter=0.003815, clk_jitter=0.319, clk_wander=0.017 この場合 オフセットは 約9µs です PPSを参照しているので stratum=1 になっています GPS/GNSS [8] RaspberryPi [9] PPSを使ったNTPサーバのためのカーネル設定 コメントを追加 [10] この記事はかなり昔のものです 最近のカーネルは最初からPPS対応になっており カーネルの作り直しはしないでそのまま 使えます 精度はオフセットが±20μsの範囲に収まる程度です ================================================================================ ============= を使って Stratum-1 NTPサーバを動かしています GPSのPPS信号を使った Stratum-1 NTPサーバの作り方 [11] この記事のコメント欄で のべろ さんという人に教わったのですが PPS用のカーネル設定がまだ不完全でした 教わった通 りやってみると なんと精度が20倍くらい高くなりました Tickless System をOFFにするとよいとのことで以下のページを教わりました http://bugs.ntp.org/show_bug.cgi?id=2314 [12] PPSとカーネルの設定について調べてみるといくつか参考になるページが見つかりました カーネルのバージョンが3.10だ とちょっとConfigurationの仕方が異なるようです 以下のページが参考になります http://mythopoeic.org/pi-ntp/#comment-181184 [13] 以下のようにカーネルの設定をします $ sudo make menuconfig を実行してカーネルコンフィギュレーションメニューが出たところで General setup > Timers subsystem と進みます Timer tick handling という項目があるのでさらに進み Periodic timer ticks (constant rate, no dynticks) にチェックを入れます Page 6 of 15
ひとつ戻って Old Idle dynticks config のチェックをはずし High Resolution Timer Supportにチェックをいれます さらにひとつ戻って Device Drivers > PPS Support と進みます PPS kernel consumer support と PPS client using GPIO にチェックをいれます これでOK あとは前の記事で書いたようにカーネルイメージを作成し を再起動します これでしばらくデータを取ってみました 以下のようになりました 1000ns のオフセットをかけてあります 中央の1000のラインが0で下がマイナス 上がプラスです だいたい±500ns の範囲内に入っています Page 7 of 15
まだこの他に CPUガバナーの設定とシリアル通信のLatency の設定をするとさらに精度があがるそうなので そちらもやってみます GPS/GNSS [8] RaspberryPi [9] にMuninを入れて 温度 気圧センサーの値 をグラフ表示する コメントを追加 [14] NASにTS-109を使っていた頃 に取り付けた温度 気圧センサーの値をNAS上のMRTGで集計してグラフ表 示するということをやっていました NASを交換したのを機会に Raspberry Piの上でMuninを動かして 温度 気圧センサーの値をグラフ表示するようにしてみました MuninはMRTGと同じようないわゆるサーバー監視ツールです MRTGと比べるとずっと簡単にインストールできて 扱いも 簡単なようです まずは Munin をにインストールするところからです 方法はネットで探すといくらでも出てきますが ポイントは Apacheを先にインストールすること のようです 以下のサイトを参考にしました http://kinokotimes.com/2016/07/17/raspberry_pi_and_munin/ [15] https://lespo.net/rasppi2-munin.html [16] 私もよく知らないまま 先にMuninをインストールして 一旦 削除する羽目になりました なんだかんだで Muninが動いて PCのブラウザから表示できるようになりました 次は 温度 気圧センサーの値の表示です こちらのサイトを参考にしました https://lespo.net/munin-glaf.html [17] 温度の値を取るために 以下のスクリプトを動かしています 気圧の値を取るためのスクリプトもほぼ同じです pi@raspberrypi:/usr/share/munin/plugins$ cat temperature #!/bin/sh #%# family=auto #%# capabilities=autoconf GETNUM=`python /usr/local/bin/bmp180-munin.py 11 4` if [ "$1" = "autoconf" ]; then if [ -n ${GETNUM} ] ; then echo yes exit 0 else echo no exit 0 fi fi if [ "$1" = "config" ]; then echo 'graph_title temperature' Page 8 of 15
echo 'graph_args -r --lower-limit 0' echo 'graph_vlabel C' echo 'graph_category Weather' echo 'total.label temperature' echo 'total.min 0' echo 'total.draw LINE2' echo 'total.type GAUGE' exit 0 fi echo "total.value $GETNUM"; 気圧センサーの値の方はこんな感じです グラフの下の線が940hPaになるように調整しています pi@raspberrypi:/usr/share/munin/plugins$ cat pressure #!/bin/sh #%# family=auto #%# capabilities=autoconf GETNUM=`python /usr/local/bin/bmp180-munin-pres.py 11 4` if [ "$1" = "autoconf" ]; then if [ -n ${GETNUM} ] ; then echo yes exit 0 else echo no exit 0 fi fi if [ "$1" = "config" ]; then echo 'graph_title pressure' echo 'graph_args -r -l 940 --lower-limit 940' echo 'graph_scale no' echo 'graph_vlabel hpa' echo 'graph_category Weather' echo 'total.label pressure' echo 'total.min 0' echo 'total.draw LINE2' echo 'total.type GAUGE' exit 0 fi echo "total.value $GETNUM"; こんな具合に表示できました ちゃんとした温度計で見ると今の室温は21.2 Cなので センサーの値はちょっと高めに出てい るようです Page 9 of 15
[18] RaspberryPi [9] i2s DACの音の良さに驚愕した コメントを追加 [19] Page 10 of 15
[20] c [21] 3 + Hifiberry DAC+ [22]2017/01/13-22:29 投稿者 Ik T [23]. 正月休みに 3 で音楽プレーヤーを作ってみました 使ったのは Volumio という音楽プレーヤーに特化したLinux Distributionです 用のイメージをダウンロードして microsdカードにいれ 3 の電源を入れればあっという間に音楽プレーヤーができあがります 最初は愛用のFostexのHP-A4というUSB-DACを使って鳴らしていたのですが あれこれ調べているうちに i2s DAC なるものの存在を知りました のGPIOピンに挿して使うDACボードを使うとものすごくいい音がするというのです しかも i2s DAC は数千円で買えるほど安価です ということで Volumioと使う上では定番と思われる Hifiberry DAC+ というボードを買いました Hifiberry のサイトで 28.90 + 送料 $8.00 でした 安いですね https://www.hifiberry.com/shop/ [24] Page 11 of 15
1週間で到着したので早速 3 に装着して音を出してみました 驚愕しました 音が良いとは聞いていたけれどこれほどとは HP-A4を通して聴いていたときと区別がつきません 4万円近く したUSB-DACなのに RaspberryPi [9] オーディオ/音楽 [25] + 温度センサーで部屋の温度を測る コメントを追加 [26] NTPサーバ構築に続いて に温度センサーを付けてみました 使ったセンサーは BoschのBMP180 [27] というチップを使ったモジュールで ebay.com で$2.88で買いました 温度センサー で検索するとBMP085というチップがよく出てきますが BMP180はBMP085の後継機種だ そうです BMP085 BMP180は気圧と温度を測ることができるチップです このモジュール端子は4つで VIN, GND, SCL, SDAです それぞれの3V GND SCL SDAに接続 GPSモジュールと違って3Vでないとダメです ピンヘッダが付いてなかったのでGPSモジュールの横にちょっと置いてみまし た ほんとは半田付けしないといけないのですが とりあえず試してみたら動いたのでこの状態でデータを取るところまでやっ てみました 設定ですが AdafruitのBMP085のページを見てやりました Page 12 of 15
http://learn.adafruit.com/using-the-bmp085-with-raspberry-pi/overview [28] 1 I2Cが使えるようにする 以下の2行を/etc/modulesに追加 i2c-bcm2708 i2c-dev 必要なツール類をインストール sudo apt-get install python-smbus sudo apt-get install i2c-tools を再起動します 2 BMP180がI2Cでつながったかどうかテスト sudo i2cdetect -y 1 0123456789abcdef 00: -- -- -- -- -- -- -- -- -- -- -- -- -10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -70: -- -- -- -- -- -- -- 77 3 Pythonのライブラリを使う Adafruitが用意したPython のライブラリを使います https://github.com/adafruit/adafruit-raspberry-pi-python-code [29] $ sudo apt-get install -y python3 python3-pip python-dev $ sudo pip3 istall rpi.gpio $ git clone https://github.com/adafruit/adafruit_python_bmp.git [30] $ cd Adafruit_Python_BMP $ sudo python setutp.py install サンプルを動かしてみましょう $ python./examples/simpletest.py Temp = 29.00 *C Pressure = 100528.00 Pa Altitude = 66.82 m Sealevel Pressure = 100517.00 Pa 拍子抜けするくらいあっさり動きました あとはMRTGで使いやすいようにサンプルスクリプトをちょこちょこっと修正し MRTGのグラフにしてみました Page 13 of 15
気圧はそのままだと見にくいので900を引いた値にしてあります RaspberryPi [9] を無線LANで接続する方法 コメントを追加 [31] を無線LAN対応にするのは意外と簡単で 検索すればやり方がたくさん出てきます 無線LANのアダプターはこれを使いました これをUSBに挿すだけで認識します が動いている時に挿すと再起動します pi@raspberrypi Bus 001 Device Bus 001 Device Bus 001 Device Bus 001 Device ~ $ lsusb 002: ID 0424:9512 001: ID 1d6b:0002 003: ID 0424:ec00 004: ID 0411:01a2 Standard Microsystems Corp. Linux Foundation 2.0 root hub Standard Microsystems Corp. BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM Wireless LAN Adapter [Ralink RT8070] 次にWLANの設定をします $ sudo wpa_passphrase >> /etc/wpa_supplicant/wpa_supplicant.conf $ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf wpa_supplicant.conf の中身はこんな感じ ssidとpskの値はダミーです ctrl_interface=dir=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid="ssid" proto=wpa2 key_mgmt=wpa-psk pairwise=tkip CCMP group=tkip CCMP #psk="ascii PASSPHRASE" psk="generated WPA PSK" } あとは /etc/network/interfaces を編集して wlan0 の設定をいままでの eth0 の設定と同じにすればOK. English 日本語 Source URL: https://nyanchew.com/jp/raspberry-pi リンク [1] https://nyanchew.com/files/raspberry-pi-pps_0.jpg Page 14 of 15
[2] https://nyanchew.com/jp/comment/reply/706#comment-form [3] http://www.adafruit.com/products/746 [4] http://www.adafruit.com/products/960 [5] http://www.satsignal.eu/ntp/raspberry-pi-ntp.html [6] http://www.eecis.udel.edu/~mills/ntp/html/refclock.html [7] http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2.8p7.tar.gz [8] https://nyanchew.com/jp/category/digital-life-j/gpsgnss [9] https://nyanchew.com/jp/category/digital-life-j/raspberrypi [10] https://nyanchew.com/jp/comment/reply/714#comment-form [11] http://nyanchew.com/jp/gps%e3%81%aepps%e4%bf%a1%e5%8f%b7%e3%82%92%e4%bd%bf%e 3%81%A3%E3%81%9F-stratum-1-ntp%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E4%BD%9C% E3%82%8A%E6%96%B9 [12] http://bugs.ntp.org/show_bug.cgi?id=2314 [13] http://mythopoeic.org/pi-ntp/#comment-181184 [14] https://nyanchew.com/jp/comment/reply/759#comment-form [15] http://kinokotimes.com/2016/07/17/raspberry_pi_and_munin/ [16] https://lespo.net/rasppi2-munin.html [17] https://lespo.net/munin-glaf.html [18] https://nyanchew.com/files/muninweather.png [19] https://nyanchew.com/jp/comment/reply/731#comment-form [20] https://farm1.static.flickr.com/456/31442212984_df5a1ec9f4_b.jpg [21] https://creativecommons.org/licenses/by/2.0/ [22] https://www.flickr.com/photos/monchan/31442212984 [23] https://www.flickr.com/people/monchan/ [24] https://www.hifiberry.com/shop/ [25] https://nyanchew.com/jp/category/digital-life-j/%e3%82%aa%e3%83%bc%e3%83%87%e3%82%a3 %E3%82%AA%E9%9F%B3%E6%A5%BD [26] https://nyanchew.com/jp/comment/reply/707#comment-form [27] http://www.bosch-sensortec.com/en/homepage/products_3/environmental_sensors_1/bmp180_1/bm p180 [28] http://learn.adafruit.com/using-the-bmp085-with-raspberry-pi/overview [29] https://github.com/adafruit/adafruit-raspberry-pi-python-code [30] https://github.com/adafruit/adafruit_python_bmp.git [31] https://nyanchew.com/jp/comment/reply/708#comment-form Page 15 of 15 -- サイト内検索 -- -- プライバシーポリシー -Powered by TCPDF (www.tcpdf.org)