Czytnik kodów kreskowych i QR na Arduino

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 Arduino

Skaner podłączony do mikrokontrolera

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

Skaner postanowiłem podłączyć do płytki Teensy 3.5 (link) tak naprawdę z dwóch powodów. Głównym jest fakt, że płytka posiada kilka interfejsów UART, dzięki czemu bez problemu można podłączyć ją do komputera oraz modułu GM65. W przypadku na przykład Arduino UNO nie jest to takie proste, ponieważ ATmega328, którą tam zainstalowano ma tylko jeden UART, dzielony z interfejsem USB. W takim przypadku bez tzw. software serialu się nie obejdzie. Poza tym płytki Teensy już dość długo nie uruchamiałem, co było kolejnym argumentem, żeby właśnie do niej podłączyć skaner.

Fizycznie podłączenie modułu nie jest niczym trudnym, musimy tylko podłączyć zasilanie, a porty Tx, Rx modułu połączyć z Rx i Tx mikrokontrolera.

#include <Arduino.h>  //Library included in VSC

void setup()
{
  Serial.begin(9600);  //communication with the computer
  Serial1.begin(9600); //communication with GM65 module
}
 
void loop()
{
  if (Serial1.available()) //Checking if any data has been received
  {
    while (Serial1.available()) //Read bit by bit until UART buffer is empty
    {
      char input = Serial1.read(); //Writing the received data to the input variable
      Serial.print(input); //Display input variable
      delay(5);
    }
    Serial.println(); //Move to a new line
  }

}

Obsługa skanera jest dość prosta i opiera się na podstawowej funkcjonalności interfejsu UART. Na początku oczywiście musimy zdefiniować dwa porty szeregowe, jeden do komunikacji z komputerem, drugi z modułem skanującym. W głównej pętli programu sprawdzamy, czy port szeregowy odebrał jakieś dane, jeśli tak uruchamia się pętla while, która przypisuje do zmiennej input odebrane dane, jednocześnie wysyłając je na drugi port szeregowy. Po całej operacji dzięki poleceniu Serial.println(); kursor w porcie szeregowym komputera przechodzi do nowej linii. 

Dane odebrane na komputerze

Po uruchomieniu projektu można zobaczyć zeskanowany przez czytnik kod w postaci ciągu znaków. 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. 

Jestem pewien, że w głowie każdego, kto pracował z płytkami Arduino, pojawił się w pewnym momencie pomysł, aby zbudować własną stację meteorologiczną. Tego typu projekty najczęściej opierają się na najprostszych czujnikach temperatury, wilgotności ewentualnie ciśnienia. Czasami dodawany jest również moduł umożliwiający pomiar prędkości wiatru. Jednak praktyczni żaden projekt nie jest wyposażony w czujnik mogący wykrywać wyładowania atmosferyczne. Jest to dość dziwny stan rzeczy, biorąc pod uwagę, że uruchomienie tego typu modułu w środowisku Arduino jest bardzo proste.

Na rynku istnieje bardzo wiele różnego rodzaju wyświetlaczy - LCD, LED, OLED itd. Z większością z nich spotykamy się na co dzień, ale istnieją również nieco inne bardziej klasyczne konstrukcje, takie jak HPDL-1414.

Źródła:

  • https://how2electronics.com/barcode-qr-code-reader-using-arduino-qr-scanner-module/
  • https://www.dfrobot.com/product-1996.html
  • https://www.pjrc.com/store/teensy35.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

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

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

2 thoughts on “Czytnik kodów kreskowych i QR na Arduino”

  1. Hello,
    The code doesn’t work for me. I get an error:

    C:\Users\Lenovo\Desktop\shop\shop.ino: In function 'void setup()’:

    shop:9:3: error: 'Serial1′ was not declared in this scope

    Serial1.begin(9600); //communication with GM65 module

    ^~~~~~~

    C:\Users\Lenovo\Desktop\shop\shop.ino:9:3: note: suggested alternative: 'Serial’

    Serial1.begin(9600); //communication with GM65 module

    ^~~~~~~

    Series

    C:\Users\Lenovo\Desktop\shop\shop.ino: In function 'void loop()’:

    shop:14:7: error: 'Serial1′ was not declared in this scope

    if (Serial1.available()) //Checking if any data has been received

    ^~~~~~~

    C:\Users\Lenovo\Desktop\shop\shop.ino:14:7: note: suggested alternative: 'Serial’

    if (Serial1.available()) //Checking if any data has been received

    ^~~~~~~

    Series

    exit status 1

    'Serial1′ was not declared in this scope

    This report should contain more information if in
    File -> Preferences option „Show
    detailed information during compilation”

Leave a Comment

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

Przewiń do góry