⌨️

Bluetoothシャッターでモールス符号を打つ

2023/03/02に公開

はじめに

はじめまして、Staff Roiです。今回は100均で売っているBluetoothシャッターの入力をPythonで受け取り、モールス符号に変換するプログラムを作っていきます。このプログラムを使えば、遠隔でシャッターを打つだけで文字入力ができるようになります。

用意

順番に見ていきましょう。

環境

・ラズベリーパイ3B (linux)
基本的にPython3がインストールされていればどの環境でも大丈夫なはずです。

Bluetoothシャッター

ダイソーで売っていたものを使います。
bluetooth_shutter
二つ種類があるそうですが、今回は上の写真のものを使います。

必要なパッケージ

・evdev 1.6.1 (キーやマウスのイベントを取得します)
・PyMorse (符号を文字列に変換、文字列を符号に変換します。)
上のPyMorseは筆者が作ったものです。「.」と「-」で符号を表します。

pip install git+https://github.com/roistaff/PyMorse

でインストールします。符号を辞書に合わせて変換し、意味不明な符号の場合は「*」で置き換えている関数があるだけで、必要なら自分で作ってもらっても構いません。

はじめていく

早速はじめていきましょう。

ペアリング

シャッターをペアリングします。windowsやmacの方は従来の方法で、ラズベリーパイでもGUIからペアリングできます。
Bluetoothのアイコンをクリックし、「デバイスを追加」でペアリングします。基本的に問題なくペアリングされるはずです。

event番号を調べる

evdevから扱うためにデバイスのevent番号を調べます。(event番号とは「event5」のようなものです)
シャッターの電源を切り、ペアリングを解除します。そうしたらターミナルで以下のコマンドを入力:

ls /dev/input/

そしたらこのようなリストが返ってきます。

by-id by-path event0 event1 event2 event3 event4 event5 mice mouse0

さらに、もう一度シャッターをペアリングして先ほどのコマンドを実行すると

by-id event0 event2  event4 event6 mice
by-path event 1 event3 event 5 event 7 mouse0

のように、event6とevent7が増えていることがわかります。今回はevent6を使います。

コードを書く

いよいよpythonコードを書いていきます。
ここに載せるのはあくまでも基本的なところで、実用的な面?はほとんどありません。

import evdev
import pymorse
import time
global spacetime
spacetime = 1.5
device =evdev.InputDevice("/dev/input/event6")
text = ""
end = 3000000000
while True:
    try:
        print(device)
        print("OUTPUT:")
        for event in device.read_loop():
            if event.type == evdev.ecodes.EV_KEY:
                outime = time.time()
                outtime = outime-end
                if outtime > spacetime:
                    space = 1
                else:
                    space = 0
                if event.value ==1:
                    start = time.time()
                if event.value ==0:
                    end = time.time()
                    t = end - start
                    if t > 0.5:
                        m = "-"
                    else:
                        m = "."
                    if space == 1:
                        text +="_"
                    else:
                        pass
                    text +=m
                    if '_' in text:
                        tt = pymorse.code_to_string(text)
                        print(text,tt,end='\r')
                    else:
                        print(text, end='\r')
    except KeyboardInterrupt:
        break
    except:
        print("retry...", end='\r')
        time.sleep(1)

変数deviceの"/dev/input/event6"のところは各自の環境に合わせて変えてください。

動作確認

今回はターミナルで実行します。
シャッターボタンの長押し(2秒以上)することで「-(ツー)」、短く押すことで「.(トン)」、空白で文字を区別するには1.5秒以上何もしないで待ちます。

ちゃんとSOS、と救難信号を送信し、国際救助隊のサンダーバードが来てくれました(笑)

Blue-Morse

今回紹介したのは、私が今作っているBlue-Morseというアプリのアルファ版です。
私が作っているBlue-Morseはインストールするだけで簡単にモールス符号で文字列を入力することができ、色々な機能もいれています。
宣伝ですが、

sudo pip install git+https://github.com/roistaff/Blue-Morse

でインストールできます。
詳しくは
https://github.com/roistaff/Blue-Morse

まとめ

コードを改造すれば、モールス符号で入力するだけではなく、opencvで写真を撮ったり、何かのスイッチにすることもできます。
是非ともbluetoothシャッターを活用してみてください。

参考

https://monomonotech.jp/kurage/raspberrypi/evdev.html

Discussion