PR 記事には広告が含まれています
Translate

屋根裏のネズミに宣戦布告!光る黒猫大作戦

スポンサーリンク

スポンサーリンク

深夜にトコトコ…まさか屋根裏にネズミ!?

深夜のちょっと眠りが浅い時間に、天井からトコトコトコ…って軽い足音がしたんです。

最初は気のせいかと思ったんですけど、翌晩も、その翌晩も。気になってしまって一度音を聞いたらその日は寝れなくなります。

…あー 屋根裏にネズミがいるわ

まだ1匹のようで今のところ実害はないんですが、増えてしまったら困るし、電線をかじられたら火災も怖いです。これは早めになんとかしなきゃ、と思って色々調べ始めました。


スポンサーリンク

ネズミ退治、どれが最強?3つの作戦を検討!

調べてみると、ネズミを追い払う方法は、大きく3つあるみたいです。

  • 臭いで追い払う
  • 音で追い払う
  • 光で追い払う

どれも「なるほど〜」って感じです。さて、どれにしましょうか。

順番に調べていきましょう。


「臭い作戦」を試したら…人間が耐えられず...

ネズミは、天敵である猫の排泄物の臭いにめちゃくちゃ敏感のようです。そのため、猫の尿や糞の臭いがする物を置くといいらしく、「ネズミのみはり番」という商品を買ってみました。

屋根裏に置いておくと、ネズミの嫌がる臭いが広がって、ネズミが来なくなるという仕組みです。

で、実際に蓋を開けてみたら…ものすごく強烈なミントの香りです!これは人間も厳しいやつだ、と思いながらも、とりあえず2階の屋根裏に設置してみた。

…が、しばらくすると1階の洗面所の換気扇の空気の流れに乗って、部屋中に強烈なミントの臭いが染み出してきました。

私は匂いに敏感なため、「家中この臭いになったら、生活できなくなってしまう」と判断し、残念ながら撤収。臭い作戦は設置したその日に敗退となりました。


超音波で追い払え作戦!でも作れなかった...

ネズミは、200Hzから60kHzという広い範囲の音が聞こえるそうです。そこで、人間に聞こえない20kHz以上の超音波を発生させて追い払う、という方法があるようです。

20kHzから60kHzなら、マイコンで簡単に発生させることができます。これならいけるかも!と思って作ろうとしたのですが、20kHz以上の音が出せるスピーカーがなかなか見つかりません。

超音波スピーカーという専用品もあるのですが、40kHzなど特定の周波数しか出せません。調べると、いろんな周波数の音を出した方が効果的らしいので、特定周波数オンリーの超音波スピーカーでは、それを実現することができません。

ということで、音作戦も断念。


これだ!青色LEDで光る猫ちゃんを作ろう

ネズミは夜行性なため光にとても敏感で、特に青色に強い感度を持っているそうです。このため青や青白い光がランダムに点滅すると、嫌がって逃げるようです。

これは…青色LEDとマイコンがあれば作れる!

しかも、せっかくだからただの基板じゃなくて、猫の形の基板にしたら面白いんじゃないでしょうか。ネコが目をピカピカ光らせてネズミを追い払う、番犬ならる番猫です。

ということで、光る黒猫ちゃんを自作することにしました!


スポンサーリンク

光る黒猫ちゃんのカラクリを大解剖!

回路の仕組み

光によるネズミ避け回路図
光によるネズミ避け回路図

マイコンには、こういったシンプルな装置にぴったりな PadaukのPFS154 を使います。消費電力が少なく、電池駆動に最適です。

プログラムの流れはこんな感じです:

  1. 普段はマイコンがスリープ状態でじっと待機
  2. 熱に反応する人体検知センサ SR602 がネズミの動きを検知
  3. センサが割り込みを発生させて、マイコンを起こす
  4. 起きたマイコンが、2つのLED(猫の目)をランダムに点滅させる
  5. しばらくしたら自動でスリープに戻る

ひとつ気をつけておきたいポイントがあります。スリープ中に電池が切れて低電圧リセットが起きると、MOS-FETのゲート電圧が不定になってしまう問題があります。不定になるとMOS-FETがOFFする場合もありますが、ONしてしまうこともあります。ONすることを防ぐために、ゲートに1MΩの抵抗を入れておきます。トランジスタの場合にはまあまあ無くても大丈夫な場合が多いのですが、MOS-FETは基本的に問題になるので、プルダウン抵抗は必須です。


プログラムの仕組み

#include <pdk/device.h>
#include <stdint.h>
#include "auto_sysclock.h"
#include "delay.h"

#define LED1_BIT    0
#define LED2_BIT    4

#define LED1_OFF()     PA &= ~(1 << LED1_BIT)
#define LED1_ON()    PA |= (1 << LED1_BIT)
#define LED2_OFF()     PA &= ~(1 << LED2_BIT)
#define LED2_ON()    PA |= (1 << LED2_BIT)
#define LED_NUM 2

#define PIR1_PIN     5
#define PIR1_STATES() ( PA & (1 << PIR1_PIN) ) != 0
#define PIR2_PIN     6
#define PIR2_STATES() ( PA & (1 << PIR2_PIN) ) != 0
#define PIR_ON 1
#define PIR_OFF 0

#define PIRPWR_BIT    7
#define PIRPWR_OFF()   PA &= ~(1 << PIRPWR_BIT)
#define PIRPWR_ON()    PA |= (1 << PIRPWR_BIT)

#define DELAY_TIME_MS 15
#define ON_TIME_S 9
#define COUNTUP_MAX 40

unsigned short xs = 17;
char rand(){
    xs ^= xs << 7;
    xs ^= xs >> 9;
    xs ^= xs << 8;
    return ( (char)xs )/8;
}

char setCountdown()
{
    char temp = rand();
    temp = temp/4 + 5;
    return temp;
}

void main() {
    MISCLVR = MISCLVR_2V75;
    PDK_USE_FACTORY_IHRCR_16MHZ();
    PDK_USE_FACTORY_BGTR();
    AUTO_INIT_SYSCLOCK();
    CLKMD &= ~CLKMD_ENABLE_WATCHDOG;  // Disenable WDT

    PAC |= (1 << LED1_BIT);          // Set LED pin as output
    PAC |= (1 << LED2_BIT);          // Set LED pin as output
    PAC |= (1 << PIRPWR_BIT);          // Set LED pin as output
  
    PAC &= ~(1 << PIR1_PIN );  //portA Init for PIR Sensor INPUT
    PAC &= ~(1 << PIR2_PIN );  //portA Init for PIR Sensor INPUT
    
    uint8_t pbdierReg = 0;
    pbdierReg |= ( 1 << PIR1_PIN );   //button INPUT
    pbdierReg |= ( 1 << PIR2_PIN );   //button INPUT
    PADIER = pbdierReg; //PBDIERはリードできないので一括で設定する必要がある PBDIER can't read. Need to set one time.

    LED1_OFF();
    LED2_OFF();
    PIRPWR_ON();

    int LEDCountdown[LED_NUM];
    int LEDCountup[LED_NUM];

    if( PIR1_STATES() == PIR_OFF && PIR2_STATES() == PIR_OFF )
    {
        __stopsys();
    }

    while(1)
    {
        for( int i=0 ; i<LED_NUM ; i++)
        {
            LEDCountdown[i] = setCountdown();
            LEDCountup[i] = 0;
        }

        while(1)
        {
            for( int i=0 ; i<LED_NUM ; i++)
            {
                LEDCountdown[i]--;
                if( LEDCountdown[i] <= 0)
                {
                    switch(i){
                        case 0:
                            LED1_ON();
                            break;
                        case 1:
                            LED2_ON();
                            break;
                        default:
                            break;
                    }
                    LEDCountdown[i] = setCountdown();
                    LEDCountup[i]++;
                }
            }

            _delay_ms(DELAY_TIME_MS);
            LED1_OFF();
            LED2_OFF();
            if( LEDCountup[0] > COUNTUP_MAX && LEDCountup[1] > COUNTUP_MAX ) 
            break;
        }

        LED1_OFF();
        LED2_OFF();

        if( PIR1_STATES() == PIR_OFF && PIR2_STATES() == PIR_OFF )
        {
            __stopsys();
        }
    }
}

プログラムのポイントは乱数

rand() という乱数生成関数を使って、LEDがランダムな周期で点滅するようにします。規則的な点滅より、不規則な方がネズミに「なんだこれ、やばい」と感じさせやすいようです。

一定回数(COUNTUP_MAX の値)点滅したら、__stopsys() でスリープに入る仕組みになっています。

あと、電池駆動なので終止電圧の管理も大切です。MISCLVR = MISCLVR_2V75 と書いておくことで、電圧が2.75V以下になったら低電圧リセットがかかって、マイコンが停止しおかしな動作をしなくなります。


基板のデザイン

さて、ここが一番楽しいところです。

猫の形の基板にする、と決めたので、まず猫のイラストを描きます。鉛筆で描きました。このフワフワ感が再現できるでしょうか。

猫の姿をしたネズミ避け基板の設計
猫の姿をしたネズミ避け基板の設計

それをKiCadに読み込みます。猫ちゃんの目の部分に青色LEDを配置して、点滅する目のギミックにします。

3Dビューアで表示させた基板
3Dビューアで表示させた基板

PIRセンサ(人体検知センサ)は、猫の首輪につけた鈴に見立てることにしました。かわいく仕上がるかな?

表も裏も同じデザインになっているので、どちらから見ても黒猫ちゃんが見えるようになっています。


基板をPCBgogoに発注!

基板の製造は PCBgogo に頼みました。

PCBgogoの基板製造パラメータ

PCBgogoの基板製造パラメータ

パラメータの設定はこんな感じです:

  • 基板サイズ・枚数を設定
  • レジストの色は黒(黒猫にしたいので黒)
  • メタルマスクも一緒に注文。枠なし・120mm×120mmにカットしてもらうよう「ご要望」欄に日本語で書いておきます。PCBgogoは完全日本語対応なので、カット指示も日本語でOKなのがありがたいですね。

設定が終わったら「カートに入れる」→ガーバーファイルをアップロード→「確認」でOKです。数十分〜数時間後にデータチェックが完了したら「レジに進む」で支払い。PayPalやクレジットカードが使えます。

ちなみにデータチェックですが、平日は早いですが、休日は少し遅い傾向があるのでご参考まで。


スポンサーリンク

さて!黒猫ちゃんを組み立てていくよ

基板が届いた!想像以上にかわいい

発注から10日ほどで基板とメタルマスクが到着

開けてみたら…鉛筆でデッサンした感じそのままのシルク印刷で、めちゃくちゃかわいいじゃないですか!目は怖いですが...

それだけじゃなくて、製造品質にも感動したポイントがあります。基板の四角い切り抜き部分なのですが、角の処理が丁寧なんです。

普通のルーターカットだと角が丸くなってしまうのですが、PCBgogoはあらかじめ角にドリルで穴を開けてからルーターカットしてくれています。おかげで角がちゃんと直角になってて、ピッタリはまるようになっています。こういう細かい気配りがうれしいですね。


部品を実装していくよ

クリームはんだの印刷

基板とメタルマスクを、マップピンを使って位置合わせして固定します。

クリームはんだには CHIPQUIK TS391LT50 という低融点の鉛フリーはんだを使います。家庭用オーブンでもリフローでき、常温保存できるので扱いやすくておすすめです。

パテベラでクリームはんだを手前に引き寄せながら印刷すると、きれいに塗れます。

部品の実装

ピンセットよりも電動バキュームピックアップツール HAKKO394が使いやすくておすすめです。吸着して、目的の場所にそっと置くだけで実装できます。

猫の目のLEDには、以前のプレゼント企画で読者の方からいただいた青色LEDを使うことにしました。贈っていただいた方ありがとうございます。ありがたく使わせていただきます。


リフロー(はんだ付け)

熱風が庫内を循環するコンベクションオーブンでリフローします。

温度プロファイルはこんな感じです:

90℃ → 120℃ → 140℃ → 165℃

あとは扇風機で冷却すれば表の面の実装が完了です。

裏面も同様に実装するのですが、ここで注意ポイントがあります。裏面をリフローするとき、表面の部品が熱で落ちないように、はんだが溶け始める140℃以下で温度上昇を止めておくのがコツです。

最後に熱赤外線センサ(PIR)をはんだ付けして、基板の組み立て完了!


台座の加工

Etcher Laser Pro というレーザーカッターでMDFから台座を切り出します。

このレーザーカッターはカメラが搭載されているので、どこを切り出すか画像で確認しながら指定できるんです。なので、廃材の空きスペースをうまく使えてとても経済的です。

基板の四角い切り込みに台座を差し込むと、黒猫ちゃんが自立するようになりました。かわいい!


ついに完成!目がピカピカ光る黒猫ちゃん

電池ボックスをつないで完成でーす!

電池は使い古しのエネループ(充電電池)を使うことにします。普通の乾電池の場合、長期使用で電池が切れた後に液漏れしてしまい、電池ボックスが壊れてしまいます。充電電池は液漏れしないのでそこが安心です。新品じゃなくて使い古しを使うのは、コスト節約のため。もうeneloopのロゴの電池は売っていないですよね。いつのだろう。

実際に点灯した様子はこちら↓

目がランダムにピカッ、ピカッと光る。これはネズミじゃなくても嫌ですね。


スポンサーリンク

作戦開始!屋根裏に設置

設置場所はネズミの通り道を狙う

天井裏に上がって、梁や断熱材の上に黒猫ちゃんたちを設置。

今回は4つ作って、ネズミがよく滞在していた場所に集中的に置いてみました。


結果発表!ネズミはいなくなったのか!?

設置して2週間後…

たまにトコトコと足音はするものの、長く滞在することはなくなりました。 しかも黒猫ちゃんを置いたエリアには来ない感じです。効果ありそう!

そして設置から2週間経過し、足音すら聞こえなくなりました

それから1ヶ月、ネズミは現れていません!眠りが深くて気づいていないだけかもしれませんが...

やったー 作戦大成功!

毎晩悩まされていたあのネズミのトコトコ音が、ついに消えました。電線をかじられて火災が発生する危険性も無くなり一安心です。

屋根裏に黒猫ちゃんを住まわせた甲斐がありました。 もし同じ悩みを持っている方がいましたら、黒猫ちゃんを屋根裏に飼ってみてはいかがですか。


今回使ったLEDを実装する際に使ったノズルはこちらから購入できます:

Padauk PFS154の高機能版のPFS123はこちらから購入できます