Amazonタイムセール祭りは9/20から開催——クリックして特集記事へ

ラズパイZeroWで作る金魚餌やり機へBluetoothボタン制御を追加

kingyopi-abshutter3-title 作ってみた!
この記事は約8分で読めます。

実際に稼働させている「ラズパイで作った自動餌やり機」のおかげで、時間を気にせず外出できて快適です。こういった実用的な仕組みが簡単に作れるのがラズパイの醍醐味ですね。

はじめてのこの記事をご覧の方は、製作までの記事をご覧ください。

サーボモーターSG90とRaspberry Pi Zero WHで金魚にエサをやる

Raspberry Pi で作った金魚の自動餌やり機をAlexaから声かけでも動作させたい(←失敗)

この仕組みの弱点として、餌の容器の物理的な要因として、餌が少なくなったり、タイミングによってはほとんど餌が出ないということがあります。

一定量を出すのは回転させるだけでは非常に微妙です・・・。

そこで、足りないときも考慮して、任意のタイミングで餌をあげられるよう、外部ボタンからPythonプログラムを動かすオプション機能を付けました。

スポンサーリンク

Bluetoothボタンで餌やり

本当はAlexaに声かけで餌を与えたかったのですが、ちょっとスキルは難しく頓挫しています。

とりあえずボタン制御であげられるように、以前使った100円ショップのBluetoothボタンを活用することにしました。

Bluetoothボタン本体

これなら簡単にボタンを押したトリガーでプログラムを走らせられます。

ただ、何度も押して大量の餌が出ても困るので、そこは制御出来るように考えました。

早速、Bluetoothボタンの下準備をしていきます。

Raspberry Pi とBluetoothボタンの連携

過去の記事、Speaker pHATと連携した「Speaker pHAT 単体で音楽再生+Bluetoothボタン制御」でBluetoothボタンとのペアリング、そしてKeyイベントの制御を「Bluetoothボタンで動作と合成音声の再生」と同じように作業していきます。

ペアリング

前回の記事ではBluetooth関連のライブラリ関連のインストールをしています。恐らく新しいRaspbianでは既にいくつか入っていると思いますが、一応員インストールしておきます。

sudo apt-get install bluez bluetooth libbluetooth-dev build-essential

ボタン制御する「bluebutton」のプログラムだけは必要です。ペアリングする前にインストールしておきましょう。

sudo apt-get install ruby
sudo gem install bluebutton

対話型のBluetoothコントロール設定へ入ります。すべてコマンドです。(SSH経由でもOKです)

sudo bluetoothctl

すると、プロンプトが[bluetooth]$に変わります。次からはそのプロンプトへ入力するコマンドです。

Bluetoothボタンのスイッチをオンにしてからスキャンします。

[bluetooth]$ scan on

ダラダラと検出されてきます。その中で、Shutter3という文字列を発見したら、MACアドレスをコピペしておいてください。

[NEW] Device FF:FF:3F:F6:48:42 AB Shutter3

この場合、MACアドレスは「FF:FF:3F:F6:48:42」ですね。

MACアドレスをコピペしておきます。次からはペアリングさせます。

コネクト=接続して、pair=ペアリングさせ、そしてTrust=信頼させます。

これを順番におこなってください。

connect FF:FF:3F:F6:48:42
pair FF:FF:3F:F6:48:42
trust FF:FF:3F:F6:48:42

コネクトした後はプロプトが[AB Shutter3 ]#へ変わると思いますが正常です。そのまま次のpairを続けてください。

最終的には以下のようになって進んでいればOKです。

[bluetooth]$ connect FF:FF:3F:F6:48:42
[AB Shutter3 ]$ pair FF:FF:3F:F6:48:42
[CHG] Device FF:FF:3F:F6:48:42 Paired: yes
Pairing successful
[AB Shutter3 ]$ trust FF:FF:3F:F6:48:42
[CHG] Device FF:FF:3F:F6:48:42 Trusted: yes
[AB Shutter3 ]$ quit

最後はquitまたはexitで抜けます。

[AB Shutter3       ]# info
 Device FF:FF:3F:F6:48:42 (public)
     Name: AB Shutter3       
     Alias: AB Shutter3       
     Paired: yes
     Trusted: yes
     Blocked: no
     Connected: yes
     LegacyPairing: no
     UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
     UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
     UUID: Device Information        (0000180a-0000-1000-8000-00805f9b34fb)
     UUID: Battery Service           (0000180f-0000-1000-8000-00805f9b34fb)
     UUID: Human Interface Device    (00001812-0000-1000-8000-00805f9b34fb)
     Modalias: usb:v248Ap8266d0001

設定する

bluebuttonの設定ファイルを作成します。

sudo nano ~/.config/bluebutton

中身はキーを押した時の検知とそのボタンを離したときの検知、そしてその長押し版の計4つです。

keyup=echo UP
keydown=echo down
longup=echo LONG UP
longdown=echo LONG DOWN

初期状態(デフォルト)でもターミナルにup、downの文字を表示させるように設定されていますので、まずはこのまま動かしてみましょう。

sudo bluebutton -c ~/.config/bluebutton

ターミナル画面にUPとかdownとか出ればOKです。

実行するPythonプログラムを指定

取りあえずボタン1回だけで餌をやりたいので、間違って押しても良いように長押しに指定します。

longupに指定してみます。長押しして、指を離した時に動作させます。

keyup=echo UP
keydown=echo down
longup=echo LONG UP && python ~/sg90/sg90.py
longdown=echo LONG DOWN

前回までに作ったsg90.pyを起動するようにしました。

動かないと思ったら

  • ペアリングしたのにボタンを押しても何も起きない・・・。
  • 設定をみても合っているのにできない・・・。
  • そもそも接続もペアリングもできない・・・。

ハッキリ言って、AB Shutter3、100円ショップのBluetoothボタンが壊れていることも考えられます。なんせチープですからね。

最初にボタン電池(CR2032)の交換をおすすめします。

ボタンが動作しているのかevtestで確認してみる

evtestというプログラムでボタンを押した時のイベントが拾えているか確認することができます。

sudo apt-get install evtest
sudo evtest

すると、イベントを取る番号を聞かれます。

No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0:    AB Shutter3        Consumer Control
/dev/input/event1:    AB Shutter3        Keyboard
Select the device event number [0-1]: 

この場合だと0ですね。そしてボタンを押すと押したことが取得できているのか確認できます。

イベントを取る番号の選択まで行かない場合は、電池が無いのかも知れません。交換後に試しましょう。

電池も新しく、イベント番号も指定したのに、何も起きない場合は、恐らく本体が壊れています・・・。その個体ごと変更してみることしかありませんね。(私も1つは壊れていました・・・。)

今後

これで長押しすれば餌を任意のタイミングであげることが可能になりました。

何度もあげると金魚さんの健康にも悪いので、Pythonプログラム側に最後にあげた時間から何分以下なら動かさないという処理を付けると良いかも知れません。

ググってみたところ、ファイルのタイムスタンプから判別する方法が簡単そうでした。

import os
import time
 前回時刻(ファイルのタイムスタンプ取得)
 lt = os.path.getmtime('previous_date.csv')
 現時刻
 dt = time.time()
 現時刻 - 前回時刻を比較
 if ( dt - lt ) > 90 * 60 :
     print("xxx")
     os.utime('previous_date.csv', None)   # ファイルのタイムスタンプ更新

参考:https://teratail.com/questions/126369

あとはAlexaに声をかけても餌をあげられるようにスキルの作成をまた調べたいと思います。できたらまたご紹介します。

Twitter、フォーラム、メールで購読
それぞれ更新情報をお伝えしています。
皆様のフォローをお待ちしています!
\ FOLLOW ME /
/ 最新記事をお知らせしています! \
作ってみた!
スポンサーリンク
フォローをお願いします——ラズパイダ
特集ラズパイ4
スポンサーリンク
こちらの記事もよく読まれています♪
ラズパイダ

コメント

最近のフォーラム投稿

Raspberry Piや記事に関することなどコメント欄の代わりにお使いください。