Raspberry PiでハードウェアPWMの使用を試み、まずWiring PiおよびWiringPi-Perlをインストールする。
すっかり更新が止まっていた本ブログ、今年もゴールデンウィークを活用して若干ながらエントリを増やしたい。実用的なものを、とまず思いついたのは時刻の同期である。我が家には数台の電波時計があるが、残念ながら集合住宅内には標準電波が届かず、各自は同期せず思い通りの時刻を指している。何たることか。
そこで、NTPで時刻合わせの行われているRaspberry PiからJJY相当の電波を発射させ、放埓な時計どもにその本分を知らしめることにする。東日本ではJJYの周波数は40 KHz、矩形波では25 µsecのパルス周期となるため、精度よく出力するにはハードウェアPWMを使用する必要があるとのことである。幸い、Raspberry Piには簡単にアクセスできるWiring Piライブラリが存在するので、そのPerlラッパであるWiring-Perlとともにインストールする。
Wiring Pi、WiringPi-PerlともGitリポジトリ上に公開されているソースコードを入手し、ビルドして使用することになっている。
$ dpkg -l | grep -e '\sgit\s' ii git 1:1.7.10.4-1+wheezy1+rpi2 armhf fast, scalable, distributed revision control system
gitはインストール済みなので、早速Wiring Piのソースコードを入手、ビルドする。
$ mkdir ~/git $ cd ~/git/ $ git clone git://git.drogon.net/wiringPi Cloning into 'wiringPi'... remote: Counting objects: 742, done. remote: Compressing objects: 100% (676/676), done. remote: Total 742 (delta 536), reused 96 (delta 58) Receiving objects: 100% (742/742), 264.80 KiB | 109 KiB/s, done. Resolving deltas: 100% (536/536), done. $ cd wiringPi/ $ ./build wiringPi Build script ===================== WiringPi Library [sudo] password for firewheel: [UnInstall] [Compile] wiringSerial.c [Compile] wiringPi.c [Compile] piHiPri.c [Compile] wiringShift.c [Compile] piThread.c [Compile] wiringPiSPI.c [Compile] wiringPiI2C.c [Compile] softPwm.c [Compile] softTone.c [Compile] mcp23008.c [Compile] mcp23016.c [Compile] mcp23017.c [Compile] mcp23s08.c [Compile] mcp23s17.c [Compile] sr595.c [Compile] pcf8574.c [Compile] pcf8591.c [Compile] mcp3002.c [Compile] mcp3004.c [Compile] mcp4802.c [Compile] mcp3422.c [Compile] max31855.c [Compile] max5322.c [Compile] sn3218.c [Compile] drcSerial.c [Compile] wpiExtensions.c [Link (Dynamic)] [Install Headers] [Install Dynamic Lib] WiringPi Devices Library [UnInstall] [Compile] ds1302.c [Compile] maxdetect.c [Compile] piNes.c [Compile] gertboard.c [Compile] piFace.c [Compile] lcd128x64.c [Compile] lcd.c [Compile] piGlow.c [Link (Dynamic)] [Install Headers] [Install Dynamic Lib] GPIO Utility [Compile] gpio.c [Compile] readall.c [Compile] pins.c [Link] [Install] All Done. NOTE: To compile programs with wiringPi, you need to add: -lwiringPi to your compile line(s) To use the Gertboard, MaxDetect, etc. code (the devLib), you need to also add: -lwiringPiDev to your compile line(s).
続いて、WiringPi-Perl。こちらは、そのままではビルドに失敗するため、0と1の欠片さんで紹介されている修正を加える。
$ cd ~/git/ $ git clone git://github.com/WiringPi/WiringPi-Perl.git Cloning into 'WiringPi-Perl'... remote: Counting objects: 38, done. remote: Total 38 (delta 0), reused 0 (delta 0), pack-reused 38 Receiving objects: 100% (38/38), 388.16 KiB | 211 KiB/s, done. Resolving deltas: 100% (15/15), done. $ cd WiringPi-Perl/ $ git clone git://github.com/WiringPi/WiringPi.git Cloning into 'WiringPi'... remote: Counting objects: 206, done. remote: Total 206 (delta 0), reused 0 (delta 0), pack-reused 206 Receiving objects: 100% (206/206), 185.49 KiB | 122 KiB/s, done. Resolving deltas: 100% (86/86), done. $ mv build.sh build.sh.orig $ cp build.sh.orig build.sh $ vi build.sh $ diff build.sh.orig build.sh 1c1 < gcc -fpic -c -Dbool=char -I/usr/lib/perl/5.10.1/CORE wiringpi_wrap.c WiringPi/wiringPi/wiringPi.c -D_GNU_SOURCE --- $ gcc -fpic -c -Dbool=char -I/usr/lib/perl/5.14.2/CORE wiringpi_wrap.c WiringPi/wiringPi/wiringPi.c -D_GNU_SOURCE $ pushd WiringPi/wiringPi/ ~/git/WiringPi-Perl/WiringPi/wiringPi ~/git/WiringPi-Perl $ ln -s wiringSerial.h serial.h $ popd ~/git/WiringPi-Perl $ ./build.sh
後は電波を発射するのみである、と思ったのも束の間、40 KHzは可聴域を遥かに超えている。どうすれば出力されているパルスが正しい周波数になっていることを確かめることができるのであろうか。
コメント