ArduinoでWebに簡単アクセス!(その2)
まず始めに。以下のEthernetDNSとEthernetDHCPを使う場合、ArduinoはDuemilanoveじゃないとROM容量が足らないので気をつけて。それから、RAMもかなりギリギリだよ。なにかSketchを書いて動きがメチャクチャになったら、RAMが足りなくなったと思っていい。その時はATMEGA328よりも大きなメモリを持ったArduinoレプリカを使うしかない。
前回はArduinoでDNSを使えるようにしたけど、今回はDHCP対応にしてみよう。
DHCPって、なんだ?という人もいるよね。
ArduinoのEthernetライブラリをそのまま使っている場合、ArduinoにIPアドレスを直接Sketchに書いていると思う。例えば、”192.168.0.10″とかね。
でも、大体みんなはブロードバンドルータの下のLANに接続して、そこからインターネットにアクセスしているよね?そのLANにPCとかを接続する時にちゃんとPCにIPアドレスを入れなくても、ちゃんとインターネットにアクセス出来るよね。これは、ブロードバンドルータにDHCPサーバという、自動的に接続したPCにIPアドレスを割り当ててくれる機能があって、PC側にはそのDHCPによるIPアドレスをして欲しいっているDHCPクライアント機能が働いているから。
そして、前回のDNSクライアント機能と併せることで、インターネットアクセスが自動化出来ているというわけ。(ホントはもう少し複雑なんだけどね。)
で、今回紹介するのが、そのDHCPクライアントライブラリのEthernetDHCPだ。前回のEthernetDNSと同じ人が提供してくれている。
このライブラリは特に不具合はないので、前回のEthernetDNSと同じようにArduinoのライブラリディレクトリにコピーして登録しよう。
これで、SketchにIPアドレスは書かなくてよくなる。(もちろん、その代わりにこのDHCP機能が働くようにSketchを書くことになるけどね。:P)
だから、いつもと違うどこかのLANに接続してもちゃんと動く。すごいでしょ?
僕の場合はモバイルでArduinoを動かす時に、MacやPCのインターネット共有機能を使って、クロス配線のEthernetケーブルでArduinoをつなげて楽しんでいる。
EthernetDHCPにもサンプルSketchがあるから、それを参考にSketchを書けばいいだけだ。
今回は、EthernetDHCPとEthernetDNSを使って、シリアルモニタに入力したサーバのIPアドレスを取得するまでのサンプルSketchを書いてみた。例えば、”www.google.com”みたいに入力してみればちゃんとIPアドレスが表示されるよ。参考にしてね。
※EthernetDNSとEthernetDHCPがGNUのLGPLであり、そのサンプルもLGPLに含まれているため、以下のサンプルSketchも改変コードのためLGPLになっています。
// Copyright (C) 2010 Hitoshi Yamada // http://emergeplus.jp // // This file is sample sketch using Arduino EthernetDNS and EthernetDHCP. // // This sketch is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as // published by the Free Software Foundation, either version 3 of // the License, or (at your option) any later version. // // This sketch is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this sketch. If not, see // <http://www.gnu.org/licenses/>. // #include <Ethernet.h> #include <EthernetDHCP.h> #include <EthernetDNS.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Change to your Ethernet Shield's MAC const char* ip_to_str(const uint8_t*); void setup() { Serial.begin(9600); Serial.println("Attempting to obtain a DHCP lease..."); EthernetDHCP.begin(mac); const byte* ipAddr = EthernetDHCP.ipAddress(); const byte* gatewayAddr = EthernetDHCP.gatewayIpAddress(); const byte* dnsAddr = EthernetDHCP.dnsIpAddress(); Serial.println("A DHCP lease has been obtained."); Serial.print("My IP address is "); Serial.println(ip_to_str(ipAddr)); Serial.print("Gateway IP address is "); Serial.println(ip_to_str(gatewayAddr)); Serial.print("DNS IP address is "); Serial.println(ip_to_str(dnsAddr)); Serial.println("Enter a host name via the Arduino Serial Monitor to have it " " resolved."); EthernetDNS.setDNSServer(dnsAddr); } void loop() { char hostName[128]; int length = 0; while (Serial.available()) { hostName[length] = Serial.read(); length = (length+1) % 128; EthernetDHCP.maintain(); delay(1); } hostName[length] = '\0'; if (length > 0) { byte ipAddr[4]; Serial.print("Resolving "); Serial.print(hostName); Serial.println("..."); DNSError err = EthernetDNS.resolveHostName(hostName, ipAddr); if (DNSSuccess == err) { Serial.print("The IP address is "); Serial.print(ip_to_str(ipAddr)); Serial.println("."); } else if (DNSTimedOut == err) { Serial.println("Timed out."); } else if (DNSNotFound == err) { Serial.println("Does not exist."); } else { Serial.print("Failed with error code "); Serial.print((int)err, DEC); Serial.println("."); } } } const char* ip_to_str(const uint8_t* ipAddr) { static char buf[16]; sprintf(buf, "%d.%d.%d.%d\0", ipAddr[0], ipAddr[1], ipAddr[2], ipAddr[3]); return buf; }
これでかなり簡単にインターネットにアクセス出来るようになった。あとは、どんなSketchにするかはあなた次第!
次回は、これを使ってArduinoからSNTPで正確な時間を取得するSketchを紹介するね。