AC100Vオン・オフモジュールを作る

投稿日:

 先週、秋月電子のオリジナルキット「ソリッドステートリレー」と超音波センサをArduinoにつなぎ、人が近づくと扇風機が回ったり、電気スタンドがついたりする、というのを試した。

 考えてみると、これからもArduinoで家電製品をオン・オフしたい、ということは欲求として出てくると思うので、この部分だけ切り離し、もう少しきちんと組み立てて、使いまわしのきくモジュールを作っておくことにした。

 またしても千石電商へ行き、1000円ばかり、ささやかに部品を買い込む。

IMG_3045

 AC100Vのプラグ、コンセント、モールドスペーサー、端子台、ヒューズホルダ、ピンヘッダ、2ミリピッチの小さい蛇の目基盤、圧着端子などだ。

 電線には圧着端子を取り付け、素子間の接続は端子台経由にして、飽きたらバラせるように工夫する。

IMG_3046

 ケースにゴリゴリ穴をあけ、部品を取り付けて詰め込み、完成だ。

IMG_3047

IMG_3050

 Arduinoから5Vを入れるには、ピンヘッダが取り付けてあるので、メスのピンコネクタで入れてやる。

 電気製品ならなんでも動かせるモジュールになっている。これを使うと、

  •  1000円ほどの単純な扇風機にArduinoをつなぎ、『1/fゆらぎ送風』をさせる
  •  イーサネットシールドをつなぎ、スマホからトースターをオンオフ

 などということが可能になる。……いや、意味があるかないかは別として(笑)。



日々思い通りにはいかぬもの

投稿日:

 帰宅。

 今日は日本ITストラテジスト協会関東支部の月例会があったが、仕事と用事が重なり、行けなかった。今回の月例会のテーマ別ディスカッションもぜひ聞きたいと思っていた内容だったので、残念である。人生、なかなか、こうしたいああしたい、と、思ったようには運ばぬものだ。

 忙中有閑。仕事は朝に引けたから、帰りに秋葉原へ寄り、挨拶がわりにヨドバシのスタインウェイをちょっと弾く。

media-20150621

 いつものショパン3曲弾くなど。

 千石電商と秋月電子で少し買い物をする。2000円ほども使えばたっぷり楽しめる。我ながらなんとささやかなこと。

IMG_3029

 今回買ったもののうちでも、出色の傑作は、このたった250円の小さなキットだろう。

IMG_3030

 これは、TTL5VでAC100Vを扱うためのリレーなのだが、昔のリレーとは違って、機械電磁式ではなく、電子式の無接点で、部品点数も極めて少ない。しかも100Vで25Aも流せる。これは、この方のブログ記事で見て知ったのである。

 それから、もうひとつはこれだろう。Arduinoのシールド基盤に小さなブレッドボードを載せることができるもの。

IMG_3031

 帰宅してみると、先週作った「メールサーバお知らせランプ」、赤い点滅で、100通以上の未読がある。

 電子メールを読み出すと、動画のように緑色の点灯に変わる。

 さて、一週間、誤動作なく動いていた「メールサーバお知らせランプ」だが、さっさと回路をバラしてしまい、次の作品を作ることにする。

 秋葉原で買ってきたものを取り出し、半田鏝を温めて、なにやらごそごそと活動する。

IMG_3038
なにやら組み立てる

IMG_3039

 このちっぽけな基盤がAC100VをTTLで扱うためのキモである。

 これを、Arduinoにつなぐ。先日買った超音波センサを、今日買ったブレッドボードシールドに取り付け、回路はこんな具合にする。

IMG_3043

 スケッチを書く。こんな感じだ。

//
//  superSonic2AC100.ino
//    27.06.21(日) 1500~
//    SatoToshio
//      Arduino + 超音波センサ + ソリッドステートリレーで、
//      人が近接したら扇風機などを回す。
//
const int TRIG = 8, ECHO = 9, SSR = 10;
float ranges[10];
int arrcount = 0;
const float THRESHOLDRNAGE = 100.0;

void setup() {
  Serial.begin(9600);
  pinMode(TRIG,OUTPUT);
  pinMode(ECHO,INPUT);
  pinMode(SSR, OUTPUT);
  digitalWrite(SSR, LOW);
}

void loop() {
  float range = 0.0;
  delay(1000);
  range = ranging();
  ranges[arrcount++] = range;
  if(arrcount >= 9){
    arrcount = 0;
  }
  //  THRESHOLDRANGE以下が何割かを調べる。雑音除去のため。
  int rangecount = 0, i = 0;
  for(i = 0; i <= 9; i++){
    if(ranges[i] < THRESHOLDRNAGE){
      rangecount ++;
    }
  }
Serial.println(range);
Serial.println(rangecount);
  if(rangecount >= 6){
    digitalWrite(SSR, HIGH);
  }else{
    digitalWrite(SSR, LOW);
  }
}

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

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

 で、これで何をするかというと、「人が近づくと部屋のミニ扇風機が回る」というのをやりたかったわけだ。暑いから(笑)。

IMG_3041

 組み付けたプロトはこんな感じだ。100円ショップで買ったアクリルの仕切りグッズにスペーサーで取り付けてある。

IMG_3042

 自分の部屋に入ると、扇風機が回り出し、涼しい。



投稿日:

 Arduinoでいろいろできるようになるには今年の夏ぐらいまでかかるだろうと思っていたが、思いのほか、今日現在でも自分で面白いと思うことができるようになった。

 こうなってみると、夏の休暇には「Raspberry Pi」を買ってみようかという気にもなるではないか。

あー、銭ゲバっぽく

投稿日:

 Arduinoで株価の監視、とかもゲスっぽくていいなあ。……アクチュエータはLEDとかじゃなくってさ、ソレノイドでピンが抜けて、鉄槌みたいなものがドガッ!!って振り下ろされるワケよ。

来週は

投稿日:

 来週は、ピアノとArduinoで何か、面白いことができないものかな。MIDIをどうにかするとか、アナログの音声をどうにかするとか。

メールサーバお知らせランプ

投稿日:

 今朝の着想、「Arduinoのメールサーバお知らせランプ」というのを実際に作った。

 自分のプロバイダのメールサーバを定期的に監視して、メールがたまっていなければ緑、少し多ければ黄、たまりすぎていれば赤、早急に読み出さなければならないようなら赤の点滅、というふうに、ランプで知らせてくれるのである。

 以前作った「未読メールメータ」とは違って、「ETHERNET SHIELD 2」を使って単独でネットにつながるように作ってあり、パソコンを立ち上げたりサーバを上げたりする必要はないので、使い方も単純だ。電源をつなぎ、そのへんにのたくっているカテ5のケーブルを突っ込めば終わりである。

 まず、100円ショップで買ったアクリルの枠にEHTERNET SHIELD 2を取り付けたArduino UNOをねじ止めする。

 LEDは昨日も使ったアノードコモンのものを、大きく見えるよう、これまた100円ショップで買ってきたピンポン玉の中に封入し、クリップでアクリルの枠にとりつける。

 RGBそれぞれのピンをデジタルの3,4,5番につなぎ、アノードに+5Vを加える。それぞれのピンに330Ωの抵抗を付けておくことを忘れてはならない。

組み付けた様子
IMG_3023

 回路図については、描くほどのものではないが、まあ、描けばこうなる。

回路図
mailLampCircuit

 そうすると、メールの量に応じて、こんな具合に光り方が変わる。

メール10通以下は緑
IMG_3019

メールが50通くらいまでは黄
IMG_3021

メールが100通近くなってくると赤、100通を超えると赤点滅
IMG_3022

 写真の彩度が悪いが、実物はもっと鮮やかな色に見える。

 スケッチはこんな感じだ。

//
//  メールの残りによりランプの色を変える。
//    佐藤俊夫
//    27.06.14(日) 1500~
//
#include <SPI.h>
#include <Ethernet2.h>

byte MAC[] = {
  0x90, 0xA2, 0xDA, 0x0F, 0xF6, 0x74
};
IPAddress IP(192, 168, 1, 129);
IPAddress MY_DNS(192, 168, 1, 1);
EthernetClient CLIENT;
const char MAIL_SERVER[] = "pop.hogehoge.ne.jp", USER[] = "USER hoge@pop.hage.ne.jp", PASS[] = "PASS passpass";
unsigned long LAST_CONNECTION_TIME = 0;
const unsigned long CONNECTION_INTERVAL = 300L * 1000L;
int R = 0, G = 0, B = 0;
const int LEDR = 3, LEDG = 4, LEDB = 5;
unsigned long LAST_LED_BLINK_TIME = 0;
boolean LED_BLINK_RED = true;
const int LED_BLINK_INTERVAL = 1000;
int MAIL_NUM = 0;
String RECEIVE_STR = "";

void setup() {
  pinMode(LEDR, OUTPUT);
  pinMode(LEDG, OUTPUT);
  pinMode(LEDB, OUTPUT);
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, HIGH);
  delay(1000);
  Ethernet.begin(MAC, IP, MY_DNS);
}

void loop() {
  if (CLIENT.available()) {
    char c = CLIENT.read();
    RECEIVE_STR += c;
  }
  if (millis() - LAST_CONNECTION_TIME > CONNECTION_INTERVAL) {
    pop3connect();
    if(RECEIVE_STR.indexOf("+OK server ready\r\n+OK ") >= 0){
      RECEIVE_STR = RECEIVE_STR.substring(RECEIVE_STR.indexOf("+OK server ready\r\n+OK ") + 22);
      RECEIVE_STR = RECEIVE_STR.substring(0, RECEIVE_STR.indexOf(" "));
      MAIL_NUM = RECEIVE_STR.toInt();
    }
    RECEIVE_STR = "";
  }
  if(MAIL_NUM <= 10){
    digitalWrite(LEDR, HIGH);
    digitalWrite(LEDG, LOW);
    digitalWrite(LEDB, HIGH);
  }else
  if(MAIL_NUM <= 50){
    digitalWrite(LEDR, LOW);
    digitalWrite(LEDG, LOW);
    digitalWrite(LEDB, HIGH);
  }else
  if(MAIL_NUM <= 100){
    digitalWrite(LEDR, LOW);
    digitalWrite(LEDG, HIGH);
    digitalWrite(LEDB, HIGH);
  }else
  if(MAIL_NUM > 100){
    if(millis() - LAST_LED_BLINK_TIME > LED_BLINK_INTERVAL){
      if(LED_BLINK_RED){
        digitalWrite(LEDR, HIGH);
        digitalWrite(LEDG, HIGH);
        digitalWrite(LEDB, HIGH);
        LED_BLINK_RED = false;
      }else{
        digitalWrite(LEDR, LOW);
        digitalWrite(LEDG, HIGH);
        digitalWrite(LEDB, HIGH);
        LED_BLINK_RED = true;
      }
      LAST_LED_BLINK_TIME = millis();
    }
  }
}
void pop3connect() {
  CLIENT.stop();
  if (CLIENT.connect(MAIL_SERVER, 110)) {
    CLIENT.println(USER);
    delay(1000);
    CLIENT.println(PASS);
    delay(1000);
    CLIENT.println("STAT");
    delay(1000);
    CLIENT.println("QUIT");
    delay(1000);
    CLIENT.println();
    LAST_CONNECTION_TIME = millis();
  }
}


ArduinoでPOP3サーバを監視

投稿日:

 この前作った「未読メールメータ」は、次のような仕組みだった。

  •  ArduinoをLinuxサーバのシリアルに接続
  •  Linuxサーバのcronを使い、定期的にプロバイダのメールサーバを監視
  •  未読メールの数をシリアルに出力
  •  Arduinoにつなげたサーボモータを未読メールの数に応じて駆動

 この時には「ETHERNET SHIELD 2」は持っていなかったので、ネットに接続するためにLinuxサーバを使わざるを得なかった。

 しかし、「ETHERNET SHIELD 2」を使えば、直接POP3サーバにアクセスして、例えば昨日やったLEDの色替えで、未読メールの数を色で表示することなどができそうだ。

  •  0通 緑
  •  ~10通 黄
  •  ~50通 赤
  •  100通~ 赤点滅

……みたいなことをやれば、Arduinoで完結できて、なかなか面白いかもしれない。



老人監視器

投稿日:

 ふと思いついたが、Arduinoにチルトスイッチとか超音波センサを適当にくっつけ、ETHERNET SHIELD 2 と一緒に使えば、最近はやりの、独居老人の管理に使えるのではなかろうか。

 リビングのドアの近くに1日以上人影がなかったら、メールで不仲の息子などに通知、とか。

 SMTPクライアントだって、まあ、単に通知するだけなら、簡単に書けるだろう。

サーボコントロールのWeb汎用化

投稿日:

 今日、Arduino + ETHERNET SHIELD 2 で遊んでいて思ったのだが、同じGETの処理をするなら、

http://hogehoge.hoge/?start=10&hold=5000&release=50

……というような、汎用化したGET引数にすれば面白いかも、と思った。まあ、セキュリティ上よろしくないが。

LEDをネットにつないでコントロール

投稿日:

 先週少しやりかけて途中だった、Arduino UNO に ETHERNET SHIELD 2 をとりつけ、ウェブインターフェイスを作ってこれでLEDをコントロールするという遊びの続きをやる。

 こんなふうなインターフェイスでコントロールすることにする。

名称未設定 1

 で、ブレッドボードとArduinoはこんな感じ。「SeeedStudio SIDEKICK BASIC KIT」に入っていた3色LEDを使う。

IMG_3004

 スケッチはこんな感じで。ウェブ上で同じようなことを公開している方々は、ブラウザの出力を受けるのに、たいてい普通のポインタ文字列を使っておられるのだが、せっかく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番を使った。

 で、ウェブインターフェイスをタブレットにロードする。

IMG_3005

 動かしてみるとこんな感じで、いろんな色になって面白い。