買ってきたソレノイド

投稿日:

 昨日千石電商で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がついているので、これを光らせて遊ぶ。チカチカでは面白くないから、各色にパルス幅変調をかける。変調は正弦波でかけ、各色の位相をちょっとづつずらしていろんな色にする。



    メール・メーターはこのように作る。

    投稿日:

     さて、一部の変わったユーザ様(ヲイ)のために、Arduinoを使用した未読メールメータの作成方法を書いておきたい。入門キットについてくるサーボを使用する。

     プログラムは次のような簡単なものでよろしい。

     まず、Arduino側には次のように書く。

    //
    //  シリアルからサーボを制御
    //    佐藤俊夫
    //    27.05.02(土) 1028~
    //
    #include <Servo.h>
    //
    Servo meter;
    const int METER_0 = 5;
    const int METER_100 = 175;
    const int METERMIN = 0;
    const int METERMAX = 100;
    const int STRLEN = 10;
    char buf[STRLEN];
    int i = 0;
    //
    void setup() {
      meter.attach(9);
      meter.write(METER_0);
      Serial.begin(9600);
    }
    
    void loop() {
      int v = 0, deg = METER_0;
      if(Serial.available() > 0){  //  もし受信したデータが存在したら
        buf[i] = Serial.read();
        if(i >= STRLEN - 1 || buf[i] == '\n'){
          buf[i] = '\0';
          i = 0;
          Serial.flush();
          //  針をナニする処理
          v = atoi(buf);
          (v > METERMAX) ? v = METERMAX : v;
          (v < METERMIN) ? v = METERMIN : v;
          deg = METER_0 + (int)(v / ((float)METERMAX / (float)(METER_100 - METER_0)));
          meter.write(deg);
    // Serial.println(deg, DEC);
    // Serial.write('\n');
          delay(1000);
        }else{
          i++;
        }
      }    
    }
    
    
    

     テストしてうまく動いたら、次に、POP3サーバにたまっている自分のメールの本数を知る工夫をする。

     私は次のようにした。まず、手近のLinuxマシンにexpectを入れる。

    # yum -y install expect
    (中略)
    

     そうすると、telnetなどでPOP3サーバに自動ログインできる環境が整う。

     シェルでこんなのを書く。まあ、遊びなんでrootで。

    # ls -Fla pop2arduino
    -rwx------ 1 root root 415 2015-05-02 13:58 pop2arduino*
    # cat pop2arduino
    #!/bin/sh
    #  pop2arduino
    #    Sat May  2 12:53:57 JST 2015
    #    Sato Toshio
    #
    expect -c "
    set timeout 5
    spawn telnet pop.hogehoge.ne.jp 110
    expect \"+OK POP3 ready\"
    send \"USER fugafuga@hagefuge.hogehoge.ne.jp\n\"
    expect \"+OK\"
    send \"PASS passpass\n\"
    expect \"+OK server ready\"
    send \"STAT\n\"
    expect -re \"\\\+OK (.+) .+$\"
    send \"QUIT\n\"
    " | egrep "\\+OK ([0-9]+) .+$" | sed -r "s/\\+OK ([0-9]+) .+$/\1/g" >/dev/ttyACM0
    

     で、このシェルは、まあ、なんだっていいんだけど、安直にcronで定期実行する。

    # crontab -e
    (以下crontab内)
    */5  *  *  *  *  /hoge/pop2arduino
    (crontabおわり)
    /etc/rc.d/init.d/crond restart
    (出力略)
    

    ……で、メールが届くのを待っていると、こういうふうに動く。

    IMG_2768