H8-3069ネット対応マイコンにMESを入れる > 基本編2.LED1とLED2をブラウザから点灯させる

2.LED1とLED2をブラウザから点灯させる

ブラウザを使わない点灯

これからH8-3069ネット対応マイコン用の「I/O BOARD」のLED1(赤)とLED2(緑)を点灯させます。このページで目標としているのはブラウザからアクセスしてLEDを点灯・消灯させることですが、その前に単純なプログラムをやります。プログラムを実行したら1秒ごとに赤LEDと緑LEDが交互に点灯するプログラムです。

#include <h8/reg3067.h> //レジスタの定義
#include <mes2.h>
int main(){
P4DDR = 0xc0;
while(1){
P4DR = 0x80;
//7ビット目、つまりLED2(緑)を //点灯させる

sleep(1000);
//1000ミリ秒待つ

P4DR = 0x40;
//6ビット目、つまりLED1(赤)を //点灯させる

sleep(1000);
} //while
} //main

上のプログラムをled1.cという名前で保存します。保存先はC:\mes\led1フォルダの中にします(led1フォルダをmesフォルダの中に新規作成する)。
ちなみにP4DDR = 0xc0;は、I/O BOARD の添付資料にLED1がP4の6ビット目に接続されていて、LED2がP4の7ビット目に接続されていると書いてあるからです。ビットに1を立てれば出力、ビットに0を立てれば入力です。この場合は6ビット目と7ビット目を出力として使いたいので0xc0という値をP4DDRに入れてやります。
このled1.cを5.初めてのプログラムを作るCBarをつかうと同じように、コンパイルしていきます。

  • CBarでC:\mes\led1フォルダの中に新規プロジェクト(led1.cba)をつくる。
  • Sourceの追加で、さきほど作った同じフォルダ内にあるled1.cを追加する。
  • コンパイルする(エラーがでたら、プログラムの間違いを直して一度クリアしてもう一度コンパイルしてみる)。
  • Compile completedと出て、コンパイルが成功したら(led1.elfが出来ていれば)プロジェクトを保存してCbarを終了する。

コンパイルが出来たら、6.パソコンとマイコンをLANでつなぐと同じようにtftpサーバからled1.elfをマイコンに送り込んでプログラムを実行します。具体的には以下の手順でやります。

  • ネットに繋がっている場合は一旦止めるため、モデムと繋がっているLANケーブルを抜き、パソコンのIPアドレスを192.168.10.1と設定する。このときにウイルス対策ソフトも止めておく。
  • シリアル9ピン(RS232C)でマイコンとパソコンをつなぐ。
  • マイコンとパソコンをLANケーブル(クロス)でつなぐ。
  • デスクトップの電話マークのアイコン(Terminal)をダブルクリックして起動する。
  • ディップスイッチがモード5であることを確認してマイコンの電源を入れる。
  • MESが起動します(何もおきない場合は、マイコンボードのディップスイッチ横の青いプッシュボタンを押すと起動します)。

MESが起動したら、マイコンにIPアドレスを設定します。

ifconfig ne0 192.168.10.2 255.255.255.0

そしてpingを打ってパソコンとつながるかを確認します。

ping 192.168.10.1

あとはTFTPサーバーで転送するでhello.elfを転送したのと同じように、led1.elfを転送します。転送が出来たらled1.elfと打って実行。緑と赤のLEDが1秒ごとに点灯したらOK。
ちなみに、このLEDはあまり長時間点灯させとくのはやめといたほうが良いそうです(やまねこのマイコン実験室より)。

ブラウザを使った点灯

ではいよいよブラウザを使ったLEDの点灯消灯をやってみます。下のプログラムはみついわさんのダウンロードページにあるcgi.cをダウンロードさせていただいて、私がちょっと変更したものです。

/*LEDをブラウザから点灯消灯するプログラム*/
#include <h8/reg3067.h>
#include <mes2.h>

int main(int argc, char **argv) {
char led[2][4];

cgi_value(*(argv+1), "led0", led[0], 3);
cgi_value(*(argv+1), "led1", led[1], 3);

P4DDR = 0xc0;
P4DR = 0;

if(led[0][0] == 'o') P4DR |= 0x40;
if(led[1][0] == 'o') P4DR |= 0x80;

printf("<html><body>\r\n");
printf("<h1>LEDテストページ</h1><hr>\r\n");
printf("<p>argcは%dです。</p>\r\n",argc);
printf("<p>*argvは%sです。</p>\r\n",*argv);
printf("<p>*(argv+1)は%sです。</p>\r\n", *(argv+1));

printf("<p>赤は%sです</p>\r\n",led[0]);
printf("<p>緑は%sです</p>\r\n",led[1]);

printf("<form action=\"%s\">",*argv);

printf("led1(赤)<input type=\"checkbox\" name=\"led0\" %s>\r\n", (led[0][0]=='o') ? "checked" : "");
printf("led2(緑)<input type=\"checkbox\" name=\"led1\" %s><br>\r\n", (led[1][0]=='o') ? "checked" : "");

printf("<input type=\"submit\" value=\"submit\" ><br>\r\n");
printf("</form><hr>\r\n");
printf("</body></html>\r\n");
}

上のプログラムをled2.cという名前でC:\mes\led2フォルダに保存します(led2フォルダを新規作成する)。ちなみにこのプログラムをこのままコピペするとエラーが出ます。上では表示の都合上、チェックボックスの表示の部分を区切りのわるいところでくぎっているためです。led2.cが欲しい場合はこちらにおきます。ご自分のPCにダウンロードしたうえでお使いください。
以下、次の手順でコンパイル、そして実行します。

  • CBarでC:\mes\led2フォルダの中に新規プロジェクト(led2.cba)をつくる。
  • Sourceの追加で、さきほど作った同じフォルダ内にあるled2.cを追加する。
  • コンパイルする(エラーがでたら、プログラムの間違いを直して一度クリアしてもう一度コンパイルしてみる)。
  • Compile completedと出て、コンパイルが成功したら(led2.elfが出来ていれば)プロジェクトを保存してCbarを終了する。
  • ネットに繋がっている場合は一旦止めるため、モデムと繋がっているLANケーブルを抜き、パソコンのIPアドレスを192.168.10.1と設定する。このときにウイルス対策ソフトも止めておく。
  • シリアル9ピン(RS232C)でマイコンとパソコンをつなぐ。
  • マイコンとパソコンをLANケーブル(クロス)でつなぐ。
  • デスクトップの電話マークのアイコン(Terminal)をダブルクリックして起動する。
  • ディップスイッチがモード5であることを確認してマイコンの電源を入れる。
  • MESが起動します(何もおきない場合は、マイコンボードのディップスイッチ横の青いプッシュボタンを押すと起動します)。

MESが起動したら、マイコンにIPアドレスを設定します。

ifconfig ne0 192.168.10.2 255.255.255.0

そしてpingを打ってパソコンとつながるかを確認します。

ping 192.168.10.1

あとはTFTPサーバーで転送するでhello.elfを転送したのと同じように、led2.elfを転送します。転送が出来たらhttp.elfと打って実行(ここで打ち込むのはled2.elfではありません)。このとき何の反応もありませんが、このままでIEなどのブラウザを開きます。アドレスバーにhttp://192.168.10.2/led2.elfと打ち込んでみます。
打ち込んで下のような画面が出ればOKです。チェックボックスにチェックを入れてsubmitボタンを押し、そのとおりにLEDが点くか見てみましょう。

led2.elfの画面

画面上に表示される始めの5行は、変数(argcとargvとled[2][4])の中身をみるために書いているだけです。argcは実行ファイルを含むパラメータの数(2)が入ります。*argvはargv[0]と同義であり、実行ファイル名(led2.elf)の文字列の始まりである「l」(小文字のエル)の入っているアドレスを意味します。
それから、*(argv+1)はargv[1]と同義です。例えば、2つのチェックボックスにチェックが入った状態でsubmitボタンを押すと、「led0=on&led1=on」という文字列の始まりである「l」(小文字のエル)の入っているアドレスを意味します。*argvと*(argv+1)はそれぞれ別物を指していますが両方「エル」を指しているので説明がまぎらわしいですね(汗)。)
また、「LANによるハードウェア制御」の267ページにint cgi_valueの説明があります。これは、「CGIプログラムへ渡されるオプション文字列中の変数に対応する値を取得する」と書かれています。なので、チェックボックスにチェックが入った状態でsubmitボタンが押されint cgi_value()が行われると、led[0]から、もしくはled[1]から「on\0」の3文字分が代入されます。ですよね?

何はともあれ、これで2つのLEDをブラウザから点灯消灯させることが出来ました!

次は3.DIPスイッチの入力を確認してみるです。>>