.NET Gadgeteer – USB Host

Tentokrát si zkusíme postavit část pokladního systému – pokladnu. Snad každá pokladna v současné době využívá čtečku čárového kódu pro urychlení práce se zbožím. Dále má jeden displej pro obsluhu pokladny a jeden pro zákazníka. Příklad si uděláme zatím co nejjednodušší. Budeme jen zobrazovat aktuálně načtený kód na displeji zákazníka a na velkém displeji budeme zobrazovat seznam všech načtených kódů.

Čtečka čárových kódů

Většina čteček se chová jako klávesnice, proto ji můžeme snadno připojit k modulu USB Host a chovat se k ní jako ke klávesnici. K deskám FEZ, které USB Host podporují, je dodávána řada knihoven pro různé typy USB zařízení – myš, klávesnice, webová kamera, … Každý dodaný znak z klávesnice vyvolá událost CharUp, CharDown, KeyUp, KeyDown. Událost *Char je vyvolána ve chvíli, kdy je znak z klávesnice převeditelný na Ascii kód.

Většina čteček se programuje pomocí speciálních čárových kódů dodaných se čtečkou. Je potřeba nastavit znak, který bude ukončovat načtený kód, aby bylo jeho zpracování co nejjednodušší.

clip_image002

Displej pro zákazníka

Pro displej zákazníka použijeme co nejjednodušší a nejlevnější řešení – alfanumerický LCD, 16x2 znaků s řadičem HD44780. Jedná se o snadno dostupný displej s dobře popsaným rozhraním. Pro .NET Gadgeteer je k dispozici knihovna včetně zdrojových kódů, která využívá Extender module.

clip_image004

K zapojení jsem použil nepájivé propojovací pole. Pin 3 displeje jsem připojil přes rezistor velikosti 10k Ohm pro nastavení kontrastu displeje. Pokud se displej připojí napřímo, tak je v podstatě nečitelný. To se může samozřejmě lišit u různých typů.

Displej obsluhy

Zde jsem použil dotykový displej T35. K vykreslování textu si zatím vystačíme s objektem SimpleGraphics, jak jsem popsal v předchozím článku.

Schéma zapojení

clip_image006

clip_image008

Zdrojový kód

 using System;
 using System.Threading;
 using Microsoft.SPOT;
 using Microsoft.SPOT.Presentation;
 using Microsoft.SPOT.Presentation.Controls;
 using Microsoft.SPOT.Presentation.Media;
 using Microsoft.SPOT.Touch;
  
 using Gadgeteer.Networking;
 using GT = Gadgeteer;
 using GTM = Gadgeteer.Modules;
 using Gadgeteer.Modules.GHIElectronics;
  
 using GHIElectronics.NETMF.USBHost;
  
 using FEZSerialLCD;
  
  
 namespace BarcodeReader
 {
     public partial class Program
     {
         private USBH_Keyboard _barcodeScanner;
         private string _code = String.Empty;
         private uint _line = 2;
         private SerialLCDDisplay _lcd = null;
  
         void ProgramStarted()
         {
             usbHost.KeyboardConnected += new UsbHost.KeyboardConnectedEventHandler(usbHost_KeyboardConnected);
             usbHost.KeyboardDisconnected += new UsbHost.KeyboardDisconnectedEventHandler(usbHost_KeyboardDisconnected);
  
             display.SimpleGraphics.DisplayText("Waiting for Barcode Scanner", Resources.GetFont(Resources.FontResources.NinaB), GT.Color.Blue, 10, 10);
  
             // create an LCD connection by using the Gadgeteer Extender Module
             // - connect the Externder Module to Port 14
             // - connect the HD44780 to the Extender Module (best done on a bread board)
             // * Pin 1 --> GND
             // * Pin 2 --> 5V
             // * Pin 3 --> GND (contrast, optionally use potentiometer) 
             // * Pin 4 --> P9 (Register Select RS)
             // * Pin 5 --> GND (R/W flag)
             // * Pin 6 --> P8 (Clock E)
             // * Pin 7-10 --> (unconnected)
             // * Pin 11 --> P4 (Bit 4)
             // * Pin 12 --> P5 (Bit 5)
             // * Pin 13 --> P6 (Bit 6)
             // * Pin 14 --> P7 (Bit 7)
             ExtenderModuleLCDConnection extenderConnection = new ExtenderModuleLCDConnection(this.extender);
             _lcd = new SerialLCDDisplay(extenderConnection); 
         }
  
         void usbHost_KeyboardDisconnected(UsbHost sender, USBH_Keyboard Keyboard)
         {
             display.SimpleGraphics.Clear();
             display.SimpleGraphics.DisplayText("Waiting for Barcode Scanner", Resources.GetFont(Resources.FontResources.NinaB), GT.Color.Blue, 10, 10);
         }
  
         void usbHost_KeyboardConnected(UsbHost sender, USBH_Keyboard Keyboard)
         {
             _barcodeScanner = Keyboard;
             _barcodeScanner.CharUp += new USBH_KeyboardEventHandler(_barcodeScanner_CharUp);
  
             display.SimpleGraphics.Clear();
             display.SimpleGraphics.DisplayText("Barcode Scanner connected", Resources.GetFont(Resources.FontResources.NinaB), GT.Color.Blue, 10, 10);
  
         }
  
         void _barcodeScanner_CharUp(USBH_Keyboard sender, USBH_KeyboardEventArgs args)
         {
             // ukončovací znak lze změnit na čtečce
             if (args.Key == USBH_Key.Enter)
             {
                 display.SimpleGraphics.DisplayText(_code, Resources.GetFont(Resources.FontResources.NinaB), GT.Color.Blue, 10, 11 * _line++);
                 
                 _lcd.Clear();                
                 _lcd.Print(_code);
                 
                 _code = String.Empty;
             }
             else
             {
                 _code += args.KeyAscii.ToString();
             }
         }
     }
 }

Štěpán

BarcodeReader.zip