# はじめに
メディアアート製作のために、複数ArduinoをLANにつないで通信制御をするシステムを組んでいる。
前回はこんな感じでArduinoのイーサネット通信を試した。
物理的な接続を確認できたので、今回は実際にLEDの点滅を試してみたい。
本当はTCPよりUDPを使いたいのだけれど、それはまた次回。
将来的にはtelnetではなく、Max/mspからの一括制御を目指します。
用意したもの
- Arduino
- 純正イーサネットシールド2
- 無線ルータ&LANケーブル
接続は前回の記事を参照のこと。
本記事ではmacからtelnetコマンドを利用した制御を試みる。
手順
- Arduino上に文末のサンプルコードを参考にWebサーバを立てる。(前回記事参照)
- telnet でArduinoにアクセス
- 1/0を送信することで、LEDのオンオフを制御
- 1/0以外の文字を送信することでコネクションを切断
#ポイント
利用出来るピンについて
イーサネットシールド(旧版)はデジタルpinの11-13を利用しているらしく、digitalWriteの制御対象としては使えない。よって9番ピンをターゲットとして9番ピンとGNDにLEDを設置して動かした。
複数アクセスと擬似マルチスレッド処理
複数PCから1つのArduinoのLEDを同時制御することは(現在の我々の技術力では)できない。クライアントの接続フラグが立っている間whileを回すため、新規の接続は基本的に無視されるコーディングになっている。(文末コードを参照)
Arduino上でマルチスレッド処理するには、たとえばこちらの記事なんかが参考になるかもしれない。
参考:TCPの1/0でLEDの点滅を制御するサンプルコード
サンプルコードのうちEthernet2のWebServerを改変して用いた。
※古いEthernetライブラリではなくではなくEthernet2を利用する必要があるので注意
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通信をするときの具体事例が上がっていたので参考にしたい。