‘Arduino’ カテゴリーのアーカイブ

ArduinoとEthernetシールドとDHCPとDNS

以前書いた Arduino DHCP Libraryを使ってみる : blog.loadlimit – digital matter – で使ったライブラリが、最近のIDEで使えなくなったということで、他のライブラリを見つけました。

gkaindl.com → software → arduino ethernet

前述のDHCP Libraryをベースに改良されたもので、機能も拡張されています。

ダウンロード後、解凍して、中身のフォルダをArduinoのlibrariesフォルダにコピーします。

あとはただただソースを書くだけ。

DHCPの更新処理とかを自動でやってくれるmaintain()が便利です。こんな感じのコードになりました。
#if defined(ARDUINO) && ARDUINO > 18
#include <SPI.h>
#endif
#include <Ethernet.h>
#include <EthernetDHCP.h>
#include <EthernetDNS.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

const char* hostName = "sample.com";

void setup()
{
  delay(100);
  Serial.begin(9600);

  EthernetDHCP.begin(mac);
}

void loop()
{
  EthernetDHCP.maintain();
  
  const byte* dnsAddr = EthernetDHCP.dnsIpAddress();
  EthernetDNS.setDNSServer(dnsAddr);
  
  static bool isDnsResolved = false;
  static byte remoteAddr[4];
  
  if (!isDnsResolved) {
    
    DNSError err = EthernetDNS.sendDNSQuery(hostName);
    
    if (DNSSuccess == err) {
      do {
        err = EthernetDNS.pollDNSReply(remoteAddr);
        
        if (DNSTryLater == err) {
          delay(20);
          Serial.print(".");
        }
      } while (DNSTryLater == err);
    }
    
    if (DNSSuccess == err) {
      isDnsResolved = true;
    }
    
  }
  
  if (isDnsResolved) {
    
    Client client(remoteAddr, 80);
    
    Serial.println("connecting...");
    
    if (client.connect()) {
      Serial.println("connected");
      
      client.println("GET / HTTP/1.0");
      client.println();
      
      // 返事が戻ってくるまで待機
      do {
        if (client.available()) {
          char c = client.read();
          // ここで何かする
        }
        if (!client.connected()) {
          Serial.println();
          Serial.println("disconnecting.");
          client.stop();
          break;
        }
      } while (true);
    }
    else {
      Serial.println("connection failed");
      delay(2000);
    }
    
  }
}

DNSの更新は見ていないのでDDNS環境のサーバを長時間監視する場合はそれなりの処理が必要です。

それと、イーサネットシールドがPCに接続していない場合にIPを取れない問題は、新しいバージョンのイーサネットシールドでは修正されていたようです。

スイッチサイエンス/商品詳細 Arduino イーサネットシールド

古いバージョンを使っている人は、下記のサイトに対策が載っていました。自分もコンデンサひとつとダイオードひとつ追加してみたら正常に動作するようになりました。

Arduino Ethernet Shieldのパワーオンリセット: PS3とLinux、電子工作も


Arduino DHCP Libraryを使ってみる

Ethernetシールドを入手したのでDHCPクライアントを試してみたいと思います。

現在のバージョンは0.4。ダウンロードはこちらから。

Arduino DHCP Library: Version 0.4

使い方はVersion 0.1のところに書いてあります。

RFID Lock Prototype: DHCP Library v0.1

ダウンロードしたファイルを展開して、開発環境のディレクトリにあるArduino\hardware\libraries\Ethernetに上書きするだけ。

そのあと、開発環境を起動してメニューからサンプルコードを開けば実験可能。

スイッチサイエンスで購入した場合は基板の裏にMACアドレスのシールが貼ってあるので、スケッチのMACアドレスをそれに書き換えます。

デフォルトではDEADBEEFFEEDってなってます。

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

↓(シールの表記に合わせて変更のこと)

byte mac[] = { 0x00, 0x50, 0xC2, 0xXX, 0xXX, 0xXX };

で、べリファイして転送。

Problem uploading to board. See http://www.arduino.cc/en/Guide/Troubleshooting#upload for suggestions.
avrdude: stk500_getsync(): not in sync: resp=0x00
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51

あ、このArduino Duemilanove、ATMEGA 328だった。

Tool→Board→Arduino Duemilanove w/ ATmega 328を選択して再度実行でOK。

ちなみに転送直後はいいけど、その後何かに組み込んで使おうとする場合は、IP取得するたびにリセットを押さないとダメらしい。シリアルモニタでログを見ると平気なのに、スタンドアローンで使おうとしたら、電源入れてもIP取得しないので困った。