フェリーハッカソンでできなかったことをやってみる
以前参加した、フェリーハッカソンでは、QRコードを読み取ってサーボモーターの駆動をしていました。 今回はNFCのリーダーを使用してサーボモーターを駆動させてみたいと思います。時間が余っていればやりきりたかった。
若干異なる点としてはpythonのnfc
のモジュールが2.7系にまでにしか対応していない点が挙げられます。
とはいえ、今回使用しているRPiのモジュールは2系でも3系でも大きな差がなく使用することができるので
大丈夫ではないかなと。だめであればそれも含めて調査する方向でやっていこうと思います。
nfcモジュールに関して
pythonで使用できるnfcモジュール
を使用してトリガーを取得していきたいと思います。
以前も使用しているので細かい部分はそちらをご参考にお願いします。
【参考】
基本的にはnfcモジュール
のイベントハンドラを使用して、ループさせ、ReaderからIDm
が取得できた場合にサーボ制御を行うものになります。
特に組み合わせれば難しくないかなと思います。こちらの処理は以下のような動きをします。
- nfcリーダーでFelicaに含まれたIDmの読み込み待ちをする。(ループ)
- IDmが認識できたら、サーボモーターを制御する(鍵を開ける)
- 鍵を開けた状態で10秒間ウエイトを行う
- サーボモータを再度制御する(鍵を閉める)
コード書いてみた
今回のコードではGPIO4でサーボモータを制御、GPIO17でLEDの制御を行っています。
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に対応してもらえると…淡い希望でした。