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

投稿日:

 さて、一部の変わったユーザ様(ヲイ)のために、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



工作

投稿日:

 一部のマニアックなユーザ様(誰?)(笑)の声にお応えし、もうすこし一生懸命に物品を作ることにする。

 取り出だしましたるは、媒体のチープ化によりどこのご家庭にも余っているCDのケースでござい。

IMG_2752

これをば、プラカッターでごりごり切断するので御座候。

IMG_2753

 そうすしますと、こういう美しいスチロール板が手に入るわけでござるよ。

IMG_2754

 コイツに、細いマジックで寸法を入れる。

IMG_2756

 マジックで入れた線を切り抜く。いろいろな方法がある。金工ドリルの細いやつでたくさん穴をあけて割り抜いたり、「ハンドニブラー」でかじったりするやり方があるが、私の場合、世のプロ電子工作派が「なんてことをするんだ!工具が傷むじゃないか!!」と怒り出すという樹脂加工の邪道!!(笑)、「半田鏝で溶断」という方法をよく使う。

IMG_2758

 線の内側を溶断したら、やすりで削り拡げてきれいな穴にする。

IMG_2760

 次に、ネジ穴をあける。アクリル板と違ってスチロール板はすぐにヒビが入ったりするから、やさしく工作しなければならない。なので、電動工具もよいが、ここは一番、ピンバイスに2ミリの歯を噛んで、ウリウリとやさしく切る。

IMG_2761

最後に、ちょいと大技。このスチロール板を曲げる。凝る向きはニクロム線の曲げ工具などを持っていると思うが、私はめったに樹脂工作をすることはないので、持っていない。そこで、余っているアングルを適当に木の台にネジ止めし、これをガストーチで炙る。

IMG_2763

 で、ほどよく温まったら、これにえいやああ、とスチロール板を当て、曲げる。

IMG_2764

 さて、これで完成。これは何かというと……。

IMG_2765

IMG_2767

 ハイ、サーボモーターの取り付けブラケットですよ。ええ、Arduinoで遊ぶために作ったんです、朝っぱらから(笑)。

よしッ!……次はッ!

投稿日:

 次は、自宅の便器をインターネットに接続するッ!!!

……と考えて荒い鼻息をついたが、1秒でやめた。

 だって、品がないし、変なものを便所に取り付けると妻におこられるもん。

 しかし、ヘルスケアのためには、ちょっとありえるよな。「iToilet」。

  •  温度
  •  重さ・量・密度
  •  色合い
  •  におい
  •  座っていた時間
  •  音量

……これらをツイッターに全自動投稿。甘えるんじゃねえ、パーミッションは恥も外聞もなく、全部パブリック。忍辱の精神なくして健康なしッ!!

 重量センサー、かなあ、ネックは。耐水性で、度重なる洗浄に耐え、コンマ1グラム単位の精密度、傾きに左右されないことも必要だ。

 においセンサーは、まあ、なんとかなるだろ、市場をあされば。



次にまたバカなものを

投稿日:

 これが、メールサーバに残る未読メールの数を表示させるという逸品(笑)のプロトタイプである。

IMG_2749

……我ながらズサンなつくりだなあ。こんなモノをIoTだなどと言っていていいのだろうか。



ポテンショメータをつないで

投稿日:

 次は、ポテンショメータをつないで、アナログ入出力をマスター。

 9番ピンを使用したパルス幅変調もわかったし、ついでに、さっきシリアルへのアクセス方法が分かったから、IDEに式ウォッチ機能がない代わりに、出力をシリアルにタレ流して観測する方法も会得。

IMG_2748

//
// ポテンショメータとLEDのPWM制御
//  佐藤俊夫
//  27.05.01(金)1604~
//
const int LED = 9;
const int POTENTIOMETER = 0;
//
void setup() {
  pinMode(LED, OUTPUT);
  pinMode(POTENTIOMETER, INPUT);
  Serial.begin(9600);
}

void loop() {
  int bright = 0;
  bright = analogRead(POTENTIOMETER) / 4;
  Serial.println(bright, DEC);
  analogWrite(LED, bright);
}



で、それじゃ、IoT風味で

投稿日:

 で、私がやりたかったのはコレなんである。

……つまり、このオモチャを、インターネットにつなぐ。これがやりたかった。

 あとはもう、

「メールが来たら旗があがる」

とか、

「録画が終わったら、人形が手を上げる」

とか、もう、なんぼでもアレンジ可能である。

 チナミに、Linuxだとこういうことをするのに大したことは書かなくてよく、

tail -n 0 -f /var/log/httpd/access_log | grep --line-buffered 'HTTP/1.1\" 200' | sed --unbuffered -e 's/..*/1/' >/dev/ttyACM0

……ぐらいの「ワン・ライナー」で済んでしまう。

 Arduino側のソースコードは、結局最終的には

//
//  シリアルからサーボを制御
//    佐藤俊夫
//    27.05.01(金) 0946~
//
#include <Servo.h>
//
Servo flag;
int incomingByte = 0;
const int FLAGOFF = 5;
const int FLAGON = 90;
//
void setup() {
  flag.attach(9);
  flag.write(FLAGOFF);
  Serial.begin(9600);
}

void loop() {
  if(Serial.available() > 0){  //  もし受信したデータが存在したら
    incomingByte = Serial.read();
    if(incomingByte == '1'){
      flag.write(FLAGON);
    }else if(incomingByte =='0'){
      flag.write(FLAGOFF);
    }
    Serial.flush();
    delay(1000);
  }    
}

……ぐらいの、お気楽な感じのモノになった。



シリアルで制御できたら、次は……

投稿日:

 次も、既にやることは決まっている。

 Arduinoをおもむろに手元のLinuxマシンにつなぐ。で、Linuxへ行って、rootになり、

# dmesg
usb 3-2: new full speed USB device using uhci_hcd and address 2
usb 3-2: configuration #1 chosen from 1 choice
usb 3-2: New USB device found, idVendor=2a03, idProduct=0043
usb 3-2: New USB device strings: Mfr=1, Product=2, SerialNumber=220
usb 3-2: Product: Arduino Uno
usb 3-2: Manufacturer: Arduino Srl
usb 3-2: SerialNumber: 75439333335351303121
cdc_acm 3-2:1.0: ttyACM0: USB ACM device
usbcore: registered new interface driver cdc_acm
drivers/usb/class/cdc-acm.c: v0.25:USB Abstract Control Model driver for USB modems and ISDN adapters

……となってればオッケーだ。

 で、

# ls -Fla /dev/ttyACM0
crw-rw---- 1 root uucp 166, 0 2015-05-01 11:50 /dev/ttyACM0

 よっしゃ、あるある。

 スピードなどはsttyで確かめると良い。

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

 オッケー。

 で、Linuxのコマンドラインから、旗を上げ下げする。

# cat /dev/ttyACM0 &
# echo '1' >/dev/ttyACM0

 おう、旗が上がる。

# echo '0' >/dev/ttyACM0

 ふふっ、旗が下がる。

 ……で、ここまで来たら、もうやりたいことはできたも同然w。



サーボが動かせたら、次は……

投稿日:

 次も、やることは決まっている。サーボが動かせたら、今度はそれをPCにつなぎ、シリアルから制御するのだ!

 ここでは、キャラクタ「’1’」を送信したら旗が立ち、それ以外だったら旗が降りる。

 やり方はカンタンだ。

  1.  サーボをArduinoにつなぐ。教科書通り電源をVinに、黄色をデジタル9番ピンに、茶色をアースに
  2.  プログラムを書く。
    //
    //  シリアルからサーボを制御
    //    佐藤俊夫
    //    27.05.01(金) 0946~
    //
    #include <Servo.h>
    //
    Servo flag;
    int incomingByte = 0;
    const int FLAGOFF = 0;
    const int FLAGON = 90;
    //
    void setup() {
      flag.attach(9);
      flag.write(10);
      Serial.begin(9600);
    }
    
    void loop() {
      if(Serial.available() > 0){  //  もし受信したデータが存在したら
        incomingByte = Serial.read();
        if(incomingByte == '1'){
          flag.write(FLAGON);
          Serial.println(incomingByte, DEC);
        }else{
          flag.write(FLAGOFF);
          Serial.println(incomingByte, DEC);
        }
        Serial.flush();
      }    
    }
    
    
  3.  IDEのシリアルモニタから「1」やその他の文字を入力・送信する。



教科書のコードをいろいろとカスタマイズ

投稿日:

 晩御飯を食べて、引き続きArduinoで遊ぶ。

 教科書の本文には「割り込み処理」が載ってなかったのだが、巻末のリファレンスには割り込みの関数がちゃんとある。

 押ボタンスイッチでトグルする処理は、やはりポーリングではなく、割り込みによらねば面白くない。

 それで、押しボタンを押すたび、LEDの点灯の流れが変わるようなものをこしらえて遊ぶ。

//
//  LED3つを順々に点灯,割り込みがかかると反対向きになる。
//
//    佐藤俊夫
//    27.4.29  1930
//
const boolean FOW = true;
const boolean REV = false;
boolean STATUS = REV;
int LED[] = {13, 12, 11};
int i = 0;
int previ = 2;

void setup() {
  //  LED3つ初期化
  for(int i = 0; i <= 2; i++){
    pinMode(LED[i], OUTPUT);
  }
  //  0番割り込み(2番ピン)で反転
  attachInterrupt(0, switchdirection, RISING);
}

void loop() {
  //  順々点灯
  previ = i;
  if(STATUS == FOW){
    i++;
    if(i > 2){
      i = 0;
    }
  }else{
    i--;
    if(i < 0){
      i = 2;
    }
  }
  digitalWrite(LED[i], HIGH);
  digitalWrite(LED[previ], LOW);
  delay(1000);
}

//  LED点灯方向を反転させる 
void switchdirection(){
  if(STATUS == FOW){
    STATUS = REV;
  }else{
    STATUS = FOW;
  }
}



それでまあ、Lチカで遊ぶ。

投稿日:

 買ってきたガイドブック、オライリーの「Arduinoをはじめよう」に載ってるLチカは1種類だけだが、それでは面白くないのである。LEDの光らせ方しかわからなくっても、並べればこうやってもうちょっと楽しくなるのだ。

……と、いうわけで、さっそく教科書通りにいかず脱線する私。

 そういえば、と思い出す。小学生の頃、理科の実験などあると、私はすぐ何かとアレンジを施したがり、「先生の言ったとおりにしていない」「教科書に載っていないことをしている」として周りの子に言いつけられ、厳しく叱られたものだった。

 いや、そりゃ、化学の薬品なんか使う実験で先生の言ったとおりにしないのは問題があるだろう。だから当時の先生に文句はまったくないが、あの微妙な実験カスタマイズの経験は後年の私に大きく影響を及ぼした。

 8ビットマイコンとBASIC言語全盛の頃、プログラミング雑誌が多くあった。「I/O」や「BASICマガジン」などと言った雑誌にはプログラミングリストが載っており、これを掲載のとおり打ち込めばゲームなどが出来たのであるが、私はこのプログラムリストを機械的に打ち込むのが大嫌いだった。載っている通りには絶対に打ち込まなかったし、しばらくすると、土曜日に本屋で立ち読みでリストを読んで「あらすじ」を覚えて帰り、日曜日に自分のPCで再現する、ということをよくやった。

 単に楽しかったからそうしていただけだが、振り返ると、あれでプログラミング力は大いについたように思う。