Calendar
SunMonTueWedThuFriSat
    123
45678910
11121314151617
18192021222324
252627282930 
<< June 2017 >>
Recommend
New Entries
Archives
Categories
Recent comment
Recent trackback
Profile
Links
Sponsored Links
Mobile
qrcode
Admin
無料ブログ作成サービス JUGEM
Seach this site
2009.12.11 Friday
スポンサーサイト

一定期間更新がないため広告を表示しています

| スポンサードリンク | - | | - | - | pookmark |
2009.08.29 Saturday
LEDのリモートコントロール
高校を卒業してすぐの頃でしょうか。
まだ携帯電話などがこの世に登場する前で、友人と2人でちょっと面白い実験をしたことがあります。
中の人と友人は、近所にある電波塔がたっている山に上り、友人は山を降りて自宅に帰ることになりました。夕暮れか夜だったと思います。それで、10キロほど離れた自宅に帰る途中、電波塔の見える海岸から電波塔に向けて懐中電灯を照らしたらそれが見えるかどうか、というものです。(「猟奇的な彼女」の「キョヌ、あっちの山から叫んでみて」ってのに近い感じもしますが)
結果はどうだったのでしょう?光は見えたでしょうか?

さて、aruduino(アルデュイーノ)のイーサネットシールドがやってきて、それなりに使おうと思いながらも、先達の華々しい活躍に少々消沈して、「何事にも先達はあらまほしきことなり」というのにも例外はあるものだ、などと思っていた中の人ですが、ここはせっかくねぎうぉっちをやっているので、カメラを使ったいいものをと思い、LEDを使って遊んでみました。

LEDシステム こんなの。

構想はこうです。

「ねぎうぉっちをみている人が、画面上のボタンを押すと、ねぎ観察画像内のLEDが光る」

さて、では、まずaruduinoのスケッチから。
短時間で作成を目的にしているので、簡単にスケッチのサンプルのサーバを使ってみました。IDE0017で、exsample->ethernet->webserverでつかわれているものを改造します。

#include <Ethernet.h> //イーサのライブラリ
#include <WString.h>  //文字列を扱うためのライブラリ
#define REDLED 7      //各色のLEDのポート
#define GRNLED 6
#define YLWLED 5

//MACアドレスとIP、ポート
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,1,177 };
Server server(80);
//文字列の宣言
String inString = String(80);

void setup()
{
  //サーバ開始
  Ethernet.begin(mac, ip);
  server.begin();
  //ピンモードを設定
  pinMode(REDLED,OUTPUT);
  pinMode(GRNLED,OUTPUT);
  pinMode(YLWLED,OUTPUT);
}

void loop()
{
  Client client = server.available();
  if (client) {
    //読み込み文字列の初期化
    inString=String("");
    boolean current_line_is_blank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        inString.append(c);   
        //空行だと出力
        if (c == '¥n' && current_line_is_blank) {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

          client.println("<br />");
          client.write(inString);
          client.println("<br />");         
          break;
        }
        if (c == '¥n') {
          //改行の場合は、空フラグをたてて中身をチェック
          current_line_is_blank = true;
          if(inString.contains("GET")){
             //リクエスト行の時、パスから判断
             if(inString.contains("RED_ON")){
               LEDON(0);
             }
             if(inString.contains("GREEN_ON")){
               LEDON(1);
             }
             if(inString.contains("YELLOW_ON")){
               LEDON(2);
             }            
          }
          inString=String("");         
        } else if (c != '¥r') {
          //改行でも復帰でもない時はこの行は空ではない
          current_line_is_blank = false;
        }
      }
    }
    //終了処理(delayがないとブラウザによってはうまく動作しないそうです)
    delay(1);
    client.stop();
  }
}

//LEDの点灯プロシージャ(1で緑、2で黄色、それ以外で赤)
void LEDON(int mode){
   digitalWrite(REDLED,LOW);
   digitalWrite(GRNLED,LOW);
   digitalWrite(YLWLED,LOW);
   if(mode==1){
     digitalWrite(GRNLED,HIGH);
   }else if(mode==2){
     digitalWrite(YLWLED,HIGH);
   }else{
     digitalWrite(REDLED,HIGH);
   }
}


サーバのサンプルはアクセスするとアナログインプットの値を調べてその値を返す、というスケッチですが、値を返すかわりに、LEDを点灯する、といものを作成します。

LEDの点灯スケッチを盛り込みますが、イーサネットシールドは、デジタルIOピンの11,12,13番を使って通信しているそうなので(建築初米工作ゼミ2008さん)、今回は、7,8,9を使います。それぞれに赤・緑・黄色を割り当てます。

さて、ねぎうぉっちのサイトから直接このaruduinoサーバにアクセスするのではなく、いったん間にねぎうぉっちのwebサーバをはさんで、ねぎwebサーバから信号を送るので、ここでは単純にhttpアクセスでLEDのライトが光るようにします。

aruduinoのwebサーバはどんな信号をうけとっているのかというと、HTTP入門さんのサイトによれば、

GET / HTTP/1.1
Accept: image/gif, image/jpeg, */*
Accept-Language: ja
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (Compatible; MSIE 6.0; Windows NT 5.1;)
Host: www.xxx.zzz
Connection: Keep-Alive

みたいなものをやりとりしているそうです。この一番上の行のGETの後の/のところにパスがはいるらいしので、
http://xxx.xxx.xxx/red
とかにアクセスすると、
GET /red HTTP/1.1
というふうになるようです。

そこで、GETが含まれている行があると、その行を検索して、RED_ONがあれば、赤LED、GREEN_ONがあれば緑LED、YELLOW_ONがあれば黄色LEDが点灯するようにしました。

さて、受け取った文字列を操作するのに、aruduinoのキャラクタ変数の配列だけでは難しいので、「aduinoをはじめよう」のテキストにあるように、TextStringというライブラリを使うことにしました。
aruduinoのサイトで検索すると、Stringというのが新しいみたいなので、そっちを使ってみます。

ここでサーバが受信したデータを表示してみようと、たまったinStringを出力すると、エラーがおきることに気が付きました。変だナー。と思ってしらべていると、
printlnでstringを出力するのはNGで、writeだといいみたいです。
このあたり、コーディングの知識がVB止まりな中の人の弱いところかも、です。

さて、スケッチができましたので、アップロードしてテストしてみると、うまくLEDが切り替わることがわかりました。
それで、今度はIPをグローバルなものに変えて、カメラの前に設置します。

設置状況

さて、今度はねぎサーバのコーディングですが、だんだん経過時間も長くなってきたので、新しいボタンをつくらず、コメント欄で操作しては?と思い、コメント欄に「赤」「黄」「緑」がある時は、arduinoサーバにそれぞれのコマンドを置くって色を変えることにしました。
直接リンクすると、ページ全体がそっちのページにいってしまうので、xmlHTTPオブジェクトを使ってhttp://xxx.xxx.xxx/GREEN_ONなどにアクセスさせます。

php部分
 //LED操作
  $ledcom = -1;
 $ledcommand = "";
  if(strpos($memo,"赤")!==false){  $ledcom = 0; }
  if(strpos($memo,"緑")!==false){  $ledcom = 1; }
  if(strpos($memo,"黄")!==false){  $ledcom = 2; }
  if($ledcom>=0){      $ledcommand = "LED(".$ledcom.");"; }

javascript部分
function LED(col){
 xmlhttp = createXMLHttp();
 if (xmlhttp){
  xmlhttp.open('GET','/led.php?col='+col+'&m='+Math.random());
  xmlhttp.send(null);
 }else{ alert("アクセス失敗"); } 
}
 

led.phpは引数からarduinoサーバにリダイレクトされます。
(ああ、ここにこれを書くとリダイレクトで転送先を隠したのがバレバレですが)

これでコメント欄に「赤」とか「緑」とか「黄」とか入ったコメントを書き込むと、LEDの色がかわります。

さて、もう1つ問題が。。。
ねぎうぉっちの画像の切り替えは5分に1回なので、せっかくLEDの色を変えてもそのタイミングまでわからないのではつまらない、と思い、カメラの動体センサをつかって変化があった時は自動で画像を更新するようにしました。もっとも、昼間LEDの光だけでは、どうもセンサーが働かないこともあるようで、実験するなら夜のほうがうまくいくようです。

LEDの切り替えには失敗はないようですが、画像の更新は失敗することもあるので、うまく切り替えが見られない時は別の色で試してみるか、しばらく立って更新画像を見ててください。あと、画像が更新されると同時にサイトにアクセスになるので、ねぎの画像がでないことがあります。その時は、更新ボタンを押してみてください。これもいずれ改善しようと思います。

幻想的な黄色あまり見えない赤定番グリーン

時間帯にもよりますが、黄色は幻想的です。赤はあまりめだちません。
昼間はどのLEDもあまりよくみえません。

さて、ケータイやインターネットの発達した現代では、自分の思いを遠くに伝えることも容易な時代になりましたが、なにかコミュニケーションできた時の快感というものは人間のDNAに埋め込まれたしくみのひとつなのでしょうか?
高校時代に行った懐中電灯の実験も、みごと成功しました。
10キロ近く離れていても、懐中電灯がぴかぴかするのは見ることができたのです。わずか5cm程度の懐中電灯の明かりを10キロ離れても確認できるってことにものすごく感動したことを覚えています。つけたり消したりするのをお互いに繰り返した覚えがあります。

そういう感動をネットで再現できればなーと思っています。


| ねぎうぉっち中の人 | arduino(アルデュイーノ) | 10:19 | comments(0) | trackbacks(0) | pookmark |
2009.12.11 Friday
スポンサーサイト
| スポンサードリンク | - | 10:19 | - | - | pookmark |
Comment









Trackback
URL : http://negiwatch.jugem.jp/trackback/36