ダイソーのシャッターリモコンをRaspberryPiで遊ぶ

DAISOのBluetoothリモコンシャッターボタンとRaspberryPi3A PC/デジモノ

100円ショップダイソーで売られている、220円のBluetoothシャッターリモコンをラズパイで遊ぶ方法を紹介します。

注意など

今回使用したシャッターボタンは以下のようなパッケージで販売されているものです。

以前は330円ほどで見た目がそっくりなものも販売されていたようですが、いま手に入るのはこの商品だけだと思います。

従来の商品であれば、アレコレすると2つのボタンで別々の機能を割り当てて遊ぶことができたようです。ただ、最近手に入るこのモデルもボタンが2つありますが、ボタンの使い分けはできません。同じ信号しか送出していないようです。

DAISOのBluetoothリモコンシャッターボタン

最近販売されているこのタイプのシャッターボタンは改造できません。

今回やること

ダイソーのBluetoothシャッターボタンを利用して、RaspberryPiのシャットダウンボタンを作成してみます。これ以外にも、ある特定のスクリプトを実行させるといったこともできますし、複数用意してそれぞれ別々の機能を持たすといったことも可能です。(1機能につきボタンが1つ必要)

基本的には以前書いたWiiリモコンをLinuxで使う話と同じなのですが、Wiiリモコンと違ってPC側からわざわざ定期的にWiiリモコンを探しに行くような処理は不要です。(Wiiリモコンが特殊なのか、Bluetoothのその辺の仕様はよくわかりません。)

検証に使ったもの

RaspberryPi 3A+

Bluetooth搭載のラズパイであればどれでも大丈夫です。x86マシンでもOKです。

OSはRaspberrypi OS LITE(32BIT) bullseyeとUbuntu20.04で動作を確認しています。

Raspberry Pi 3 Model A+

Raspberry Pi 3 Model A+

5,000円(07/21 10:55時点)
Amazonの情報を掲載しています

ダイソー Bluetoothシャッターボタン

近所のダイソーで調達しました。220円です。

DAISO220円シャッターリモコン

側面にスライド式の電源ボタンと、正面に2つシャッターボタンがあります。(なお、この2つのボタンは全く同じ機能しか割り当てられていません)

設定方法

準備

必要なモジュールをインストールします。

$sudo apt update
$sudo apt install bluez
$sudo apt install inotify-tools

RaspberryPiであればbluezは標準でインストールされているはずです。inotify-toolsはファイルを監視(この場合は/dev/input以下)のために使用します。

リモコンのMACアドレスを確認

適当なスマホか何かで一度接続してアドレスを確認してください。

ABShutter3というデバイス名になっているはずです。

この個体の場合、アドレスは2A:2A:07:98:2C:98ということがわかりました。この部分以後は各自書き換えてください。

また、確認が終わったらスマホとの接続は削除しておいてください、

 

リモコンシャッターと接続

$sudo bluetoothctl
 >power on
 >scan on
 >pair 2A:2A:07:98:2C:98
 >connect 2A:2A:07:98:2C:98
 >trust 2A:2A:07:98:2C:98
 >scan off

 >quit

これで毎回ちゃんと接続されるはず。繰り返しになりますが、MACアドレスは各自入手したボタンのMACアドレスを使用してください。

入力デバイスを確認(この手順は飛ばしてもOK)

※おそらく、ダイソーのシャッターボタンはすべてこのイベント番号なので、ここの手順は飛ばしてOKです。

BTシャッターボタンを接続した状態で

$cat /proc/bus/input/devices

これを実行すると結果がずらっと出てくると思いますが

最初に調べた2a:2a:07:98:2c:98 がヒットする入力デバイスが見つかるはずです。

今回の場合、event5 とevent6が出ていますが、この場合は多分event5をみれば良いです。以下のコマンドを打った後にBTシャッターのボタンを押してみるとよくわからない英数字の羅列がでてくるはずです。

$sudo hexdump /dev/input/event5
0000000 1a98 6417 eb24 0006 0004 0004 00e9 000c
0000010 1a98 6417 eb24 0006 0001 0073 0001 0000
0000020 1a98 6417 eb24 0006 0000 0000 0000 0000
0000030 1a98 6417 59b8 000a 0004 0004 00e9 000c
0000040 1a98 6417 59b8 000a 0001 0073 0000 0000
0000050 1a98 6417 59b8 000a 0000 0000 0000 0000
0000060 1a98 6417 7e94 000b 0004 0004 00e9 000c
0000070 1a98 6417 7e94 000b 0001 0073 0001 0000
0000080 1a98 6417 7e94 000b 0000 0000 0000 0000
0000090 1a98 6417 3605 000d 0004 0004 00e9 000c
00000a0 1a98 6417 3605 000d 0001 0073 0000 0000
00000b0 1a98 6417 3605 000d 0000 0000 0000 0000
00000c0 1a98 6417 ed82 000e 0004 0004 00e9 000c
00000d0 1a98 6417 ed82 000e 0001 0073 0001 0000

これだとよくわからないので、input.hで定義されている構造体にデータを流しこめばOKです。なので以下のサイトを参考にしてテスト用にCプログラムを書きます。

Linux の入力デバイスをカスタマイズ - Qiita
デバイスから来るイベントを調べる。デモのために『リングマウス』 というのを入手した。Linux からは普通のマウス入力として見える。ただデモではマ…
$emacs keycheck.c
#include <assert.h>
#include <fcntl.h>
#include <linux/input.h>
#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>

int main(void)
{
 int fd = open("/dev/input/event5", O_RDWR);
 assert(fd != -1);

 for (;;) {
  struct input_event event;
  assert(read(fd, &event, sizeof(event)) == sizeof(event));
  printf("tv_sec: %lu, type: %04x, code: %04x, value: %08x\n", event.time.tv_sec, eve\
  nt.type, event.code, event.value);
  fflush(stdout);
  }
  close(fd);
 }

上記赤字部イベント番号は適宜書き換えてください。で、コンパイル・実行

$gcc -o keycheck keycheck.c 
$sudo ./keycheck

プログラムを実行しておいて、BTシャッターボタンを押すと以下のような表示が出るはずです。

type: 0004, code: 0004, value: 000c00e9
type: 0001, code: 0073, value: 00000001
type: 0000, code: 0000, value: 00000000
type: 0004, code: 0004, value: 000c00e9
type: 0001, code: 0073, value: 00000000
type: 0000, code: 0000, value: 00000000

これでイベント番号は73(10進数で言えば115),valueが1の時ボタンが押されたこと(press)を示しています。このイベント番号に割り込んでしまえばOKです。

※ダイソーのシャッターボタンは全て同じイベント番号なのでこの手順は飛ばしてOKです。

実際の処理プログラム

待ち受け処理

今回の場合、リモコンシャッターに対応するevent番号は5でしたが、これは環境やデバイスの接続の順番等によっても変わるので、それを検出しないといけません。相変わらずですが、力ずくで制御をとります。inotyfyで/dev/input以下を監視しつつ、変化があれば

cat /proc/bus/input/devices

の結果から該当するハードウェアアドレスのイベント番号をテキスト処理で取り出して、該当のデバイスが接続するまで待ち受けをするスクリプトを作成します。ハードウェアアドレスでイベント番号検出しているので、複数のBTシャッターボタンを1台のラズパイに接続してそれぞれ別の任務を割り当てることも可能です。

$emacs btsh_cnt.sh
#!/bin/bash
function searchBTSHUTTER(){
 RESULT=`cat /proc/bus/input/devices | grep -A 1 '2a:2a:07:98:2c:98' | grep "Handlers=kbd"`
 RESULT=`echo $RESULT | grep -o event[0-9]*`
 echo $RESULT
}
function connectBTSHUTTER(){
 INPUTDEV=`searchBTSHUTTER`
 echo ${INPUTDEV}
 if [ -n "$INPUTDEV" ];then
  BTDEV="/dev/input/"$INPUTDEV
  ./btsh $BTDEV
  echo $BTDEV
  wait
  fi
 }

SCRIPT_DIR=`dirname $0`
cd $SCRIPT_DIR

connectBTSHUTTER
while true
 do
  inotifywait /dev/input
  wait
  connectBTSHUTTER
 done

実行権限の付与を忘れずに

$chmod 775 btsh_cnt.sh
MACアドレスの指定は小文字を使わないとダメな場合があるようです。
cat /proc/bus/input/devices に対するメッセージを確認してそれに合わせてください。

割り込み処理

該当機器が接続された場合に割り込みを行うCプログラムを作成します。

$emacs btsh.c
#include <fcntl.h>
#include <linux/input.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc,char *argv[]) {
 char *INPUT_DEVICE =argv[1];
 int input = open(INPUT_DEVICE, O_RDWR);
 ioctl(input, EVIOCGRAB, 1);

 for(;;){
   struct input_event event;
   if (read(input, &event, sizeof(event)) != sizeof(event)) {
    break;
   }
   if(event.type ==1){
    if(event.code==115 && event.value==1){
    system("bash ./hoge01.sh");
   }
  }
 }
 ioctl(input, EVIOCGRAB, 0);
 return 0;
}

ioctl(input, EVIOCGRAB, 1)の部分で、標準ドライバから制御を奪取、

event.codeが115,event.valueが1の時にhoge01.shを実行するようなっています。

これをコンパイルします。

gcc -o btsh btsh.c

実際に処理するスクリプト

実際に処理を行うスクリプトを書きます。スクリプトに関しては各自やらせたいことを書けばよいのですが、今回の例はラズパイの電源を落とす処理です。

$emacs hoge01.sh
#!/bin/bash
sudo shutdown -h now
$chmod 775 hoge01.sh

サービスに登録

デバイスの接続状態を監視するスクリプトをサービスとして登録します。

$sudo emacs /etc/systemd/system/btsh.service
[Unit]
After=network-online.target

[Service]
User=root
ExecStart=/home/hoge/btsh_cnt.sh

[Install]
WantedBy=multi-user.target

赤色部分は適宜修正してください。最初に書いたスクリプトの場所を指定します。

サービスを登録します。

$systemctl enable btsh.service

これで次回再起動時からリモコンシャッターが使用できる状態になっているはずです。

まとめ

今回はダイソーで売られているBluetoothリモコンシャッターをラズパイで遊ぶ方法について説明しました。

ラズパイは電源ボタンがないため、GPIOから配線するのが一般的です。しかし、この方法を電源OFFに利用すれば、ソフトウエアの処理だけで済むのでハンダ等が苦手な人でも簡単ですし、ケースの都合でGPIOへのアクセスが難しい場合にも有効です。また、シャッターボタン自体の入手も容易で安いのがメリットですね。

コメント