お仕事: 2017年11月アーカイブ

Arduino UNO を基盤に作成したシステムでイノシシ用の箱罠の制御をしたくてあれこれしているんだけど、とりあえず概要としては、

・モーションセンサーで箱罠にイノシシ(何らかの動物)が入ったのを検知
・モーションセンサーを OFF にして、測距センサーを ON
・測距センサーから 60cm の位置(地上から 40cm)に物体を検知したら測距センサー OFF
・モーターを 1秒間回し、罠の扉を閉めるトリガーのワイヤーを引く

という動きをさせたい。
まあ、これだと無限ループに入る可能性があるから、何十秒か測距センサーを稼働させ検知出来なければ、一旦モーションセンサーの監視処理に戻す等の細かい制御は必要なんだけど。

ちなみに、モーションセンサーだけで罠に動物が入ったのはわかるんだから扉閉めればいいでしょ?って考え方もあるだろうが、それだとうり坊とか狐、たぬきなどの小動物でも扉が閉まっちゃうから。
なので、測距センサーで体高を計って、40cm以上の高さがある時だけ扉を閉めるんやね。

じゃあ、モーションセンサーいらんやん。測距だけでええやんって話だけど、測距センサーって無茶電気食うのよ。なので、通常はモーションセンサーで監視をし、何かいれば(モーションセンサーに検知されれば)測距センサーの監視に切り替えるわけ。

ということで、昨夜、こんな仕組みを作ってみた。

20171101_arduino1.JPG

回路図が書けないので、実際の接続図ね。
モーターはまだ接続していない。12V のギヤードモーターって、必要な電流量が 500mA とかなんで、直接 Arduino に接続しても回らんのよ(^^; Arduino からの出力が 20mA なんで、全然足らん(^^;
トランジスタとか使って、高い電流が流れる回路を作ってやらないといけないので、とりあえず昨夜はモーターを動かす代わりに LED を点灯させてみた。

プログラムはこんな感じ。

int sn = 0;
void setup() {
 
     pinMode(8, OUTPUT);      // デジタルピン 8番から測距センサーに 5V 供給
     pinMode(7, OUTPUT);      // デジタルピン 7番からモーションセンサーに 5V 供給
     pinMode(4, OUTPUT);      // デジタルピン 4番からDCモーターに 5V 供給(実際は LED)
     pinMode(2, INPUT);       // デジタルピン 2番にモーションセンサーの検知結果を入力
     Serial.begin(9600) ;     // 9600bpsでシリアル通信のポートを開きます
     digitalWrite(7, HIGH);   // まずは、モーションセンサーを ON
}
void loop() {
     // モーションセンサーのチェック
     if (sn == 0) {
        // 2番ピンを確認(検知情報)
        if (digitalRead(2) == HIGH) {     // 動体検知された!!(2番ピンが HIGH(検知!!))
          sn = 1;  // 次の処理に移行するため、1をセット
          digitalWrite(7, LOW);  // モーションセンサー OFF
          digitalWrite(8, HIGH); // 測距センサーを ON
        }
     }
     // 測距センサーのチェック
     if (sn == 1) {
       int ans ;
       ans = analogRead(0)  ;   // センサーから読込む
 
       // 60cm より近くなったらモーターを 5秒回す
       if (ans >= 110) {
          sn = 2;  // もう何もしない
          digitalWrite(8, LOW); // 測距センサーを OFF
          digitalWrite(4, HIGH);   // モーター ON
          delay(1000) ;            // 1000ms(1秒)時間待ち
          digitalWrite(4, LOW);    // モーター OFF
       }
       
       // 測距は 3秒ごとに行う      
       delay(3000) ;            // 3000ms(3秒)時間待ち
     
     }
}

で、実際に動かしてみたら・・・

20171101_arduino2.JPG

おお、ちゃんと動いたよ。
最終的に、センサーから 60cm以内のところに手をかざすと LED が点灯。

なんで、60cm = 110 なのかは、「赤外線測距センサー(GP2Y0A21YK)を Arduino で試す」あたりを見てちょ。

これで、あとは、

・モーター用の回路を作って LED と交換
・6V 電源(単3電池 x 4)で動くことの確認
・とりあえず、実地テストのためのケース等の作成(モーターにつけるプーリー等も)

ってあたりが残作業。最後のケース作りとかが一番手間がかかりそうやなあ・・・


以前、「赤外線測距センサーを注文し直し(^^;」というエントリーで書いたように、最初に購入した測距センサーでは測距出来る距離が考えている要件に足りなかったので、別のセンサーを改めて購入し直した。

その部品が先週届いたのだが、今日になって、やっと Arduino につないでみることが出来た。測距センサーは SHARP GP2Y0A21YK。測距範囲が 10~80cm のやつ。

接続図(回路図に非ず(^^; 回路図、よくわかんねえ(^^;)はこんな感じ。

20171029_arduino1.JPG

「小さな電源の場合は、電源ピン付近に10uF程度のコンデンサを入れた方が安心」という記事を見たので、「赤外線測距モジュールで物体の距離を測ってみます(1/2)」というページを参考にコンデンサも入れてみた。

んで、センサーから目標物の距離によって、Vo コネクタから出力される電圧が変化するので、それを Arduino のアナログ入力ピンで拾うんだけど、数値はボルト数ではない。
アナログ入力ピンから読んだ値 ÷ 1023 × 5 でボルト数になるみたいだけど、わざわざボルトに直して値の評価をする必要もないし、そもそも、どうも電圧にも個体差があるようだ。

ということで、こういうプログラムを作って、距離によって実際の値がどのように変化するか調べてみた。

/*
 * GP2Y0A21 sensor tester
 */

void setup() {
     pinMode(8, OUTPUT);      // デジタルピン 8番から 5V 供給
     Serial.begin(9600) ;     // 9600bpsでシリアル通信のポートを開きます
     digitalWrite(8, HIGH);   // 電源ON
}
void loop() {
     int ans ;

     ans = analogRead(0)  ;   // センサーから読込む
     Serial.println(ans) ;    // シリアルモニターに表示させる
     delay(5000) ;            // 5000ms(5秒)時間待ち
}

実際にアナログピンで取れた数値はこんな感じ。

10cm
480
477
479

20171029_arduino2.JPG
20cm
271
271
272

30cm
202
204
203

40cm
185
185
186

50cm
176
177
178

60cm
110
110
110

70cm
105
106
106

80cm
96
106
102

目標物を手持ちで計ったんで、若干バラつきがあるけど、まあ、だいたいまとまった数字が出てるね。
数値と距離の関係を XY グラフにした時、線は直線ではなく二次曲線「みたい」に曲がる。だから 10~20cmでは数値が大きく変化するが、70~80cmではあまり変わらない。
この曲線を完璧に計算式で再現するのは相当難しいらしい。それもあって、やはりこのように実際の数字を計ってみるのが一番良いようだ。

このアーカイブについて

このページには、2017年11月以降に書かれたブログ記事のうちお仕事カテゴリに属しているものが含まれています。

前のアーカイブはお仕事: 2017年1月です。

次のアーカイブはお仕事: 2018年2月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら