実現したいこと
キー入力(enterキー)を押したら、プログラムが終了するようにしたいです。
前提
プログラムを実行すると、カードリーダー(ソニー製 Sー380)が待機状態(読み込み待ち状態)となり、フェリカカードをかざすと
かざしたカードリーダーのIDを読み取り、ターミナル上にそのIDが表示されるプログラムを作成しています。
なお、フェリカカードをかざした後は再び待機状態となります。再度フェリカカードをかざすと再びIDがターミナル上に表示されます。
プログラムの実行はターミナル上から行っています。なお、フェリカーカードをかざすと、同時にGPIOピンが動作してリレーやLEDの点灯、
電子音ブザーが鳴るようにしています。やりたい事としては、"enterキー"を押したら、プログラムから抜けれるようにしたいのですが、
"enterキー"を押してもプログラムから抜けることが出来ずに、フェリカカードの待機状態が続きます(読み込み待ち状態)。
if keyboard.is_pressed("enter"):
break
の1文で指定しているはずなのですが、どこがおかしいのでしょうか?お知恵貸していただけると幸いです。
発生している問題・エラーメッセージ
エラー自体は出ないのですが、"enterキー"を押すとプログラムを終了できるようになりたいです。
今現在は"enterキー"を押してもプログラムを終了することが出来ないため、control + Z で強制終了しています。。。
該当のソースコード
import sys import RPi.GPIO as GPIO import time import binascii import nfc import os import datetime import csv sys.path.append('/home/pi/.local/lib/python2.7/site-packages') import keyboard class NFCReader(object): def on_connect(self, tag): #タッチ時の処理 print("【 Touched 】") #タグ情報を全て表示 print(tag) print("dump felica.") print(' ' + '\n '.join(tag.dump())) #IDmのみ取得して表示 self.idm = binascii.hexlify(tag._nfcid) print("IDm : " + str(self.idm)) #特定のIDmだった場合のアクション if self.idm == "00000000000000": print("【 登録されたIDです 】") 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番号指定の準備 GPIO.setmode(GPIO.BCM) gpio_led = 17 gpio_relay = 4 gpio_buzzer = 22 # LEDピンを出力に設定 GPIO.setup(gpio_led, GPIO.OUT) GPIO.setup(gpio_relay, GPIO.OUT) GPIO.setup(gpio_buzzer, GPIO.OUT) reader = NFCReader() dt_now = datetime.datetime.now() while True: if keyboard.is_pressed("enter"): break else: print("touch card:") reader.read_id() print("released") print(reader.idm) print(dt_now) GPIO.output(gpio_led, 1) # LED点灯 GPIO.output(gpio_relay, 1) # relay点灯 GPIO.output(gpio_buzzer, 1) # buzzer点灯 time.sleep(0.5) GPIO.output(gpio_led, 0) # LED消灯 GPIO.output(gpio_relay, 0) # relay消灯 GPIO.output(gpio_buzzer, 0) # buzzer消灯 # ピンの設定を初期化 # この処理をしないと、次回 プログラムを実行した時に「ピンが使用中」のエラーになる GPIO.cleanup(gpio_led) GPIO.cleanup(gpio_relay) GPIO.cleanup(gpio_buzzer)
試したこと
なお、試したこととして単純に”enterキー”の物理的な接触不良の可能性が無きにしもあらずのため
”space”に変更してみてプログラムを試したところやはりダメでした。
そこで、かなりプログラムを単純化させて、NFCとGPIOを無しで動作させてみました。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
import sys
import time
sys.path.append('/home/pi/.local/lib/python2.7/site-packages')
import keyboard
while True:
if keyboard.is_pressed("space"):
break
else:
print("touch card:")
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
ターミナル上から上記のプログラムを実行させ、”space”を押すと無事にプログラムが終了しました。
このことから、"enterキー"の不良ではなく、プログラムのどこかに問題があるように感じます。
分かる方がいましたら、ご教示いただけると幸いです。
補足情報(FW/ツールのバージョンなど)
PCはラズベリーパイ4 Bモデルです。使用言語はPython3です。