TCP通信でPCからLED(on Arduino)の点滅を制御する


 はじめに

メディアアート製作のために、複数ArduinoをLANにつないで通信制御をするシステムを組んでいる。

前回はこんな感じでArduinoのイーサネット通信を試した。
物理的な接続を確認できたので、今回は実際にLEDの点滅を試してみたい。

本当はTCPよりUDPを使いたいのだけれど、それはまた次回。

将来的にはtelnetではなく、Max/mspからの一括制御を目指します。

用意したもの

  • Arduino
  • 純正イーサネットシールド2
  • 無線ルータ&LANケーブル

接続は前回の記事を参照のこと。

本記事ではmacからtelnetコマンドを利用した制御を試みる。

手順

  1. Arduino上に文末のサンプルコードを参考にWebサーバを立てる。(前回記事参照)
  2. telnet でArduinoにアクセス
  3. 1/0を送信することで、LEDのオンオフを制御
  4. 1/0以外の文字を送信することでコネクションを切断

ポイント

利用出来るピンについて

イーサネットシールド(旧版)はデジタルpinの11-13を利用しているらしく、digitalWriteの制御対象としては使えない。よって9番ピンをターゲットとして9番ピンとGNDにLEDを設置して動かした。

複数アクセスと擬似マルチスレッド処理

複数PCから1つのArduinoのLEDを同時制御することは(現在の我々の技術力では)できない。クライアントの接続フラグが立っている間whileを回すため、新規の接続は基本的に無視されるコーディングになっている。(文末コードを参照)
Arduino上でマルチスレッド処理するには、たとえばこちらの記事なんかが参考になるかもしれない。

参考:TCPの1/0でLEDの点滅を制御するサンプルコード

サンプルコードのうちEthernet2のWebServerを改変して用いた。
※古いEthernetライブラリではなくではなくEthernet2を利用する必要があるので注意

WebServer-uthacks.ino

void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        if (c=='1')
          digitalWrite(9,HIGH);
        else if (c=='0')
          digitalWrite(9, LOW);
        else if (c=='\n' || c=='\r')
          continue;
        else
          break;

      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
}

これから

ここのページにMax/mspでTCP・UDP通信をするときの具体事例が上がっていたので参考にしたい。