出典

 

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照明が点灯されたり、読み取り完了が分かるように、ライトがついたり「ピッ」と音がなったりと、非常に快適に読み取りできます。