
では、ちょっと応用してLEDの代わりに電気スタンドでもON/OFFしてみましょう。
考え方としては、LEDの代わりに100VをON/OFFする電気的なスイッチを接続すればOKですね。
秋月電子で売っているソリッドステートリレーキットが手元にあったので使用しました。
これは数V(3〜8V程度)の制御電圧で商用電源のON/OFFが出来る半導体スイッチのキットです。
マザーボードについているLEDは、液晶モジュール(LCD)のコントロール信号と同じポートを使用しているので、
文字の表示を行うと一緒に点灯してしまいます。
ということは文字の表示中にスイッチもON/OFFしてしまうことになるので、別の空きポートを使用します。
ポートBのビット5,6(PB5、PB6)が未使用のようなので、ここを使用することにしました。
この端子はマザーボードに外部取出し用のパターンも出ているのでよさそうです。
下記写真では40ピンのフラットケーブルで接続されていますが、別の用途を考えているためです。
今回の目的ではPB5、PB6、+5V、GNDの4本だけしか使いません。
|
 |
実際に作ってみた写真です。右側の端子は上から順に、
1.LAN (とりあえずクロスケーブルでPCと接続)
2.USB (PCから5V電源をもらっているだけです。このキットではUSB通信は出来ません。)
3.シリアル (ソフト書き込み用です。通常は必要ありません。)
フラットケーブルをはさんで左側は、秋月のソリッドステートリレーキットをユニバーサル基板に組んだだけです。
トライアックには、AC100VのON/OFF制御が出来るように商用電源が接続されています。
ポートに対して”Lo”でONする結線になっています。フォトトライアックの制御側の吸い込みです。

先にハードを作ってしまいましたが、当然ソフトの変更も必要です。
極力そのまま付属のソースを使用するとして、改造しなければいけない部分が数箇所あります。
1.制御ポートの変更
・いままでPB0に割り当てていた部分をPB5へ、
・いままでPB1に割り当てていた部分をPB6へ、
2.PB5、PB6を他の制御から影響を受けないようにマスクする。
3.ポートBの初期設定
【制御ポートの変更】
それでは実際にどこを修正すればいいのかみていきましょう。
サンプルソフトで行っている制御ポート(LED0〜3)のアドレス定義は「http.c」にあります。
13行目あたりにあるdefine文でON/OFFするポートBのビット位置を定義しています。
#define LED0 0x1
#define LED1 0x2
#define LED2 0x4
#define LED3 0x8
LED0〜3が、ポートBの何ビット目に該当するのかの定義です。オリジナルでは下位4Bitを使用していますが、
今回は5、6bitを使用するのでLED0と1を下記のように変更します。
#define LED0 0x20
#define LED1 0x40
これで、LED0をON/OFFさせようとすれば、ポートBのBit5の出力が、
LED1をON/OFFさせようとすれば、ポートBのBit6が変化します。
【出力ポートのマスク】
他の関数よりポートBのBit5,6が直接アクセスされると不都合が生じます。
それは出力の状態を操作されていることになるからです。
他の関数からはポートBにアクセスされても状態が変化しないようにマスクしておきます。
複数の場所に手を加える必要があるので、ヘッダファイル(Network.h)にdefine定義しておきましょう。
適当な位置に定義します。下記は例です。
#define OUT_P_MSK 0x60
実際にマスクする部分は3箇所です。
1つ目は、DataLink.c内にあるNIC_Reset()関数部分です。470行目付近です。この中に、
*PortB=(UCHAR)0x0f;
という記述が2箇所あります。このままではリセット時に出力がONしてしまうので、
コメントアウトするか以下のように修正します。ポートBはNICの初期化に関係ありません。
*PortB=(UCHAR)0x0f|OUT_P_MSK;
2つ目は、LcdDrv4.c内のLCDコントロール関数です。
LcdOut2() 内に直すところがたくさんあります。(260行目付近)
ここはLCDにデータを送って文字を表示させる関数ですが、ポートBに出力しています。
*Port=********;
という部分が全てポートBへの出力です。
7箇所ぐらいありますが、全て以下のように変更します。
*Port=********|(*PortB & OUT_P_MSK);
ビット5,6の状態は変化させないということです。
3つ目は、LcdDrv4.c内のLCD初期化部分です。90行目付近のLcdModule_Initial()内です。
上記と同様に*PortB=********;の部分を下記のように変更します。
*PortB=********|OUT_P_MSK;
【ポートBの初期設定】
最後に、起動直後に出力がOFFするようレジスタ設定のところで定義しておきましょう。
アセンブラで記述されている、RESETV.ASM内の90行目付近にポートBの設定があります。
MOV.B #H'FF,R0L
MOV.B R0L,@PBDDR:8 ;PORTB出力
ここの後に下記2行を追加します。
MOV.B #H'6F,R0L
MOV.B R0L,@PBDR:8
ポートBに0x6fを出力する命令です。すなわちこの時点でLEDはOFFします。
|
これらの変更後に、再度コンパイル〜書き込みまで行い完了です。
さあ、うまく動作したでしょうか?
ブラウザからアクセスすると、左のような画面が現れます。
PB0にチェックを入れてSUBMITを押すと、
ボートBのBit5がONするはずです。
(ここでいうONとはポートがLo出力になること)
|

先ほどのブラウザ画面では、携帯電話の画面に表示しきれません。
もうすこしスマートに表示するように改造しましょう。
http.c内の69行目付近にHTMLが書かれています。
*HttpMsg_*に格納されているのでここを修正すればよいのでしょう。お好みで修正してください。
HTTPクライアントに送信するHTMLデータは、同ファイルの370行目付近にある
MakeHttpStr_Aki()内で生成されます。
プログラム中のコメントにもあるとおり、HttpMsg_2のX部分を書き換えるだけです。
HttpMsg_2に変更を加えてしまったら、TempBuff[**]の**部分も直します。
Xの部分が何文字目になるのか**の部分に入れればOKでしょう。
|
私の作ったブラウザ画面はこんな感じです。
これなら携帯電話に表示しても見やすいと思います。
サンプルプログラムでは、表の一番右側はポートAの状態表示です。
ここをポートBの5,6ビットに変更しました。
すなわち、リロードすれば現在ONしているのかOFFしているのかが分かります。
本来ならポートの状態を別ポートでモニタして表示するのが筋ですが、
改造が楽なので簡易的にこうしています。 |
この変更に関しては以下のとおりです。
MakeHttpStr_Aki()関数内の先頭に以下の記述を追記します。
UCHAR c_PBDR;
CUHAR *PortPBDR;
PortPBDR=(UCHAR*)PBDR;
c_PBDR=~(*PortPBDR);
次に下記部分を書き換えます。
前:if(c_PADR & (UCHAR)LED0){
後:if(c_PBDR & (UCHAR)LED0){
これでPB0のところのON/OFF表示がポートの出力状態となります。
そのほかの部分も同様に変更すれば反映されます。
|

それでは最後に、自宅のネットワークにつなげてインターネットからアクセス制御してみましょう。
多少ネットワークの知識が必要になりますが、ここでは分かっているものとして解説しません。
適当にアクセスされても困りますので、HTTPポートをデフォルト値から変更しておきましょう。
Network.h 内の159行目付近に
#define HTTP_PORT 80
という記述があります。ここがHTTPのポートを定義している部分です。
ここの80を適当なポート番号に変えましょう。ここでは12345として話を進めます。
(他のポートとダブっては駄目です。10000〜60000ぐらいにしておけば無難でしょう)
変更後ソフトを書き込んでみて、反映されているか確認します。
下記のようなアドレスで接続できれば正常です。アドレスのおしりに、:12345が追加になります。
http://192.168.1.100:12345/
IPアドレスも変えたいなら、20行目付近の「MY_IP_STR」を変更します。
デフォルトでは192.168.1.100です。自宅のLANとサブネットが異なるなら変更します。
次にルータにポートマッピングの設定を施します。
ポート12345へのアクセスを全てH8−LANキットのIPへ渡すようにします。
|

これだけで設定は完了です。
アクセスできるか試してみましょう。アクセスするには、
http://自宅のIPアドレス:設定したポート番号/
(例: http://***.***.**.**:12345/)
と、入力すればOKです。
携帯電話からばっちりアクセスできました。
PB0にチェックして送信すると、部屋の電気がつきました。
ちょっと不思議な気分です。
夏場、家に帰る前にエアコンの電源を入れたり、
防犯対策として外出先から部屋の電気をつけたり、
自宅のサーバーを立ち上げたり・・・いろいろと応用が出来そうです。
|