LoginSignup
2
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-11-09

 はじめに

メディアアート製作のために、複数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通信をするときの具体事例が上がっていたので参考にしたい。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4