先週少しやりかけて途中だった、Arduino UNO に ETHERNET SHIELD 2 をとりつけ、ウェブインターフェイスを作ってこれでLEDをコントロールするという遊びの続きをやる。
こんなふうなインターフェイスでコントロールすることにする。
で、ブレッドボードとArduinoはこんな感じ。「SeeedStudio SIDEKICK BASIC KIT」に入っていた3色LEDを使う。
スケッチはこんな感じで。ウェブ上で同じようなことを公開している方々は、ブラウザの出力を受けるのに、たいてい普通のポインタ文字列を使っておられるのだが、せっかくStringクラスがあるので、それを活用することにした。Stringクラスを使う欠点は多少メモリを浪費することだが、反面、余裕は十分あり、今回は別にメモリが足りないというわけでもないので、そうした。
// // Web2TriColorLED.ino // 27.06.07(日) 1800~ // 佐藤俊夫 // 3色LEDをウェブインターフェイスで制御 // ETHERNET SHIELD 2 使用 // #include <SPI.h> #include <Ethernet2.h> // byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0xF6, 0x74 }; IPAddress ip(192, 168, 1, 129); EthernetServer SERVER(80); EthernetClient CLIENT; int R = 0, G = 0, B = 0; const int LEDR = 3, LEDG = 5, LEDB = 6; // void setup() { Ethernet.begin(mac, ip); SERVER.begin(); pinMode(LEDR, OUTPUT); pinMode(LEDG, OUTPUT); pinMode(LEDB, OUTPUT); } void loop() { char c; String rstr = ""; CLIENT = SERVER.available(); if (CLIENT) { while (CLIENT.connected()) { if (CLIENT.available()) { c = CLIENT.read(); rstr += c; if(rstr.endsWith("\r\n")){ break; } } } if(rstr.indexOf("red=") >= 0){ R = rstr.substring(rstr.indexOf("red=") + 4, rstr.indexOf("&green=")).toInt(); G = rstr.substring(rstr.indexOf("green=") + 6, rstr.indexOf("&blue=")).toInt(); B = rstr.substring(rstr.indexOf("blue=") + 5, rstr.indexOf("&end")).toInt(); } analogWrite(LEDR, R); analogWrite(LEDG, G); analogWrite(LEDB, B); delay(10); rstr = ""; sendform(); // give the web browser time to receive the data delay(1); // close the connection: CLIENT.stop(); } } // void sendform(){ char* formFirstHalf[] = { "<html>", " <head>", " <meta charset=\"utf-8\">", " </head>", " <body>", " <center>", " <h1>Arduino 3色LEDをウェブインターフェイスで</h1>", " <form method='GET'>", " <table>", " <tr>", " <th style='background-color:red; color:white;'>赤</th>", " <th style='background-color:green;color:white;'>緑</th>", " <th style='background-color:blue; color:white;'>青</th>", " </tr>" }; // 14 num. char* formSecondHalf[] = { " </table>", " <input type='hidden' name='end'>", " <input type='submit' value='セット'>", " </form>", " </center>", " </body>", "</html>" }; // 7 num. int i = 0; CLIENT.println("HTTP/1.1 200 OK"); CLIENT.println("Content-Type: text/html"); CLIENT.println("Connection: close"); CLIENT.println(); CLIENT.println("<!DOCTYPE HTML>"); for(i = 0; i < 14; i++){ CLIENT.println(formFirstHalf[i]); } CLIENT.println(" <tr>"); CLIENT.println(" <td>"); CLIENT.println(" <select name='red'>"); for(i = 0; i <= 255; i++){ CLIENT.print(" <option value='"); CLIENT.print(i, DEC); if(i == R){ CLIENT.print("' selected>"); }else{ CLIENT.print("'>"); } CLIENT.print(255 - i, DEC); CLIENT.println("</option>"); } CLIENT.println(" </select>"); CLIENT.println(" </td>"); CLIENT.println(" <td>"); CLIENT.println(" <select name='green'>"); for(i = 0; i <= 255; i++){ CLIENT.print(" <option value='"); CLIENT.print(i, DEC); if(i == G){ CLIENT.print("' selected>"); }else{ CLIENT.print("'>"); } CLIENT.print(255 - i, DEC); CLIENT.println("</option>"); } CLIENT.println(" </select>"); CLIENT.println(" </td>"); CLIENT.println(" <td>"); CLIENT.println(" <select name='blue'>"); for(i = 0; i <= 255; i++){ CLIENT.print(" <option value='"); CLIENT.print(i, DEC); if(i == B){ CLIENT.print("' selected>"); }else{ CLIENT.print("'>"); } CLIENT.print(255 - i, DEC); CLIENT.println("</option>"); } CLIENT.println(" </select>"); CLIENT.println(" </td>"); CLIENT.println(" </tr>"); for(i = 0; i < 7; i++){ CLIENT.println(formSecondHalf[i]); } }
気を付けるところは、私が買った「SeeedStudio SIDEKICK BASIC KIT」というキットに入っている3色LEDは「アノードコモン(共通陽極)」というタイプで、プラスに5V、各色のコントロールはマイナスになる、という点だ。ここを間違えると思ったように動作しない。一番長い脚が共通陽極だ。封入の切り欠きを左にして、左から赤、アノード、緑、青の順に脚が並ぶ。
また、フォームから与える値も、アノードコモンであるゆえに、「0」が最も明るくなり、「255」が最も暗くなるので、インターフェイスを逆にするなど、多少工夫が必要だ。
それから、PWM(パルス幅変調)の機能を大いに活用し、いろいろな色が出せるようにした。この場合の注意点は、ETHERNET SHIELD 2を取り付けると、10番・11番・12番のピンが使えなくなるので、他のピンで出力しなければならないことだ。今回は3番・5番・6番を使った。
で、ウェブインターフェイスをタブレットにロードする。
動かしてみるとこんな感じで、いろんな色になって面白い。
「LEDをネットにつないでコントロール」への2件のフィードバック