[レジなし無人販売冷蔵庫] QRコードリーダを使ってみました

2020.12.26

1 はじめに

CX事業本部の平内(SIN)です。

Amazon Web Services ブログでは、「レジなし無人販売冷蔵庫を構築についての記事」が公開されています。
レジなし無人販売冷蔵庫を構築できる、This is my Smart Cooler プログラムを公開しました

こちらでは、「お客様自らがレジなし無人販売冷蔵庫を迅速に構築し学習や体験ができる This is my Smart Cooler プログラムを発表します。」ということで、そのレシピがGithubで公開されています。
レジ無し無人販売冷蔵庫 構築レシピ

「これを真似てみたい」ということで、ここまで作業を進めています。

今回は、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()

5 QRコード

Amazonの記事で紹介されているものは、Amazon.comのページから表示できる、AmazonPay決済用のQRコードです。 QRコードとバーコードが表示されていますが、内容は、同じです。 そして、今使用しているデバイスは、どちらで読み込めので、少々画面が隠れていても問題無いかも知れません。

6 最後に

今回は、QRコードリーダでの読み取りを確認してみました。

QRコードは、OpenCV等で、画像から取得することも可能ですが、さすが、専用端末です。

スマフォなどをかざした時点で、読み取りを開始する合図としてLED照明が点灯されたり、読み取り完了が分かるように、ライトがついたり「ピッ」と音がなったりと、非常に快適に読み取りできます。

「レジなし無人販売冷蔵庫」頑張って作ります。