RaspberryPiでNFCをトリガーにしてサーボモーターを駆動する

フェリーハッカソンでできなかったことをやってみる

以前参加した、フェリーハッカソンでは、QRコードを読み取ってサーボモーターの駆動をしていました。 今回はNFCのリーダーを使用してサーボモーターを駆動させてみたいと思います。時間が余っていればやりきりたかった。

【参考】 uepon.hatenadiary.com

若干異なる点としてはpythonnfcのモジュールが2.7系にまでにしか対応していない点が挙げられます。 とはいえ、今回使用しているRPiのモジュールは2系でも3系でも大きな差がなく使用することができるので 大丈夫ではないかなと。だめであればそれも含めて調査する方向でやっていこうと思います。

nfcモジュールに関して

pythonで使用できるnfcモジュールを使用してトリガーを取得していきたいと思います。

以前も使用しているので細かい部分はそちらをご参考にお願いします。

【参考】

uepon.hatenadiary.com

基本的にはnfcモジュールイベントハンドラを使用して、ループさせ、ReaderからIDmが取得できた場合にサーボ制御を行うものになります。 特に組み合わせれば難しくないかなと思います。こちらの処理は以下のような動きをします。

  1. nfcリーダーでFelicaに含まれたIDmの読み込み待ちをする。(ループ)
  2. IDmが認識できたら、サーボモーターを制御する(鍵を開ける)
  3. 鍵を開けた状態で10秒間ウエイトを行う
  4. サーボモータを再度制御する(鍵を閉める)

コード書いてみた

今回のコードではGPIO4でサーボモータを制御、GPIO17でLEDの制御を行っています。

f:id:ueponx:20190203232411j:plain

import nfc
import binascii
import RPi.GPIO as GPIO
import time

class NFCReader(object):
    def on_connect(self, tag):
        print("touched")
        self.idm = binascii.hexlify(tag.idm)
        return True

    def read_id(self):
        clf = nfc.ContactlessFrontend('usb')
        try:
            clf.connect(rdwr={'on-connect': self.on_connect})
        finally:
            clf.close()

if __name__ == '__main__':
    GPIO.setmode(GPIO.BCM)
    gp_out = 4
    gp_led = 17
    GPIO.setup(gp_out, GPIO.OUT)
    GPIO.setup(gp_led, GPIO.OUT, initial=GPIO.LOW)
    servo = GPIO.PWM(gp_out, 50)

    reader = NFCReader()
    while True:
        print("touch card:")
        reader.read_id()
        print("released")
        print(reader.idm)

        GPIO.output(gp_led, GPIO.HIGH)

        servo.start(0.0)
        servo.ChangeDutyCycle(2.5)
        time.sleep(0.5)
        servo.stop()

        time.sleep(10.0)

        servo.ChangeDutyCycle(7.5)
        time.sleep(0.5)
        servo.stop()

        GPIO.output(gp_led, GPIO.LOW)

        # GPIO.cleanup()

今回はnfcの処理の部分は汎用性をもたせるためにクラス化しています。 また、特定のIDmで開けるといった処理はしていません。リーダーで何らかのデータを読み込めた場合には判断なく処理をする形にしています。 割と簡単にできたなと思います。

おわりに

ある程度組み合わせればなんかできそうなことが増えてきました。今回も2時間もかからず出来上がった感じでした。

できれば、nfcモジュールがそろそろPython3に対応してもらえると…淡い希望でした。