2009年10月24日 (土)

PIC16F88の寝床(Fedra11サーバ)ケース完成!

定期メンテナンスで自宅サーバの入れ替えを行い,不要になったPCをPIC16F88の寝床(サーバ)にしようという企み.ただ,この不要になったサーバの生い立ちをたどると,ダイナミックDNSクライアント,メールサーバ,自宅内ファイルサーバを担っていたキーサーバだったのだが,ハードは余りモノで構成していたので,A4のコピー用紙をクッションにして筐体無しのむき出しで長いこと使っていた.さすがにこのままでは,OSを入れ替えたところでPICと一緒にフィールドに持ってゆけないので,今回のメンテナンスで筐体を与えることとした.

フラッと秋葉原に行って,マイクロATX用のスマートな筐体を探す.いつのもお店で350Wの電源付きで4,980円で売っていた特価のケースを購入.結構出物だと思う.VGAモニタも持ち運びを考えると,極力小さいのがいい.こちらもいつものモニタのお店で15" 7,980円のものを買った.画素数はいらない.Fedra11のCUIのみをインストールしているから.さっそうと家に帰ってきてマザーを組みつけようとして唖然.ああそうだ,このマザー,AT規格だったんだ...

Svr0_00 もう一度秋葉原に行った上にしかも今時AT規格のマザーの格安ケースなんて探す気もしないので,例によって,それなら作ってしまえ,ということになる.

かくして,このようなへんてこりんなものができあがる.時間もないし,金属加工は苦手なのでいつもの木工中心,取っ手まで手作りだ.筐体の取っ手の横に,これまた何かに使えると思って買い置きしてあった冷却ファンを装備.あとは電源にもファンが付いているので,こうした部分には穴を開けなきゃいけない.コネクタを挿す面を正面パネルとした.ポータブルなので,前面接続,前面操作がいいだろう.

Svr0_01真ん中にはパワースイッチ.これも,お手製のつまみをつけた.たくさん空いている丸い小さな穴は,すべて冷却用.取っ手の横のファンから取り入れた空気がハードディスクやメモリ,ノースチップ,サウスチップを冷やしてこの数箇所の丸穴から排出される.サーバの前にいると熱風が来るかな,と思ったけれど,もともと発熱はそう大したこと無いので,不快感は無い.Svr0_02

前面パネル.真ん中の不恰好なきのこの笠のようなものがお手製の電源スイッチ.市販のつまみを使わずに,お手製の木の円盤を瞬間接着剤で強引に付けた.
その左に見えるのは電源ONとHDDアクセスの確認LED..これらも裏からホットメルトで強引に取り付けられている.

Svr0_03

電源のファン,通気口も負債じゃいけないから,ジグソーやホールソーで穴をあける.

Svr0_04

中身はこんな.ATXではないので,ペリフェラルのコネクタパネルが無い.しかも,このマザー,VGAがオンボード実装されていないのでPCIバスにビデオカードを挿入する必要がある.もう一枚のカードは,EtherNet.EtherNetも同様,オンボードに載っていない頃のマザーだったのだっけ.

Svr0_05

HDDを固定して,2枚のPCIカードを取り付けて,フタで位置決めできるよう高さを合せる.HDDが一番高いので,ここに合せるよう,VGAカードとEtherNetカードに各々,板を接着する.

Svr0_06 Svr0_07フタの裏には緩衝材としてウレタンシートを貼る.一度フタを閉じて開けてみると,確かにHDD,EtherNetカード,VGAカードの痕が付いているのでこれで固定されているのだろう,ということにする.

で,完成!

Svr0_08と思ったが,ここでまた悪い虫が騒いじゃった.サーバのケースはいいとして,実際には硬くて融通の利かない電源コードやVGAケーブル,VGAモニタの電源(レギュレータが外付けなのだ),キーボードなんかをこまごま持ってゆくのはいやだし.使うときにAC100Vのコンセントが2つ必要というのも使いにくそうだな~.
と,いうことで,最終形はこんな具合.ケーブルや電源ユニット,100V3口コンセンなどをコバンザメ風に筐体にくっつけて,これとディスプレイユニット,大物2つだけで必要なものを持ち運びできるようにした.
そうなると,実際には,電卓やメモ帳なども使うよね,時計もあるといいだろな.ストップウォッチ機能があるとなお良いね.ってことで,ポータブルサーバと一緒に使いそうなものを100均で買ってきて,これも筐体に貼り付けた.完全に悪乗り. Svr0_09 Svr0_10

Svr0_11現場についてたら,筐体から取り外すとこんな状態になる.

Svr0_12100V1本とEtherネットケーブルだけが,外部と接続される.

あとは,サーバとして機能するよう,アプリケーションづくりだ.長い仕事になりそう.

2009年9月12日 (土)

Fedra11 自宅サーバ ApacheとPHP,MySQLの立ち上げ

で,次はApacheをまともに立ち上げ,PHPとMySQLを立ち上げる.これでLAMPの完成だ.("P"にPysonやPerlを使う方々もいらっしゃるとのことだが,私はPHP派だ)

phpはFedra11をインストールする時に指定しておいたので,設定だけだ.

phpの設定(/etc/php.ini)で変更したところは,2箇所.アップロードファイルの上限サイズ(upload_max_filesize)をデフォルト2Mだったのを16Mとした.もう一箇所はマルチバイト対応のところ.ここも昔はずいぶんと苦労したなぁ.

[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = EUC-JP
mbstring.http_input = auto
mbstring.http_output = SJIS
mbstring.encoding_translation = Off
mbstring.detect_order = auto
mbstring.substitute_character = none;
mbstring.func_overload = 0
mbstring.strict_encoding = Off

次に,Apache側の設定.こちらは,/etc/httpd/conf/httpd.confファイルをいじる.昔と変わらなければ,下記2行を足せば,とりあえず動くはず.
       LoadModule php5_module modules/libphp5.so
       AddType application/x-httpd-php .php

Phpinfo

viエディタで変更してセーブしたら,apacheを再起動しておく.
    /etc/rc.d/init.d/httpd restart

ここで,ホームディレクトリにテスト用の簡単なphpファイル"index.php"をviで手作りして,テストする.

<html>
<head>Title</head>
<body>testtest<br/><br/>
<? phpinfo();?>
<br/><br/><br/></body>
</html>

簡単になったねー.本当に.

Mysql

次はMySQL.ガイド本によると,ブログサーバの構築用にMySQLのインストールが載っている. というわけで,ついでにブログサーバWordpressもインストールしてしまおう.こちらは,ガイド本の通りなので手順を書くことはできないが,迷いことなくすんなりと完了.mySQLサーバもWordpressも最新バージョンに上がっていたけれど,なーんの問題もなし.

というわけで,(比較的)あっさりフリーで自宅サーバが立ち上がった.Fedra11(だけじゃないんだろうけれど),昨今のLiuxって,完成度高いなぁ.

2009年8月23日 (日)

Fedra11自宅サーバ まずはSAMBA, SSH,DDNSから(その2)

次は,samba.

sambaももうLinuxでは定番のソフトだ.当初,Windowsバージョンとの相性だとか,日本語文字コードの違いだとかで手痛い不具合を何度も被ってきたが,やはり,LowSpecの一昔前のマシンがsambaを実装してFileサーバとして皆の為に役立つマシンに復活してくれる,しかもそれがCostFreeと言うのだから,なん何ともすごいソフトだ.一つ前のRedhat10(だったかな)の頃,sambaをインストールした時には何の苦労も無く立ち上がった.今もそのサーバは健在だ.だから,今回のFedraも,ガイド本に沿ってインストールすれば...ね?ちゃんと動いた!っていうことを創想像してビール片手にやってみたのがわるかったのか,現実はそう甘くない.確かに,sambaで設定した,ホームディレクトリや共有ディレクトリは見えるのだが,アクセスできない.新規にファイルやフォルダを作成しようとしても「権限がありません」エラーになる.また,Linux側でファイルを作成しても,ホームディレクトリのものは見れるが,共用ディレクトリのファイルは見えない.つまり,sambaは立ち上がっていて通信もできているのだがファイルを読めないし(ホームディレクトリはかろうじて読める),書けないのだ.もちろんディレクトリ設定の,Brousableはonにしているし,read onlyはnoにしている.samba側の設定に落ち度は無いはず.今まで何回となく,やってきた設定だから.また,ガイド本の内容ともほぼ同じだし.....

ここで,FTPで苦労したことを思い出した.そうか,SE-Linuxのbool定数だ!
というわけで,今度は
        [root@host123] getsebool -a | grep samba
でコマンドを見てみた.
日記風に書くといかにも簡単の様だが,実際すべてが解決するまでには2日を要している.だが,2日間の悶絶など書いたところで誰もうれしくは無いので,結論だけ言うと,
    samba_enable_home_dirs --> on に,
    samba_run_unconfined --> on に,
    samba_export_all_rw --> onに
することで,全て解決した.コマンドは,例によって
[root@host123] setsebool -P samba_enable_home_dir on
[root@host123] setsebool -P samba_run_unconfined on
[root@host123] setsebool -P samba_export_all_rw on

コレにて一件落着

さて,メインイベント,DDNS(ダイナミックDNS)のインストール&コンフィギュレーションだ.
Windows版では,Diceというソフトを使っている.これはスバラスィーソフトだ.頭のいい人って本当に沢山いるんだな.それもFreeで提供だというので,日頃からその恩恵に預かっています.
一番いいのは,これのUnix版が動くこと.早速DiceのUNIX版をダウンロードしてテスト.設定ファイルもさすがにWindows風にというわけには行かず,キャラクタユーザインターフェース(CUI)上で対話形式で設定を行ってゆく.だが,WindowsベースのDiceを設定したことのある人なら,CUIで聞かれてもたじろぐことは無い.一貫性の取れているインターフェースだから.見栄えが変わってもうろたえる必要は無し.筆者のお世話になっているDDNSサーバmy-domain.jpさんとのやり取りもばっちりに見える.よし,じゃ,IPアドレスの変化を検出した時にDDNS更新をかけるように設定して,Reboot.........その後,ADSL回線を再起動して故意にIPアドレスを変えてみる..........だめ.理由はわからないが,IPアドレスの変化が検出できない.しかしこれは,DiceのUNIX版の不具合,というよりも,きっとUNIX側の仕様が変わった為じゃないかな.

というわけで,今回はDiCEには頼れない.

じゃ,GNU DIPをやってみっか.コレも実は3日かかっている.正直納得いかないけれど,まあ,なんとか実用域には来たと思うので途中の経緯は省き,ここまでのBestPracticeを残しておく.淡々と.

1. GNU DIPを所定のサイトからダウンロード
今回はhttp://gnudip2.sourceforge.net/gnudip-www/latest/gnudip/html/client/UNIX/からgnudip-2.3.5-gdipc.tar.gzをダウンロードした.

2. /usr/localに場所を移して解凍
[root@host123] cd /usr/local
[local@host123] tar zxf gnudip-x.x.x-gdipc.tar.gz

3. カレントディレクトリをusr/local/gdipc/binに移してコンフィギュレーション
[local@host123] cd gdipc/bin
[bin@host123] ./gdipc.pl -c -f gdipc.conf (Unixの場合)

対話形式で次のような設定をする.
Using Update Configuration Mode
Configuration file name:
  → 設定内容を保存するファイル名:ここではgdipc.confとした
Username: REG-XX-XXXX-XXXX
  → DDNSサイトからもらったログインユーザネーム
Domain: xxx.xxx.jp(更新するホスト名)
  → DNSアドレスに登録したいホスト名(url)
Connect by direct TCP (d) or web server (w) [d]: w
  → DDNSサーバによる.my-domainのDDNSサーバの場合は必ず'w'(WEB)
GnuDIP Server - host[:port]: my-domain.jp
  → DDNSサーバのurl(私の場合は,my-domain.jp)
Server URL [/gnudip/cgi-bin/gdipupdt.cgi]: /gnudip/
  → DDNSサーバによる.(my-domainの場合は,"/gnudip/")
Password: XXXXXX(パスワード)
  → DDNSサイトからもらったログインユーザネームに対応するパスワード
Cache File []: gdipc.cache
  → DDNSクライアントソフトが前回のIP値を覚えておくためのキャッシュファイル名
Minimum Seconds Between Updates [0]:
  → デフォルト通り(リターンを押す)
Maximum Seconds Between Updates [2073600]:
  → デフォルト通り(リターンを押す)
これで一つのホストに対する設定は終了
例えばwww, ftp, fs000等のサーバをDynamicDNSサイトに「A」登録した場合は,たとえ物理マシンが同一マシンで動いていたとしても,それはインターネット側からはわからないので,ダイナミックDNSサーバへIP登録する場合は,A登録した分だけ,登録を繰り返す必要がある.
 例えば,上記の手順でwww.(自分のドメイン)で登録したとして,他にftp.(自分のドメイン)とfs000.(自分のドメイン)も登録したい場合は,上記設定でできたコンフィギュレーションファイルをviで編集しても良い.1行目に先ほどの対話式で設定した内容が載っているので,これを2行コピーし,ホスト名のところ(www)をftpやfs000などと修正するだけで良い.

4. とりあえず,手動で動作確認してみる
[bin@host123] ./gdipc.pl -f gdipc.conf -g 10000:10000

DDNSのコマンドのやり取りがうまくいったら,DDNSサイトのDNS登録内容に現在のIPアドレスが
更新される.

5. 動作を確認できたら,Boot時にデーモン起動するように仕込む.今回は,/etc/rc.d下に起動スクリプトgdipc.dを書いて,/etc/rc.d/rc.localの最後にこのgdipc.dを呼び出すこととした.忘れてはいけないことは,gdipcの実行ディレクトリ(/usr/local/gdipc/bin)にパスを通すこと.
【/etc/rc.d/gdipc.dの内容】
#!/bin/bash
PATH=$PATH:/usr/local/gdipc/bin
export PATH
cd /usr/local/gdipc/bin
rm *.cache
gdipc.pl -f /usr/local/gdipc/bin/gdipc.conf -d 300 -l /var/log/gdipclog.log -g 10000:10000 &
cd

ここで,
-dはデーモン起動ということで,続く300は300秒毎(5分毎)にデーモン起動されるというもの.
-lオプションは以降に続くファイル名(/var/log/log.log)のlogを出力する,というオプションだ.

一方,rc.localには,下記の記述を1行追加することで,Boot時にGNUDIPを自動起動する.
【rc.localへの追加内容】
su -l -c /etc/rc.d/gdipc.d

以上で,理屈上はGNUDIPが起動時にデーモンとして常駐し,以降5分間隔でDDNSサーバの情報を更新に行くことになる................はずなのだが,

なんと,このスクリプト,手動で動作させると100発100中で正常動作するのに,自動起動時に起動されると,デーモンとしてはちゃんと常駐して5分感覚で起動されていることはわかるのだが,IPアドレスを聞きに行くためのスクリプトが正常に動いていないのか,毎回失敗に終わったというエラーメッセージが出力される.でも,うまく行くときもある.理由が全くわからない.起動時に一度失敗すると,以降,デーモン常駐して5分おきに起動はされるものの,永遠と同じメッセージを吐いて更新が失敗に終わる.また,うまく行くときには行こう5分おきの更新も100%うまく行く.

いいや.SSHも効くし,だめなら,kill -9でプロセスを殺して手動で/etc/init.d/gdipc.dを起動すれば100%動くんだから.まあ,自分が海外出張に言ってhしまったときくらいが問題かな.

理屈ではあってるから,まあ,良いとする.

さて,続いては,PICの寝床として快適になるよう,WEBサーバ(Apache)&PHP,MySQLの設定だ!

Fedra11自宅サーバ まずはSAMBA, SSH,DDNSから(その1)

Fedra11のガイド本をさーっと読んでみる.数年前のRedhatの頃と比べると,クライアントOSとしての用途が増えたからだろうか,ずいぶんグラフィック基調の画面になっている.但し,購入したインプレス社のガイド本によると,サーバ向けとして立ち上げる際には,最低限の構成で立ち上げることを強く勧めている.当然グラフィック(Xウインドウ)等も無い.良心的だ.

サーバとして機能させるマシン動作確認は,クライアントで行う.クライアントでサービス呼び出しをして,期待通りの挙動を示してくれるかをクライアント上の端末でサービス結果を確認するのが通常だから.メンテナンスもWindowsマシンからのリモートで行うことが通常.一度立ち上げたら,サーバマシンの前に座ってコンソールをたたくのは,マシンの状態がよっぽど重篤な場合か,ないしは大改造を行うときくらいなものだ.

だから,OSを立ち上げたらその次にはまずサーバのメンテナンスに必要なツールが無くてはならない.こういうと昔はTelnet(イーサネットからの仮想ターミナル),FTP(ファイル転送)が定番だったが,今はクライアントマシンはWindowsだから,いきなりsamba(Windows,Linux上でのファイル共有)から立ち上げることにしている.もう充分sambaも使いやすく,安定してきている.そして,VTはSSHにSSHクライアントとして,PIC16F88やPIC16F677のRS-232C/RS-485の動作確認に便利に使っているTera Termを採用.

その後に,FTP,これは今やvsftpdが一般的なようなので,これを採用.そして長年Linuxで自宅サーバを立ち上げる時のネックになっていた(勝手に自分でそう思っていただけですが)DDNS(ダイナミックDNS)クライアントの立ち上げを試みる.このハードルがクリアできれば,Linuxベースの自宅基幹サーバの構築にも目処が立つ.

まず,OSの立ち上げ.これは,ガイド本に沿ってDVD-ROMから起動する.サーバ用なので,最低限のソフトしかインストールしない.だから設定は殆ど無い.昔はディスクのパーティーション設定やフォーマットに結構手を焼いたが,今はこれも「おまかせ」設定で問題なし.楽になったなー.

立ち上げるとまずは,ネットワークの設定.ガイド本のとおり素直に設定し,ローカルネット,外部のインターネットに向けpingを打ってみる.無事完了.

ユーザの設定は現在のワークグループに併せて,パスワードもそろえて設定をする.

次にSSHを設定する./etc/ssh/ssh.confをviで編集する.
 最終行に,AllowUsersに,SSHでログインするユーザを指定する.

sshを起動する.
[root@host123] /etc/rc.d/init.d/sshd start

動作確認できたので,起動時にデーモン起動できるように設定
[root@host123] chkconfig sshd on

次はFTPだ.これもガイド本の通りにvsftpのインストールと設定をしてデーモン起動をさせてwindowsマシンからFTP起動をしてみる.Windows側のソフトは,フリーのFFFTPを使った.接続はOK,だが,ファイルの読み出し,書き込みがぜんぜんできない...悩んだ挙句,SE-Linuxの設定値(Bool定数)にそれらしいフラグがあったので,これをいじってみたところ,読み書きが正しくできるようになった.
bool定数を見るには,root権限で下記コマンドを使う.
        [root@host123] getseboole -a
こうすると,すべてのbool定数が出てきてしまうので,ftpだったらこんなコマンドを打つ
        [root@host123] getbool -a |grep ftp

ftpに関連する定数のうち,
       allow_ftpd_full_access --> off
というのがくさそう.というわけで,これを恩にしてトライする.
       [root@host123] setsebool allow_ftpd_full_access on

これでうまく読み書きできるようになった.

あとは,-Pオプションでシステム起動時に毎回onにイニシャルされるよう,書き込む.
        [root@host123] setsebool -P allow_ftpd_full_access on

ちなみに,メールソフト,posfixもガイド本に沿って実施し,正常に動作した.

2009年8月19日 (水)

PICの寝床:Linux(Fedra 11)サーバの構築スタート

夏休みや冬休みは,ホームシステムの定期メンテナンスの時でもある.

家族は4人だが,PCは10台.どうしてこうなったのかは別にして,これだけあるとやはり調子の悪いPC,サーバのファイル容量が足りなくなったなど,いろいろと問題は出てくる.こうしたものにも結構手間がかかるので,日頃はできる範囲で対応をして,時間がない場合には応急措置をして,なんとかしのぐ.かくして,PCシステムメンテナンスの大物案件は長期休暇のタイミングで,となる.
今回,直接調子が悪くなったのはリビングのPCだ.寝室にあったデスクトップをリビングに持ってゆき,ついでにメモリなど増設して使うことにした.寝室には,LAPTOP(Shop Brand品)を置く.こうしてもともとリビングにあったPCが浮いてしまう.悪いところ,おそらくHDDか電源を交換すれば再生するだろうから,使えるものを使って積年の課題だったホームサーバのメンテを行うことにした.

対象となるのはサーバ,メインファイルサーバ,ダイナミックDNS更新(DiCE),メールサーバ(独自ドメイン)を預かる,我が家のPCシステムの基幹を支えるシステムである.で,見た目はこうだ.ハードディスクなんか,ごろんごろんしている.これがホームサーバとはいえ,生きているサーバにはとても見えないことだろう.ホームサーバの場合,上記にあるように日頃フロントエンドで使用するクライアントマシンに最高のスペックが優先的に与えられる.余ったハードウエアは,お父さんの趣味を兼ねてバックエンドのサーバに再利用しようというのが妥当な線だろう.にしても,さすがにこのまま放っておくのは心がが痛む.とわかっていて既に4から5年,ノントラブルで動くもんだから,見て見ぬフリをしてきた.
Currentserver これで,ホームサーバを更新したら,写真中心付近にある,A4のコピー用紙の座布団の上に設置(というより放置か)されたのが現サーバのマザーボードや右に横たわっているハードディスク等は不要になる.

既にこいつの3rdライフも考えている.家族の趣味のスポーツ大会の運営サーバに生き返らせるのだ.しかも,PICと組み合わせて.近年,一部の大会の運営をボランティアで協力しているのだが,たかがスポーツ大会とはいえ,裏方は大変.おびただしいデータ量のタイム計測や審判結果,採点等をすばやく,確実に集計し,賞状を出してMC用の原稿を用意し,WEBに速報を載せ,...となると,これはもうITの力が必須.しかし,広い会場で全員がPCを持って運営なんかできないから,必然的にスイッチ入力や大型表示等が欲しくなる.こういうところはPICの出番.だけどPICだけでも何にもできない.バックエンドの支えも大事.だからサーバというわけだ.

筋書きはこう.現在の基幹ホームサーバはハードがダメ.実はOSもWINDOWSの,もうサポートの切れた古いものを使っている.早くここから脱したい.これからもずっとお世話になるサーバだし,きちんと最新OSで1台立ち上げる.そのセッティングノウハウをトランスファして,空いた源ホームサーバに筐体を与えて大会運営サーバとして再生する.で,このサーバを寝所にして,大会運営に便利なフロントエンド機器をPICで作り,システム化する.PICシステムとPICの寝床(サーバシステム)とは,RS-485のAsync通信→USB変換でPCへ,または,シリアル←→イーサネット変換機(名前なんだっけ,7000くらいのやつ)で接続することになるだろう.

ここもボランティアでやるからにはお金もかけられない.第一,PICのココロとバックエンドのココロを一つにしたコラボレーションを考えたときに,高額でハイソなバックエンド様とはとうていお付き合いできない.主役のPICとのバランスが大事である.ということで今回はフリーのLinuxサーバで仕立てようと決心した.

実は,ホームサーバとして最初に立ち上げたのは,Linuxだった.Redhat3のころ,FMV-Deskpower-CというなつかしいPCがSONYのVAIOにリビングPCの座を明け渡した時に,FM-VをLinuxで生き返らせた.Pentium90MHzというSPECで,当時Windows98の時代ですら,重たく感じてきたCUだったが,ファイルサーバ&ローカルWEBサーバとしては十二分に,サクサク生き返ったことは鮮明に記憶に残っている.以来,WEBサーバだけはRedhat系Linux+Apacheをひいきにしている.じゃ,全部Linuxでサーバ構築をすればいいじゃないかと言う話になるが,メールサーバとダイナミックDNSがネックになり,ここだけはお手軽にWindowsマシンでサーバを組んで今に至っている.

Fedraguide 久しぶりのLinuxだが,Redhatのフリー版は今やFedraの流れに変わり,それもバージョン11を数えるほど変わってしまっている.その間,ご他聞にもれずセキュアOSとしてのパフォーマンスもアップしている.SE-Linuxというやつだが,うわさにはかなり手ごわいらしい.まったく自信は無い.しかし,PICの生きる道を極めるため,一発やってみようと考えた.
買ったのがこのガイド本.ちょうど最新版(Fedra 11)が発行されたので,,DVDも付いているし,これを購入!
暫くこいつにかかりきりになりそうだな...

2009年7月14日 (火)

PIC12F509を用いたなんちゃって正弦波発振器基板化

Pic12f509_5Pic12f509_2PIC12F509を用いたなんちゃって正弦波発振器,ブレッドボードでの実験を終了して基板化をし,いよいよPIC16F88を用いた陸上タイム計測装置にドッキングすることになる.

最終的には「スタート時報音発生回路部」として本体基板上に実装することになるが,本体のエッチングパターンに織り込む前にまずはフレキシブル基板上に実装.3枚作る予定.

本体に織り込むときのことを想定して回路はなるべくコンパクトに,ジャンパは極小にと考えていたら,例によって結構トリッキーな配線になってしまった.

本来は図を書くことが望ましいが,これくらいの回路なら何とかなるだろうとラフスケッチ後半田付けをしながらこのパターンになってしまったので後のことを考えてせめて写真を撮っておく.左側は部品実装面,右側はパターン回路面だが,パターンの方は左右反転させてある.(コンピュータって便利!)反転前の写真は,ややこしいので最後に載せる.

左側の部品実装面の写真上で,一番左上に8ピンDIPのPIC12F509が実装される.そう,PIC12F509の下にジャンパがあり,PIC12F509を実装すると見えなくなってしまうのでこの段階で撮影.中央やや左のラインに2SA1015Yが4つ縦に並んで実装される.これで回路としては完成(のはず)だ.

これが,パターン回路面(反転前写真).半田付けをする際に見るのはこちらだ.

Pic12f509_7 

2009年7月 9日 (木)

PIC12F509を用いたなんちゃって正弦波発振器の完成

Vvvf

PIC12F509を使って正弦波もどき発振器を作成しようという試み.左のグラフの,正弦波に対して,赤色のパルスを連続発生っせて,そのエンペローブにより「ほぼ正弦波」を発生させようというものだ.きっかけは,PIC16F88を用いた陸上用タイム計測器を自作して5月の晴れた日に陸上競技のトラック内でテストした時の事.この陸上用タイム計測器には「ヨーイ,ドン」の合図として時報(ブッブッブッピーというやつ)を実装したのだが,アナログ発振回路で構成したために昼間の日差しとトラックからの放射熱が重なり温度が上がると発振周波数が異様に高くなり,競技者全員のやる気を吸い取るスタート音に成り下がってしまい悩んでいた.そこに\60のPIC12F509が「ぼくにもできそう」と立候補したというわけだ.

途中経過は一切省いて,完成した回路,ソフトを列挙.ブレッドボードでしか試していないし,オシロも無いので最終的な波形で確認したわけではないけれど,一応それらしき音が発生できたので完成としておこう.

(回路図p.4右下)  「090621Draft.ppt」をダウンロード
(計算書)             「pic509.xls」をダウンロード
(ソフトウエア本体) 「PIC12F509FakeOfSinWave.asm」をダウンロード
(ソフトウエア(ヘッダ))「ms509.inc」をダウンロード (変わっていない)

これでバックアップ良し.

音を聞く限り,確かに矩形派特有のがさつなブザー音という感じではない.きっとそこそこの波形になっているのだろう.一応RCのローパスフィルタを一段だけ入れたが,さりとてNHKの時報のようなきれいな正弦波というわけにはいかず,高調波成分が残っていそう.ま,用途を考えたら合格にしよう.少なくてもクールな体育館でも炎天下の競技場でも,今度はまじめにスタート音を発してくれるだろう.ちなみに単にパッシブなL.P.Fを2段積んでも音量が下がるだけで音質の改善は感じられなかった.

Nec_0363 ところで,動作確認はブレッドボードで実施した.これに先立って,ブレッドボード実験部屋を作ってみた.「部屋」とは言っても,100均のA4プラスティックBOXにブレッドボード実験に必要なものと,良く必要になる部品を収納して左の写真のように開いて使えるようにしたものだ.こういうくだらない道具作りから入り,なかなか本題に取り組まないのも昔からのくせだ.

【収納物】
・ブレッドボード
・各種配線(市販のもの,自作の配線数々)
・電源(機種変更して不要になった
  携帯充電器を改造した電源(+5V)
・ピンセット,ドライバ
・ミニテスタ,ロジックプローブ
・部品(PIC,OP-AMP,Tr,アンプ(LM386),抵抗各種,コンデンサ各種)

休みを使った実験が終わり,日常モードに戻るときはふたを閉じ,壁に貼り付けて収納する.奥行き3cmの壁収納システム.電子部品はこまごまと散らかるので,このサイズの収納でも結構整理になる.化粧ベニヤと角材で超薄のタナを作り壁に張り付け,そのタナに9つのA4プラスティックケースをマジックテープで貼り付け固定している.片付け,取り出しも簡単.材料費\2,000.

Nec_0364Nec_0365

続きを読む "PIC12F509を用いたなんちゃって正弦波発振器の完成" »

2009年6月21日 (日)

PIC12F509を用いたなんちゃって正弦波発振器の構想

まず結論から.

Photo こんな回路を作れば,できそうな感じになってきた.PIC12F509の動作は,正弦波に程近い(とはいっても高々8倍の周波数だが)VVVFの指令パルスを出す.これを受けて実際のVVの部分の実現をどうするか,だ.当初より変更してトランジスタはPNPタイプのものにしたが比較的簡単な回路でできそう.抵抗値は現物あわせで決めた.計算すりゃいいんだけれどね.計算してもどうせ確認するし,実際には手持ちの抵抗で実現できる値を選ぶんだろうから,ということであとはPICが正確なパルス指令を出してやれば良い.

本当はPICから出た指令パルスの波形をオシロでとりたいのだが,家にそんなものは無い.LEDを点灯して貧乏なデバッグを実施する.なんとなく,できてそう.試しに,PICの指令パスル出力をそのまま圧電スピーカにつないでみた.圧電スピーカは直流分が入っていてもいいし,電力もいらないので簡単に確認ができる.

完全ではないが,それらしき周期でパルスを発生している.GP3はプの音,440Hzの低音側っぽい音だ.また,GP5はピの音,880Hzを意図した発振をするはず.この2つのI/Oを順番にOnさせると,オクターブになるはず.....うーん.微妙に音痴.ちょっと高い音が低めだ

これは,例の発振周波数×8倍の周波数で時間待ちをしているところの,定数違いだろう.やっぱり計算はビール抜きのときにやらなきゃね.

ただし,おおまかにはあっているので,つまらないところで命令数を数え間違えているなどの原因だろうから,今のところは気にしない.いざとなったら高々2音のオクターブ関係なんだから,ホビーの王道現合という手だってある.

ところで,PIC12F509でもやってしまった.もう片付いた話だが,新しいPICの種類を使う度に,再三こうした目に遭うので今後の戒めの意味で書き記そう.

GP2のコントロールが効かないのだ.今回,TRISの設定値は0x28,GP0,GP1,GP2,GP4が出力だ.GP0,1,4は正確にソフトウエア通りにON/OFFしているようだが,GP2だけうんともすんともいわない.LEDをつけても,ロジックプローブを当てても,まったく無反応.まるで入力に設定されているようなのだ.

ここでマニュアルを読む.GP2がアサインされているのは,T0CKI,TMR0の外部クロック入力と兼用のピンだ.うーん,こいつとあたっているのか.

確かにマニュアルには,OPTIONビットの中にTMR0のクロックソースを指定するビットがある.TMR0の外部クロックを有効にすると,このピンは入力に設定される.(TRISをオーバーライトする,とある)しかも,パワーリセット時のデフォルト値は,外部入力なのだ.

ヤラレタ.

だけどPICの気持ちがわかれば,直すのも簡単.OPTION命令でTMR0のクロックソースをIntに切り替えて,無事GP3は出力として使えるようになりました.

「PIC12F509FakeOfSinWave.asm」をダウンロード

2009年6月20日 (土)

PIC12F509ちっさいけれど,ピリリ

PIC16F88+SC1602S*Bを使った陸上タイム計測器の時報(スタート音)に使う正弦波発信器モドキをPIC12F509で作ってみよか,と思いつき,考えてみた.Excelで試算した内容を冷静にも一度見てみた.
プリスケーラを2とか1に設定すれば,TMR0を使って何とか1KHz前後までは何とか発生できる見込み.でもPIC12F509って,割り込みが無いんだよな.すると,ソフトウエアでTMR0の計数値を見張り,例えばFF→00になった瞬間をSTATUS-Zフラグで検出すれば出来るのだけれど,これにはbtfs?命令とGOTOディレクティブでループを構成しなければならない.でも待てよ?プリスケーラが1ということは,TMR0のカウントクロックとCPUの動作するインストラクションクロックが全く同一ってコトだな.そうすると,TMR0のオーバフローを検出するループが仮に3マシンサイクル(btfs?(=1サイクル)+goto(2サイクル))になってしまうので,タイミングが0~3サイクルは狂ってしまうことになる.うーん,残念だけれどTMR0は使わないほうが良いね.このクラスのPICで組まれる一般的な方法として,nopやLoopで時間待ちをしたほうが良さそうだ. nopやloopで時間待ちをする場合,ソフトウエアの正確なコードが決まらないとどんな時間待ちをどのような定数でやれば良いかも決まらない.卵鶏状態でなにも決まらない.
そこで,コードを書き始めることにする.

Vvvf何ちゃって正弦波発信器は,PIC12F509のGPIOをVVVF(Variable Voltage & Variable Frequency))っぽく制御すれば制限波っぽい波形を生成できるんじゃないか,という幼稚な発想で始めた遊びだ.発生させたい正弦波の8倍の周波数で,VVVF的パルスを生成する為の指令(1ビット)を出力する.これをトランジスタで受け,オープンコレクタ出力にして指令に対応した電圧が生成されるように負荷抵抗をセットしてやれば良い.オープンコレクタにするのは,複数の指令パルスを受けた電圧をワイヤードORで結線することでして連続波形にする為だ.(ほんとうはOPアンプの加算回路で合成するべきなのかもしれないが,遊びだから面倒くさいことはなるべくやりたくないのだ.後は交流カップリングとアッテネータを介してで386(1WオーディオアンプIC)へ送れば良いんじゃないか.

さてと,ソフトを作るには...MPLAB のIDEの環境を整えて,っと.MicroChipのサンプルソースを変更してソフトを書けば良いね.サンプルソフトを見てみた.すると,

ORG     0x3FF             ; processor reset vector

; Internal RC calibration value is placed at location 0x3FF by Microchip
; as a movlw k, where the k is a literal value.

ORG     0x000             ; coding begins here
movwf   OSCCAL            ; update register with factory cal value

とある.え?リセット割り込みベクタが03ffH??? しかも何のソースコードも書いていないし.その後すぐにorg000Hがあるし.

データシートを斜め読みしてみると,12F509はPricisionな内蔵RC発振器を有しており,かつそのキャリブレーション値が工場出荷時に書かれているというのだ.上記のサンプルソースと併せて解釈すると,キャリブレーション値はプログラムメモリの03ffHにmovlw kの形式で保持されているという.(kがキャリブレーション値)なおかつ,03ffHはリセットベクタだというから,電源リセット時にはここからCPUは動作を始める.PIC12F509の場合,03ffHのこの命令の次にPC(プログラムカウンタ)が向かうところはオ-バーフローして000Hだ.ここにはmovwf OSCCAL命令があり,Wレジスタに保持された,工場で書き込まれた内蔵RCオシレータのキャリブレーション値がキャリブレーションレジスタに目出たく書かれ,とてもリーズナブルな仕組みで4MHz(誤差1%)のPricisionなCPU動作クロックが供給されるということになる.こんな仕組みが60円のCPUに入っているなんて,にくいねぇ.4MHzの発振器から供給されたクロックは,4分周されてTMR0のカウントアップ用クロックソースとして供給される.だからこの場合,カウントクロックは1MHzだ.また,CPUのマシンサイクルは4クロックで供給されるので,1マシンサイクルは1MHzとなる.かくして,ユーザはTMR0で1μSecで刻むなり,1命令で1μSecを消費するなりということで,単純だが精度の良く計算のしやすいクロックを用いてアプリケーションを作成することができる.

さて,PIC12F509は8pinのIC.内蔵クロックで駆動するとなると,電源+,Gndに2pinを消費するが,残りの6品は全てI/Oとして使える.但し,GPIO3だけは入力としてしか使えないそうだ.ちょっと不満.何でbit3なんだ.MCLR*との関係なんだろうけれど...ま,こういう割り切りがPICの魅力でもあるんだけれどね.
かくして,趣味で.
Bit0(出力)角度 -1π/16~3π/16, 5π/16~7π/16の時の出力指令
Bit1(出力)角度 3π/16~5π/16, 15π/16~17π/16の時の出力指令
Bit2(出力)角度 7π/16~9π/16,13π/16~15π/16の時の出力指令
Bit3(入力)低音:ブッ(440Hz)の発振指令
Bit4(出力)角度 11π/16~13π/16の時の出力指令
Bit5(入力)高音:ピー(880Hz)の発振指令
というピンアサインとした.
入力のビットパターンが変わらない限りは,所定のサイクルで上記Bit0,1,2,4をサイクリックにON/OFFさせれば良い.
一つのパルスを発生させるソフトはおおよそ次のようになるだろう
ModeL_1_8_PI  ; 1/8PI Out PitPatern=0x04
     movf GPIO,W      ←1Clock
     andlw CommandMaskBitPattern  ←1Clock
     xorwf mode,W      ←1Clock
     btfsc STATUS,Z     ←1Clock
     goto setMode

  ;;; Wait xxx Instruction Clock
     movlw LowToneWaitFactor    <<<- ここまで
     call wait_8_Plus_4_by_n_Clocks     LowToneWaitFactor×4+8 ->>>
     nop         ←(補正)1Clock
     nop         ←(補正)1Clock

  ;;; Out Signal to GPIO
      movlw 0x04      ←1Clock
     movwf GPIO      ←1Clock
     goto ModeL_3_8_PI    ←2Clock

ここで,共通の時間待ちサブルーチンを以下とした
wait_8_Plus_4_by_n_Clocks
wait_8P4n000  movwf wait_8P4nCounter0
wait_8P4n001  decf wait_8P4nCounter0,F
     btfsc STATUS,Z
     return
     goto wait_8P4n001

この条件で消費クロックを数え,excelから時間待ちFactorと調整用のNOPを入れて正しく440Hz,または880Hzの正弦波っぽくなるように調整した.

「pic509.xls」をダウンロード

コンパイルは通ったぞ.とりあえず.

「PIC12F509FakeOfSinWave.asm」をダウンロード
「P12C509.INC」をダウンロード
「ms509.inc」をダウンロード

大きな勘違いは無いと思うけれど.ビールの見ながらExcelシートと作ったし.計算間違ってなければいいなあ.取り合えず,今度の休みにでも動作確認してみよう.

それにしても,60円のPIC12F509もやるもんだ.がんばっているなぁ.

2009年6月12日 (金)

恐るべし,陸上競技場

完成した!,と思った自作光電管式陸上競技タイム計測器をとある陸上競技場へ持ち込んで最終確認...のつもりが,5月の晴天下の陸上競技場は只者ではなかった.

 体育館内でのテスト,自宅前の市道上でのトライアルにはほぼ満足できる性能,使い勝手だった.本当に実際の計測環境での最終確認のつもりで,まずはPM1:30.陸上競技場のトラック内部の中央部に陣取って練習の邪魔にならぬよう意気揚々とくみ上げた....が,レーザ光の光軸がずれているにも関わらず,光電管スイッチがONしてしまう.ははぁ,5月の晴天下,周囲にさえぎるモノの無い陸上競技場だから,照り返しが外乱光になっているのだな,と思い,レーザ発光側,センサ側ともその場にあるもので覆ってみたが,変わらず.近距離でなら,ON,OFFを認識してくれるが,発光側と受光側を30cmも離すともうONしっぱなし.
 壊れたのかな,と思い,ベンチ内の日陰で再びトライアルしてみると,今まで通りほぼ完全に振舞ってくれる.再び日なたへ出すと,もうダメ.そうすると,温度そのものの影響じゃないな.
 それを確かめるべく,夕方5:30に再びトライアル.昼間に比べると立っている時の上半身近辺の気温はかなり涼しくなっている.しかしこれでも現象はそう変わらない.ここで思い当たるのは熱を蓄えた陸上競技場の地面から上がってくる温度.赤外線カメラで見てみたら,かなり真っ赤になっていることなんだろうな.例によって測定器なんて全く持っていないから,想像の域を超えないけれど.
後日,フォトトランジスタPTS610,PTS615の特性を見てみると,なんと感度のピークは800nmではないか.赤色レーザ光の波長は650nm.細かい数値は覚えていないが,赤外線って確か800nmくらいの波長だったように思う.むしろ,赤外線の方を強く拾うんだね.きっと.
 というわけで,ここは電子回路上で対策するしかないことになる.今はフォトトランジスタの入光・遮光時の電圧変化に対して,単純に74HC14のスレッショルドにあわせてバイアスをかけているだけ.従って外乱信号が74HC14のスレッショルドよりも高い位置に来てしまえば,常時ONになってしまい,光電管センサとしては使い物にならないのだと考えるとつじつまが合う.
 やっぱ,フツウにコンパレータで取ろう.その前段でOff時の外乱光をキャンセルできるレベルシフトを行えるようにすれば良いかな.LM324あたりの単電源OPアンプでなんとかできたら良いな.だめならこの方式での自作はあきらめかな.

実はもう一つ我慢なら無いことがあった.
非常に気に入っていた,スタートの時報音だったが,完全なアナログ発信回路を用いた為,どうも温度変化に弱い.高温になればなるほど,高い音にシフトするばかりか,ブッブッブッピーのプの音(440Hz=Aを想定)とピーの音(880Hz=オクターブ上のAを想定)のオクターブ関係がずれて,スタートダッシュのモチベーションを根こそぎ取り去るようなマヌケな音になる.
Drums担当だとは言え,若かりし頃はアマチュアミュージシャンの端くれだったプライドが我慢の限界を超えた.
Vvvf ようし.ここもデジタル化するぞ!どうせいつかはやろうと思っていたんだ.とはいえ,PICだけで可聴音域の完全な正弦波を発生させることは難しい.考えたのは,VVVF方式.正弦波っぽく電圧可変,周波数可変のパルスを生成するのだ.
本当は正弦波を発生したいが,デジタル制御で赤の信号を作り,なんとなく正弦波っぽく聞こえる発振器を作る.何ちゃって正弦波だ.デジタル制御によるパルス列だから,周波数は温度に拠らず,また,オクターブの関係に至っては正確無比にKeepできるというものだ.
これをPIC12F509あたりでできたらオモシロイ.D/Aの機能が無いので周辺ICの力は借りることにはなるが,8ピン・割り込み無し・\60円のPICであえてチャレンジしてみる.PIC12F509にもTMR0は実装されている.こいつを使って.やるとすると,どうなるか...

「pic509.xls」をダウンロード

今回は440Hz.12F509内臓の4MHzクロックでPICをドライブすると,TMR0の計数クロックは1MHzとなる.前出のグラフのように,発生させたい正弦波周波数の8倍でスイッチON/OFFをするための動作タイミングを1MHzの計数クロックでTMR0を使った場合の設定を算出してみると...
 440Hz  プリスケーラ=2,TMR0のカウント値=142
 880Hz  プリスケーラ=1,TMR0のカウント値=142
と,この場合でゆけばプリスケーラ値を1,2と切り替えれば良いことになる.4MHzでPIC12F509を動作させた時のインストラクションクロックは1MHzなので,TMR0のカウントクロックと同じだ.だから,厳しいほうの880Hzで見ても,142インストラクションに1回の割合でパルス発生をしてやれば良いことになる.パルス発生とはいっても,PIC12F509から見ればGPIOを切り替えるだけだ.うーんこれなら,割り込み無くても何とかなるんじゃないかな~.あるとおもいます.
と,言うわけで,Mesure88プロジェクトは最後の(最後にしたい)山場を迎える.

«PIC16F88を使った電飾。次のテーマ