分裂

投稿日:

 Arduinoは内部抗争で分裂しているのだそうな。そういやあ、arduino.orgとarduino.ccの二つがあって、ダウンロードできるIDEのバージョンが微妙に違ったりするので、変だな、と思っていたのである。

 私はと言うと、なんというか、2ちゃんねる用語でいうところの「今北産業」(笑)みたいなことなんで、なにがどうなんだか、さっぱりワカンネェw。

無駄の多い距離計(笑)

投稿日:

 昨日、一定の距離に近づくとカメラのシャッターが切れるという装置を作ったが、ふと思いついて、同じハードウェアで距離計が作れるな、と思った。なぜかというと、無駄にサーボを使っているからだ。

 50センチ以下の距離が測れればいいな、というわけで、サーボの0度から180度まで割り付ける。

 5センチ18度、というわけで、何かスマホいじりをしている次女に

「お~い、智香っ、智香。分度器を貸せ」

と言ったら、

「ん~?分度器?……ナイ。」

とニベもない。中学生のクセして、ないワケあるかいっ!!……と思ったが、ガミガミ言うのも面倒くさい。

 針の長さがだいたい8cmだから、

tan18° = x ÷ 8cm、x = tan18° × 8cm ≒ 2.6cm。

 円周上2.6cm刻みで目盛りをふればよろしい。……って、なにムダな計算しとるんだ俺は。

IMG_2999

 まあよい、それで、動かしてみるとこんなふうになかなか面白い。

 で、まあ、定規をあてて測ると、だいたい合ってる。

IMG_2996

 しかし、デジタルで採れている値を、ムダにアナログに直すという、はっはっは。

 スケッチはこんな具合。

//
//  rangemeter.ino
//    超音波センサで測距して、サーボで作ったメーターで表示する。
//    27.6.7(日) 1015~
//    佐藤俊夫
//
#include <Servo.h>

Servo meter;
const int SERVO = 8;
const int TRIG  = 9;
const int ECHO  = 10;
const int SERVO_MIN = 0;
const int SERVO_MAX = 180;
const float RANGE_MIN = 0.0;
const float RANGE_MAX = 50.0;

void setup() {
  meter.attach(SERVO);
  meter.write(SERVO_MIN);
  pinMode(TRIG,OUTPUT);
  pinMode(ECHO,INPUT);
}

void loop() {
  float range = 0.0;
  delay(1000);
  range = ranging();
  if(range <= RANGE_MAX){
    indication(range);
  }else{
    indication(RANGE_MAX);
  }
}

void indication(float range){
  int deg = 0;
  deg = map(range, RANGE_MIN, RANGE_MAX, SERVO_MIN, SERVO_MAX);
  meter.write(deg);
}

float ranging(){
  float time = 0.0, range = 0.0;

  digitalWrite(TRIG,LOW);
  delayMicroseconds(1);
  digitalWrite(TRIG,HIGH);
  delayMicroseconds(1);
  digitalWrite(TRIG,LOW);
  time = pulseIn(ECHO,HIGH);
  if (time > 0.0) {
    range = (time / 2.0) * 340.0 * 100.0 / 1000000.0;
    return(range);
  }else{
    return(9999.0);
  }
}  



韓国「WIZnet」にて

投稿日:

 先週カメラのシャッターをイーサネット経由で切るのを作ったり、それをバラして雲の写真を撮ったりして面白おかしく遊んでいたら、WIZnetという韓国のメーカーに見つけられ、「よかったらサイト上で紹介しますよ。あと、最新のWiFiシールドとかも案内しますよ」というような感じのコメントがつき、「いやあ、拙いので恥ずかしいんですけど、ともかくご紹介はご自由にどうぞ」みたいな返事をしたら、WIZnetのサイト上で紹介されたでござるの巻。

Shutter control using ethernet shield 2 | WIZnet Museum
http://wiznetmuseum.com/portfolio-items/shutter-control-using-ethernet-shield-2/

 なんか、当ブログ、「オッサンとバイエル、ピアノ等」、ピアノの記事がどんどんどんどん少なくなっている気がするが、まあ、いいや(笑)。

 私は右翼だが、韓国人や韓国と手を結び、仲良くすべきだと思っている変な右翼なので、韓国企業に紹介されたことは、まことに嬉しいことである。

 変な諍いは政治家が勝手にやっているので、そういうのはソッチに任せ、コッチは韓国ドラマをみたり韓国料理を食ったりSAMSUNGの携帯でネットをやったり韓国製チップの採用されたイーサネットシールドを使って面白おかしくやればいいのである。ソレはそれ、コレはこれ。はっはっは。

撮った写真を並べて動画化

投稿日:

 それで、デジカメの電池がなくなるまでベランダ写真をとり、雲の流れる動画にした。

 しかし、今日は良く晴れていて、雲があまりないので、いまいち雲が流れる感じはしないのであった(笑)。

空の写真を撮る。

投稿日:

 昨日Arduinoを使って出来上がった「シャッターを切るやつ」、単純なものに作り直す。

 今度は1分おきに間欠的にシャッターを切るものに変更して、これをベランダに持ち出し、南の空を1分おきに撮影する。

media-20150531

 何をするかと言うと、雲が流れる動画を作りたいのである。

 プログラムはとっても簡単。

//
//  サーボを間欠的に動かしてカメラのシャッターを切る。
//    佐藤俊夫
//    27.5.31(日)1020~
//

#include <Servo.h>

Servo shutter;
const int SERVO = 9;

void setup() {
  shutter.attach(SERVO);
  shutter.write(90);
}

void loop() {
  int i = 0;
  shutter.write(50);
  delay(5000);
  shutter.write(90);
  for(i = 0; i <= 60; i++){
    delay(1000);
  }
}

 こうしてカメラをベランダに放置しておくと、無線SDカードで刻々と写真がタブレットに流し込まれてくるのもいとをかし、である。

Arduinoの参考書は

投稿日:

 Arduinoの参考書は、この本以外は特に必要ないのではないかと思われるほど、本当に手短に、しかも分かり易く、必要なことが述べられてある。



カメラのシャッターをネット経由で切る

投稿日:

 先週、Arduinoを使ってデジカメのシャッターを切る遊びがやりたくて、ソレノイドでやろうとしたら、ソレノイドの力不足でうまくいかなかった。

 よく考えてみたら、最初に買った入門キットの中に小さいサーボがあり、これは力があるからシャッターぐらい押せるだろう、と思って工夫した。

 そうしたら、うまくいった。こんな具合である。



 ネットワーク経由で動くようになっており、そのプログラムは次の通りである。

//
//  WebServerでサーボを動かし、カメラのシャッターを切る。
//    佐藤俊夫
//    27.5.30(土)1300~
//

#include <SPI.h>
#include <Ethernet2.h>
#include <Servo.h>

byte mac[] = {
  0x90, 0xA2, 0xDA, 0x0F, 0xF6, 0x74
};
IPAddress ip(192, 168, 1, 129);
EthernetServer server(80);
Servo shutter;
const int SERVO = 9;

void setup() {
  Ethernet.begin(mac, ip);
  server.begin();
  shutter.attach(SERVO);
  shutter.write(90);
}

void loop() {
  String recvbuf;
  EthernetClient client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        recvbuf += c;
        if (c == '\n' && currentLineIsBlank) {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.println("<head></head>");
          client.println("<body>");
          client.println("<center><h3>Drive solenoid.</h3>");
          client.println("<hr>");
          client.println("<form method=\"POST\">");
          client.println("<input type=\"submit\" value=\"Do!\">");
          client.println("</form>");
          client.println("</center>");
          client.println("</body>");
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
          if(recvbuf.indexOf("POST") == 0){
            shutter.write(50);
            delay(5000);
            shutter.write(90);            
          } 
          recvbuf = "";
        }
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    client.stop();
  }
}

次に、ETHERNET SHIELD 2というやつを…

投稿日:

 次に、昨日FETやソレノイドと一緒に買っておいた「イーサネットシールド」というやつを試す。

 これを買ったのは、簡単なウェブインターフェイスで、例えばフォームのボタンをクリックするとデジカメのシャッターが落ちる、みたいなのをやりたかったからだ。千石電商で3240円だったが、多分、もっと安い互換品などもあるのだろう。

 ともかく、こんな箱に入っている、こういう形のブツである。

IMG_2880

 この方のサイトなどを勝手に参考にさせていただきつつ、いじくってみる。

 Arduinoに取り付けるとこのようになる。

IMG_2881

 で、ArduinoのIDEにサンプルプログラムが入っているから、それをタッチアップして目的を達する。

 注意しなければならないのは、私の買ったのは「ETHERNET SHIELD 2」という最新のもので、ネットで多く紹介されている「ETHERNET SHIELD R3」というものとは違うということだ。

 私の買った「ETHERNET SHIELD 2」は、最新のArduino IDE 1.7.3でないと、サンプルコードなども違い、扱えない。私が使っているIDEは1.6.4なので、アップグレードしなければならない。

 アップグレードしたIDEで、次のように「ファイル」→「スケッチの例」→「Ethernet2」とメニューを操作していくとサンプルコードが出てくる。

webServerSketchExample2

  • AdvancedChatServer
  • BarometricPressureWebServer
  • ChatServer
  • DhcpAddressPrinter
  • DhcpChatServer
  • TelnetClient
  • UdpNtpClient
  • UDPSendReceiveString
  • WebClient
  • WebClientRepeating
  • WebServer

……このように、けっこういろいろなものが入っている。今日は一番下の「WebServer」を選ぶ。

 このソースのMACアドレスとIPアドレスを、先達サイトを参考に現況に合わせて書き換える。MACアドレスはシールドの基板の裏にシールで貼ってある。
 
 出来上がったらそのへんにのたくっているカテ5のモジュラーをえいっとつっこみ、ブラウザにIPアドレスを入れれば、すぐにミニWebサーバとして動き出す。

ArduinoWebServerScreen

 これは、各アナログピンの現在の値を5秒毎にモニタしている。何かセンサをピンにつなげば、即、ネット温度計やネット照度計の出来上がりである。

 さて、次に、コイツで「POST」を受け取る段取りだ。コイツにアクセスして、フォームのボタンを押すと、ソレノイドが動く、という機構を作るためである。

 本当ならクライアントから来る文字列を標準入力で受ける段取りが必要だが、今日は簡略化して、ブラウザがPOSTを投げたら、内容はなんでもいいから、とりあえずソレノイドを動かす、というふうにする。

 そのソースコードはこんな感じだ。

//
//  WebServerでソレノイドを動かす。
//    佐藤俊夫
//    27.5.24(日)1352~
//

#include <SPI.h>
#include <Ethernet2.h>

const int FET = 9;
byte mac[] = {
  0x90, 0xA2, 0xDA, 0x0F, 0xF6, 0x74
};
IPAddress ip(192, 168, 1, 129);
EthernetServer server(80);

void setup() {
  Ethernet.begin(mac, ip);
  server.begin();
  pinMode(FET, OUTPUT);
}

void loop() {
  String recvbuf;
  EthernetClient client = server.available();
  if (client) {
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        recvbuf += c;
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.println("<head></head>");
          client.println("<body>");
          client.println("<center><h3>Drive solenoid.</h3>");
          client.println("<hr>");
          client.println("<form method=\"POST\">");
          client.println("<input type=\"submit\" value=\"Do!\">");
          client.println("</form>");
          client.println("</center>");
          client.println("</body>");
          client.println("</html>");
        if (c == '\n' && currentLineIsBlank) {
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
          if(recvbuf.indexOf("POST") == 0){
            digitalWrite(FET, HIGH);
            delay(2000);
            digitalWrite(FET, LOW);            
          } 
          recvbuf = "";
        }
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
}

 次に、ちょっと仕掛けを作る。本当はカメラのシャッターを切りたいのだが、買ってきたソレノイドの力があんまりなくて、シャッターが切れない。それで、ガラスのコップをソレノイドで叩いて音を出す。

 ソレノイドは、午前中やったように、電流がちょいとばかり多く流れるので、FETでリレーしてやる。

 こんな仕掛けにする。

IMG_2885

 こんなフォームを作り、携帯電話にロードする。「Do!」というボタンをクリックすると、ソレノイドが動く。

form

 で、ガラスのコップにソレノイドの軸を近づけて……。

IMG_2886

 操作するとこんな風になる。