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の動作は確認できたかな?

6 件のコメント:

  1. 大阪 在住のBambusと言います。

    SAKURAボードについて教えて下さい。

    >MACアドレスは適宜変更が必要。
    とありますが、SAKURAボードの場合、MACアドレスは無いようですが、どのように設定するのですか?
    ArduineからSAKURAへの移植でここだけがどうしても分からないのです。

    返信削除
    返信
    1. こんにちは。
      TEthernet.begin(mac)でMACアドレスが設定されます。っていう意味ではないですよね・・・。
      MACアドレスの数値はどうするの?という事ですよね。
      本来、グローバルあるいは一般的なネットワークに接続するには、IEEEにお金を払って上位24bitをメーカの識別コードとして取得し、下位24bitをメーカが製品や連番で任意に世界中で「一意」になるように設定します。(実際には、もうちょっと、ルールが有るかもしれません。→ http://en.wikipedia.org/wiki/MAC_address#Address_details )
      ArduinoのEthernetシールドはメーカがMACアドレスを取得して、そのアドレスをシールで貼ってくれていたかと思いますが、SAKURAはそれが無いと思います。つまり、インターネットや一般的なネットワークにはつないではいけないわけですが、実験用に構成した自分の管理下にあるローカルのネットワーク(他に影響しない)であれば、自分の任意のMACアドレス(そのネットワーク内にあるものと重ならないように)を振ってしまえば、動作します。
      der_Bambusさんの問題の解決にはならないかもしれませんが、よろしくお願い致します。

      削除
    2. いしわたむねおさま

      早々のResありがとうございます。
      >der_Bambusさんの問題の解決にはならないかもしれませんが、>よろしくお願い致します。

      いや、解決に"なり過ぎ"でした。私の質問したMacアドレスは、ご指摘のように「購入時に番号が振られていない」ことです。私もネットで時々話題になる、Arduineを使って遠隔で(スマホから)エアコン制御を作成してみました。ま、問題無く動作しますが、エアコンの赤外線の信号データが巨大で(1信号にint型データが400~500必要)、入/切信号だけでメモリーがパンク!冷房だの除湿だの暖房だのを入れるには、メモリー容量が大きいArduine MEGAに頼らざるを得ない...。その時知ったのが、メモリー十分で5000円しないSAKURAで、これに飛びついたのですが、Macアドレスが分からない??となったのです。
       で結局、いしわたむねおさま が言われるようにSAKURAでは、公のインターネットに繋げない、繋いではいけない と言うことなのでしょうか? 正式にインターネットに繋ぐには、別途ネットワークカード等が必要になるのでしょうか? 分かる範囲で御教授願えるとうれしいです。宜しくお願いします。

      削除
    3. エアコンの制御コード、長いですよね・・・。なんであんな長いんでしょう?テレビとかレコーダのリモコンのほうがボタンとか多いと思うんですが・・・
      さて、MACアドレスの件ですが、インターネットに直接繋がなければ、おそらく問題ないはずです。一般家庭ではおそらくルータを使っているとおもいますので、ルータのLAN側で稼働させる分には、インターネット側から見たMACアドレスはルータのものになっているはずです(たぶん・・・)。マンション等の集合型やケーブルTV等のインターネットではわかりませんが、既にスマホからの遠隔制御を行なっているということは、固定IPかDDNSを使ってルータでポートフォワードしているとおもいますので、大丈夫じゃないでしょうか。「問題ありません。」と断言する知識がないので、すみません、「たぶん」です。

      削除
  2. 期待できそうですね。
    「DDNSを使ってルータでポートフォワードしているとおもいますので」...その通りです。
    確かに、我が家に入ってくれば、192.168....だけで可能と思っていたのですが、全く通信できないので、MACアドレスが原因かと思ったしだいです。他に原因がありそうなので、挑戦してみます。
    うまくできれば、安くいくのですが....。
    ありがとうございました。

    返信削除