お昼休み。
ご飯食べて事務室に帰ってきたら、事務所の入り口にどでーんと置かれたプラ製段ボールが置いてある。
どうやらコロナ対策としてプラ段で机と机の間に仕切りを立てろとのこと。
工作のやり方は各自に任せるようです。
なぜ今更こんなもの作ろうと思ったか
プラ段をちょうどいい大きさに切って置いて、テープで留めるだけで十分なのですが、私のデスクの周りには少し問題が。
私の隣の席に固定電話機があって、基本この電話には私が出ていました。(左が私です。)
間仕切りを設置したことにより、この電話が遮断されてしまいます。
さらにこの電話、私以外の人も使うので、正面に受話器を取る小窓みたいなものがないと不便なんですね。
最初は蝶番で簡易的にドアを作りましたが、自動ドアにしたら面白いんじゃね?と
思い製作に取り掛かりました。
試作1回目
まずは回路図を簡単に書いてみます。
大体の仕様が掴めたら、段ボールで実験してみます。
ステッピングモータでドアをどうやって動かせばいいのか、最初はリンク機構を作ってみましたが、
このやり方ではトルクが不足して少しドアに抵抗が加わるとステッピングモーターが脱調してしまいます。
この手段ではダメなので、次にラックとベルトを使って動かすように変更しました。
ドアをスライドさせるガイドはホームセンターからコの字アルミバーを買って付けます。
スライドの際、実際はプラ段の抵抗が思ったより多いので、PP板に変更してコーナーを削ったものを使用しました。
人感センサーを張り付けるソケットは、3Dプリンターで製作します。
配線はユニバーサル基板が40x60のものしかなかったので、詰め詰めの配線ではんだ付けしました。
これにA4988のマイクロステップを調整する為に4pスイッチと、回転速度を調整できるように可変抵抗を付けてあります。
※追記:A4988のヒートシンク左にある調整部は電流値の調整コックです。これをプラスドライバーで回して電流値を上げると
ステッピングモーターの保持トルクが増します。
これを最適な値に調整しないとA4988のIC部とモーターがかなり発熱するので気を付けましょう。
今回の自動ドア機構は高い保持トルクを必要としないので、電流値は弱く絞りました。
ステッピングモータードライバは大きい物も売っていますが、マイクロステップ数が調整出来て
ドライバとモーターの発熱の調整がしっかり出来ていればA4988で十分だと思います。
ステッピングモーターにベルトとギアを付けて、一旦試作は完了です。早速会社に持っていって取り付けてみます。
取り付けたものがこちら。(センサー交換後の写真です。ごめんなさい)
左側が手動で開け閉めするドアです。
トラブル
取り付けて半日ほどでトラブルが連発しました。検知範囲が広すぎて傍を通っただけで反応したり、
デスクに付いている私の足などに反応したりと
人感センサーの誤検知が多く発生しました。
また、このプログラムだと一定時間が経過するとドアが閉まる仕組みになっており、
この窓を使って電話する人が、途中でドアが閉まらないよう人感センサーを反応させることに気を取られ
快適に電話が出来ないという不親切なものになってしまいました。
よく考えたら、コンビニに自動ドアの真下で電話して、ドアが閉まらないように注意しながら
センサーが検知するようにうろうろするのって適切ではないですよね。
人感センサーで開閉を行うくらいならスイッチの方がだいぶマシだという結論になり、やりなおしです。
人感センサーを変更
かといってプラ段にタクトスイッチを張り付けるのはあまりにイケてません。
あくまで非接触に拘りたいので、ここはフォトリフレクタに手をかざすとスイッチがONになる仕組みに変更します。
家に転がっているフォトリフレクタモジュールを使い、プログラムもセンサがONになった時だけ開↔閉を切り替えるという単純なものに変更しました。
フォトリフレクタがONになると、アナログピン2に接続されている電圧値が下がり、モーターが駆動してドアが開きます。
変数resistvalは半固定抵抗の値を読み取っています。
これでフォトリフレクタに手をかざすとドアの開閉が出来るようになり、他の人も安心して使ってもらえるものが出来ました。
Arduinoのスケッチは以下のように組みました。
const int STEP = 14;
const int DIR = 15;
const int JINKAN = 2;//フォトリフレクタのピンNo
const int LED = 6;//センサーがONになったら点灯するLEDピンNo
const int RESIST = 1;//半固定抵抗のピンNo
const int MINDELEY = 350;//最小ステップ間隔
int c = 0;
int openclose = 0;
int stepRotate = 2500; //ステッピングモーターが1回転するステップ数
int resistval = 0;//半固定抵抗の取得値
int stepdelay = 0;//計算後のステップ間隔
void setup() {
pinMode(STEP,OUTPUT); // Step
pinMode(DIR,OUTPUT); // Dir
pinMode(LED, OUTPUT);
}
void loop() {
/*
openclose = 0 閉まっている
openclose = 1 開いている
*/
int senserval = analogRead(JINKAN);
Serial.println(senserval);
delay(200);
c++;
Serial.println(c);
if(senserval <= 128){
switch(openclose){
case 0://Allclose
Open();//開ける
c = 0;
break;
case 1://Allopen
Close();//閉める
c = 0;
break;
}
}else if(c > 500){//時間がたっても空きっぱなしだと強制開閉
switch(openclose){
case 1://Allopen
Close();//閉める
c = 0;
break;
}
}
}
void Open(){
resistval = analogRead(RESIST);
stepdelay = (resistval * (MINDELEY / 1023)) + MINDELEY;
Serial.println("High");//開く
stepGo(false,stepRotate,stepdelay);
openclose = 1;//全開
delay(1500);
}
}
void Close(){
resistval = analogRead(RESIST);
stepdelay = (resistval * (MINDELEY / 1023)) + MINDELEY;
Serial.println("Low");//閉じている
stepGo(true,stepRotate,stepdelay);
openclose = 0;//全閉め状態
delay(1500);
}
void stepGo(bool HL,int rev,int stepsecond){
digitalWrite(LED,HIGH);
digitalWrite(DIR,HL);
for(int i = 0; i < rev; i++)
{
digitalWrite(STEP,HIGH);
delayMicroseconds(stepsecond);
digitalWrite(STEP,LOW);
delayMicroseconds(stepsecond);
}
digitalWrite(LED,LOW);
}
まとめ
こういったツールはやっぱりユーザーあってのものなので、使う人が不便を感じたらすぐ修正に取り掛かるのは大事だと思いました(ましてや自分で勝手に作ったものならなおさらです)
今回初めに人感センサーを開閉スイッチに使いましたが、人感センサーは広範囲での人のいる/いないを取得するのに
向いているセンサ―だと感じました。
今回のように局所的な範囲での検知には向いていなかった、ということですね。
あと3Dプリンターがあると工作の幅が200倍くらい広がります。
追記 1ヵ月間稼働させてみて
設置から約1ヵ月間が経ちましたが、特にトラブルもなく動き続けています。
周りの反応は上々で、「バカだなあ」という賛辞の言葉を数多く頂きました。
普段よく使うセンサーやモーターでも新しい発見があったりして個人的には満足しています。