次に、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

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


 

買ってきたソレノイド

投稿日:

 昨日千石電商で5Vのソレノイドを見つけ、買ってきた。ソレノイドは「引き」の製品が多く、電圧も6Vとか12Vが多い。「5Vで押し」のは珍しいので、650円で高かったのだが、買った。

 何がしたいかと言うと、デジカメのシャッターをソレノイドで押したりしたいのである。

 とりあえず、小さいからそんなに何アンペアも流れるもんじゃないだろ、適当なFETか何かでスイッチしてやればいいんだろ、くらいの考えで、東芝の2SK2232、こちらは130円くらいのモンで、それも一緒に買った。

 家へ帰って千石電商のサイトにあるソレノイドのデータシートを見たが、中国製で、どうも要領を得ない。何アンペア流せまっせ、とか書いてない。

 うーん、計れ、ってかい(笑)。

 適当にテスター当てると、35Ω。E=IR、I=E/R。140ミリアンペア。……って、んなわけあるかい(笑)。

 中国のメーカーのサイトデータシートを見ると、4.5Ω、1.1Aと書いてあるから、多分そうなんだろう。しかし、ソレノイドって、「押しはじめ」と、「押し持続」で、電流が違うように思うんだが、……まあ、いいか。

 一方、買ったFET、2SK2232は、というと、東芝製だからデータシートはちゃんと日本語。

 で、えーっと……ドレイン電流は……


2SK2232定格

 25アンペアと書いてあるから、まあ、余裕でオッケーなんだろ、……多分w。

 ぶっつけで繋いで壊すのもアレだから、まあ、一応回路図とか書いてみてですね……

IMG_2873

 それでまあ、ブレッドボードはこうなりますわな……。

IMG_2874

 で、そうだなあ……。他に給電回路もないから、Arduinoでテスト。まず、コードはこうして、2秒に1回くらい、ソレノイドをビクンビクンさせてみよう、と。

//
//  買ってきたソレノイドをドライブする。
//    佐藤俊夫
//    27.5.24(日) 1044~
//
const int FET = 9;  //  2SK2232をデジタル9番に。

void setup() {
  // put your setup code here, to run once:
  pinMode(FET, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(FET, HIGH);
  delay(1000);
  digitalWrite(FET, LOW);
  delay(1000);
}

 で、コンパイルしてロード、Arduinoにつなぐと、まあ、こういう感じで、……

……調子よくカッチコッチと動く。

 ところが、ここで大問題が(笑)。

 こうやって、ソレノイドをデジカメのシャッターに押し当てると、……

……力不足で、シャッターが押せないのである。ええい、この根性なしソレノイドが!(笑)。

DSC_0130

 次は、電源を変えて、もうちっと力のあるソレノイドで押してみてやろうかい。うーん、デジカメのシャッターの押し強さって、秤かなにかで計るしかないな。うーむ。

千石電商で

投稿日:

 5Vの「押し」のソレノイドがあったから買い。何アンペア流れるかよく確かめてないw。それと、FET、2SK2232。

 あとブレボーのジャンプコード数十本と、Arduinoのイーサネットシールド。

MIDI端子に

投稿日:

 自分のピアノのMIDI OUTにArduinoをつなぎ、次女から取り上げた人形かぬいぐるみにサーボあるいはソレノイドを取り付け踊らせる、などもいいなァ。

PIC16F628とArduino

投稿日:

 割合にシリアスな話なのだが……。

 休暇中にArduinoなどいじっているのは、実は、多少、以前の仕事上の屈託があってのことだ。

 4年ほど前、仕事で「PIC16F628」という石を触ったことがある。これは、新規の仕事ではなく、古いプロジェクトのメンテナンスだった。

 当時すでに古い石だった「PIC16F628」だ。36ピンのパラレルにつなぐROMライタでプログラムを焼く。

 使えるのはPIC16F628独特の、たしか1語長14ビットという変わったアセンブラのみ。

 しかも、いったいどういうマネジメントか、ソースコードが消失していた。ROMイメージからディスアセンブルした不完全なソースを参考に、バイナリを直接直さなければならなかった。

 そのプロジェクトはもう忘れられかけたプロジェクトで、それが立ち上がった頃は華々しくもてはやされ、かかわった人たちは表彰などされたのだが、私が始末を押し付けられた頃にはもう何年も経っており、腐ったプロジェクトに成り果てていた。

 誠意をもってメンテしたが、誠意を持とうが持つまいが、私には何の得もないし、また、組織にとってもなんの得もないという腐った作業だった。ただ、やらなければならないことになっており、しかも、それをやると私が叱られる、という、わけのわからない仕事だった。つまり、「叱られる奴を出さなければならない」という仕事なのだ。

 実は当時、既にArduinoは発売されて普及していた。私もそれを知っていた。もし、その腐ったプロジェクトが新規に始まったもので、最初から私に任されたものだったら、私はPIC16F628などではなく、携帯電話かArduinoを使用しただろう。

 そうできなかったことが、当時本当に悔しかった。

 ArduinoはPIC16F628のような苦労をしなくてよい。C言語ライクにプログラミングでき、倍長実数まで扱え、アナログ入出力ができ、ごく安い値段でイーサネットやBluetoothまで扱える。

 自宅の小机の上で「Lチカ」なんぞ試し、夜、赤いLEDが間遠に明滅するのを眺めると、ほんの数年前のそのことがホロ苦く思い出される。



で、

投稿日:

 まあ、おデコの温度を測ってネットに晒すのはシャレだったが、……。

 脳波は、耳と額の電位差を測って、これをFFTにかければよいのだそうである。

 ……っていうか佐藤よ!何をしようとしている!?お前はどこへ行きたいのだ!!w

ついに俺をネットに接続することに成功した。

投稿日:

IMG_2803 さて、このようにArduinoで遊び、写真のような成果を得た。

 これが、Arduinoを使用して、私・佐藤俊夫をワイヤード(USB経由)でネットに接続し、常時私のおツムの具合をネットに公開するシステムの図である。

notice 全般構成を解説しよう。きわめて簡単だ。

 左側のブレッドボード、その更に左側にわずかに見える緑色の素子がサーミスタである。+5Vを印加、10kΩ抵抗と直列につないで接地し、抵抗とサーミスタの間から出力をとってArduinoのアナログ入力に入れてある。

 まことに疑問の余地もなく、シンプルである。

 Arduino側には、次のようなシンプルなソースが書かれている。

//
//  シリアルに体温を送る。
//    佐藤俊夫
//    27.05.05(火) 1730~
//
const int THERMISTOR = 0;  //  A0
//

void setup() {
  Serial.begin(9600);
}

void loop() {
  float v = 0;
  //
  v = analogRead(THERMISTOR);
  v = -9.663E-5 * v * v + 0.164 * v + 0.197;
  Serial.println(v, DEC);
}

 次に、これを手近のLinuxマシンにつなぐ。

# stty -F /dev/ttyACM0
speed 9600 baud; line = 0;
-brkint -imaxbel

 これでよい。

 あとは、crontabに次のように書き込み、crondを再起動すれば終わりである。

   */5  *   *   *    *   head -n 1 /dev/ttyACM0 | mail -s "Sato's Physical condition." foobar@hogehoge.ne.jp

 無論、上記の「foobar@hogehoge.ne.jp」というメールアドレスは、私のブログへのメール投稿アドレスにほかならず、こうすることによりTwitterとFacebookにパブリサイズ共有されるわけである。

 これで、私こと佐藤が、ついにインターネットに接続された!!



なぜ

投稿日:

 なぜ体温付近の温度をArduinoで検出しようとしているかと言うと、言わずと知れたこと、ふっふっふ、

俺をネットに接続するためだ!

Arduino入門キットのサーミスタ

投稿日:

 先日、Arduino UNOと一緒に買った入門キットは、「seeedstudio SIDEKICK BASIC KIT」と言うもので、千石電商の2階に置いてあったから無造作にヒョイと選んだものだ。

 ブレッドボードにジャンパ各色、小さいサーボ、可変抵抗、抵抗、チルトスイッチ、ダイオード、ボタンやスイッチ、ブザー、LED各種、コンデンサ、Cdsセル、サーミスタなどが詰め合わせになっており、オライリーの「Arduinoをはじめよう第2版」の題材を一通り試せるようになっている。

 まず過不足のないところなのだが、seeedstudioというのは何分中国企業で、日本語のドキュメントが少ない。

 と言っても、部品は簡単なものばかりなので、特にドキュメントなどなくても自分でテスターで計りながら使えばそれでよいのだが、この中の、サーミスタに関する情報が非常に少なく、難渋する。

 サーミスタには写真のように「503」と刻印があるのみで、なんの情報もない。

 ネット上で探すと、一応、seeedstudioのFAQページに、情報があることはある。

  •  そのページ
  •  その中に、中国語のPDFで、こんなシートがある。

     要するに「MF11-503K」という型番で、「503」というのはどうやら、「25℃で50kΩ」とでも言う意味らしい。

     で、電圧発生抵抗を一本入れて、えーっと、どういう計算になるんだっけな、……と初心に帰る。

     抵抗2本、直列に入れた時の一本目の抵抗の電圧はこうだから……


    Scan10001

     自分の指でつまんで温めたりして試したいんで、ターゲット温度を体温前後にする。なので、データシートどおりに抵抗が変化するんなら、こういう感じに電圧は変化する。


    Scan10002

    ……で、Arduinoのアナログ入力は、0V~5Vを0~1024にマッピングするんで、1024/5をこれらにかけて、近似させればいいよね。

     2次式モデルでこうなった。

    v = -9.663E-5 * v * v + 0.164 * v + 0.197;

     結局、サーミスタに直列に10kΩ、サーミスタの下からアナログへ出して、サーボにつなぐ。サーボの針が体温で上がったり下がったりするわけだ。

     コードはこんな感じ。

    //
    //  サーミスタでサーボを制御
    //    佐藤俊夫
    //    27.05.05(火)
    //
    #include <Servo.h>
    //
    const int SERVO = 9;  //  D9(Servo)
    const int THERMISTOR = 0;  //  A0
    const float INMIN = 30;
    const float INMAX  = 40;
    const float OUTMIN = 5.0;
    const float OUTMAX = 175.0;
    //
    Servo meter;
    
    void setup() {
      meter.attach(SERVO);
    }
    
    void loop() {
      int v = 0;
      //
      v = analogRead(THERMISTOR);
      v = -9.663E-5 * v * v + 0.164 * v + 0.197;
      v = map(v, INMIN, INMAX, OUTMIN, OUTMAX);
      v = constrain(v, OUTMIN, OUTMAX);
      meter.write(v);
    }
    
    

     



    3色LEDをパルス幅変調

    投稿日:

     Arduinoの入門キットには3色LEDがついているので、これを光らせて遊ぶ。チカチカでは面白くないから、各色にパルス幅変調をかける。変調は正弦波でかけ、各色の位相をちょっとづつずらしていろんな色にする。