■ENC28J60を使ったNICモジュールを作ろうとして、まあ、実際ICMPとTCPの3ウェイハンドシェイクまではざっくり作れているのですが、そうこうしているうちにCQ出版のInterface9月号にネットワークインターフェースを持つモジュールが付録に。価格も追加の部品を合わせて2000円前後ということで、あっさりこれを使うことに決めた。
長いことやっていると何が目的だったのか忘れてしまいそうになるんですが、そもそも「ネットワーク越しにATXの電源スイッチを操作する」ことが目的です。ENC28J60とAVRでNICモジュールというのは、そのための手段であって、それを目的とはしていませんでした。もちろん、いつの間にか手段が目的となるというのはよくある話で。
ATXの電源スイッチをネットワーク越しに操作するというのはWake On LANのことではなく(WOLならすでに実装している)ATXの電源スイッチ接点にスイッチ回路を割り込ませてLAN経由でスイッチ操作を行えるようにするという意味。いろいろ実験しながら回路を決められればいいのだけど、今は手軽にトライできる環境でないので、まずは光MOSFETを使ったトライアックで3.3VのTTL出力で導通操作させるモジュールを作成した。
付録のモジュールとスイッチモジュールを合わせてブレッドボードに載せて安直に回路は完成。
残るはプログラムですが、付録モジュールにはSilentCというCライクな言語を扱うインタプリタが載っていて、雰囲気としては昔のBASICインタプリタを載せていたパソコンみたい。ただ、実際にはバックグラウンドでネットワークのアクセスを待ち受けているルーチンが動いていて、HTTPアクセスで呼び出されるHTMLファイルの中でプログラムが実行される。だから、エージェント的な作りには向いていない。ただ、今回作ろうとしている、アドホックに呼ばれて動作するモノには問題ない。
付録モジュールには汎用のTTL入出力を扱えるポートが4つ(#0~#3)あるらしく、そのうち#3を使ってオン・オフを操作するプログラムを作成した。単純なATXオンでは0.5sオンしてオフする。いわゆる長押し、PCの強制オフでは4sオンしてオフする。プログラムといって公開するのもためらわれますが、こんなんです。
main(){*0x4010000e|=8; Sleep(10); *0x4010000e&=0xf7;}
flush(){*0x4010000e|=8; Sleep(50); *0x4010000e&=0xf7;}
light4(){*0x4010000e|=8; Sleep(400); *0x4010000e&=0xf7;}
本誌(Interface9月号)にはレジスタアドレスが載っていないので困りましたが、付録モジュールにはじめから書き込まれているサンプルを読み取ってどうにか。
ところでスイッチ回路ですが、本当は機械的なリレーを使った方がいいのかと思ったのですが、3.3Vの世界で駆動できるリレーが少ないということと、以前PS2.5を作った時に何も考えずにうまくいったので、とりあえずそれで。