[クーポン配布] LABISTS JP JP製ラズベリーパイ4Bセット品に使用出来る割引クーポンはこのバーをクリック

簡易ドライブレコーダーZeroWにBluetoothボタンでオンオフ編

rpi0cam-btbutton作ってみた!
この記事は約18分で読めます。

これは過去にも扱ったBTボタンである100円ショップで300円で売っている(なんだそれ)AB Shutter3 ボタンを使い、録画の開始やシャットダウンの制御をしたいと思います。

が、どうやらRaspbianBusterになったからか、途中のバージョンアップか分かりませんが、いつものAB Shutter3がペアリングが安定せず、更にイベントを認識できないトラブルに見舞われました。

一応、エラー回避は出来たので、これまで同様にBluetoothボタン導入の手順と、合わせてエラーの回避をまとめてみました。

AB Shutter3を使ったテクニックは1年以上前に流行りましたので、情報が多くて助かりますね。

前回の「ラズパイZeroWで作る簡単アクションカメラ——バイク編」から、ボタンで制御する方法とそのエラー回避をご紹介します。

ほんと、このBluetoothボタンはRaspberry Pi には便利ですな。

追記 ボタンはupとLong Downのような組み合わせで2種類を割り当てます。upとdownの記述を間違えていたので修正しました。

input-utilsを追加しました。

スポンサーリンク

Bluetoothボタンの役割を考える

このBluetoothリモートシャッターは主にダイソー系の100円ショップで取り扱っています。Amazonでも見かけますが、それは少し異なっていて、こちらは300円とお高く感じますけど、すぐに手に入る点でよく活用しています。

ちゃんとした汎用的なBluetoothボタンって高いんですよー。Raspberry Pi とは不釣り合いな価格なので、こういったオモチャ系が助かります。

このBluetoothボタンはボタンが大小で2つありますが、これを区別することがそのままではできません。押し分けるようにプログラムしてあるネタもWEBで見つかりましたが、ここでは単純に1つのボタンだけで進めます。

押し分ける場合はこちらの方のプログラムをコピーしましょう。

※但し、event0とevent1の内、event0の時しか2つのボタンは認識しませんでした。なぜかevent1がペアリングされたので、結局、2つのボタンの使い分けができなかった・・・。
event0が両方のボタンで、event1が小さいAndroidと書いてあるボタンに割り当てられているみたい??

ボタンのイベントは、ボタンを押した時、離した時の二種類で取れ、それと長押しのイベントでも二種類取れますから、全部で4種類が取得できます。

但し、過去にもトライした時、押す時と離す時とを区別するのが難しいため、あくまでタイミングの制御だけになり、実質は2種類になりますね。

そのため、今回は2パターンにします。

ボタンを押したとき録画開始 / 停止
ボタンを長押ししたときシャットダウン
スポンサーリンク

Bluetoothボタンのセットアップ

ここは過去記事を参考にしてください。

このAB Shutter Bluetoothボタンだけでどんだけ書いているんだ?!ってくらい同じ事やってます。

上記のリンクは上から最新となっているので、金魚パイの記事が比較的に分かり易いでしょう。

過去記事も踏まえて、改めて手順を書いていきます。

アップデート&アップグレード

いつものです。

sudo apt update
sudo apt upgrade

Bluetoothの制御にbluebuttonをインストール

Bluetooth関連をインストールします。

3B系、Zero系のRaspbian、またフル版、Lite版という違いで入っていない物が異なります。恐らく、以下でおおよそ大丈夫かと思います。
仮に既にインストール済みと表示されてもそれはインストールしないので構いません。

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

bluetoothボタンを制御するソフトウェアをgemという管理ツールを使ってインストールします。

sudo apt install ruby
sudo gem install bluebutton

ペアリングする

こちらも何度も過去記事に記載していますので参照してください。

手順の流れを記しておきます。(bluetoothctlに入って設定)

sudo bluetoothctl
power on
scan on

[NEW] Device FF:FF:3E:F5:A7:CD AB Shutter3 

Macアドレス(FF:FF:3E:F5:A7)をコピペしておいてから、スキャンを止めます。

scan off

接続する

connect FF:FF:3E:F5:A7:CD

ペアリングする

pair FF:FF:3E:F5:A7:CD

次回ON/OFFでも認識するように信頼させる

trust FF:FF:3E:F5:A7:CD

イベント検知の設定ファイル作成

イベント動作を設定します。bluebuttonというファイルに記述します。

sudo nano ~/.config/bluebutton
#以下を記述
keyup=echo UP
keydown=echo DOWN
longup=echo LONG UP
longdown=echo LONG DOWN

実行してみます。

sudo bluebutton -c ~/.config/bluebutton

ボタンを押されるのを待っている状態になりますので、押してみます。

Try to find device AB Shutter3…
 Device AB Shutter3 find at /dev/input/event1
 Reading events from /dev/input/event1…
 DOWN
 UP
 DOWN
 LONG DOWN
 UP
 LONG UP

これでOKです。

先程のconfigに書いた設定に、シェルスクリプト、Pythonで書いた物を割り当ててあげればOKです。

#以下を記述
keyup=echo UP
keydown=echo DOWN
longup=echo LONG UP && python ~/sg90/sg90.py
longdown=echo LONG DOWN
スポンサーリンク

カメラの撮影開始・停止

前回の「ラズパイZeroWで作る簡単アクションカメラ——バイク編」でにお伝えした通り、撮影させるためのコマンドが以下でした。

raspivid -w 800 -h 600 -t 10000 -o video.h264

単純にこのコマンドをシェルスクリプトにします。

sudo nano recstart.sh

shの中身

#!/bin/bash
raspivid -w 800 -h 600 -t 10000 -o video.h264

簡単に書けばこんな感じでも一応動作します。

10秒なら録画の停止は必要ありませんね。

このshファイルに実行権を与えます。

sudo chmod +x recstart.sh

これをボタンを押した時に実行させるには、keydown=echo DOWNの部分に追加してみましょう。keyup=echo UPにしないと長押しがいつまでも取れないのでUPで!

sudo nano ~/.config/bluebutton
keyup=echo UP && ~/recstart.sh
keydown=echo DOWN
longup=echo LONG UP
longdown=echo LONG DOWN

これでボタンを待ち受けて実行します。

bluebutton -c ~/.config/bluebutton

echo UPの記述も残したままですので、実行した場合、ターミナルには以下のようになって、10秒後に続きが表示されます。

 Try to find device AB Shutter3...
 Device AB Shutter3 find at /dev/input/event1
 Reading events from /dev/input/event1...
 DOWN
 UP

ホームディレクトリに保存されていますので、ターミナルで覗いてみてください。先程、指定したファイル名で保存できていると思います。

スポンサーリンク

シャットダウンは長押しに

シャットダウンは長押しのボタンイベントに割り当てます。

シャットダウンはコマンドで以下のように書きます。

sudo shuttdown -h now

同じようにキーイベントの設定ファイルに追記するためPythonでpyファイルにしてみます。

sudo nano owari.py
#!/usr/bin/python
# coding:utf-8
 import os
 os.system("sudo shutdown -h now")

こちらが有名です。そのまま利用させていただきます。参考:Bluetoothシャットダウンボタンを作る #300円でIoTボタン

実行権限を与えます。

sudo chmod +x owari.py

そして、作ったshファイルを、同じようにキーイベントの設定ファイルに追記します。長押しに当てます。LONG UPでも構いません。

sudo nano ~/.config/bluebutton
keyup=echo UP && ~/recstart.sh
keydown=echo DOWN
longup=echo LONG UP
longdown=echo LONG DOWN && ~/owari.py

これは簡単に記述してみました。「echo UP」のようにこの設定ファイルにそのままコマンドも入れられます。ただ、凝ったプログラムを走らせることができるようにshやpyなどで書いたファイルを当てるほうが良いでしょう。echoくらいならそのままで使えます。

あとは、この録画用のスクリプトやPythonコードを考えて、2種類のボタン押下だけで簡単に使いたいですね。

自動起動に入れておけば、電源を繋いでからBluetoothボタンをオンにして使えます。まぁ、ラズパイをオンにするには充電器にオンオフがあるので、それで入れることになります。

こういった外部からの切っ掛けが作れる状態なら、録画時間やサイズなどをどうするかによりますが、静止画にしたり、使い方が少し広がりますね。

自動起動の方法やPythonやシェルスクリプトについては過去記事を参考にしてください。

スポンサーリンク

Bluetoothボタンと繋がらない? イベントが検知できない?

infoで状態を見てみます。

sudo bluetoothctl

Bluetoothコントロールモードでinfoで確認してみて、以下のようになっている場合は、経験上は恐らくAB Shutter3が故障または不良品です・・・。

[AB Shutter3       ]# info FF:FF:3E:F5:A7:CD
 pi@raspberrypi:~ $ sudo bluetoothctl
 Agent registered
 [AB Shutter3       ]# info
 Device FF:FF:3E:F5:A7:CD (public)
 Name: AB Shutter3       
 Alias: AB Shutter3       
 Paired: no ←ここがno
 Trusted: yes ←ここはyes
 Blocked: no
 Connected: no ←ここがno
 LegacyPairing: no

コントロールモードに入ったら”[AB Shutter3       ]”と接続されているのに、Connectedがnoだし、そもそもPair:noとペアリングが外れています。

これ、全部yesになっていないとおかしくない??

そもそもConnectedしているから”[AB Shutter3       ]#”と表示されているのに矛盾しています。

イベントをチェックする

sudo apt install evtest

AB Shutter3 の電源をオンにして

sudo evtest
 pi@raspberrypi:~ $ 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
 Input driver version is 1.0.1
 Input device ID: bus 0x5 vendor 0x248a product 0x8266 version 0x1
 Input device name: "AB Shutter3        Consumer Control"
 Supported events:
   Event type 0 (EV_SYN)
   Event type 1 (EV_KEY)
     Event code 113 (KEY_MUTE)
     Event code 114 (KEY_VOLUMEDOWN)
     Event code 115 (KEY_VOLUMEUP)
     Event code 116 (KEY_POWER)
   Event type 4 (EV_MSC)
     Event code 4 (MSC_SCAN)
 Properties:
 Testing ... (interrupt to exit)

event numberは0で試してみて、ボタンを押すとイベントが取れているのかメッセージが出ます。

 Event: time 1570687199.572178, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70028
 Event: time 1570687199.572178, type 1 (EV_KEY), code 28 (KEY_ENTER), value 1
 Event: time 1570687199.572178, -------------- SYN_REPORT ------------
 Event: time 1570687199.826413, type 1 (EV_KEY), code 28 (KEY_ENTER), value 2
 Event: time 1570687199.826413, -------------- SYN_REPORT ------------

ここでダメな場合は、電池の交換も考えてください。仮に電池を新品に替えてもダメなら、Bluetoothボタンの不具合と思われます。

その他のツールでデバイスの確認方法

Raspbianなどではinput-utilsツールが分かり易いでしょう。

sudo apt install input-utils

全てのイベントを閲覧するには以下のコマンドです。

sudo lsinput

個別に、event0、event1などを指定すれば入力待ちになるのでボタンを押してみてください。

sudo input-events 1

こちらのinput-utilsの方が簡潔に一覧で読みやすいと思いました。

スポンサーリンク

イベントが取得できない時

イベントが取れない時の対処方法
  • 電池の交換をする
  • ハード(ボタン)の故障なら交換
  • OSのバージョンアップによる不具合

私も2つ購入して1つはダメでした。電池を新品に替えてもイベントだけ取れませんでした。非常に不安定なので途中で気が付くでしょう。ペアリングが出来ても、何かの拍子にペアリングがNOとなり繋がらないことが多々起こりました。

経験上、bluetoothctl で scan on をした時、一発で見つからない症状がありました。

電池やハードを交換してもダメな場合、次の「上手くいかないエラーを解消する」に進んでください。

ペアリングなどやり直す場合のコマンド

bluetoothctl でよく使うコマンド(AB Shutter3 MACアドレスがFF:FF:3E:F5:A7:CDの場合)

untrust FF:FF:3E:F5:A7:CDtrustを辞める
disconnect FF:FF:3E:F5:A7:CD接続を辞める
remove FF:FF:3E:F5:A7:CDデバイスのMACアドレス削除
devices FF:FF:3E:F5:A7:CD接続できるデバイス一覧

順番にuntrust→disconnect→removeとデバイスを削除しからもう一度接続し直したら上手くいく場合もあります。

スポンサーリンク

上手くいかないエラーを解消する

ここもこの記事のキモになります!

上手くいけた場合はこの記事の上の方でスンナリ終わっています。それでも上手くいけた場合は、もしかしたらOSがバージョンアップしたからかも知れません。

かなり時間をかけて調べてみました。(疲れた)

もしかしたら電池が弱いだけではないかもしれません! 何か複合的におかしい気がする。

以下のコマンドで確認してみてください。

 sudo systemctl status bluetooth.service

結果はこんなでは?

10月 10 13:39:25 raspberrypi bluetoothd[340]: Sap driver initialization failed.
10月 10 13:39:25 raspberrypi bluetoothd[340]: sap-server: Operation not permitted (1)
10月 10 13:39:26 raspberrypi bluetoothd[340]: Failed to set privacy: Rejected (0x0b)
10月 10 14:12:04 raspberrypi bluetoothd[340]: No cache for FF:FF:C2:1F:4A:EB

ここ、おかしいですね。でも、active (running)にはなっているのです。

エラー解消その1

sap driverとsap-serverに関しては回避することはできるようです。

sudo nano /lib/systemd/system/bluetooth.service

この中にあるExecStart=/usr/lib/bluetooth/bluetoothdに、オプションの –noplugin=sapを追記します。

https://qiita.com/hidenorly/items/1c7ff9ce41edfa7d3aee
ExecStart=/usr/lib/bluetooth/bluetoothd --noplugin=sap

エラー解消その2

もう一つ、その下の行に以下を追記します。

ExecStartPre=/usr/sbin/rfkill unblock bluetooth

これでもダメな場合は/etc/rc.localにも追記します。

sudo nano /etc/rc.local

以下を追記。

rfkill unblock bluetooth

恐らくこれらの修正でエラーは無くなり、イベントを認識できなかったことが出来るようになっていると思われます。私はこれで認識しました。(電池も替えましたけど)

再びテスト

もう一度試してみましょう。

sudo bluebutton -c ~/.config/bluebutton
pi@raspberrypi:~ $ sudo bluebutton -c ~/.config/bluebutton
 Try to find device AB Shutter3…
 Device AB Shutter3 find at /dev/input/event1
 Reading events from /dev/input/event1…
 DOWN
 UP
 DOWN
 UP
 DOWN
 UP
 DOWN
 UP
 DOWN
 LONG DOWN
 UP
 LONG UP
 DOWN
 LONG DOWN
 UP
 LONG UP

おお! イケた!

これは電池も交換しないとならないのは変わりませんが、もしかしたらOSがバージョンアップした影響も多分にあると感じました。

スポンサーリンク

次回、RPi-Cam-Web-Interfaceでコマ撮りにする

これだけではあまりにも使い勝手が悪いため、ZeroWとスマホを連携させるため、ラズパイ側をホットスポット化し、そこにRPi-Cam-Web-Interfaceを介してスマホから覗いてみようと思います。

ずっと観ながらの撮影というわけではなく、操作するときだけ繋いで、カメラの位置などを確認できるようにしてみたいと思います。

恐らくZero系ですから非力です。動画をとなると転送でコケるでしょう。バイクで移動している時の映像ですから、タイムラプスのように固定で撮れません。トラッキングみたいにコマ撮りにしてみます。

それなら電池も持ちますし、長い時間の移動が要所要所で楽しめるかと思います。

・・・そこにAIが加わって、〇〇の時に撮影するなんてのも出来そうですね。

Raspberry Pi Zero WとカメラモジュールV2を使ったなんちゃってドライブレコーダーZEROを、AB Shutterボタンで撮影制御する方法の手順でした。

また、AB Shutterのエラー(不具合)で悩んでいる人の幾ばくのヒントになればと思います。

つづく

Raspberry Pi カメラモジュール【Raspberry Pi Camera V2】
Raspberry Pi
¥3,590(2019/10/10 16:43時点)
商品の構成 ・Raspberry Pi Camera V2 [913-2664]

コメント