出典
QRコードリーダの使い方を確認してみました。
最初に動作している様子です。RaspberryPiにUSBケーブルでQRコードリーダを接続し、スマフォ画面(QRコードが表示されている)をかざして、その内容を表示しています。
※表示されている内容は、加工されています。実際(AmazonPay)のものではありません。
2 QRコードリーダー
使用したQRコードリーダーは、レシピで案内されていた、自動バーコードスキャナ無指向性ハイスピードCCDデスクトップ2Dミニバーコードリーダーハンズフリーです。
読み取った内容をキーボード入力のように扱うことが可能です。
3 pynput
Pythonでキーボード入力を扱うには、pynputが利用可能です。
$ pip3 install pynput
from pynput.keyboard import Key, Listener
なお、ここで、ssh等で接続された状態で、pynputを使用しようとすると、下記のようなエラーとなります。
ImportError: this platform is not supported: ('failed to acquire X connection: Bad display name ""', DisplayNameError(''))
Try one of the following resolutions:
* Please make sure that you have an X server running, and that the DISPLAY environment variable is set correctly
これは、Linuxの通常起動で、キー入力は、デスクトップ画面から利用することを前提としているからです。
ここでは、ユーザーpiをアクセスリストに追加することで、このエラーは回避できます。
$ export DISPLAY=:0.0
$ sudo xhost +si:localuser:pi
localuser:pi being added to access control list
$ xhost
access control disabled, clients can connect from any host
SI:localuser:pi
4 コード
動作確認のために使用したコードは以下のとおりです。
キー入力は、1文字ごと、on_press()で受信します。入力が、Key.enterとなった時に、入力完了として、1行分をcallback関数で戻しています。
qr.py
from pynput.keyboard import Key, Listener
class Qr():
def __init__(self, callback):
self.__callback = callback
self.__data = []
def on_press(self, key):
print("on_press key:{}".format(key))
if str(key) != 'Key.enter':
try:
self.__data.append(key.char[0:1])
except AttributeError:
return
else:
qr_code = ''.join(self.__data)
self.__callback(qr_code)
def start(self):
print("start qr reader.")
with Listener(on_press=self.on_press) as listener:
listener.join()
def callback(qr_code):
print("callback qr_code:{}".format(qr_code))
qr = Qr(callback)
qr.start()
最後に
今回は、QRコードリーダでの読み取りを確認してみました。
QRコードは、OpenCV等で、画像から取得することも可能ですが、さすが、専用端末です。
スマフォなどをかざした時点で、読み取りを開始する合図としてLED照明が点灯されたり、読み取り完了が分かるように、ライトがついたり「ピッ」と音がなったりと、非常に快適に読み取りできます。