i-modeで遠隔操作しよう


1.ハードに関して
2.ソフトの修正
3.ブラウザ画面の修正
4.携帯電話からアクセス



秋月電子で売っている 「AKI−H8/3052 LAN開発ボードキット」というものを使用します。
このキットはパソコンからLAN経由でH8マイコンのI/Oをコントロールできます。
携帯電話などからネットワーク経由でいろいろ遠隔操作したら面白そうでしょ?

このキットには、H8/3052Fというマイコンボード(右下写真のなかの右側)と、
Ethernetコントローラや入出力端子を備えたマザーボード(右下写真のなかの中央)と、
液晶モジュール(右下写真のなかの左側)とツール類やサンプルソフトが付属します。

CPUやRAMなどの表面実装ICは初めからはんだ付けされていますが、
その他の部品は説明書を見ながら自分で取り付けます。

全部合体させると左下の写真のようになり完成です。
【H8-3052F】
・512kbyteのフラッシュROM内蔵
・8kbyteのRAM内蔵(マザーボードに1MのSRAMを増設してあります)
・ソフト書き込み用の回路も搭載されており、パソコンとシリアルケーブルで接続するだけで書き込み可能
 必要なソフトは一式含まれています。
・動作クロック25MHz


キットが用意できたところでさて何をしましょうか?
まずは簡単なところでパソコンからマザーボードに搭載されたLEDでもON/OFFさせてみましょう。
簡単というか、初めからサンプルとしてキットに付属のCDROMのなかに入っています。

何か書こうと思ったけど説明書そのままになってしまうのでここはスキップします。
説明書どおりにやれば誰でも出来ます。

1.ハードに関して

では、ちょっと応用して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する結線になっています。フォトトライアックの制御側の吸い込みです。



2.ソフトの修正

先にハードを作ってしまいましたが、当然ソフトの変更も必要です。
極力そのまま付属のソースを使用するとして、改造しなければいけない部分が数箇所あります。

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出力になること)



3.ブラウザ画面の修正


先ほどのブラウザ画面では、携帯電話の画面に表示しきれません。
もうすこしスマートに表示するように改造しましょう。
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表示がポートの出力状態となります。
そのほかの部分も同様に変更すれば反映されます。


4.携帯電話からコントロール

それでは最後に、自宅のネットワークにつなげてインターネットからアクセス制御してみましょう。
多少ネットワークの知識が必要になりますが、ここでは分かっているものとして解説しません。


適当にアクセスされても困りますので、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にチェックして送信すると、部屋の電気がつきました。
ちょっと不思議な気分です。

夏場、家に帰る前にエアコンの電源を入れたり、
防犯対策として外出先から部屋の電気をつけたり、
自宅のサーバーを立ち上げたり・・・いろいろと応用が出来そうです。


とっちんページトップにもどる
電子工作のページトップに戻る