これは過去にも扱った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:CD | trustを辞める |
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のエラー(不具合)で悩んでいる人の幾ばくのヒントになればと思います。