言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Arduino Ethernet

P1020964

ちょっとしたインターネットデバイスが作りたくなって 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 コンバータケーブルを一緒に買いました。

パソコンと接続する

P1020968

Arduino Ethernet と パソコンを繋げるには、USB コンバータの黒い線の方を Arduino の BLK と書いてある向きに挿します。電源も USB から来るのでパソコンと繋げるだけでとりあえず使えるようになります。

USB ドライバのインストール

USB コンバータのドライバを http://www.ftdichip.com/Drivers/VCP.htm からダウンロードしてインストールします。

Arduono でプログラムを書く

Arduino 1.0 を立ち上げ、以下の設定をします。

  • Tools - Board - Arduino Ethernet
  • Tools - Serial Port - /dev/tty.usbserial-なんとか (Mac の場合)

動作確認としてとりあえず 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 という本を買ったのだが、この本が出た頃より今は事情が随分変わっているようで、本に書いてあるより全然簡単だし安上がりに出来ます。なので本の真似をしないようにしましょう(笑)。