📱

ラズパイを使って、iPadをスワイプするよ

commits6 min read

ラズパイを使って、リレータッチボードを制御するメモです。

デモ

iPadのスワイプを行っています。

https://twitter.com/tw_kotatu/status/1391373410496831490

概要

リレータッチボードとは、スマートフォンなどの画面をタッチすることができるボードです。
スマートフォンの画面にボードを置いた状態でリレーをONにするとボードを置いた位置を指でタッチした状態として認識されます。
リレータッチボードを複数個使うことで、スワイプを行います。

システム図

image

機材一覧

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)

事前準備

タッチボードの線だし

リレータッチボードと接続するためにはんだ付けが必要です。
以下がはんだ付けした写真です。

relay_handa

スワイプ用タッチボードの作成

1つのタッチボードで、タップすることができます。

tap

複数のタッチボードを時間的にタップのタイミングをずらすことで、スワイプを実現します。
いろいろと試行錯誤したところ、3つあればスワイプを安定的に実現できそうです。

2つでも実現できましたが、コードが複雑になることおよび精度が悪いため諦めました

swipe

以下のボードを作成しました。

swipeboard

接続

PIN表

ラズパイ リレータッチボード 備考
5V 5V -
GND GND -
21(BCM) EN ラズパイ物理ピン - 40
20(BCM) EN ラズパイ物理ピン - 38
16(BCM) EN ラズパイ物理ピン - 36

回路図

swipe_kairo

手順

リレータッチボードの使い方

リレータッチボードには、リレー駆動用のドライバが搭載されており1.6mA程の電流でリレーをONにできます。
ラズベリーパイのGPIO制御 - 出力ピン(ENに接続ピン)をLOW->HIGHにすると、タッチ動作が行われます。

環境の構築

GPIOの制御はいろんな方法がありますが、
個人的に好きなgpiozeroモジュール(pin_factory=pigpio)で制御します。

  • gpiozeroについては↓

https://gpiozero.readthedocs.io/en/stable/index.html
  • gpiozero-pinsについては↓

https://gpiozero.readthedocs.io/en/stable/api_pins.html
$ 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

タップ動作

下記のコードでタップすることができます。

タップ - コード

tap.py
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となる
    • この時点でタップ動作となる

スワイプ動作

スワイプ動作は、 前述した"スワイプ用タッチボードの作成"の説明図の動作となります。

スワイプ - コード

relay.py
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です🎊。

注意事項

接地面やインターバルの間隔によって認識が悪い場合があります。
そこらへんは試行錯誤でお願いします。

最後に

今回は、直接ラズパイのプログラムを実行していますが、
ラズパイ側をサーバにすることで、リモート経由で制御することができます。
電子書籍を読む場合に、スワイプするのが面倒な時に手元で制御するなど
いろいろなアプリケーンになるかもしれません。

GitHubで編集を提案

Discussion

ログインするとコメントできます