LoginSignup
27
20

ラズパイとQRコードリーダー(not カメラ)で何か作れるように

Last updated at Posted at 2018-12-15

レッドインパルスのたかけんです。
こちら、IoTLT Advent Calendar 2018 、16日目の記事になります!

はじめに

ラズパイとQRコードを組み合わせ作品例って、多いですよね。
勤怠管理とか蔵書管理とか。

Raspberry Pi 3 QRコードリーダー - Qiita

実装方法として、カメラを取り付けて画像認識でQRを読み取る方法があります。
しかしこの方法の場合、QRの読み取りの精度やそこまで良くなかったり読み取るまでに時間がかかったりなどの問題もあります。

USB接続のバーコードスキャナを使う

USB接続のバーコードスキャナを使うと、ちょっと値段はしますが、素早く、かつ正確に読み取ることができます。

Amazon | Sumeber 自動バーコードスキャナ無指向性ハイスピードCCDデスクトップ2Dミニバーコードリーダーハンズフリーモバイル支払いのための2M USBケーブルで (MP168) | バーコードスキャナー | 文房具・オフィス用品

構成としては、こんな感じになります。

raspi_qr.png

問題

USB接続のバーコードスキャナは、外付けのキーボードとして認識されます。
なので、ラズパイでそのまま使おうとすると、入力待ちのターミナルやブラウザなどの入力フォームにカーソルがフォーカスされていないと、入力できないです。

IoTデバイスなので、ラズパイの起動が完了したらフォーカスとか気にしないで、QRコードが読めるようにしたいですね。

バックグラウンドのキー入力を取得する

バックグラウンドのキー入力を取得できるpythonライブラリを使います。

以下、サンプルコードです。

from pynput.keyboard import Key, Listener

def on_press(key):
    global qr_data
    # 1文字ずつqr_dataに
    if str(key) != 'Key.enter':
        try:
            qr_data += key.char[0:1]
            return
        except AttributeError:
            return
    # 最後はenter入力になる
    else:
        print(qr_data)
    qr_data = ''


if __name__ == '__main__':
    with Listener(
        on_press=on_press,
    ) as listener:
        listener.join()

バックグラウンドのキー入力が取れるようになったら、後はカメラの場合と同じですね。

私はこの後は、pynputとWebSocketサーバをThreadで立ち上げ、キー入力の結果をWebSocketで送り、結果をラズパイに取り付けたモニタのブラウザに表示させつつ、Kintoneにデータを送るようなプログラムに作成し、Supervisorでデーモン化し、systemdで自動起動するようにしました。

余談

バックグラウンドでキー入力を取れるということは、悪用もできそう...。
使い方にはご注意ください!!

追記

MacOSだと、sudoで実行してもキー取得できなかったです。
おそらくセキュリティ対策が講じられているのかと。

参考

Pythonでキーイベントを取得したかったけどできなかった話←できました。 - 豆腐とコンソメ

27
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
20