วันศุกร์ที่ 22 พฤษภาคม พ.ศ. 2563

USB QR Code Reader RaspberryPi4

เนื่องจากได้รับงานด่วนๆ ให้ทดลอง usb qr-code reader กับ raspberry pi4
จึงได้ซื้อของยี่ห้อ waveshare มา
สามารถซื้อได้จากที่นี่
https://www.waveshare.com/barcode-scanner-module.htm

คู่มือ ตามนี้
https://www.waveshare.com/w/upload/archive/3/3c/20180623102926%21Barcode_Scanner_Module_User_Manual_EN.pdf

qr-code reader รุ่นนี้ สามารถอ่าน bar-code ได้ด้วย

สามารถใช้งานได้ 2 แบบ คือ แบบ usb และแบบ uart

ในที่นี้ผมเลือกใช้แบบ usb เพราะว่าหน้างาน อาจจะได้ใช้ qr-code reader 2 ตัวพร้อมกัน
และคนที่ติดตั้งก็ไม่ใช่เรา ดังนั้นต้องยืดหยุ่นให้มากที่สุดเท่าที่จะทำได้

เมื่อได้ของมาแล้ว ก็ไม่รอช้า เสียบเข้าช่อง usb ของ raspberrypi4 เลย
ตัว raspberrypi จะเห็น qr-code reader อยู่ที่ /dev/hidraw0
เราสามารถตรวจสอบว่า raspberrypi มองเห็นอุปกรณ์ตัวนี้ไหม โดยพิมพ์ ls /dev/hi* แล้วกด enter
เราสามารถเขียนโปรแกรมให้อ่านข้อมูลที่ได้จากการสแกนจากที่นี่


ซึ่งผมและทีมงานก็ได้พยายามหาข้อมูลจากอาจารย์ goo เหมือนเดิม จนไปเจอที่นี่
https://www.raspberrypi.org/forums/viewtopic.php?f=45&t=55100

ซึ่งมี code ให้อยู่ จึงได้ copy มา แล้วก็ทดสอบเลย
ก็ติดปัญหาบ้าง เช่น
1. code ที่เขาแปะไว้ คือใช้กับ python2 เราก็ต้องเรียกใช้ให้ถูกวิธี
2. code ที่ได้มา มีการ map ค่าที่ได้ ต่างกับ Hardware ที่เรามี ก็ต้องมา map ใหม่ ยุ่งยากเล็กน้อย

สุดท้ายแล้ว ก็ต้องปรับ code จนออกมาเป็นเวอร์ชั่นที่ใช้ได้ ดังนี้

import sys

hid = { 4: 'a', 5: 'b', 6: 'c', 7: 'd', 8: 'e', 9: 'f', 10: 'g', 11: 'h', 12: 'i', 13: 'j', 14: 'k', 15: 'l', 16: 'm', 17: 'n', 18: 'o', 19: 'p', 20: 'q', 21: 'r', 22: 's', 23: 't', 24: 'u', 25: 'v', 26: 'w', 27: 'x', 28: 'y', 29: 'z', 30: '!', 31: '@', 32: '#', 33: '$', 34: '%', 35: '^', 36: '&', 37: '*', 38: '(', 39: ')', 44: ' ', 45: '_', 46: '+', 47: '{', 48: '}', 49: '|', 51: ':' , 52: '"', 53: '~', 54: '<', 55: '>', 56: '?'  }
hid2 = { 4: 'A', 5: 'B', 6: 'C', 7: 'D', 8: 'E', 9: 'F', 10: 'G', 11: 'H', 12: 'I', 13: 'J', 14: 'K', 15: 'L', 16: 'M', 17: 'N', 18: 'O', 19: 'P', 20: 'Q', 21: 'R', 22: 'S', 23: 'T', 24: 'U', 25: 'V', 26: 'W', 27: 'X', 28: 'Y', 29: 'Z', 30: '1', 31: '2', 32: '3', 33: '4', 34: '5', 35: '6', 36: '7', 37: '8', 38: '9', 39: '0', 44: ' ', 45: '-', 46: '=', 47: '[', 48: ']', 49: '\\', 51: ';' , 52: '\'', 53: '~', 54: ',', 55: '.', 56: '/'  }


fp = open('/dev/hidraw0', 'rb')
ss = ""
shift = False
done = False
d = 0
first_char = 0
while not done:
    ## Get the character from the HID
    buffer = fp.read(8)
    for c in buffer:
        d = d+1
        if c > 0:
            if int((c)) == 57:
                print ("Start/Stop Package")
            else:
                ##  40 is carriage return which signifies
                ##  we are done looking for characters
                if int((c)) == 40:
                    if shift:
                        ss += '3'
                    done = True
                    break;
                ##  If we are shifted then we have to
                ##  use the hid2 characters.
                if shift:
                    ## If it is a '2' then it is the shift key
                    if int((c)) == 32 :
                        ss += '#'
                        shift = False
                    ## if not a 2 then lookup the mapping
                    else:
                        if d == first_char+16:
                            ss+= '3'
                            shift = False
                            ss += hid2[int(c)]
                        else:
                            ss += hid[ int((c)) ]
                            shift = False
                ##  If we are not shifted then use
                ##  the hid characters
                else:
                    ## If it is a '2' then it is the shift key
                    if int((c)) == 32 :
                        shift = True
                        first_char = d
                    ## if not a 2 then lookup the mapping
                    else:
                        ss += hid2[ int((c)) ]
print (ss)


เมื่อ save โปรแกรมแล้ว ให้เปลี่ยน permission ด้วย
sudo chmod 766 ชื่อโปรแกรม.py

ตอนเรียกใช้ ให้เรียกใช้แบบนี้
sudo python3 ชื่อโปรแกรม.py

ต่อมา
เราต้องการ QR-Code ตัวอย่าง ในการอ่านข้อมูล ก็ให้หาเวปที่สร้าง QR-Code ได้ ซึ่งมีอยู่มากมาย
ยกตัวอย่างเช่น https://www.the-qrcode-generator.com/ หรือ
https://th.qr-code-generator.com/

เมื่อเราสร้าง QR-Code ได้แล้ว ก็ลอง scan ได้เลย
ค่าที่อ่านได้ จะต้องเหมือนกันกับที่เราสร้างในเวป









น่าจะเป็นประโยชน์ต่อผู้สนใจนะครับ