ラズパイを使って、iPadをスワイプするよ
ラズパイを使って、リレータッチボードを制御するメモです。
デモ
iPadのスワイプを行っています。
概要
リレータッチボードとは、スマートフォンなどの画面をタッチすることができるボードです。
スマートフォンの画面にボードを置いた状態でリレーをONにするとボードを置いた位置を指でタッチした状態として認識されます。
リレータッチボードを複数個使うことで、スワイプを行います。
システム図
機材一覧
no | 部品名 | 個数 | 備考 |
---|---|---|---|
1 | ラズベリーパイ | 1 | 今回は4Bで確認 |
2 | リレータッチボード | 3 | タッチボード(ドライバあり) - タップだけなら1つOK |
3 | ジャンパー線 | 適量 | |
4 | ブレッドボード | 1 | ※twitterの動画では、プリント基板で実現しています |
開発環境
- ラズベリーパイ
- Linux rpi 5.10.17-v7l+ #1403 SMP Mon Feb 22 11:33:35 GMT 2021 armv7l GNU/Linux
- Python
- Python 3.7.3 (default, Jan 22 2021, 20:04:44)
事前準備
タッチボードの線だし
リレータッチボードと接続するためにはんだ付けが必要です。
以下がはんだ付けした写真です。
スワイプ用タッチボードの作成
1つのタッチボードで、タップすることができます。
複数のタッチボードを時間的にタップのタイミングをずらすことで、スワイプを実現します。
いろいろと試行錯誤したところ、3つあればスワイプを安定的に実現できそうです。
以下のボードを作成しました。
接続
PIN表
ラズパイ | リレータッチボード | 備考 |
---|---|---|
5V | 5V | - |
GND | GND | - |
21(BCM) | EN | ラズパイ物理ピン - 40 |
20(BCM) | EN | ラズパイ物理ピン - 38 |
16(BCM) | EN | ラズパイ物理ピン - 36 |
回路図
手順
リレータッチボードの使い方
リレータッチボードには、リレー駆動用のドライバが搭載されており1.6mA程の電流でリレーをONにできます。
ラズベリーパイのGPIO制御 - 出力ピン(ENに接続ピン)をLOW->HIGHにすると、タッチ動作が行われます。
環境の構築
GPIOの制御はいろんな方法がありますが、
個人的に好きなgpiozeroモジュール(pin_factory=pigpio)で制御します。
- gpiozeroについては↓
- gpiozero-pinsについては↓
$ sudo apt install pigpio
$ sudo service pigpiod start
$ sudo systemctl enable pigpiod.service #<=起動時にenableしたい場合
$ python3 -m venv env_swipe
$ source env_swipe/bin/activate
(env_swipe) $ pip install pigpio
(env_swipe) $ pip install gpiozero
タップ動作
下記のコードでタップすることができます。
タップ - コード
import time
from gpiozero import OutputDevice
from gpiozero.pins.pigpio import PiGPIOFactory
# pin settings
RELAY_PIN_0 = 21
def main():
# use pigpio
factory = PiGPIOFactory()
tap_pin = OutputDevice(RELAY_PIN_0, pin_factory=factory)
# tap
tap_pin.on()
time.sleep(0.050)
tap_pin.off()
return
if __name__ == "__main__":
main()
- 実行方法
(env_swipe) $ python tap.py
タップされればOK🎉です。
タップコード - 補足
- OutputDevice()にて、GPIOの出力PINとして設定している
- tap_pin.on()がGPIO-HIGHとなる
- この時点でタップ動作となる
スワイプ動作
スワイプ動作は、 前述した"スワイプ用タッチボードの作成"の説明図の動作となります。
スワイプ - コード
import sys
import time
from gpiozero import OutputDevice
from gpiozero.pins.pigpio import PiGPIOFactory
# pin settings
RELAY_PIN_0 = 21
RELAY_PIN_1 = 20
RELAY_PIN_2 = 16
class Relay():
def __init__(self, pins):
# use pigpio
factory = PiGPIOFactory()
self._swipe_pins = []
for pin in pins:
self._swipe_pins.append(OutputDevice(pin, pin_factory=factory))
return
def tap(self, left=True, intervel=0.050):
pin = self._swipe_pins[0] if left else self._swipe_pins[-1]
pin.on()
time.sleep(intervel)
pin.off()
return
def swipe(self, left=True, intervel=0.020):
step = 1 if left else -1
for pin in self._swipe_pins[::step]:
pin.on()
time.sleep(intervel)
for pin in self._swipe_pins[::step]:
pin.off()
time.sleep(intervel)
return
def main():
relay = Relay([RELAY_PIN_0, RELAY_PIN_1, RELAY_PIN_2])
args = sys.argv
if "swipe_left" == args[1]:
relay.swipe(True)
elif "swipe_right" == args[1]:
relay.swipe(False)
elif "tap" == args[1]:
relay.tap()
else:
pass
return
if __name__ == "__main__":
main()
実行の仕方
# 左にスワイプ
(env_swipe) $ python relay.py swipe_left
# 右にスワイプ
(env_swipe) $ python relay.py swipe_right
DEMOの動作になればOKです🎊。
注意事項
接地面やインターバルの間隔によって認識が悪い場合があります。
そこらへんは試行錯誤でお願いします。
最後に
今回は、直接ラズパイのプログラムを実行していますが、
ラズパイ側をサーバにすることで、リモート経由で制御することができます。
電子書籍を読む場合に、スワイプするのが面倒な時に手元で制御するなど
いろいろなアプリケーンになるかもしれません。
Discussion