iikagenlabo

興味のあることを良い加減で研究していきます

野良猫フン害対策の決定打、自作猫よけスプリンクラー!!

野良猫の糞尿被害に困っていたので、自作の猫除けスプリンクラーを製作しました。赤外線センサーに反応したら水をまくだけのシンプルな構成です。

 

野良猫または飼い猫の糞尿対策に困っている方は多いかと思います。いちどマーキングされると繰り返されますし、やはり臭いが気になります。

最初は定番のトゲトゲのシート、その後超音波装置も試しましたがすぐに慣れてしまい効果はほとんどありませんでした。

ネットで調べてみると水道のホースをつないでセンサーで感知して勢いよく水を撒くのが見つかります。確かにこれは効きそうですが狭いウチにはちょっと大げさすぎです。

 

自作の猫よけスプリンクラーもいくつか見つかります。水道を電磁弁で制御するものや、マイコンを使ったもの、猫には反応するけど人には反応しないようにしたものなど、結構手が込んでいます。皆さんすごいし効果もありそうですが、これらを参考にもう少しシンプルな構成を考えました。

いちばんのポイントはどうやって水を撒くか。いろいろ方法は考えられますが、ここはシンプルに自動車のウォッシャー用のポンプとノズルを使いました。バラで用意しましたけど車に取り付けるキットがあるのでこちらを使うのが安いし簡単です。

 

 

人感センサーモジュールは電源をつなげばすぐ使えるものがあります。そして電源はウォッシャーポンプにあわせて12Vのアダプターを使います。出力は2.0A以上の物を用意します。1.5Aではポンプが作動しませんでした。

 

AC100Vのコードも自作しましたが、防水の延長コードを使えば良いでしょう。

 

次にセンサーでポンプを動作させる回路です。極力シンプルにセンサーの出力でFETにつないだポンプを動作させるだけのものです。FETはNchの2SK4017を使いました。

回路図

必要な部品はMOSFETの2SK4017、ダイオード1N4007、抵抗10kΩです。電子部品は交通費を考えたら秋月の通販で買うのが安いかと思います。

 

基板に実装したのがこちら。動作確認用にLEDを追加しています。他には配線を接続しやすいように端子台と、赤外線モジュール用にピンヘッダを使っています。

 

全て部品を組付けて完成したのがこちら。100均の容器を2つ使って電気回路部分と水タンクを作りました。屋外なので雨が入らないように防水処理をしておきます。

 

さらにあまっていたコンパネで雨よけ用の箱を作って設置しました。あまり目立たないようにすると警戒されなくて良いと思います。

 

置いた後の様子はこちら。冒頭の動画とともに一定の効果はあるようです。

たしかに置いた場所には近寄らなくなりますが、猫は賢いのでここなら大丈夫というところまでは進入してきます。通路になっているようなところでは、もう1台作って両端に設置すると良さそうです。

ダイソーの300円スピーカーをバスレフに改造

リモートワークのメリットのひとつは、家で音楽をかけながら仕事できるところですね。
しかしノートPCのスピーカーでは満足いく音では鳴ってくれないので、ここはひとつ音がよいという評判のダイソーのスピーカーを使ってみようと思いました。

 

なかなかの人気らしく1店目には置いてなく、2店目で入手。買ったダイソーでも後日行ったらスピーカーはありませんでした。タイミングが良かったのかもしれません。

f:id:iikagenlabo:20200620204443j:plain

 

まずはそのまま聴いてみます。たしかに300円とは思えない音が鳴ります。高音域が硬い感じですが中音域の再現性は良いです。ユニットとエンクロージャが小さいので低音域は期待できませんね。これをバスレフにするとどうなるのか楽しみです。

f:id:iikagenlabo:20200620225127j:plain

 

まずは適当に図を書いて大きさを決めます。コンパクトにしたいですが容積は1リットルは欲しいので下のような寸法にしました。この図は内寸です。実際に切り出すときは板の厚みを足した大きさにします。

 

f:id:iikagenlabo:20200620225435p:plain

 

家に余っていたパイン集成材とMDF材を切り出します。ソーガイドを使った手ノコなので切る回数が多いと疲れます。やはり微妙に大きさがずれましたが、隙間はボンドで埋めれば大丈夫でしょう(^^♪

f:id:iikagenlabo:20200620225901j:plain

 

組み立てながら前面のパイン材をワトコオイルで塗ります。これは木目が活かせてムラなく仕上がるのでお勧めです。色はダークウォルナット。塗料ではないのでダークでもそんなに濃くはなりません。

f:id:iikagenlabo:20200620230122j:plain

 

バスレフポートには消せるボールペン、フリクションの軸を使います。ちょうどいい大きさのパイプが近くで入手できなかったんですよね。フリクションはテーパーがなくて真っ直ぐの軸なのが良いです。
長さは3cmにしました。板の厚みの分短くしても良かったかもしれません。接着剤で止めた後ホットボンドで補強します。

f:id:iikagenlabo:20200620230352j:plain

 

エンクロージャのMDFにはアサヒペンのスーパーメイクアップシートを貼ります。塩ビの薄いシートで、初めて使いましたが思ったよりも悪くない質感でした。塗装するよりこちらの方がおすすめです。

f:id:iikagenlabo:20200620230721j:plain

 

ターミナルをハンダ付けして、中に100均のフェルトを2重に入れて吸音材にします。入れすぎるとあまり響かなくなるので、ここは聴きながら入れる量を調整します。

f:id:iikagenlabo:20200620231031j:plain

 

最後に裏ぶたを接着して完成! コンパクトでなかなか良い感じです。よく見ると合わせ目の精度がいまいちだったりしますが、自分で使うので問題ないです(^^;

f:id:iikagenlabo:20200620231309j:plain

 

ノートPCの横に置くとちょうどいい大きさです。早速鳴らしてみると、元の状態では出ていなかった低音域が自然な感じで鳴るようになりました。再現性も高くあまりボリュームを上げずに近距離で使うには良いバランスです。ただ曲によっては高音域が刺さるように鳴ることもありますが、これは元々のユニットの特性なのでしょう。

バスレフポートは指でふさいでもあんまり変わらないから、効いているのかは微妙ですね(^^; それよりもエンクロージャ全体で響かせている効果の方が大きいです。

f:id:iikagenlabo:20200620231637j:plain

 

ダイソーの300円スピーカーをバスレフに改造してみたところ、自分的には満足のいくものが出来上がりました。

ただ、これでリモートワークもバッチリと思ったところで、完全リモートワークが終わってしまって出番が少なくなってしまったのが残念です。

自作スピーカーは思ったより難しくないですね。自由に設計できるので何本も作る人がいるのもわかる気がします。

M5Stackで指定時刻を過ぎたか調べる

NTPで時刻合わせをしたら、指定時刻になったら何かを処理させたいところですよね。 前回紹介したLocalClockクラスを使えば、checkTime()メソッドで指定時刻になったかどうかが調べられます。

指定時刻になったかどうかを調べるには、一定間隔で時刻を取得して過ぎているかどうかで分かります。 処理自体は簡単ですが、時間表現が関数によってちがい地味にめんどくさかったので紹介します。

まず、時間の差分を求めるにはtime.hにあるdifftime()という関数を使います。 これはtime_tを引数に取り、時間差を秒単位のdouble型で返します。

double difftime(time_t const time1, time_t const time2);

ここで time_t で時間を渡せば良いのですが、getLocalTime()で取得できる時間は struct tm です。 そこでmktime()を使って struct tm から time_t に変換します。

time_t mktime(struct tm* const time);

こうして time_t に変換した時間を使って指定時刻と現在の時刻の差分を取り、経過したかどうかを調べます。 time_t はただの数値で人が直接見ても理解することができません。 通常時間を扱うには struct tm の方が良いですね。

M5Stack NTPで時刻合わせ

f:id:iikagenlabo:20190707150412j:plain

M5Stackは時計にするにはちょうど良い大きさですね。 時刻合わせにNTPサーバーを使う記事も多くあって参考になりました。

「明日の天気」では決まった時刻に天気情報を取ってくるために時刻合わせをしました。 指定時刻になったかどうか調べる関数も一緒にクラスにしたので紹介します。

LocalClock.h

class LocalClock
{
public:
    LocalClock() {}

    //  NTPサーバーで時刻合わせ
    void    configNtpTime();
    //  時刻の初期化
    void    initTime();
    //  時間更新処理
    void    tick();
    //  現在の時刻を取得
    struct tm   getNowTime() const { return now_time; }

    //  指定時刻をまたいだかどうか
    bool checkTime(struct tm time) const;
    //  時刻の差分を求める
    double diffTime(struct tm t0, struct tm t1) const;

private:
    //  NTPサーバー
    const char* ntpServer =  "ntp.jst.mfeed.ad.jp";
    const long  gmtOffset_sec = 9 * 3600;
    const int   daylightOffset_sec = 0;

    struct tm   pre_time;
    struct tm   now_time;
};

LocalClock.cpp

#include <M5Stack.h>
#include <WiFi.h>
#include "time.h"

#include "LocalClock.h"

//  NTPサーバーで時刻合わせ
void LocalClock::configNtpTime()
{
    configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

    //  取得した時間を表示
    struct tm timeinfo;
    getLocalTime(&timeinfo);
    Serial.printf("%02d:%02d:%02d\n", timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
}

//  時刻の初期化
void LocalClock::initTime()
{
    getLocalTime(&now_time);
}

//  時間更新処理
void LocalClock::tick()
{
    //  前回の時刻を保存して、現在の時刻を取得する
    pre_time = now_time;
    getLocalTime(&now_time);
}

//  指定時刻をまたいだかどうか
bool LocalClock::checkTime(struct tm time) const
{
    if((diffTime(now_time, time) >= 0.0) &&
        (diffTime(time, pre_time) >= 0.0))
        return true;

    return false;
}

//  時刻の差分を求める
double LocalClock::diffTime(struct tm t0, struct tm t1) const
{
    //  struct tm をtime_tに変換
    time_t time0 = mktime(&t0);
    time_t time1 = mktime(&t1);

    //  差分を求める time0 - time1
    return difftime(time0, time1);
}
LocalClock local_clock;

などとしてクラスの実体を生成したあと、

local_clock.configNtpTime();
local_clock.initTime();

でNTPで時刻設定して取得します。

あとは、指定時刻をまたいだかどうかをcheckTime()で調べられます。

bool checkTime(struct tm time) const;

これを使って指定時刻に天気情報を取得するようにしています。

M5Stackで自作LEDマトリクスを光らせる(2)

4×4の自作LEDマトリクスを光らせるために配線します。
アノード側とカソード側それぞれ4本ずつの8本の制御線が必要です。
M5Stackに付属のコードが色分けされていてよい感じなのでこれを使います。

LEDマトリクスとM5Stackの配線は次のようにしました。
電流制限抵抗はカソード側につけて、その先をM5Stackにつなぎます。

f:id:iikagenlabo:20190531012145j:plain

ピンのつなぎ方は下の通りです。

A B C D a b c d
5 12 17 16 18 19 23 22

 

次に点灯させるためのスケッチを書きます。
こちらのサイトを参考にさせてもらいました。
https://www.hiramine.com/physicalcomputing/arduino/matrixled.html
ピン番号がちがうだけでほぼそのままですね。
アノード側をLOW、カソード側をHIGHで初期化しておくのがポイントです。 

#include <M5Stack.h>

//  ピン番号の定義
int a_pin[4] = {  5,  2, 17, 16 };
int c_pin[4] = { 18, 19, 23, 22 };

void setup() {
  //  アノード側の初期化
  for(int lp1 = 0; lp1 < 4; lp1++)
  {
    pinMode(a_pin[lp1], OUTPUT);
    digitalWrite(a_pin[lp1], LOW);
  }
  //  カソード側の初期化
  for(int lp1 = 0; lp1 < 4; lp1++)
  {
    pinMode(c_pin[lp1], OUTPUT);
    digitalWrite(c_pin[lp1], HIGH);
  }
}

//  static点灯
void loop() {
  // アノードのループ
  for( int ano = 0; ano < 4; ano++ )
  {
    digitalWrite( a_pin[ano], HIGH );
    // カソードのループ
    for( int cat = 0; cat < 4; cat++ )
    {
      digitalWrite( c_pin[cat], LOW );
      delay(100); //点灯時間
      digitalWrite( c_pin[cat], HIGH );
    }
    digitalWrite( a_pin[ano], LOW );
  }
}

動作テストのために順番に点灯させます。

完成。

M5Stackで自作LEDマトリクスを光らせる

M5Stackで自作LEDマトリクスを光らせてみました。
習作なのでコンパクトに4×4で試します。市販の8×8LEDマトリクスでも良いですが自分で作った方が理解が進みますね。

f:id:iikagenlabo:20190526202556j:plain

まずは点灯させるLEDマトリクスを作ります。
基板は使わずに空中配線にします。

作り方はこちらのサイトを参考にさせてもらいました。

make.kosakalab.com

参考にしたのは5mmのLEDですが、手持ちの3mmのLEDにしました。
MDFに4mm間隔で3mmの穴をあけて治具を作っておきます。

f:id:iikagenlabo:20190526202731j:plain


次に用意したLEDの足を曲げます。
長い方のアノードの足を裏から見て右側に、カソードを同じく下側に曲げます。
このときアノード側の足を高めにして,空中配線したときにカソード側と接触しないようにしておきます。

f:id:iikagenlabo:20190526202834j:plain


同じものを16個用意します。8×8にするなら64個必要なので大変ですね。

f:id:iikagenlabo:20190526202914j:plain


足を2mmくらい重なる長さに切りながら半田付けしていきます。

f:id:iikagenlabo:20190526202958j:plain


完成!

f:id:iikagenlabo:20190526203115j:plain

次は光らせるための配線です。


M5Stack WiFi設定を3つに増やす

M5Stackは小さくて軽いので当然持ち歩きますよね?

でも自宅や外出先でWiFiを毎回設定しなおすのが面倒です。

そこでWiFiの設定を3つまで保存できるように、サンプルのWiFiSettingを改造して、保存されているアクセスポイントに自動でつながるようにしました。

f:id:iikagenlabo:20190510014936j:plain

プログラムを実行するとすでに保存されているWiFiの設定につなぎに行き、3つ順番にトライします。
次からはつながった設定を最初に接続しに行きます。

どの設定にもつながらなかった場合はWebServerが起動して、M5StackにWiFiでつないでブラウザからアクセスポイントの設定ができます。
これもサンプルのWiFiSettingとほとんど同じで、保存する設定番号の選択が増えただけです。

f:id:iikagenlabo:20190510015027p:plainこれで自宅やスマホテザリングなどのアクセスポイントを複数保存でき、再設定なしでWiFiにつなげられるようになりました。

WiFiの設定プログラムはクラス化したので、アプリに組み込むのも簡単だと思います。

ソースコードはこちらからどうぞ。

github.com