Obsługa czytnika kodów kreskowych w języku Python na Raspberry Pi

Praktycznie codziennie spotykamy się z różnego rodzaju kodami kreskowymi. Mimo że zazwyczaj nie zwracamy na nie uwagi, to pełnią one bardzo ważną rolę w dzisiejszym świecie – identyfikacja produktów w sklepie, przepływ paczek w centrach logistycznych czy też odpowiednie rozprowadzenie komponentów na procesach produkcji. W każdym z tych obszarów wykorzystywane są kody kreskowe, między innymi dzięki ich prostocie. Niewielkich rozmiarów kod może być łatwo zeskanowany przez automatyczny skaner lub operatora wyposażonego w odpowiedni sprzęt.

Na rynku dostępnych jest wiele gotowych urządzeń skanujących, ale istnieją również niewielkie moduły, które możemy bez problemu zintegrować z projektowanym sprzętem. Właśnie jednej z takich konstrukcji przyjrzymy się dzisiaj nieco bliżej.

Czym są kody kreskowe?

Książkowy kod kreskowy

Jednak zanim przejdziemy do skanerów, odpowiedzmy sobie na pytanie, czym w zasadzie jest kod kreskowy. Mówiąc najprościej, jest to graficzne odzwierciedlenie pewnych informacji zapisanych jako ciąg jasnych i ciemnych kresek. Wielkość, szerokość czy też ogólny wygląd kodu definiują sztywne normy. Warto też wiedzieć, że obecnie najczęściej spotkać możemy się z liniowymi kodami jednowymiarowymi (taki jak na zdjęciu) oraz dwuwymiarowymi kodami QR.

W kodzie kreskowym każda cyfra składa się z siedmiu takich samych bloków, w czarnym lub białym kolorze. Szerokość każdego pasku zależy od tego, jaki znak chcemy zapisać. Przyjęło się, że każda cyfra reprezentowana jest przez dwa białe i dwa czarne paski, ułożone zawsze w ten sam sposób – biały – czarny – biały – czarny. 

Przykładowy kod QR

Nieco inaczej wygląda to w kodach QR. Przy tych dwuwymiarowych kodach informacje numeryczne i alfanumeryczne zapisywane są w postaci czarnych i białych kwadratów reprezentujących odpowiednie wartości binarne. Poza tym każdy kod QR zawiera też trzy nieco większe kwadraty, będące znacznikami pozycji. Dzięki nim wiadomo gdzie znajduje się początek zapisanych informacji.

Jak działa skaner kodów kreskowych?

Głowica skanująca

Zatrzymajmy się jeszcze na moment przy samym procesie skanowania i odpowiedzmy na pytanie, jak taki skaner działa. Każde urządzenie skanujące oparte jest tak naprawdę na dwóch elementach diodzie laserowej lub diodzie LED o dużej jasności i fotodetektorze. Dioda laserowa lub LED emituje wiązkę światła, która trafia na soczewkę rozpraszającą. Gdy na drodze rozproszonego światła, znajdzie się kod kreskowy to światło zostanie odbite, ale tylko przez białe części kodu, ciemne kreski pochłoną całe światło. Można powiedzieć, że każdy skaner reaguje tak naprawdę na wolne przestrzenie między czarnymi paskami kodu kreskowego. Odbita i poszatkowana przez kod kreskowy wiązka światła trafia dalej na fotodetektor. Jego zadaniem jest rozpoznać, gdzie w kodzie kreskowym umieszczone zostały kreski czarnego koloru i na tej podstawie wygenerować sygnały elektryczne przetwarzane później przez pozostałą elektronikę skanera. W przypadku skanowania kodów QR sytuacja wygląda identycznie z tą różnicą, że światło odbijane jest przez białe kwadraty, a nie kreski.

Czasami skaner może być wyposażony w trzeci element, czyli dodatkową emitującą białe światło diodę LED. Jej zadaniem jest doświetlić skanowany kod, tak aby maksymalnie zniwelować możliwy błąd w odczycie. 

Skaner GM65

Moduł GM65

Urządzeniem, które pozwoli nam dziś zeskanować kilka kodów kreskowych, będzie moduł skanujący o oznaczeniu GM65. Jest to niewielkie urządzenie, potrafiące skanować kody kreskowe jak i dwuwymiarowe QR. Poniżej możecie zobaczyć kilka najważniejszych parametrów technicznych tego sprzętu.

  • Napięcie zasilania: 5 V DC
  • Prąd znamionowy: 160 mA
  • Kąt skanowania: 34° (w poziomie), 26° (w pionie)
  • Minimalny kontrast: 30%
  • Interfejsy: UART i USB
  • Wspierane standardy kodów jednowymiarowych: Code 11, Code 39/Code 93, UPC/EAN, Code 128/EAN128, Interleaved 2 of 5, Matrix 2 of 5, MSI Code, Industrial 2 of 5, GS1 Databar(RSS)
  • Wspierane standardy kodów dwuwymiarowych: QR, Data Matrix, PDF417
  • Zakres temperatury pracy: od 0°C do 50°C
  • Wymiary 46,8mm x 27,5mm x 11,8mm

GM65 zasilany jest napięciem 5V i wspiera dwa standardy komunikacji. Najprościej jest podpiąć urządzenie dedykowanym przewodem USB, wówczas traktowane jest ono jak klawiatura. Jeśli jednak chcemy zintegrować urządzenie z, na przykład mikrokontrolerem łatwiej jest wykorzystać wbudowany interfejs UART, którym skaner wysyła przetworzony na ciąg znaków kod kreskowy.

Warto też wspomnieć, że moduł wyposażony jest w brzęczyk oraz pojedynczy przycisk pozwalający włączyć i wyłączyć urządzenie.

Konfiguracja skanera

Aby skaner mógł pracować poprawnie, należy go odpowiednio skonfigurować. Proces ten realizowany jest poprzez skanowanie odpowiedniego kodu QR, najważniejsze kody umieściłem poniżej, ale w dokumentacji można znaleźć ich znacznie więcej. Jeśli będziecie skanować kody prosto z ekranu komputera, polecam zasłonić białą diodę LED, ponieważ skaner nie zawsze łapie kody, gdy ta oświetla matrycę LCD. Po poprawnym zeskanowaniu kodu konfiguracyjnego na module zaświeci się niebieska dioda LED.

Pierwsze trzy kody pozwalają wybrać sposób komunikacji z skanerem, oraz przywrócić go do ustawień fabrycznych.

Dzięki kolejnemu zestawowi kodów możemy zmodyfikować czas odstępu miedzy kolejnym skanowaniem.

Kody powyżej umożliwiają sterowanie białą, doświetlającą diodą LED.

Kolejne kody służą do sterowania buzzerem.

GM65 i Raspberry Pi

Poza podłączeniem skanera wprost do portu USB komputera, możemy połączyć go z dowolnym mikrokontrolerem lub procesorem wyposażonym w interfejs UART lub USB. Aby pokazać wam, jak taka komunikacja wygląda, uruchomię prosty kod w języku Python, który będzie odbierał dane z GM65 i wyświetlał je w terminalu.

Opis wyprowadzeń Raspberry Pi (ElectronicWings)

Do płytki Raspberry Pi skaner możemy podłączyć w dwojaki sposób. Bezpośrednio do pinów Tx/Rx, które wyprowadzone są na złączu GPIO lub do portu USB. Niezależnie, który ze sposobów wybierzemy, to kod obsługujący GM65 będzie wyglądać identycznie, jest tak, ponieważ urządzenie zawsze będzie rozpoznawane jako port szeregowy. 

Aktywacja interfejsu UART

Jeśli chcesz podłączyć skaner bezpośrednio pod wyprowadzenia GPIO, musisz wcześniej aktywować interfejs UART. Podłączając urządzenie pod port USB, można pominąć ten proces. 

sudo raspi-config

Aktywację UARTa zaczynamy od wpisania komendy widocznej powyżej w terminalu. Uruchomiona ona prosty interfejs konfiguracyjny naszego Raspberry.

Na początek wybieramy opcję interfejsu.

Następnie klikamy opcje Serial Port.

Gdy Raspberry zapyta nas czy chcemy logować się do „shell” przez serial port, wybieramy opcję Nie.

W kolejnym kroku wybieramy opcję TAK, w ten sposób aktywujemy sprzętowy serial port.

Identyfikacja portu

Na końcu otrzymujemy podsumowanie wprowadzonych zmian, po wybraniu OK, wracamy do startowego ekranu. Zamykając go Raspberry może poprosić o restart, zgadzamy się na to.

ls -l /dev

Chcąc odczytywać dane wysyłane przez skaner, musimy wiedzieć na jaki port będą one wysyłane. W tym celu należy uruchomić w terminalu widoczną powyżej komendę.

Okno terminalu po uruchomieniu polecenia ls.

Urządzenie zostało zidentyfikowane jako serial0 i automatycznie nadano mu nazwę ttyS0. Takie właśnie oznaczenie powinno widnieć również na waszym sprzęcie, chyba że podłączyliście również inne sprzęty komunikujące się poprzez port szeregowy. Poza tym w każdym Raspberry aktywny jest również port serial1 (ttyAMA0), jest to wlutowany na PCB moduł Bluetooth/WIFI.

Obsługa skanera w Pythonie

Obsługa skanera kodów kreskowych w języku Python jest dość prosta i nie wymaga dużej znajomości tego języka.

import serial

Zaczynamy od dodania jednej z wbudowanych bibliotek, jaką jest serial. Dzięki niej możliwa jest obsługa urządzeń komunikujących się poprzez port szeregowy.

ser = serial.Serial("/dev/ttyS0", 9600)

Następnie musimy odpowiednio zdefiniować nasz interfejs, jego nazwą będzie po prostu ser. W nawiasie umieszczone zostały dwa najważniejsze parametry, czyli nazwa portu, z jakim chcemy się połączyć oraz prędkość. Funkcja ta może przyjmować jeszcze kilka innych zmiennych, takich jak ilość bitów czy kontrola parzystości, ale w tym projekcie nie ma potrzeby ich określania.

while True:
    rec_data = ser.read()
    print(rec_data) 

Główną część programu stanowi nieskończona pętla while z dwiema funkcjami wewnątrz. Pierwsza z nich do zmiennej rec_data przypisuje odczytaną z portu szeregowego zmienną. Dalej dzięki poleceniu print możemy odczytane dane zobaczyć w oknie terminalu.

Okno terminalu po uruchomieniu skryptu

Po uruchomieniu kodu i zeskanowaniu dowolnego kodu w terminalu powinna pojawić się jego cyfrowa reprezentacja. Musicie przyznać, że uruchomienie tego typu skanera jest naprawdę proste, a w połączeniu z odpowiednim systemem daje on naprawdę sporo możliwości. Można przykładowo dość łatwo zbudować prosty system magazynowy, na części elektroniczne połączony z bazą danych. Możliwości jest wiele, bo kody kreskowe to bardzo uniwersalny sposób kodowania informacji.

Istnieje całkiem sporo różnego rodzaju systemów inteligentnego domu, zwanych również smart home. Każdy ma swoje wady i zalety, a wybór odpowiedniego systemu zależy tak naprawdę od indywidualnych preferencji użytkownika. Jednym z takich systemów jest HomeKit od firmy Apple. W tym oraz kolejnych materiałach z tej serii chciałbym opowiedzieć wam nieco o sposobie integracji HomeKita i dobrze wszystkim znanych modułów ESP8266. Pokaże wam jak skonfigurować taki moduł, tak aby jego działaniem można było sterować z poziomu iPhona, MacBooka lub Apple Watcha. Poza tym do wyjść naszego mikrokontrolera podłączymy różnego rodzaju moduły peryferyjne, których działaniem będzie sterować ESP.

W ostatnim czasie próbuje swoich sił w nieco bardziej profesjonalnym fotografowaniu elektroniki. Wykonując zdjęcia, starałem się wymuszać konkretny rodzaj oświetlenia kilkoma panelami z diodami WS2812B, sterowanymi przez Arduino. Jednak ciągła zmiana kodu jest dość męcząca, dlatego zbudowałem proste urządzenie sterujące tego typu diodami.

Źródła:

  • https://how2electronics.com/barcode-qr-code-reader-using-arduino-qr-scanner-module/
  • https://www.dfrobot.com/product-1996.html
  • https://www.posnet.com.pl/rodzaje-i-budowa-kodow-kreskowych
  • https://en.wikipedia.org/wiki/Barcode
  • https://www.posnet.com.pl/jak-dziala-skaner-kodow-kreskowych
  • https://raw.githubusercontent.com/DFRobot/DFResources/master/Others/DFR0660%20Datesheet.pdf
  • https://www.dfrobot.com/product-1996.html

Chcesz być na bieżąco?
Dołącz do newslettera

Otrzymywać będziesz powiadomienia o nowych artykułach oraz informacje o projektach, nad którymi pracuję.

Leave a Comment

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Przewiń do góry