電波時計同期装置の作り方 まとめ
前回の日記で書いた、1年越しで完成したNTPによる電波時計同期装置の作り方をまとめておきます。(`・ω・´)
ハードウェア編
材料
- 1/4W炭素皮膜抵抗 100円/100本くらい
1kΩ × 4
15kΩ × 1
1MΩ × 1
20MΩ × 1 - セメント抵抗 30円/本くらい
5W1Ω × 1 - ダイオード 200円/50本くらい
1SS270A × 2 - セラミックコンデンサ 10円/本くらい
10pF × 2 - クリスタル(水晶発振子)100円/本@秋月
40kHz × 1 - トランジスタ 200円/20個くらい
2SC2120-Y × 1 - 電界効果トランジスタ(FET) 100円/1個くらい
パワーMOSFET 2SK2232 × 1(2SK4017でも可) - LED 300円/100本くらい
緑色LED × 1
赤色LED × 1 - ロジックIC 40円/個くらい
74HCU04 × 1 - ICソケット 60円/個くらい
ICソケット14ピン × 1 - フェライト棒 250円/本くらい
10mm径14cmフェライト棒 × 4本 - エナメル線
0.35mm径 50m - ユニバーサル基板
適当なサイズを1枚 - ピンソケット 20円/本くらい
40ピン分くらいを1本 - FT245RL USBパラレル変換モジュール 980円@秋月
必要な道具
- ハンダゴテとハンダ
- テスター
あると便利な道具
製作手順
- コイル製作
フェライト棒をテープや接着剤で繋げてコイルをひたすら巻く - 以下の回路図と実体配線図を参考に部品を取り付け配線する
ICソケットやピンソケットなど、壊れにくいモノからがオススメ(`・ω・´)
FT245RLは直接ハンダ付けせず、ソケット経由で取り付け(;´∀`) - 配線確認
テスターで配線を念入りに確認する
特にVCCとGNDがショートしていないコトを確認 - 動作確認
PCのUSB端子に接続し、緑色のLEDが点灯すればとりあえず動作OK
ソフトウェア編
動作環境
- NTP設定済でUSBが使えるPC
当たり前ですが…(´・ω・`) - libusbが使えるLinuxデュストリビュージョンの環境
僕はCentOS6を使いました(´・ω・`)
インストール手順
ライブラリのインストール
以下のサイトからlibftdiのsourceをダウンロードしてコンパイル
libFTDI » FTDI driver download - Open Source
CentOS6だとimake関連でハマりました…(´д`)
エラーで文句言ってきた内容を無理やり回避するとコンパイルできましたが…
CentOS7だと問題無いです(´・ω・`)制御ソフトウェアのインストール
以下のサイトから制御ソフトウェアをダウンロードしてコンパイル
http://www.hi-ho.ne.jp/denkas/library/jjyd.zip
コンパイルのコマンドラインは以下の通り# gcc -o usb_jjy -I. -lftdi1 usb_jjy.c # cp usb_jjy /usr/local/sbin/
ちなみにアーカイブにはCentOS6用のコンパイル済バイナリが入ってます。
サービス登録 アーカイブの/etc/init.dに入っているjjydをコピーして登録
# cp jjyd /etc/init.d/ # chmod +x /etc/jjyd # chkconfig --add jjyd
起動 コイルを基板に接続してからjjydサービス起動
# service jjyd start
0秒から赤色LEDが点滅し始めたら完成!(≧∀≦)
電波時計を受信モードにしてみましょう(゚∀゚)
ついに完成!電波時計同期装置
去年の2月からずっと続けていたNTPによる電波時計同期装置ですが、ついに完成しました!(≧∀≦)
昨晩本番用基板を製作してあったので、今日は配線をしっかりチェックした後、恐る恐るPCのUSB端子に接続すると、電源ランプ点灯!(゚∀゚)
そして制御ソフトウェアを動かすと…電波発信ランプが点灯!!(゚∀゚)
で、電波時計を同期させると…同期しました!!!(≧∀≦)
去年の2月、思い立って電気回路の勉強から開始し、学習キットを使って勉強し、試作を繰り返して苦節1年2か月、ついに完成しました!!( ;∀;)
まぁ本や部品、キットなどで結構な金額…恐らく10万over…は使いましたが…(´・ω・`)
得られた技術はすごく大きいのでpricelessというコトにします(・∀・)
装置のほうは100均とかで適当なプラケースでも買って収納する予定です♪( ̄ー ̄)
回路図は最終的に以下のようになりました。実体配線図も作って製作を始めたのですが、当初作ったのは間違いだらけで、ここに載せるのは完成後に完成品見ながら書き下ろしました…ヽ(;´Д`)ノ
無線LAN中継器(´・ω・`)
自宅では光コンセントがリビングに出ている関係で、ルーターから自室までを無線LANブリッジで接続しています。
モノはバッファローのWLAE-AG300Nで、今の家に引っ越した時に設置して以来、4年間不眠不休で頑張っていたのですが、先日月曜日にとうとう電源がお亡くなりになった模様で、ウンともスンとも言わなくなってしまいました。゜(ノД`)゜。
http://buffalo.jp/products/catalog/network/wlae-ag300n_v/
暫定でLANケーブル引き回すのも考えたのですが、やっぱり買おうという考えになりバッファローのサイトを見るも既に終売…。でも機能的には事実上の後継製品と思わしきWEX-733Dがあったのでこちらをamazonでポチりました。4,300円くらいでした。ついでに自動構築検証LANで使うHubが100Mだったので、この際だからGiga買いました。3,100円でした。奥さんには中継機の購入申請しか出してないケド…(´・ω・`)コワイ
http://buffalo.jp/product/wireless-lan/extender/wex-733d/
で、昨晩届いたので早速開封し設定。今までのバッファロー製品はデフォルトIPアドレスが192.168.11.1だったと思うのですが、192.168.20.1になってました。まぁ大したコトじゃないので、そんなもんだと気にせず設定開始、ルーターのSSIDを選択してパスワード入れたらあっという間に設定完了。そしてなんとここで思いもよらない神機能!!(゜∀゜)
設定画面が開けなくなりました…。゜ヽ(゜`Д´゜)ノ゜。
問答無用でSSID選択とパスワードを入力させられて勝手に再起動したかと思ったら、その後に設定画面開けなくなるって何さ!えぇ、もちろんPINGも通じません…。゜ヽ(゜`Д´゜)ノ゜。
マニュアル読んでも「つながります」としか書かれておらず、仕方ないので出荷時状態にリセットして再設定しても現象は同じ。で、ここでまさか…と思って普通にブリッジとして使ってみると…つながるじゃん(@_@;)
でもでも設定画面は開けず、IPアドレス無くなっちゃったん?という疑問はあったものの、まぁそういう製品も無くは無いし…と思って無理やり納得。で、マニュアルを再度読み返すと、特定のURLを入れると設定画面が開けるらしい事が判明したので試してみると…開けました。(´・ω・`)
HTTP通信の場合はパケットフォワードする前にURLを調べて、特定のURLだったら自分の設定画面に対するアクセスだと判断している模様です…だったらマニュアルにちゃんと書けよと小一時間…(ry
というワケで設定画面も開けたし設定設定~♪となったのですが、ログの転送設定でハプニングが。転送先Syslogサーバに自宅LAN監視サーバを設定したところ、ワラワラとメッセージが転送されてきたんです。えぇ、もちろんIPアドレス付きで。∑(´Д`;)
そのIPアドレスはルーターが割り振っているDHCPのアドレスレンジだったので、ルーターのDHCPリースの情報を確認すると、見たことないMACが…。えぇ、それが無線LAN中継機でしたよ奥さん…。(-_-;)
これってDHCPサーバが無い環境だったら使えないじゃん…というツッコミをしたい気持ちを抑えつつ、仕方がないのでDHCPサーバから中継機のMACに対して静的アドレスを割り振るように設定、なんとか目的を達しました。(´・ω・`)
最近の製品は簡単設定をウリにしているモノが数多くありますが(この製品もソレ)、いろいろ細かく設定しようとすると情報無いだけならともかく、そもそも設定できない仕様になっていたりしてハマるという、何とも言い難い経験でした…まぁその他の性能や使い勝手は文句無いんですケドね…あ~あ(-_-;)
無線LANブリッジ死亡(泣)
ウチではリビングに光回線が出ているので、自室までLANケーブル引き回すのは美しくないからイヤで、無線ブリッジを使ってルーターとつなげてます。
で、今の家に引っ越しで4年間ずっと稼働しっぱなしだったのですが…今日帰宅してネット接続しようとしたらウンともスンとも言わず…∑(´Д`;)
あれれ?と思って調べてみると、ブリッジの電源ランプが消えていて、電源再投入してもリセットしても全くの無反応で、監視システムのログを見ると今日の15時過ぎに反応が無くなってて、死亡確認となりました。゚(ノД`)゚。
モノはバッファローのWLAE-AG300N/Vです。まぁ丸々4年間常時稼働だったのだから、持ったほうかもしれないですが、なんかショックです…。゚(ノД`)゚。
まぁ打ちひしがれてばかりもいられないので、交換用機器を手配しないとだったのですが、WLAE-AG300N/Vは既に販売終了、市場在庫も高価格でちょっと…だったので、事実上の後継と思われるWEX-733Dを購入しました…こっちのほうが半分の値段の4300円くらいで買えたんで…。(´・ω・`)
というワケで届いたらまた設定しないとです…面倒だけどやらなきゃ…(´Д`)
灯台下暗し
電波時計同期装置ですが、時間帯や日によって安定して同期できたり、なかなか同期できなかったりしてしまい、安定性の無さで悩んでいました。(´・ω・`)
昨日は安定しなかったのですが、日付が変わる辺りで同期に成功していて、今日も試してみたら問題なく動作していました。で、ふと頭を過ったバグの予感…∑(´Д`;)
標準電波のJJYフォーマットでは二つのパリティを入れます。計算式は以下の通りです。
PA1 = (20h+10h+8h+4h+2h+1h) mod 2
PA2 = (40m+20m+10m+8m+4m+2m+1m) mod 2
ここでhは時間、mは分です。つまりPA1は24時間制での時間の値から計算されるパリティ、PA2は同様に分の値から計算されるパリティです。ですが、制御プログラムのソースを見ると…以下抜粋です。
jy_t = t_st->tm_yday + 1;
out0(fd,sec);
out0(fd,sec);
if (jy_t - 200 >= 0) { out1(fd,sec); jy_t -= 200; pa1 = !pa1; } else out0(fd,sec);
if (jy_t - 100 >= 0) { out1(fd,sec); jy_t -= 100; pa1 = !pa1; } else out0(fd,sec);
out0(fd,sec);
if (jy_t - 80 >= 0) { out1(fd,sec); jy_t -= 80; pa1 = !pa1; } else out0(fd,sec);
if (jy_t - 40 >= 0) { out1(fd,sec); jy_t -= 40; pa1 = !pa1; } else out0(fd,sec);
if (jy_t - 20 >= 0) { out1(fd,sec); jy_t -= 20; pa1 = !pa1; } else out0(fd,sec);
if (jy_t - 10 >= 0) { out1(fd,sec); jy_t -= 10; pa1 = !pa1; } else out0(fd,sec);
pos_marker(fd,sec);
…tm_ydayって書いてありますね。∑(´Д`;)
これは年月日の情報を計算して出力している部分です。なのになぜかPA1の値を計算しちゃってます。ちなみに時間の出力ロジックでもPA1をちゃんと計算してます。つまり“日によってPA1の値は反転してしまう”ワケなのです…これで日によって安定しなかった理由がハッキリしました…。゚(ノД`)゚。
原因は時刻出力のロジックをコピペして年月日の出力ロジックを作ったのですが、パリティ計算の部分を削除し忘れてたのです…。゚ヽ(゚`Д´゚)ノ゚。
ソフトウェア作るのは慣れっこだけど、ハードウェアは超初心者だからというワケで、ハードウェアばかり疑ってたのですが、原因はソフトウェアでした…灯台下暗し、ですね。。゚(ノД`)゚。
というワケで、問題がなかなか解決しない時は自信がある部分ほど疑って掛かるほうが良いというコトですね…よく言われるコトですが、ひさびさに身に染みて理解しました…(´・ω・`)
NTPで電波時計を同期
NTPで電波時計を同期するという野望を達成するべく、かれこれ1年は試行錯誤しています。(´・ω・`)
ウチのマンションは標準電波が家の中まで入って来ないので、標準電波で電波時計を合わせようと思うとベランダに時計を出して同期しないとなりません。。゚(ノД`)゚。
で、ほぼ毎日のように毎晩時計をベランダに出しては同期というコトをしていたのですが、さすがになんとかしたくなった時、「NTPがあるんだから、PC使って電波出せばいいじゃん(゚∀゚)」って発想になりました。
でも売り物のNTPを使った標準電波発信機は数万円もする上、電波が1mくらいしか飛ばないので話にならず、音源使って3倍高調波で40kHzを発信するアプリがいくつかありますが、常時利用するには音源とアンプを占有するから難があるし、なら自分で都合がいいモノを作ってしまえ!と考えて無謀なチャレンジが始まりました。(´・ω・`)
ソフトウェア側は慣れっこでも、電子回路なんて全然わからない初心者も初心者なので、本やキットでひたすら勉強して、やっと電波が出せたのが去年の夏でした。ただ、コードを時計にぐるぐる巻きにしないと同期ができないシロモノでしたが。(´・ω・`)
その後アンテナについて勉強したり、さらに電子回路について勉強し続け、やっとのコトで回路としてはほぼ完成形になってきました。(゚∀゚)
で、今日はブレッドボードで試作回路を組んで、やっと部屋の中なら同期ができるレベルになりました。(・∀・)
でも目標のリビングまで飛ばすのはなかなかできず…もっと研究しないと。回路は一旦これで完成として、次はちゃんと基板にハンダ付けしたモノを作ってから、アンテナを試行錯誤かな…(´・ω・`)
UEFI環境でのPXEブート
以前@ITで「PXE+Kickstartで動かすVirtualBox+CentOS環境自動構築サーバーの作り方 」という記事を書いたのですが、この時はUEFIを意識せずレガシーBIOSの場合のみの記述でした。(´・ω・`)
http://www.atmarkit.co.jp/ait/articles/1407/17/news010.html
最近UEFIが前提になったサーバを自動構築する際に軽くハマったので、UEFI環境に対するPXEブートサーバを設定する際の差分を備忘録代わりにまとめておきます。(゚∀゚)
あ、先に書いておきますが、RedHat 6系のUEFI環境でのPXEブートのマニュアルは、嘘がいっぱい書いてあるのでご注意を。僕はずっぽりハマりました。゚ヽ(゚`Д´゚)ノ゚。
ブートローダーをUEFI用に変更
レガシーBIOSの場合はpxelinux.0がブートローダーでしたが、UEFI環境ではbootia32.efiもしくはbootx64.efiがブートローダーになります。このブートローダーはRedHat系であればインストールメディアに入っています。CentOS 6.5の場合は/(DVDメディアへのパス)/EFI/BOOT/ディレクトリ配下に入っていました。ただファイル名が全部大文字になってますが、別にリネームしてしまっても、そのまま使っても構いませんのでご安心を。(・∀・)
というワケでブートローダーをコピーしてしまいましょう。
# cp /(DVDメディアへのパス)/EFI/BOOT/BOOTX64.* /var/lib/tftpboot/pxeboot_cent6
ここで注意なのですが、BOOTX64.confも必要なのです。後で説明しますが、pxelinux.cfg配下に入れていた設定ファイルを使わないのです。代わりにBOOTX64.confを編集してefidefaultファイルとして使います。ちなみにMACアドレスによるファイル名付与ルールはレガシーBIOSの場合と同様ですが、設定ファイルを配置するパスがpxelinux.cfg配下ではなくブートローダーの置いてあるディレクトリと同じになりますのでご注意を。(´・ω・`)
次にブートローダを代えるため、以下のようにdhcpd.confを変更しましょう。
変更前:
filename "/pxeboot_cent6/pxelinux.0";
変更後:
filename "/pxeboot_cent6/bootx64.efi";
言うまでも無いと思いますが、ブートローダーのファイル名は大文字なら大文字、小文字なら小文字、はたまた別の名前ならその名前で読み替えて設定してください。
ちなみにアーキテクチャを自動で判別して適切なブートローダーを返すなんて芸当もできます。以下の設定例を参考にしてみてください。classを使っていますが、この記事を読まれるような皆さんなら読み替えできるでしょう。(・∀・)
# ここから冒頭に記述
option space PXE;
option PXE.mtftp-ip code 1 = ip-address;
option PXE.mtftp-cport code 2 = unsigned integer 16;
option PXE.mtftp-sport code 3 = unsigned integer 16;
option PXE.mtftp-tmout code 4 = unsigned integer 8;
option PXE.mtftp-delay code 5 = unsigned integer 8;
option arch code 93 = unsigned integer 16;
# ここまで冒頭に記述
class "pxeclients" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
next-server 10.0.0.1;
if option arch = 00:06 {
filename "/pxeboot_cent6/bootia32.efi";
} else if option arch = 00:07 {
filename "/pxeboot_cent6/bootx64.efi";
} else {
filename "/pxeboot_cent6/pxelinux.0";
}
}
設定ファイル修正
さて、お次は先ほどちょこっと触れたefidefaultファイルを作ってしまいましょう。
先ほども書きましたが、これまでのpxelinux.0の設定ファイルとは異なりますので流用はできません。というか、むしろコレgrub.confなんですよね。(´・ω・`)
書き換える内容ですが、最初にスプラッシュイメージの行を書き換えます。3行目辺りを以下のようにします。
変更前: splashimage=/EFI/BOOT/splash.xpm.gz
変更後: splashimage=(nd)/splash.xpm.gz
やっている事はイメージパスの書き換えです。ここで指定するパスですが、(nd)は“Network Drive”の略な意味で、コレを付けるとPXEブートしている時はブートローダーのあるディレクトリになります。つまり先の例なら、tftpのpxeboot_cent6/のディレクトリです。そういえばスプラッシュイメージがありませんね。ついでにコピーしてしまいましょう。
# cp /(DVDメディアへのパス)/EFI/BOOT/splash.xpm.gz /var/lib/tftpboot/pxeboot_cent6
次はブート設定の部分を修正しましょう。以下のように修正します。
変更前:
title CentOS 6.5
kernel /images/pxeboot/vmlinuz
initrd /images/pxeboot/initrd.img
変更後:
title CentOS 6.5
root (nd)
kernel /vmlinuz ks=http://192.168.xx.xx/ks/default.cfg
initrd /initrd.img
変更のイメージは伝わったでしょうか。
まず“root (nd)”が追加されています。これは先に出ていた通りNetwork Driveを表しています。つまりtftp経由でファイルを取得せよ、というコトになります。
kernelとinitrdのエントリは余計なパスが取り除かれています。vmlinuxとinitrd.imgの配置場所は先と同様ブートローダーのあるディレクトリです。先の例ならtftpのpxeboot_cent6/のディレクトリから読み取ろうとします。もしサブディレクトリを作成するなら、サブディレクトリの指定は必要です。
またvmlinuzにksオプションが追加されています。これはKickstartファイルの指定ですので詳細は割愛します。
これらの変更によって、UEFI環境でもPXEブートしてKickstartの実行ができるようになります。(゚∀゚)
おまけでVMware PlayerでのUEFIファームの設定方法など。まぁ設定方法なんて大層なモノでもありませんが、vmxファイルに以下の行を足すだけです。
firmware = "efi"
ちなみにESXiの場合はオプション設定で普通に変更できます。ヽ(´ー`)ノ