Arduinoでネットワークアクセス

Arduinoでネットワークへの接続を行った。せっかくEthernet端子付きのArduinoを買ったんだから、試してみないとね。

以下の3つを試してみた。

  1. IPアドレス(Google)へ接続
  2. URL(Dropbox)へ接続
  3. 一定時間おきに接続

IPアドレス(Google)へ接続

Googleへのアクセスを行う。

サンプルのMACアドレスと、GoogleのIPアドレスを変更して動かしてみた。MACアドレスは、Arduinoの裏面にシールで貼ってある。IPアドレスは、IPドメインLOOKUPで、「google.com」で調べると良い。

#include < SPI.h >
#include < Ethernet.h >
  byte mac[] = {
    0x90,
    0xA2,
    0xDA,
    0x0D,
    0x27,
    0xBE
  };
IPAddress server(74, 125, 235, 66); // Google
EthernetClient client;

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ;
  }
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    for (;;)
    ;
  }
  delay(1000);
  Serial.println("connecting&#8230;");
  if (client.connect(server, 80)) {
    Serial.println("connected");
    client.println("GET /search?q=arduino HTTP/1.0");
    client.println();
  } else {
    Serial.println("connection failed");
  }
}

void loop()
{
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    for (;;)
    ;
  }
}

setupで接続を開始して、loopで戻り値を取得している。”client.read()”で、HTTPのレスポンスが読めるみたいだ。

結果がHTMLで返ってくる。HTMLの出力には、それなりに時間がかかった。

URL(Dropbox)へ接続

今度は、Dropboxの公開フォルダに置いたファイルを参照しに行く。先ほどと違うのは、ドメイン名を指定している点。IPアドレスは変わるかもしれないので、ドメイン名で指定した方が良い。

  #include < SPI.h >
  #include < Ethernet.h >

  byte mac[] = {
    0x90,
    0xA2,
    0xDA,
    0x0D,
    0x27,
    0xBE
  };

IPAddress server(74, 125, 235, 66); // Google
char serverName[] = "dl.dropbox.com";
EthernetClient client;

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ;
  }
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    for (;;)
    ;
  }
  delay(1000);
  Serial.println("connecting&#8230;");
  if (client.connect(serverName, 80)) {
    Serial.println("connected");
    client.println("GET /u/7551322/hello.txt HTTP/1.0");
    client.println();
  } else {
    Serial.println("connection failed");
  }
}

void loop()
{

  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    for (;;)
    ;
  }
}
  

IPアドレスをドメイン名に変えて、hello.txtまでのパスを書いた。そこの違いだけで、それ以外は同じ。

ドメイン名を指定して、接続できていた。最後に出力されている”Hello Network”は、hello.txtの中身だ。

一定時間おきに接続

次は、一定時間おきにネットワーク接続を行う。実際の運用になると、数分おきにネットワーク接続する事になるだろう。一定時間おきに、Dropboxのファイルを参照するプログラムを書いた。

#include < SPI.h >
#include < Ethernet.h >
#define LED_PIN 9
#define MODE_CONNECT 1
#define MODE_ALLREADED 2
#define MODE_DISCONNECT 3

byte mac[] = {
  0x90,
  0xA2,
  0xDA,
  0x0D,
  0x27,
  0xBE
};

char serverName[] = "dl.dropbox.com";
EthernetClient client;
int mode = MODE_DISCONNECT;

void setup() {
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
  while (!Serial) {
    ;
  }
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    for (;;)
    ;
  }
  delay(1000);
  Serial.println("ready.");
  Serial.println();
}

void loop()
{
  if (mode == MODE_CONNECT) {
    if (client.available()) {
      char c = client.read();
      Serial.print(c);
      if (c == & #8216;$&# 8217;) {
        mode = MODE_ALLREADED;
      }
    }
  }

  if (mode == MODE_DISCONNECT) {
    Serial.println("connecting&#8230;");
    mode = MODE_CONNECT;
    digitalWrite(LED_PIN, HIGH);
    if (client.connect(serverName, 80)) {
      Serial.println("connected");
      Serial.println();
      client.println("GET /u/7551322/hello.txt HTTP/1.0");
      client.println();
    } else {
      Serial.println("connection failed");
    }
  }

  if (mode == MODE_ALLREADED || !client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    Serial.println();
    Serial.println();
    client.stop();
    digitalWrite(LED_PIN, LOW);
    delay(5000);
    mode = MODE_DISCONNECT;
  }
}

ここは少しポイントがある。loopでネットワーク接続を行うため、接続中などのステータス管理を実施する必要がある。ここでは、3つのステータスを導入している。それぞれのステータスの箇所が動く仕組みだ。

MODE_CONNECTのif文で、”if (c == ‘$’)”としている箇所がある。これは、textの最後を判別するために用意した。Dropboxのhello.txtの最後に”$”を入れている。これがないと、読み込み終了判定が出来ないからだ。

*2012/08/01 追記

”$”で読み込み終了判定をしていたが、Arduino – ClientReadによると、戻り値が-1かどうかで判定が出来るようだ。

5秒おきに、ネットワーク接続を行っているのを確認した。hello.txtの中身を変えると、その変更が反映されたテキストが出力されることも確認した。

投稿日 2012年07月29日