2012年8月5日日曜日

ArduinoとGR-SAKURA Ethernet編1

 シリアルanalogRead, analogWrite の次は、Ethernet について試してみようと思います。Ethernetといっても色々あるので、今回はArduinoとGR-SAKURAを超簡易版Web Serverにするスケッチを試します。Arduinoのサンプルスケッチの中にあるAD値をブラウザで表示できるWeb ServerのサンプルのAD部分を省略した以下のソース(スケッチ)をArduino と GR-SAKURA で動かしてみました。

#define RXDUINO

#ifdef RXDUINO
#include <rxduino.h>
#else
#include <Arduino.h>
#include <SPI.h>
#endif

#include <Ethernet.h>

#ifdef RXDUINO
TEthernet Ethernet;
#endif

// MACアドレスは適宜変更が必要。
byte mac[] = {
    0x90, 0xA2, 0xDA, 0x0D, 0x02, 0x8C};

EthernetServer server(80);

void setup()
{
    // シリアルポートを9600bpsで開始。
    Serial.begin(9600);
    // 受信バッファにデータが入るまで待機。
    while (Serial.available() == 0);        
    Serial.println("Initializing...");
    // 一旦、受信バッファにデータがあれば、
    if (Serial.available() > 0) {
        // 読み込んで、廃棄。
        char c = Serial.read();
    }
    
    // DHCPでネットワークを開始する。
    if (Ethernet.begin(mac) == 0) {
        // DHCPのアドレス取得に失敗。
        Serial.println("Failed get address on DHCP");
        while(1);
    }
    Serial.println("Get IP address from DHCP is success.");
    // サーバーの開始して、取得アドレスを報告。
    server.begin();
    Serial.print("Please access by browser at http://");
    Serial.println(Ethernet.localIP());
}

void loop()
{
    // クライアントの接続リスン。
    EthernetClient client = server.available();
    // サーバに接続されたクライアントがあれば、
    if (client) {
        Serial.println("new client");
        
        boolean currentLineIsBlank = true;
        // クライアントが接続されていれば、
        while (client.connected()) {
#ifdef RXDUINO
            // (Rxduinoでの)Ethernet受信処理実行。
            Ethernet.processPackets();
#endif
            // クライアントから受け取ったデータがあれば、
            if (client.available()) {
                // データを受信してシリアルへ。
                char c = client.read();
                Serial.write(c);
                // EOL(\n)を受け取ったら、
                if (c == '\n' && currentLineIsBlank) {
                    // http レスポンスを送信する。
                    client.println("HTTP/1.1 200 OK");
                    client.println("Content-Type: text/html");
                    client.println("Connection: close");
                    client.println();
                    client.println("<!DOCUTYPE HTML>");
                    client.println("<html>");
                    client.println("Hello!");
                    client.println("</html>");
                    break;
                }
                
                // EOL(\n)を受け取ったら、
                if (c == '\n') {
                    currentLineIsBlank = true;
                }
                // 
                else if (c != '\r') {
                    currentLineIsBlank = false;
                }
            }
        }
        
        delay(1);
        
        client.stop();
        Serial.println("client disconnected");
    }       
}



 Arudiono では、Ethernetを使うためにはEthernet Shieldが必要になりますが、GR-SAKURAやRaxinoは標準でEthernetポートを持っています。


 Arduino + Ethernet Shield では当然ながら動きます。


 GR-SAKURA(Rxduino)ではEthernet受信処理を行うのに"Ethernet.prosessPackets();"という記述が必要なようで、これをいれないとうまく動きませんでした。
 とりあえず、Web Serverの動作は確認できたかな?