RGB dioda jako USB periferie

Patrik Hubka, František Chytka, UREL, FEEC, VUT Brno
xhubka00feec.vutbr.cz, xchytk01feec.vutbr.cz

Obsah:

  1. Úvod
  2. Realizace
  3. Závěr
  4. Literatura

logo-UREL

Úvod

Je s podivem, jak rozmanité obvody lze k počítači v dnešní době připojit. Není žádnou vyjímkou, že lze sehnat i exotickou periferii k pc poměrně jednoduše, a to od USB lampiček, nabíječek, krokoměru, aromalampy až po ovládání inteligentní domovní elektroinstalace, či diagnostiky automobilu. Cílem projektu je vyzkoušet si náročnost komunikace přes sběrnici USB, "osahat" přístupy a pokusit se přenášet data z AVR do počítače a naopak. Srdcem zařázení je 8bitový kontoler AVR - ATmega8. Přenos dat je demonstrován na berevné RGB diodě. Přenesenými daty se nastavují PWM kanály konroléru a tím i jas jednotlivých barev diody.

Realizace

Do AVR je implementován virtuální port USB, který je vytvořen softwarem V-USB [2]. Komunikující aplikace, běžící na PC, je vyvinuta ve vývojovém prostředí Visual Studio 2008, a to v programovacím jazyce C#.

Hardware:
Zařízení bylo odzkoušeno na nepájivém poli. Zde se bohužel projevuje mnoho parazitních vlivů, které by se na hotové desce plošného spoje neprojevily. Fotografii zapojení ukazuje Obr.2. Na Obr.1. je vidět schéma zapojení testovaného přípravku.
pripravek
Obr.1: Schema zapojení

foto
Obr.2: Foto Přípravku

Napájení USB sběrnice je standardně 5V, ale maximální úrovně signálů jsou menší, jak ukazuje Tab.1. Proto musí být úroveň signálů D+ a D- snížena. Novější standardy musejí být se staršími zařízeními kompatibilní. Rozpoznání zařízení se s mnoha dalšími úkony provádí po připojení zařízení k PC.
Při přenosu může vznikat silné rušení, které zhorší kvalitu signálů přespříliž. Sběrnice USB je navržena tak, aby se vliv rušení eliminoval co nejvíce. Data jsou vedena dvěma vodiči - diferenčně. Objeví-li se např na D- rušivý kladný impulz, ten samý kladný impulz se objeví i na D-, protože jsou vedeny spolu. Diference vůči zemnímu potenciálu je větší, ale diference mezi datovými vodiči je nulová.

StandardLogická "L"Logická "H"
Full-Speed, Low-Speed0 - 0,3 V2,8 - 3,6 V
High-Speed -10 mV - +10 mV360 - 440 mV

Tab.1: Rozhodovací úrovně

Zařízení s novými standardy (USB2.0, 3.0), které podporují High-Speed mód, mají poměrně nízké rozhodovací úrovně. Tehdy může nastávat problém s odrazem vlny na vodiči. Při vyšších rychlostech přenosu (tedy vyšší frekvenci) se z vodiče stává vedení, po kterém se šíří vlna. Odraz vlny bude způsobovat zarušení singálu a znemožnění detekce logických úrovní. Ve standardu Low-Speed(1,5 Mb/s) a Full-Speed (12 Mb/s) není zakončení signálových vodičů definováno vůbec. Ve standardu High-Speed(480 Mb/s) je definováno zakončení datových vodičů obecným odporem. Buď je zajištěn odpor mezi oběma datovými vodiči o velikosti 90 ohm, nebo je každý zvlášť připojen ke GND odporem 45 ohm [3]. Přizpůsobení je možné realizovat běžným rezistorem. V tomto projektu, kde pracujeme s rychlostí Low-Speed, se o zakončení vodičů starat nemusíme.
Mikrokontrolér má vestěvěné tři PWM kanály. Na jejich výstupu je zapojena RGB dioda. Napětí v přímém směru je na modré a zelené diodě Uf=3,4V. Na červené diodě je Uf=1,5V. Proto jsou jejich předřadné rezistory jiné, viz schéma.
Software:
K realizaci USB zařízení byl využit software virtuálního portu implementovaný do AVR. Narozdíl od FTDI převodníků (USB/UART) není nutná dodatečná instalace ovladačů na PC a ušetří se tím velikost desky plošného spoje (kontrolér plní funkci řízení i komunikace s PC). Po softwarové stránce je naopak USB zařízení náročnější. V projektu bude využito hotového kódu pro mikrokontrolér, a to V-USB od firmy Objective Developement Software [2]. K vývoji aplikace na PC je využito Visual Studio 2008 firmy Microsoft Corp. [4]. Jako podklad pro vývoj aplikace ve Visual Studiu byl využit projekt AVR osciloskopu [1].
Všechna USB zařízení se dělí do tříd (HID, tiskárny, zvukové zařázení, flešky, atd.). V tomto projektu bude komunikující zařízení pracovat ve třídě HID (Human Interfece Device). Obecně do této třídy spadají klávesnice, myši, herní konzole, aj.
Po připojení zařízení k USB je třeba vyslat k hostiteli (PC) tzv. identifikátory. Ty určují, jaká data se přenáší, kolik bude dat v jednom přenosu, atd.
PROGMEM char usbHidReportDescriptor[USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH]={
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop) 
    0x09, 0x01,                    // USAGE (Vendor Usage 1) 
    0xa1, 0x01,                    // COLLECTION (Application) 
    0x19, 0x01,                    //   USAGE_MINIMUM (0) 
    0x29, 0x03,                    //   USAGE_MAXIMUM (3) 
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0) 
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255) 
    0x75, 0x08,                    //   REPORT_SIZE (8) 
    0x95, 0x03,                    //   REPORT_COUNT (3) 
    0x81, 0x02,                    //   INPUT (Data,Var,Abs) 
    0x19, 0x01,                    //   USAGE_MINIMUM (0) 
    0x29, 0x03,                    //   USAGE_MAXIMUM (3) 
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0) 
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255) 
    0x75, 0x08,                    //   REPORT_SIZE (8) 
    0x95, 0x03,                    //   REPORT_COUNT (3) 
    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs) 
    0xc0                           // END_COLLECTION
};
Zařízení USB se stále musí hlásit svému hostiteli. Po několikamilisekundových intervalech (běžně 10 - 100 ms) se zařázení "hlásí" pomocí finkce "usbPoll()". Jakmile zařázení tuto funkci přestane provádět, ať již kvůli chybě programu či kvůli zacyklení, je hostitel nucen toto zařízení odpojit.
Při odesílání dat hostiteli je nejprve zjištěn provoz na lince. Pokud je linka volná, jsou připravená data odeslána funkcí "usbSetInterrupt(data,délka)". Při příchodu dat od hostitele je automaticky volána funkce "usbFunctionWrite(data,délka)" jejímž parametrem je ukazatel na uložená data a délka dat.
Aplikace, vyvinutá v prostředí Visual Studio 2008 [4], by měla přijímat a odesílat data na připojené zařízení - na kontrolér AVR. Ke komunikaci s tímto HID zařízením je použita knihovna "UsbLibrary.dll", která je přiložena v [1]. Tato knihovna obsahuje všechny níže popsané funkce a procedury. K detekování připojeného zařízení je využita událost:
	private void usb_OnSpecifiedDeviceArrived(object sender, EventArgs x)
        {
           Oznámení uživateli
        }	
Naopak při odpojení zařízení se specifickým ID číslem (naše zařízení) je vyvolána událost:
	private void usb_OnSpecifiedDeviceRemoved(object sender, EventArgs x)
        {
           Oznámení uživateli
        }	
Čtení dat ze zařízení USB je automatické. Všechna data, poslaná během jednoho přenosu do PC, se uloží do operační paměti. Následně je vyvolána událost, ve které se data načtou a zpracují:
	private void usb_OnDataRecieved(object sender, DataRecievedEventArgs args)
        {
           Zpracování dat. Data jsou uložena v poli args.data[]
        }	
Odeslání dat zajišťuje funkce:
	usb.SpecifiedDevice.SendData(p1);
	
Přičemž "p1" je proměnná, která obsahuje odeslaná data. Tato musý být typu byte[] (byte array).
Tab.2: Seznam součástek
ATmega8
Xtal 12MHz
RGB-LED
USB-conA
Con-6pin-Jumper
C 22pF...2x
C 100uF
C 100nF
R 68...4x
R 200
R 1k5
R 4k7
D 1N4004
ZD 3,6V...2x
ZD 5,6V

Závěr

Při realizaci byl odzkoušen přenos dat směrem do PC, který fungoval bezchybně. Oproti tomu přenos dat z PC směrem do zařízení byl problematický. Po odeslání dat na AVR byla vyvolána funkce "usbFunctionWrite(data,délka)", však buffer "data" byl prázdný. Chyba se vyskytuje na straně zařízení. Pokud by se vyskytla chyba na straně PC, nebyl by v kontroléru přenos detekován vůbec. Aby bylo splněno zadání projektu bylo nutné původní plán koncepce pozměnit. Na PC je postupně posílána hodnota 0 až 255. V momentě, kdy se nastavený jas LED a příchozí hodnota do PC shodují, je odeslána prázdná zpráva na AVR. Jakmile zařízení detekuje přenos od PC, zastaví inkrementaci a uloží aktuální hodnotu. Tímto číslem se nastaví PWM kanál v AVR. Odpovídající barva je pak tímto kanálem řízena. Tento děj se opakuje pro všechny tři barvy RGB diody.
Toto řešení je v podstatě jednosměrné - simplexní. Lze je využít pouze pro odesílání dat ze zařízení na PC. Ukázku je možné zhlédnout zde: Ukázka - video . Programy jsou ke stažení zde: SW

Literatura

[ 1 ] The cheapest dual trace scope in the galaxy. Blogspot.com [online]. 2008-10-2 [cit. 2012-05-10]. Dostupné z: http://yveslebrac.blogspot.com/2008/10/cheapest-dual-trace-scope-in-galaxy.html
[ 2 ] V-USB: Virtual USB port for AVR® microcontrollers. OBJECTIVE DEVELOPMENT SOFTWARE GMBH. Objective Development [online]. 2012 [cit. 2012-03-26]. Dostupné z: http://www.obdev.at/products/vusb/index.html
[ 3 ] Universal Serial Bus. In: Wikipedia: the free encyclopedia [online]. San Francisco (CA): Wikimedia Foundation, 2001 [cit. 2012-04-18]. Dostupné z: http://en.wikipedia.org/ wiki/Universal_Serial_Bus
[ 4 ] Microsoft Corporation: Download Center. Microsoft Visual Studio 2008 Service Pack 1 (Installer) [online]. 2008-11-8 [cit. 2012-04-25]. Dostupné z: http://www.microsoft.com/download/en/details.aspx?id=13276