ちょっとしたインターネットデバイスが作りたくなって Arduino Ethernet というのを買ってみました。Arduino Ethernet というのは、人気の AVR マイコンキット Arduino に LAN 端子、そして TCP/IP コントローラ Wiznet W5100 がセットになった物です。この W5100 というのが凄くて、普通はソフトウェアで書かれている TCP/IP の仕組みをワンチップの中に入れてしまった物です。これだけで小さなコンピュータなのですが、お値段たったの 4 ドルらしい。しかし普通の人にはこのチップのハンダ付けは無理なので、Arduino とセットになったこのキットは大変便利です。Arduino の CPU と W5100 は SPI という方法で接続されていますが、Arduino のライブラリを使うと特に何も気にせずネットにアクセス出来るようになります。
注意点としては、この Arduino には USB が付いていません。私はミラクル・リナックスの #50040 USB-TTL コンバータケーブルを一緒に買いました。
パソコンと接続する
Arduino Ethernet と パソコンを繋げるには、USB コンバータの黒い線の方を Arduino の BLK と書いてある向きに挿します。電源も USB から来るのでパソコンと繋げるだけでとりあえず使えるようになります。
USB ドライバのインストール
USB コンバータのドライバを http://www.ftdichip.com/Drivers/VCP.htm からダウンロードしてインストールします。
Arduono でプログラムを書く
Arduino 1.0 を立ち上げ、以下の設定をします。
動作確認としてとりあえず File - Examples - Basic - Blink の LED チカチカを選び、実行ボタンを押して確認をします。と、ここで落とし穴。普通 Arduino の内蔵 LED は 13 番なのですが、Arduino Ethernet だけ 9 番なのでピン番号を変更します。
void setup() { // Arduino Ethernet has a built-in LED on pin 9. pinMode(9, OUTPUT); } void loop() { digitalWrite(9, HIGH); // set the LED on delay(100); // wait for a second digitalWrite(9, LOW); // set the LED off delay(100); // wait for a second }
Web サーバーを書く
早速この LED チカチカをインターネット対応にしてみましょう。Arduino には沢山サンプルが用意されているので、適当に触っているうちにだいたい使い方が分かると思います。以下のように打ち込んで、MAC アドレスと IP を変えてから指定した IP (例: http://192.168.1.177) にブラウザでアクセスするとウェブから Arduino の LED をチカチカ出来ます。
/* LED blink server */ #include <SPI.h> #include <Ethernet.h> byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x29, 0x8E }; // ここは MAC アドレス IPAddress ip(192,168,1, 177); // ここは IP アドレス EthernetServer server(80); // LED state bool isHigh = false; void setup() { // start the Ethernet connection and the server: Ethernet.begin(mac, ip); server.begin(); pinMode(9, OUTPUT); } void loop() { // listen for incoming clients EthernetClient client = server.available(); if (client) { char prev = '\n'; // ヘッダをスキップします。 while (client.connected()) { if (!client.available()) continue; char c = client.read(); if (prev == '\n' && c == '\n') break; if (c != '\r') prev = c; } client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println(isHigh ? "HIGH" : "LOW"); digitalWrite(9, isHigh ? HIGH : LOW); // set the LED on isHigh = !isHigh; delay(1); // give the web browser time to receive the data client.stop(); // close the connection: } }
感想
C で書くのを厭わなければかなり簡単。ちなみに、参考のために Making Things Talk という本を買ったのだが、この本が出た頃より今は事情が随分変わっているようで、本に書いてあるより全然簡単だし安上がりに出来ます。なので本の真似をしないようにしましょう(笑)。