[やってみた]300円Bluetoothボタンをラズパイに接続

# [やってみた]300円Bluetoothボタンをラズパイに接続

## 目的・背景

本件は、もう数年前に試したことを今になって改めて手順を確認してみようと思い、
再チャレンジしたものです。

当時、100均で売っている300円シリーズのBluetoothボタンをラズパイに認識させ
いろいろやってみようという記事を見てチャレンジ。
一眼レフのシャッターを切る、音声認識の処理を開始する等、いろいろなチャレンジと
組み合わせる入口になった検証です。

## 目標

当時を懐かしみBluetoothボタンを認識させる。
新たにPython3でも利用可能にする。

## 参考サイト

## 環境・機器
- Raspberry Pi 3B  

```
$ cat /etc/issue
Raspbian GNU/Linux 9 \n \l

$ uname -a
Linux raspberrypi 4.19.66-v7+ #1253 SMP Thu Aug 15 11:49:46 BST 2019 armv7l GNU/Linux
```

- Bluetoothボタン  
後の手順で判明しますが、製品名は「AB Shutter3」のようです。  
(数年前に購入したが未だに電池残量がありました)  
![名称未設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589067/99152fee-bb04-b697-db63-3f5d421e7a96.jpeg)


## 手順

* インストール

```
Bluetooth関連パッケージのインストール
$ sudo apt install bluetooth

bluebuttonをインストールするのにgemを使うのでrubyをインストール
$ sudo apt install ruby

bluebuttonをインストール
$ sudo gem install bluebutton
```

* Bluetoothデバイスの検出  

```
$ sudo bluetoothctl
：
[NEW] Device 01:10:10:26:C4:B8 AB Shutter3
：
```

* ペアリング  

```
[bluetooth]# pair 01:10:10:26:C4:B8
Attempting to pair with 01:10:10:26:C4:B8
Pairing successful
```

* 信頼済みリストへ追加  

```
[bluetooth]# trust 01:10:10:26:C4:B8
[CHG] Device 01:10:10:26:C4:B8 Trusted: yes
Changing 01:10:10:26:C4:B8 trust succeeded

[bluetooth]# quit
```

## 動作確認  

ボタン動作検出時の設定ファイルを作成  

```
$ vi ~/.config/bluebutton

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

bluebuttonを実行 
-dでデバイス名、-cで設定ファイル名を指定
ボタン操作に応じて「DOWN」「UP」が表示される  

```
$ sudo bluebutton -d="AB Shutter3" -c ~/.config/bluebutton

Try to find device AB Shutter3...
Device AB Shutter3 find at /dev/input/event0
Unable to connect to X server
Reading events from /dev/input/event0...
DOWN
UP
DOWN
UP
DOWN
LONG DOWN
UP
LONG UP
```

## 動作確認(python3)

githubに公開されているpython3に対応した「AbShutter」をダウンロード  

```
$ git clone https://github.com/ytani01/AbShutter.git
```

「evdev-test1.py」を実行

```
$ cd AbShutter
$ python3 evdev-test1.py

devs: ['/dev/input/event0']
input_dev: device /dev/input/event0, name "AB Shutter3", phys "b8:27:eb:19:96:c0"
Push buttons.. ([Ctrl]-C to end)

(大ボタンON/OFF)
event at 1595484476.670751, code 04, type 04, val 786665
event at 1595484476.670751, code 115, type 01, val 01
event at 1595484476.670751, code 00, type 00, val 00
event at 1595484476.730703, code 04, type 04, val 786665
event at 1595484476.730703, code 115, type 01, val 00
event at 1595484476.730703, code 00, type 00, val 00

(大ボタン長押しON/OFF)
event at 1595484557.160798, code 04, type 04, val 786665
event at 1595484557.160798, code 115, type 01, val 01
event at 1595484557.160798, code 00, type 00, val 00
event at 1595484557.415881, code 115, type 01, val 02
event at 1595484557.415881, code 00, type 00, val 01
event at 1595484557.465889, code 115, type 01, val 02
event at 1595484557.465889, code 00, type 00, val 01
event at 1595484557.515882, code 115, type 01, val 02
event at 1595484557.515882, code 00, type 00, val 01
event at 1595484557.565892, code 115, type 01, val 02
event at 1595484557.565892, code 00, type 00, val 01
event at 1595484557.615890, code 115, type 01, val 02
event at 1595484557.615890, code 00, type 00, val 01
event at 1595484557.665889, code 115, type 01, val 02
event at 1595484557.665889, code 00, type 00, val 01
event at 1595484557.715893, code 115, type 01, val 02
event at 1595484557.715893, code 00, type 00, val 01
event at 1595484557.760866, code 04, type 04, val 786665
event at 1595484557.760866, code 115, type 01, val 00
event at 1595484557.760866, code 00, type 00, val 00

(小ボタンON/OFF)
event at 1595484498.600783, code 04, type 04, val 458792
event at 1595484498.600783, code 28, type 01, val 01
event at 1595484498.600783, code 00, type 00, val 00
event at 1595484498.660781, code 04, type 04, val 458792
event at 1595484498.660781, code 28, type 01, val 00
event at 1595484498.660781, code 00, type 00, val 00

(少ボタン長押しON/OFF)
event at 1595484588.150914, code 04, type 04, val 458792
event at 1595484588.150914, code 28, type 01, val 01
event at 1595484588.150914, code 00, type 00, val 00
event at 1595484588.405880, code 28, type 01, val 02
event at 1595484588.405880, code 00, type 00, val 01
event at 1595484588.455891, code 28, type 01, val 02
event at 1595484588.455891, code 00, type 00, val 01
event at 1595484588.505882, code 28, type 01, val 02
event at 1595484588.505882, code 00, type 00, val 01
event at 1595484588.555887, code 28, type 01, val 02
event at 1595484588.555887, code 00, type 00, val 01
event at 1595484588.605891, code 28, type 01, val 02
event at 1595484588.605891, code 00, type 00, val 01
event at 1595484588.655888, code 28, type 01, val 02
event at 1595484588.655888, code 00, type 00, val 01
event at 1595484588.705887, code 28, type 01, val 02
event at 1595484588.705887, code 00, type 00, val 01
event at 1595484588.755881, code 28, type 01, val 02
event at 1595484588.755881, code 00, type 00, val 01
event at 1595484588.805890, code 28, type 01, val 02
event at 1595484588.805890, code 00, type 00, val 01
event at 1595484588.810923, code 04, type 04, val 458792
event at 1595484588.810923, code 28, type 01, val 00
event at 1595484588.810923, code 00, type 00, val 00
```

## 感想

この結果から、大ボタン=code 115、少ボタン=code 28、
ボタンDOWN(押す)=val 01、ボタンUP(離す)=val 00、
ボタンLOND DOWN(押しっぱなし)= val 02ということがわかりました。

この結果で分岐するような処理を作れば、2種類のボタン、3種類の動作で
合計6通りの処理がかけそうです。

ただ、LONG UPは検出できませんでした。
LONG UPはボタンを押してないのに等しいので検出することはできないのかも知れません。
なので、実質4通りの処理になりそうです。