Сканер штриховых кодов (Barcode Scanner) имеет возможность считывания различных типов штриховых кодов. Подобные сканеры находят сейчас широкое применение в торговых центрах, ресторанах, магазинах одежды и т.п. В данной статье мы рассмотрим подключение USB сканера штриховых кодов к последовательному порту платы Raspberry Pi. Результаты сканирования штрих-кода будут отображаться на экране ЖК дисплея 16х2.
Ранее на нашем сайте мы рассматривали сканирование QR кодов с помощью платы Raspberry Pi и камеры для нее, без использования специализированных сканеров штриховых кодов.
Необходимые компоненты
- Плата Raspberry Pi 4 B+ (или любая другая подходящая модель платы) (купить на AliExpress).
- Переносной USB сканер штриховых кодов (USB Handheld Barcode Scanner).
- ЖК дисплей 16x2 и модуль I2C для него (купить на AliExpress).
- Соединительные провода.
- Предметы с нанесенными на них штриховыми кодами.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Основные принципы работы сканера штриховых кодов
Ручной сканер штриховых кодов (Handheld Barcode Scanner) содержит USB порт и может подключаться к компьютеру/ноутбуку по технологии Plug and play. Обычно подобные сканеры могут выполнять до 300 сканирований в секунду и могут распознавать коды форматов Code11, Code39, Code93, Code32, Code128, Coda Bar, UPC-A, UPC-E, EAN-8, EAN-13, JAN.EAN/UPC и т.п. Кроме того, они могут выполнять сканирование шероховатых и местами неясно различимых кодов.
Подобные сканеры передают данные последовательно по интерфейсу USB и могут работать в режиме HID или RS232. Можно выбрать различные режимы сканирования со скоростью передачи 9600 или 115200 бод. Режим чтения данных можно выбрать триггерный (Triggering) или непрерывный (Continuous). Если вам необходимо сбросить сканер штриховых кодов к заводским настройкам, то вам необходимо просто просканировать специальный штриховой код, который поставляется на отдельном листе вместе со сканером.
Мы будем использовать сканер штриховых кодов, показанный на рисунке ниже. Он может работать в режимах USB и RS232, также программным способом можно изменять скорость его работы.
Типы штриховых кодов
Ниже перечислены наиболее популярные типы штриховых кодов.
EAN-13: Европейский товарный код (European Article Numbering System, EAN), состоит из 13 цифр.
UPC-A: универсальный товарный код (Universal Product Code, UPC), используемый в розничной торговле. Состоит из 12 цифр.
EAN-8: Европейский товарный код (European Article Numbering System, EAN), состоит из 8 цифр, обычно применяется для малых пакетов.
ITF: чередующийся штриховой код, содержащий только цифры и используемый для кодирования пар цифр в формате штрихового кода с высокой плотностью.
Code 39: самый простой из алфавитно-цифровых штриховых кодов, разработанный для самопроверки символов.
Code 128: очень эффективный алфавитно-цифровой код с высокой плотностью. Содержит контрольную сумму для целей проверки. Обычно Code 128 используется для хранения алфавитно-цифровых данных определенной длины. В нашем проекте мы будем использовать несколько случайных штриховых кодов в формате Code 128.
Схема проекта
Схема подключения к плате Raspberry Pi USB сканера штриховых кодов представлена на следующем рисунке.
В схеме мы подключили к плате Raspberry Pi ЖК дисплей 16х2 по интерфейсу I2C, на котором мы будем показывать значение штрихового кода, считанного сканером.
Схема соединений между платой Raspberry Pi и модулем I2C ЖК дисплея показана в следующей таблице.
Модуль I2C ЖК дисплея | Плата Raspberry Pi |
SDA | Pin No. 2 |
SCL | Pin No. 3 |
VCC | Pin No. 4 |
GND | Pin No. 6 |
Также она показана на следующем рисунке.
Внешний вид собранной конструкции проекта показан на следующем рисунке.
Включение интерфейса I2C в настройках Raspberry Pi
Для подключения ЖК дисплея к плате Raspberry Pi по интерфейсу I2C нам сначала необходимо включить использование данного интерфейса в настройках платы. Для этого войдем в настройки платы с помощью команды:
1 |
sudo raspi-config |
Далее войдем в настройки подключений (Interfacing options) и в них выберем пункт P5 – включение/выключение (Enable/Disable) I2C как показано на следующем рисунке.
После этого система спросит вас – “would you like the ARM interface to be enabled”? Нажмите “<Yes>” и после этого вы увидите сообщение что “The ARM I2C interface is enabled.” Далее нажмите <ok> и затем нажмите finish.
Но после этого нам необходимо еще узнать I2C адрес ЖК дисплея, используя следующую команду в терминале:
1 |
sudo i2cdetect -y 1 |
В результате выполнения этой команды вы увидите адрес I2C устройства, подключенного к контакту 27 платы.
Настройка сканера штриховых кодов
Наш сканер штриховых кодов мы настроили с помощью таблицы со штриховыми кодами, которая поставлялась в комплекте со сканером. Ее внешний вид показан на следующем рисунке. С ее помощью мы смогли установить такие основные настройки сканера как скорость передачи, триггерный режим, заводские настройки и т.д. Для этого необходимо лишь просканировать соответствующий код.
Перед тем как приступать к программированию платы Raspberry Pi убедитесь в том, что в качестве режима передачи данных в сканере установлен USB режим. В качестве режима чтения (Reading mode) должен быть выбран триггерный режим (Triggering mode), а в качестве Suffix – CR*.
Объяснение программы для Raspberry Pi
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Вначале с помощью установщика pip установим в плату пакет rpi_lcd. Автор проекта (ссылка на оригинал приведена в конце статьи) использовал просмотрщик VNC для удаленного управления платой Raspberry Pi, подключенной к той же самой Wi-Fi сети, к какой подключен его ноутбук. Для написания программы он использовал программное обеспечение THONNY с поддержкой языка python версии 3.7.3.
В программе мы первым делом подключим (импортируем) необходимые библиотеки. Мы будем использовать библиотеку Sleep для организации задержек в программе и библиотеку LCD для работы с ЖК дисплеем 16х2.
1 2 |
from time import sleep from rpi_lcd import LCD |
Далее объявим переменную item_count, в которой мы будем хранить количество просканированных в течение цикла объектов. Первоначально мы присвоим ей значение 0. В переменной scode мы будем хранить просканированный штриховой код, первоначально ее значение будет пустым.
1 2 3 |
item_count=0 #For storing the no. of scanned items scode="" #variable that will contain the scan code lcd.text("Scan the Code... ", 1) #welcome message that will display in first line of the display |
Затем в бесконечном цикле мы будем производить непрерывное сканирование штриховых кодов до тех пор пока плата не будет сброшена (reset).
В этом цикле мы будем использовать функцию input() для считывания данных со сканера штриховых кодов. Просканированный код мы будем сохранять в переменной scode в форме строки и выводить его на экран ЖК дисплея.
1 2 3 4 5 6 7 8 9 10 11 12 |
while 1: #for Endless scans scode= str(input()) #will wait to get the input from barcode reader lcd.text("Scanned Barcode is", 1) lcd.text(scode,2) #displaying Scanned Barcode on 2nd Row sleep(2) #Delay of 2 seconds lcd.text(" Item Added", 1) sleep(2) item_count=item_count+1 #count and will increase the count every time it scan a barcode IC=str(item_count) #type casting item_count from Integer to STRING lcd.text(" Total Item = ",1) lcd.text(IC,2) sleep(1) |
Также в нашем цикле мы будем инкрементировать переменную item_count с каждым просканированным объектом. Для вывода ее значения на экран ЖК дисплея мы будем использовать функцию lcd.text(), предварительно преобразовав ее в строковую переменную.
Тестирование работы проекта показано на рисунках ниже. Просканированный штриховой код будет отображаться 2 секунды на ЖК дисплее, после чего на экран дисплея будет выводиться сообщение ‘Item is added’, после чего спустя еще 2 секунды на экран ЖК дисплея будет выведено общее количество просканированных объектов.
Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы на Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
from time import sleep from rpi_lcd import LCD lcd = LCD() #inintialising the LCD by default it is for 16X2 alpha numeric Lcd item_count=0 #переменная для хранения общего количества просканированных объектов scode="" #в этой переменной будет храниться просканированный штрих код lcd.text("Scan the Code... ", 1) #приветственное сообщение на 1-й строке дисплея while 1: #for Endless scans scode= str(input()) #will wait to get the input from barcode reader lcd.text("Scanned Barcode is", 1) lcd.text(scode,2) #отображаем просканированный штрих код на 2-й строке дисплея sleep(2) #задержка на 2 секунды lcd.text(" Item Added", 1) sleep(2) item_count=item_count+1 #счетчик будет увеличиваться на 1 с каждым просканированным объектом IC=str(item_count) #преобразуем число целого типа в строку lcd.text(" Total Item = ",1) lcd.text(IC,2) sleep(1) |