Ergonomia ponad wszystko
Naprawdę trudno byłoby dziś znaleźć w Polsce osobę, która nie znałaby – chociażby z widzenia – wszechobecnych automatów paczkowych. Swoją niebywałą popularność zawdzięczają one łatwości odbierania przesyłek – niemal od samego początku urządzenia te były bowiem wyposażane we wbudowane skanery kodów QR, co znakomicie uprościło i przyspieszyło obsługę: wystarczy bowiem pokazać skanerowi kod (wyświetlony na ekranie smartfona lub ewentualnie wydrukowany na kartce papieru), zaś proces otwierania odpowiedniej skrytki zostanie automatycznie doprowadzony do końca.
W tego typu aplikacjach – a także we wszystkich innych zastosowaniach, w których użytkownik musi okazać maszynie odpowiedni kod kreskowy – szczególnie pożądane są rozwiązania redukujące efekt olśnienia (potocznie, choć niepoprawnie nazywanego także chwilowym oślepieniem) przez silne światło emitowane przez celownik i/lub oświetlacz skanera.
Konstrukcja silnika skanującego EM20-80 V2 (fotografie 1 i 2), będącego bohaterem tego odcinka naszego cyklu, już od samego początku procesu projektowego była przemyślana tak, by spełniać ten ważny – z punktu widzenia doświadczeń użytkownika – wymóg.
Funkcję oświetlacza pełni tutaj bowiem zestaw diod LED, współpracujących z obszernym dyfuzorem, zainstalowanym dookólnie wobec centralnie położonego obiektywu kamery CMOS.
Światło emitowane przez tak zaprojektowany układ optyczny jest zarazem na tyle łagodne, by spojrzenie prosto w czytnik nie powodowało powstawania irytujących „blików” w oczach użytkownika oraz na tyle silne, by efektywnie iluminować okazany skanerowi kod kreskowy w niemal dowolnych warunkach oświetleniowych (fotografia 3). I to właśnie jest clou tytułowego podejścia frontem do użytkownika, co w nomenklaturze stosowanej przez markę Newland określa się mianem... customer-facing.
Mało tego – zastosowanie oświetlacza z dyfuzorem pozwala uniknąć odbić w sytuacjach, gdy kod jest odczytywany np. ze smartfona – zapisy przykładowych obrazów, zarejestrowanych przez kamerę czytnika EM20-80 V2 i zgranych do aplikacji EasySet, można zobaczyć na rysunku 1, zaś oryginalne obrazy monochromatyczne – bez żadnej dodatkowej obróbki – pokazano na fotografiach 4...6.
I choć algorytmy skanerów korzystających z kolimowanej wiązki oświetlającej (takich jak np. moduł EM3296V4, opisany w poprzednim odcinku kursu) także doskonale radzą sobie ze skanowaniem kodów wyświetlanych na ekranach, to jednak w szczególnie niekorzystnych warunkach pracy brak przeszkadzających błysków zawsze będzie dodatkowym atutem, przemawiającym za implementacją czytnika typu customer-facing.
W tym miejscu należy dodać, że dyfuzor skanera EM20-80 V2 pełni także dodatkową funkcję – rozprasza bowiem światło zielonych diod LED, które sygnalizują dokonanie prawidłowego odczytu zaprezentowanego skanerowi kodu (fotografia 7). Jeżeli jednak szczególnie zależy nam na takim potwierdzeniu wizualnym, to zdecydowanie warto ustawić odpowiednio długi czas działania zielonych LED-ów – domyślnie wybrany czas (20 ms) jest bowiem na tyle krótki, że impuls w praktyce pozostaje niemal niezauważalny w typowych warunkach pracy. Nie jest to jednak żaden problem – oprogramowanie skanera umożliwia ustawienie dowolnej wartości z przedziału od 1 ms do 2500 ms – praktyczne testy wykazały, że optymalny czas załączenia diod zawiera się w przedziale od 300 ms do ok. 1 sekundy.
EM20-80 V2 w pigułce
Zanim przejdziemy do opisu implementacji modułu EM20-80 V2 w docelowym urządzeniu oraz konfiguracji czytnika za pomocą trzech różnych metod, przyjrzyjmy się najpierw najważniejszym parametrom technicznym naszego bohatera:
- dekodowanie: obsługa ok. 50 rodzajów kodów 1D i 2D,
- czujnik obrazu: kamera CMOS 640×480 px (monochromatyczna),
- oświetlacz: zestaw białych diod LED z dyfuzorem,
- sygnalizacja odczytu: zielone diody LED (za dyfuzorem) + wyjście do zewnętrznej diody LED + wyjście PWM do podłączenia buzzera,
- pole widzenia: 68° (poziomo) × 51° (pionowo),
- dopuszczalny kąt obrotu kodu w osi kamery: 360°,
- dopuszczalne nachylenie kodu w poziomie: ±45°,
- dopuszczalne nachylenie kodu w pionie: ±40°,
- minimalny kontrast wydruku: 30%,
- pobór prądu: 141 mA @ 3,3 V (w czasie skanowania), 93 mA @ 3,3 V (w trybie standby), 51 mA @ 5 V (w trybie standby),
- napięcie zasilania: 3,3...5,0 V (DC) ±5%,
- oświetlenie zewnętrzne: 0...100 000 lx,
- zakres temperatur pracy: –40°C...60°C,
- zakres temperatur przechowywania: –40°C...75°C,
- wilgotność: 5%...95% (bez kondensacji),
- gwarancja: 2-letnia.
Wymiary, montaż mechaniczny
Moduł EM20-80 V2 jest zbudowany w oparciu o prostą (a dzięki temu niezawodną) konstrukcję mechaniczną – główna płytka drukowana, widoczna na fotografii 2, jest przykręcona do korpusu wykonanego z czarnego tworzywa sztucznego. Do płytki zamocowano także samą kamerę, której obiektyw został wyprowadzony w środkowej części dyfuzora, wytworzonego z mlecznobiałego tworzywa. Na jego zewnętrznym obwodzie umieszczono dodatkowo miękką uszczelkę – w trakcie integracji docelowego systemu należy tak zamontować silnik skanujący, by uszczelka pozostawała bezpośrednio dociśnięta do okna optycznego – pozwoli to uniknąć jakichkolwiek niepożądanych odbić wewnętrznych oraz akumulacji zanieczyszczeń (kurzu, wilgoci czy małych owadów, mogących dostać się do wnętrza obudowy urządzenia). Do zamocowania modułu w docelowej obudowie przewidziano cztery otwory montażowe, rozmieszczone symetrycznie na wystających uszach i przystosowane do użycia ze śrubami M3 lub podobnymi. Rysunek 2 prezentuje najważniejsze wymiary zewnętrzne czytnika.
Wybierając materiał osłonowy (okno optyczne), należy dopilnować, by jego powierzchnia była odpowiednio twarda i odporna na zarysowania. Producent zaleca zastosowanie szkła akrylowego (PMMA), tworzywa ADC (CR-39, czyli węglanu allilodiglikolu) bądź chemicznie wzmocnionego szkła. Minimalna transmitancja to 92%, zaś grubość powinna mieścić się w zakresie od 0,8 do 2,0 mm. Więcej szczegółów na temat parametrów materiałowych okna optycznego można znaleźć w dokumentacji [1].
Zasilanie, interfejsy elektryczne i pierwsze uruchomienie
Skaner EM20-80 V2 jest wyposażony w trzy złącza udostępniające zarówno linie zasilania, jak i interfejsy szeregowe oraz dodatkowe sygnały sterujące. Największe możliwości daje 12-pinowe gniazdo ZIF, współpracujące z taśmami FPC ze specjalnymi wycięciami blokującymi po obydwu stronach usztywniacza – podłączając przewód do tego gniazda, należy zatem zwrócić uwagę, czy wycięcia znalazły się za zaczepami, wykonanymi po obu stronach slotu w gnieździe (fotografia 8).
Prawidłowo wykonane połączenia pomiędzy silnikiem skanującym a płytką ewaluacyjną pokazano na fotografii 9, zaś układ wyprowadzeń opisano w tabeli 1.
Pozostałe dwa złącza to niewielkie, 4-pinowe gniazda rastrowe typu 1.25T-4AWB marki Fuzhou Aoke Electronics Co. Ltd, o konstrukcji zbliżonej do gniazd z serii PicoBlade marki Molex – tutaj także mamy bowiem do czynienia z charakterystycznymi, płaskimi stykami, które na dodatek ustawione są w dokładnie takim samym rozstawie równym 1,25 mm.
Pierwsze z nich – znajdujące się obok złącza ZIF – pozwala skorzystać z interfejsu RS-232 (tabela 2), zaś drugie (zamontowane na prostopadłym boku płytki drukowanej) udostępnia szynę USB (tabela 3).
Dla maksymalnego ułatwienia implementacji w docelowym systemie producent wprowadził do sprzedaży gotowe kable USB (fotografia 10) oraz RS-232, pozwalające w prosty sposób podłączyć skaner do komputera bądź innego urządzenia nadrzędnego. W przypadku instalacji modułu w bezpośredniej bliskości płyty głównej lepszym wyborem będzie natomiast skorzystanie z gniazda ZIF i przewodu FPC – w takim przypadku możemy bowiem zapewnić obsługę wszystkich dodatkowych linii, w tym wyprowadzeń sterujących zewnętrznym buzzerem, diodą LED, liniami kontrolującymi transmisję UART (RTS, CTS), a także obwodami resetu i zewnętrznego wyzwalania skanu.
Czytnik EM20-80 V2 jest domyślnie skonfigurowany w trybie emulacji urządzenia USB HID, a ściślej rzecz ujmując – klasycznej klawiatury komputerowej. Po podłączeniu kompletnego zestawu ewaluacyjnego do komputera PC za pomocą kabla USB z wtykiem typu B możemy od razu rozpocząć testy skanera – odczytanie kodu zostanie potwierdzone 20-milisekundowym błyskiem zielonych diod LED i 80-milisekundowym dźwiękiem buzzera o częstotliwości 2730 Hz. Poszczególne znaki, zapisane w zeskanowanym kodzie, zostaną przesłane jeden po drugim do komputera, bez dodatkowych opóźnień pomiędzy nimi. Istnieje oczywiście także możliwość podłączenia czytnika za pomocą wbudowanego portu USB oraz kabla pokazanego na fotografii 10 – wtedy jednak nie będziemy mogli skorzystać z udostępnianych przez zestaw ewaluacyjny, zewnętrznych elementów interfejsu użytkownika: przycisków resetowania i wyzwalania czy też buzzera i diody LED, potwierdzających dokonanie odczytu.
Konfiguracja za pomocą predefiniowanych kodów kreskowych
Podobnie jak w przypadku większości (jeśli nie wszystkich) współczesnych czytników kodów kreskowych, także skaner EM20--80 V2 daje możliwość konfiguracji setek parametrów i funkcji, udostępnianych przez oprogramowanie silnika skanującego, za pomocą predefiniowanych kodów „serwisowych”, których kompletną listę można znaleźć w dokumentacji [2].
Przykład 1. Zmiana częstotliwości buzzera
Oprogramowanie czytnika umożliwia ustawienie częstotliwości sygnału akustycznego (potwierdzającego dokonanie prawidłowego skanu) w zakresie od 20 Hz do 20 kHz. Załóżmy, że z uwagi na zastosowany rodzaj przetwornika chcemy zwiększyć wartość tego parametru z domyślnej 2,73 kHz na 4,2 kHz (czyli najwyższą predefiniowaną).
W tym celu wskazujemy czytnikowi następujące kody, znajdujące się na stronie 14 dokumentacji [2]:
- Enter Setup – wejście w tryb programowania,
- High (4200Hz) – ustawienie właściwego parametru,
- Exit Setup – powrót do normalnego trybu pracy.
Aby sprawdzić, czy ustawienie zostało prawidłowo zapisane, wystarczy teraz zeskanować dowolny „zwykły” kod kreskowy 1D lub 2D (inny niż kody specjalne zawarte w [2]) – od razu da się zauważyć, że częstotliwość sygnału dźwiękowego uległa wyraźnemu podwyższeniu.
Przykład 2. Zmiana trybu skanowania
Domyślny tryb skanowania ustawiony w oprogramowaniu modułu to „Sense Mode” – czytnik monitoruje obraz rejestrowany przez kamerę i w razie relatywnie intensywnej zmiany (mogącej sugerować, że przed czytnikiem pojawił się kod) procesor załącza podświetlenie i dokonuje próby wykrycia kodu. W niektórych sytuacjach znacznie lepszym wyjściem jest skorzystanie z jednego z pozostałych trzech trybów pracy:
- Level Mode (tryb wyzwalany poziomem logicznym) – ustawienie stanu aktywnego (niskiego) na wejściu wyzwalającym nTRIG powoduje rozpoczęcie sesji dekodowania, która trwa aż do momentu dokonania odczytu (wykrycia i zdekodowania kodu) lub do powrotu linii nTRIG w stan nieaktywny (wysoki).
- Pulse Mode (tryb impulsowy) – analogicznie jak w poprzednio opisanym trybie, jednak z tą różnicą, że rozpoczęcie sesji ma miejsce po chwilowej aktywacji, a następnie dezaktywacji linii nTRIG.
- Continuous Mode (tryb ciągły) – silnik skanujący automatycznie przemiata obraz z kamery w poszukiwaniu kodów i dekoduje je przez cały czas, niezależnie od tego, czy zawartość kodu zmieniła się, czy nie – powoduje to, że w czasie dłuższej prezentacji niezmiennego kodu (np. wydrukowanego lub statycznie wyświetlonego na ekranie smartfona) skaner będzie wielokrotnie wysyłał do urządzenia nadrzędnego ten sam ciąg znaków.
Dla przykładu zastosujemy tryb ciągły – w tym celu skanujemy kody znajdujące się na stronie 16 dokumentacji [2]:
- Enter Setup,
- Continuous Mode,
- Exit Setup.
Po 3 sekundach od zakończenia cyklu programowania czytnik włączy ciągłe podświetlenie i rozpocznie skanowanie.
Uwaga! Przed wykonaniem tego eksperymentu warto najpierw włączyć na komputerze dowolny edytor tekstowy (np. notatnik) i ustawić kursor na pustej stronie, gdyż ciągłe przesyłanie rozmaitych znaków w trybie emulacji klawiatury może spowodować niespodziewane zachowanie innych włączonych aplikacji (np. przeglądarki plików czy przeglądarki internetowej) – wynika to z prostego faktu: niektóre skróty klawiszowe mają postać… pojedynczych liter, niewzbogaconych o klawisze specjalne (np. Shift, Ctrl czy Alt).
Włączenie trybu ciągłego skanowania przy pozostawionych domyślnych pozostałych ustawieniach może być dość niewygodne z uwagi na generowanie „ściany tekstu” w czasie prezentowania kodu czytnikowi. Aby szybko powrócić do bezpiecznych ustawień domyślnych, można posłużyć się kodem Restore All Factory Defaults, dostępnym na stronie 32 [2].
Obsługa programowania wsadowego
Nie ulega wątpliwości, że o ile zmiana pojedynczych ustawień za pomocą osobnych kodów serwisowych jest dość wygodna, o tyle już pełna konfiguracja skanera – odpowiednia do potrzeb docelowej aplikacji – byłaby niezwykle mozolna i pracochłonna. Dlatego też czytniki marki Newland są wyposażane w tzw. tryb programowania wsadowego (Batch Programming). Cała zabawa polega na tym, by przygotować odpowiedni ciąg znaków, łączący ze sobą wiele osobnych komend, a następnie wygenerować na jego podstawie dwuwymiarowy kod w formacie PDF417, QR Code lub Data Matrix – programowanie nastaw z jego użyciem będzie procesem nieporównanie szybszym i łatwiejszym niż osobne wpisywanie kolejnych poleceń i wertowanie prawie 300-stronicowej dokumentacji.
Składnia kodu wsadowego to w istocie ciąg znaków złożony z prefiksu („@”), po którym następują kolejne komendy rozdzielone średnikami (bez spacji!).
Załóżmy w tym momencie, że chcemy zmienić następujące ustawienia:
- czas świecenia zielonych diod LED po prawidłowym odczycie wydłużamy do 320 ms,
- dezaktywujemy buzzer (całkowicie wyłączamy sygnał potwierdzenia odczytu oraz melodyjkę odtwarzaną po włączeniu zasilania lub zresetowaniu modułu).
Jeżeli mamy już wybrane funkcje, które chcemy zmodyfikować, odszukujemy w dokumentacji odpowiednie kody serwisowe. Pod każdym z nich znajduje się alfanumeryczny ciąg znaków, rozpoczynający się od znaku „@” – i tak, dla zmiany czasu świecenia zielonych LED-ów jest to komenda:
- @GRLDUR320,
w przypadku wyłączenia sygnału dźwiękowego odtwarzanego po włączeniu modułu odnajdujemy polecenie:
- @ PWBENA0
zaś wyłączenie sygnału potwierdzenia odczytu odbywa się przy użyciu ciągu znaków:
- @GRBENA0
Teraz wystarczy „skleić” ze sobą wszystkie trzy polecenia, pamiętając jedynie o tym, że znak „@” wpisujemy tylko raz na początku komendy. Otrzymujemy następujące polecenie wsadowe:
- @GRLDUR320;PWBENA0;GRBENA0
Teraz wystarczy już tylko utworzyć odpowiedni kod – w tym celu możemy skorzystać np. z darmowego generatora kodów QR, dostępnego online pod adresem: https://qr.io i widocznego na rysunku 3.
Uwaga – należy wybrać zakładkę „Text”, gdyż w innym przypadku do właściwego ciągu znaków zostaną doklejone dodatkowe znaki, które uniemożliwią poprawne działanie funkcji programowania wsadowego.
Po wpisaniu naszej komendy i odczekaniu krótkiej chwili, naszym oczom ukaże się gotowy kod QR, integrujący trzy wybrane przez nas polecenia.
Teraz wystarczy już tylko przejść na stronę 238 dokumentacji [2], a następnie zeskanować kody:
- Enter Setup,
- Enable Batch Barcode,
- QR (wygenerowany przed chwilą na stronie https://qr.io),
- Exit Setup.
Tryb wsadowy stanowi niebywałe ułatwienie podczas programowania powtarzalnych konfiguracji, np. w produkcji seryjnej czy serwisie urządzeń. Co jednak począć, jeżeli urządzenie nadrzędne powinno móc samodzielnie zmieniać konfigurację modułu skanującego już na etapie eksploatacji? I tutaj właśnie dochodzimy do kolejnej funkcjonalności, oferowanej przez czytniki OEM marki Newland – programowania za pomocą interfejsu szeregowego UART (RS232) lub USB CDC.
Programowanie przez interfejs szeregowy
W poprzedniej części naszego kursu wspomnieliśmy już o możliwości przestawienia trybu komunikacji czytników OEM, z czego korzystaliśmy zresztą w celu odczytu znaków za pomocą interfejsu szeregowego UART lub USB w trybie CDC (wirtualny port szeregowy). Teraz jednak nie będziemy odbierać, ale… wysyłać dane do naszego czytnika. W tym celu musimy skonfigurować go do odpowiedniego trybu pracy – najprościej będzie zastosować tryb USB CDC, który możemy włączyć kodem znajdującym się na stronie 63 dokumentacji [2].
Zanim jednak włączymy program terminalowy, by połączyć się z modułem i wysłać do niego komendę konfiguracyjną, zapoznajmy się pokrótce ze składnią poleceń, która w tym przypadku będzie nieco bardziej złożona niż w klasycznym trybie wsadowym z użyciem kodów programujących 2D. Powiedzmy, że chcemy przywrócić wyłączoną wcześniej obsługę buzzera.
Składnia podstawowej komendy programującej ma postać:
Prefix Storage type Tag SubTag Data Suffix
- Prefix – stały ciąg znaków o postaci „~<SOH>0000”, gdzie <SOH> to kod specjalny ASCII o nazwie Start of Header (0x01),
- Storage type – określa tryb zapisu polecenia i przyjmuje dwie wartości: „@” (zapis do pamięci nieulotnej) lub „#” (zapis do pamięci RAM, tracony po resecie lub utracie napięcia zasilającego),
- Tag – trzyliterowy kod określający, do której grupy funkcjonalnej należy polecenie; w praktyce są to po prostu trzy pierwsze znaki „nazwy” danej komendy,
- SubTag – druga część nazwy polecenia, definiująca konkretną komendę z danej grupy,
- Data – dane do zapisu (np. wartość liczbowa),
- Suffix – stały ciąg znaków „;<ETX>”.
Powyższa ramka, utworzona dla komendy @GRBENA1 (oznaczającej tymczasowe włączenie obsługi buzzera), przyjmuje następującą postać heksadecymalną:
7E 01 30 30 30 30 23 47 52 42 45 4E 41 31 3B 03
I to wszystko! Tak przygotowany ciąg znaków wystarczy przesłać za pomocą dowolnego programu terminalowego (obsługującego zapis szesnastkowy) do naszego modułu. Należy pamiętać, że domyślne nastawy interfejsu USB CDC to 9600 8N1, czyli 9600 baud, 8 bitów danych, brak obsługi parzystości i jeden bit stopu.
Prawidłowo zinterpretowana komenda zostanie natychmiast wdrożona, a potwierdzeniem tego faktu będzie zwrócenie przez czytnik nieco krótszego ciągu znaków – jego interpretację (w oparciu na dokumentacji [2]) pozostawiamy naszym Czytelnikom jako swego rodzaju zadanie domowe do samodzielnego wykonania.
Podsumowanie
W artykule zaprezentowaliśmy interesujący przykład nowoczesnego czytnika modułowego OEM o obszernym zakresie wbudowanych funkcjonalności i szerokich możliwościach konfiguracji. Warto bowiem wiedzieć, że oprócz programowania za pomocą kodów predefiniowanych i wsadowych oraz komend szeregowych, konfigurację modułu można zrealizować także za pośrednictwem oprogramowania EasySet, które opisaliśmy już w poprzednim odcinku niniejszego cyklu.
inż. Przemysław Musz, EP
- EM20-80V2 OEM scan engine integration guide [https://t.ly/TwGdr]
- EM20-80V2 OEM scan engine user guide [https://t.ly/h3bWB]