Gadgeteering aneb zábava pro pořádné chlapy

Vše ostatní - tiskárny, skenery, zdroje, klávesnice, myši, herní zařízení, skříně a další.

Moderátor: L4mka

webwalker
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. úno 2010
Bydliště: Buranov vedle Prahy

Gadgeteering aneb zábava pro pořádné chlapy

Příspěvek od webwalker »

Tak co, už vás omrzelo hraní her, které jsou stále a dokola na jedno brdo?
Nevíte, co s volným časem a chcete zábavu (někdy i s pořádnou porcí adrenalínu), která vám vydrží mnohem déle než přitroublé střílečky?
Umíte, či chcete se naučit programovat jen tak pro vlastní zábavu a potěšení (někdy i celé rodiny)?
Pokud ano, pak jste v tomto vláknu správně a doufám, že se tu nebudete nudit :)
Pokud ne, nemá cenu abyste v dalším čtení pokračovali a přeju vám hodně štěstí do dalších levelů vaší oblibené hry :)

Gadgeteering - jednoduše "hračičkování"
Už jste někdy přemýšleli o tom jak vůbec fungují takové věci třeba jako ovládání topení ve vašem domě přes internet? Automatické zavlažování zahrady? Nebo jak to, že je možné ovládat nějaké autíčko přes mobil? Jak vlastě fungují roboti či droni? Chtěli byste si něco podobného nebo i lepšího postavit sami, jen si myslíte, že to je hrozně složité a že byste to sami nedokázali? Omyl, tak složité to není a vy to s přehledem dokážete!

"Hračičkování" je tedy vlastně vytváření jak smysluplných, tak i naprosto šílených elektronických zařízení (Gadgetů), které se vám zrodily v hlavě když jste měli zrovna upito :)
Samozřejmě pokud vás napadne něco opravdu originálního, můžete si tak přijít i k nemalým penízkům. Krásným příkladem a ukázkou pěkného Gadgeteeringu je projekt Sphero.
http://www.youtube.com/user/gosphero

Takže ať neztrácíme čas, co budeme na ty naše blbůstky potřebovat:
Určitě jste už někdy slyšeli nebo na internetu narazili na výrazy jako Arduino, Raspberry PI nebo NET Gadgeteer. Co to je?
No nic překvapivého. Jsou to všechno jen mikropočítače, ke kterým budeme přidávat nějaké moduly (u Arduina Shieldy) a následně programovat tak, abychom docílili námi zamýšlené funkčnosti.

Takhle nějak vypadá porovnání jednotlivých systémů:
Obrázek
Arduino Pro Mini, Arduino Fio, FEZ Panda II, Raspberry Pi

O výhodách a a nevýhodách jednotlivých systémů tu psát nebudu. Jeden článek jsem našel zde:
http://blog.timmlinder.com/2012/06/comp ... f-arduino/

V každém případě já se od této chvíle budu věnovat pouze NET Gadgeteeru a to konkrétně typu FEZ Spider:
Obrázek

Pokud tu je někdo, kdo se věnuje Arduinu nebo jinému systému a měl chuť zde tento systém představit, budu jen rád. Ono vůbec by bylo dobré, kdybyste se v tomto vlákně pochlubili svými projekty (na jakémkoliv systému). V žádném případě tu ale nebudu tolerovat flame o tom, který systém je lepší a který stojí za prd. Tady nejsme Sparta/Slavia nebo Intel/AMD/nVidia! My jsme "hračičkové" a chceme si navzájem pomáhat. Ne se prudit!

Je prakticky jedno, jaký systém zvolíte, já jsem NET Gadgeteer pro své potřeby zvolil z toho důvodu, že už delší čas pracuji s NET Frameworkem ve Visual Studiu a C#. Kdo programuje spíše v C zvolí Arduino. Ale jak jsem řekl, je to (až na nějaké specifika ) vlastně jedno.

Kromě hardware FEZ Spider, který představím příště, co vlastně budete ještě potřebovat?

1. Alespoň minimální znalost C# (nebojte opravdu nic složitého)
2. Minimální znalost elektrotechniky (osobně znám pouze Ohmův zákon :oops: )

Takže to by bylo zatím vše.
Příště se koukneme na samotný HW FEZ Spider a jeho moduly.

Cílem mých příspěvků bude osvětlit práci s NET Gadgeteer a pokud bude zájem a čas, tak bych zde chtěl postupně ukázat zhruba následující:

- programování vstupů/výstupů - nějaké to rozsvěcování a ztlumení LED
- ovládání motorů a serv
- napojení gadgeteru na wifi a jeho ovládání z PC (nebo SmartPhone)
- vytvoření autíčka na dálkové ovládání z PC
- obrácené ovládání gadgeteru pomocí RC soupravy
- hrátky s kvadroptérou
atd.
No a možná tady zažijete spoustu srandy, když něco nebude fungovat tak, jak má :-D
Naposledy upravil(a) Krteq dne čtv 29. srp 2013, 19:16, celkem upraveno 1 x.
Důvod: Opraven titulek vlákna
Chtěl bych se stát profesionálním pískačem. Už teď jsem v tom sice hvězda, ale chtěl bych se ještě zdokonalit a začít se tím živit.
GPUreport.cz
termit256
Začátečník
Začátečník
Registrován: 05. led 2005

Re: Gageteering aneb zábava pro pořádné chlapy

Příspěvek od termit256 »

Poradny chlape, oprav si nazev vlakna.
Osobne jsem nikdy moc nechapal smysl techto desticek. Pokud neco delam, zvolim procesor navrhnu HW/SW presne podle toho co potrebuju. Nepotrebuju desku se spoustou kravin ktere v danem projektu nepouziju a ktera mi nesedi do zadne krabicky. Ale vzhledem k tomu jake mnozstvi se toho vsude nabizi, zjevne sve uzivatele si to najde.
webwalker
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. úno 2010
Bydliště: Buranov vedle Prahy

Re: Gageteering aneb zábava pro pořádné chlapy

Příspěvek od webwalker »

@termit256: Ještě pořádnější chlape, rád bych si název vlákna opravil už dříve, jenže nemám oprávnění (pokud jsem teda něco nepřehlédl) :sad:
Smysl těchto věciček je v rychlém vývoji projektu (RD) a jeho prototypování. Po ukončení vývoje se teprve vytvoří a osadí konečný plošňák a kód se přenese do mikroprocesoru. Já, protože to mám pouze pro zábavu, nic z toho dělat nikdy nebudu a spokojím se s tím, jak to je. Jediné s čím počítám je přenesení obvodů z breadboard na nějaký pevnější pájený spoj.
Chtěl bych se stát profesionálním pískačem. Už teď jsem v tom sice hvězda, ale chtěl bych se ještě zdokonalit a začít se tím živit.
GPUreport.cz
webwalker
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. úno 2010
Bydliště: Buranov vedle Prahy

Re: Gadgeteering aneb zábava pro pořádné chlapy

Příspěvek od webwalker »

FEZ Spider a NETMF

Tohle bude sice trochu nudnější část, ale nedá se nic dělat, měli byste se s tím obeznámit.

FEZ Spider patří do rodiny NET Gadgeteer, za jehož vývojem stojí Microsoft Research. Já vím, že v dnešní době není tento softwareový gigant u zdejších "geeků" díky platformě Metro příliš oblíben a je moderní si do něj spíše kopnout, ale to ponechme zatím stranou (později se sami přesvědčíte o tom, že v Metru uděláte některé věci mnohem snadněji než ve WinForms) a koukněme se na FEZ Spider a NETMF trochu (ne zas tak příliš) podrobněji.

FEZ Spider na první pohled vypadá jako klasická základová deska (jen je taková malinká cca 5x5 cm) a při bližším pohledu zjistíte, že tomu tak opravdu je :)
Samozřejmě oproti klasické MoBo tam něco chybí a něco zas přebývá. Nejsou tam žádné PCIE sloty nebo sokety pro CPU a RAM. Místo toho jsou tam 10-pinové sokety pro připojení modulů. CPU i s RAM už tam jsou připájeny (ze spodní strany). Dále tam je resetovací tlačítko a sada mikro-přepínačů, které využíváme při ugrade firmware.

Obrázek

Všimněte si, že sokety pro napojení modulů jsou označeny jednak číslem a jednak písmenem. Číslo označuje identifikační číslo soketu a písmeno typ soketu (k typu soketu se dostaneme později).
Moduly, které do těchto soketů zapojujeme, jsou různých druhů, typově však dva:

1. Vstupní moduly - jednoduchá tlačítka, různá čidla (teplota, tlak, vlhkost ..)
2. Výstupní moduly - jako LED, Display ...

Tady je přehled některých modulů, kompatibilních s NET Gadgeteer:
https://www.ghielectronics.com/catalog/category/275
nebo u nás, kde se dají i pořídit (levné to moc není):
http://shop.microframework.eu/

HW parametry FEZ SPIDER:
14 .NET Gadgeteer compatible sockets that include these types: X, Y, A, C, D, E, F, H, I, K, O, P, S, T, U, R, G, B and Z.
Configurable on-board LED
Configuration switches.
Based on GHI Electronics EMX module
72MHz 32-bit ARM7 processor
4.5 MB Flash
16 MB RAM
LCD controller
Full TCP/IP Stack with SSL, HTTP, TCP, UDP, DHCP
Ethernet, WiFi driver and PPP ( GPRS/ 3G modems) and DPWS
USB host
USB Device with specialized libraries to emulate devices like thumb-drive, virtual COM (CDC), mouse, keyboard
76 GPIO Pin
2 SPI (8/16bit)
I2C
4 UART
2 CAN Channels
7 10-bit Analog Inputs
10-bit Analog Output (capable of WAV audio playback)
4-bit SD/MMC Memory card interface
6 PWM
OneWire interface (available on any IO)
Built-in Real Time Clock (RTC) with the suitable crystal
Processor register access
OutputCompare for generating waveforms with high accuracy
RLP allowing users to load native code (C/Assembly) for real-time requirements
Extended double-precision math class
FAT File System
Cryptography (AES and XTEA)
Low power and hibernate support
In-field update (from SD, network or other)
Dimensions: W 2.25" x L 2.05" x H 0.5"

Typy Soketů
Pojďme se teď kouknout na ty typy soketů a jejich piny v NET Gadgeteer:
Obrázek
Nemá cenu se tím nyní významěji zabývat. Ti, co s tím už dělají mají jasno. Pro ostatní jen jen to, co nás bude v nejbližší době zajímat:

1. GPIO - General Purpose Input/Output - pin může být použit jak pro vstup tak i výstup (digitální)
2. AIN - Analog Input
3. AOUT - překvapivě Analog Out :)
4. PWM - Pulse-width modulation - zatím to nechme být, bude o něm celý jeden článeček
5. +3,3V - pomocná větev 3,3V
6. +5V - překvapivě pomocná větev 5V :)
7. GND - zem

Víc zatím potřebovat nebudeme. Snad jen to, jaký rozdíl je mezi analogovým a digitálním (třeba) výstupem:

1. Digitální - výstup na pinu je buďto pravda (3,3V) nebo nepravda (0V resp. zem)
2. Analogový - výstup na pinu může nabývat libovolných hodnot od 0V až po 3,3V

Příklad 1
Chceme-li kupříkladu vytvořit Gadget na měření mezní teploty v pokoji, kdy požadujeme, aby se nám po překročení určité teploty rozsvítila LED, uděláme to následovně:
Do Spideru zapojíme do soketu A a pinu 3 (Analog In) čidlo teploty, do stejného soketu A ale na pin 6 (GPIO) zapojíme LED. Pak už zbývá pouze naprogramovat kód, který nastaví pin 6 jako výstupní digitální, smyčku (nebo vlákno), která neustále čte hodnotu na pinu 3 (teplotu) a porovnává ji s naší hraniční mezí. Pokud teplota přesáhne onu hraniční mez, odešle se na pin 6 hodnota True (3,3V), která rozsvítí LED. Toť vše :)
(Toto jen hrubý nástin kódu, samotnému programování se budeme věnovat zas někdy příště.)

NETMF
A jaký operační systém na Gadgeteeru běží? No, žádný. Poněkud zjednodušeně se dá říct, že tam běží pouze NET Framework v osekanější verzi NETMF(.NET Micro Framework). Takže, kdo někdy něco dělal v .NET má již dopředu vyhráno. Může využívat svůj oblíbený programovací jazyk i vývojové nástroje MS Visual Studia.
Ale integraci ve Visual Studiu 2010 (Express) se budeme věnovat příště.

PS: Své příspěvky se snažím psát tak, aby je pochopil hlavně ten, kdo s tímto nikdy nepracoval. Vím, že odborníci asi koulejí očima a rvou si přitom vlasy z hlavy. Takže sorry :)
Chtěl bych se stát profesionálním pískačem. Už teď jsem v tom sice hvězda, ale chtěl bych se ještě zdokonalit a začít se tím živit.
GPUreport.cz
webwalker
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. úno 2010
Bydliště: Buranov vedle Prahy

Re: Gadgeteering aneb zábava pro pořádné chlapy

Příspěvek od webwalker »

Net Gadgeteer a Visual Studio 2010 (Express)

Abychom mohli pracovat s NET Gadgeteer v MS Visual Studio, je k tomu zapotřebí následující:

1. Mít nainstalované Visual Studio (klidně Express, které je zdarma)
2. Mít nainstalovaný NET Micro Framework SDK
3. Používáte-li FEZ Spider nebo jiná zařízení od GHI Electronics, pak ještě GHI NETMF Package

Pokud plánujete pracovat s VS2010 můžete příslušné soubory stáhnout zde:
VS2010
http://www.microsoft.com/visualstudio/e ... 10-express
NETMF (Verze 4.2)
http://netmf.codeplex.com/releases/view/91594
GHI NETMF package
https://www.ghielectronics.com/support/ ... -framework (musíte se zaregistrovat)

Pokud plánujete pracovat s VS2012, soubory jsou zde
VS2012
http://www.microsoft.com/visualstudio/eng/downloads
NETMF (Verze 4.3)
http://netmf.codeplex.com/releases/view/81000
GHI NETMF package
https://www.ghielectronics.com/support/ ... -framework (musíte se zaregistrovat)

Začínáme pracovat ve VS
Pokud máme výše uvedené soubory v PC nainstalované, můžeme přejít k naší první aplikaci. Budem chtít vytvořit gadget s jednou LED diodou (multicolorLED) a tlačítkem (Button), které bude tu LEDku zapínat a vypínat. O tento naprosto směšný gadget nyní ani tak nejde, jde především o to ukázat, jak použít Visual Studio pro vývoj NET Gadgeteer.

Obrázek
Vybereme Nový projekt

Obrázek
Zvolíme šablonu typu Gadgeteer

Obrázek
K výběru se nám zobrazí seznam dostupných základních desek pro náš projekt. Já vyberu konkréně FEZ Spider.

Obrázek
Po vybrání základové desky se nám objeví UI Designer se zvolenou základovou deskou. Do toho okna můžeme z Toolboxu přidávat moduly, které chceme v projektu použít. Podobně, jako přidáváme ovládací prvky (Controls) ve formulářích Winforms.

Obrázek
Pro náš projekt tedy z toolboxu do designeru přeneseme tyto moduly:
1. usbClientDP - modul pro napájení a programování mcu
2. button - modul tlačítka (v okně vlastností mu dáme rovnou jméno button1)
3. multicolorLed - modul tříbarevné LED (dáme mu rovnou jméno multicolorLed1)
Klikem pravým tlačítkem myší se nám zobrazí kontextové menu a z něj vybereme "Connect all modules".

Obrázek
Designer nám nabídne a graficky znázorní návrh propojení jednotlivých modulů k základové desce. Samozřejmě si tato propojení můžeme nastavit ručně. Nyní můžeme podle toho schématu fyzicky propojit moduly s FEZ Spider. POZOR, moduly připojujeme vždy při odpojeném napájení (USB)!!!

Obrázek
Visual Studio nám nastaví všechny potřebné reference a my můžeme začít programovat náš první projekt. :-D
Chtěl bych se stát profesionálním pískačem. Už teď jsem v tom sice hvězda, ale chtěl bych se ještě zdokonalit a začít se tím živit.
GPUreport.cz
webwalker
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. úno 2010
Bydliště: Buranov vedle Prahy

Re: Gadgeteering aneb zábava pro pořádné chlapy

Příspěvek od webwalker »

Programování Gadgetu z předchozího příspěvku je pak opravdu jednoduché.

1. Na konec metody ProgramStarted(), kterou pro nás VS2010 připravilo a je startovacím místem pro náš kód vepíše následující:
// Predplaceni eventu pro stisk tlacitka
button1.ButtonPressed += new GTM.GHIElectronics.Button.ButtonEventHandler(button1_ButtonPressed);

// Predplaceni eventu pro uvolneni tlacitka
button1.ButtonReleased += new GTM.GHIElectronics.Button.ButtonEventHandler(button1_ButtonReleased);
Jak vidíte nejde o nic jiného než o "předplacení si" událostí při stisku a uvolnění tlačítka naprosto stejně, jako to děláme u dektopových Winforms nebo kdekoliv jinde.
Máme-li tyto události "předplacený", musíme ještě vytvořit příslušné metody button1_ButonPressed a button1_ButonReleased (resp. VS to udělá za nás, pokud klikneme na tlačítko TAB při "předplácení" eventu).
// Obsluha eventu button1 stiknut
void button1_ButtonPressed(GTM.GHIElectronics.Button sender, GTM.GHIElectronics.Button.ButtonState state)
{
multicolorLed1.TurnBlue();
}

// Obsluha eventu button uvolnen
void button1_ButtonReleased(GTM.GHIElectronics.Button sender, GTM.GHIElectronics.Button.ButtonState state)
{
multicolorLed1.TurnOff();
}
To je celý kód. Metoda TurnBlue() prvku multicolorLed nám rozsvítí modrou LED a metoda TurnOff() stejného prvku nám LED zase zhasne. Nyní můžeme náš kód odeslat (Deploy) do zařízení a spustit normálně klávesou F5.

Takto bude vypadat celý kód:

Kód: Vybrat vše

    public partial class Program
    {
        // This method is run when the mainboard is powered up or reset.   
        void ProgramStarted()
        {
            // Use Debug.Print to show messages in Visual Studio's "Output" window during debugging.
            Debug.Print("Program Started");

            // Predplaceni eventu pro stisk tlacitka
            button1.ButtonPressed += new GTM.GHIElectronics.Button.ButtonEventHandler(button1_ButtonPressed);
            // Predplaceni eventu pro uvolneni tlacitka
            button1.ButtonReleased += new GTM.GHIElectronics.Button.ButtonEventHandler(button1_ButtonReleased);
        }

        // Obsluha eventu button1 stiknut
        void button1_ButtonPressed(GTM.GHIElectronics.Button sender, GTM.GHIElectronics.Button.ButtonState state)
        {
            multicolorLed1.TurnBlue();
        }
        // Obsluha eventu button uvolnen
        void button1_ButtonReleased(GTM.GHIElectronics.Button sender, GTM.GHIElectronics.Button.ButtonState state)
        {
            multicolorLed1.TurnOff();
        }
    }
Dříve, než tak ale učiníme nastavíme si ještě "Deployment" ve vlastnosti projektu.
Obrázek
Pokud máme Spidera s PC propojeného pomocí USB (default) zvolíme transport pomocí USB. Další možnosti jsou pak:
- Serial - sériová linka
- TCP/IP - docela killer věc (můžete provádět deploy i po síti)
- Emulator - kód pošle do emulátoru (mě to však zatím nefunguje)

Nastavíme tedy USB, uložíme a stiskem F5 projekt spustíme. No a je hotovo. Tlačítkem teď LED rozsvítíme a uvolněním tlačítka LED zhasneme :-D

Asi si teď klepáte na čelo a říkáte "no to je fakt tedy bomba" :stupid:
Ale o samotný kód a obtížnost projektu teďka nejde. Chtěl jsem vám jen ukázat základní styl programování v NET Gadgeteer. Ty kódy pro správný "hračičky" teprve přijdou :-D
Pokud v projektu budete používat pouze již hotové moduly, programujete prakticky naprosto stejným způsobem jako programujete ovládací prvky ve winforms. Moduly jsou v projektech vystaveny nikoliv jaku hardware, ale formou objektů. Z toho vyplývají několik podstatných věcí:

1. Bezkonkurenčně nejrychlejší vývoj aplikací (RD) na trhu
2. O elektronice toho zas tak moc vědět nemusíte (ani jste se nemuseli starat kam a co na jaký pin připojit )
3. Využití jazyka vyšší úrovně
4. Můžete se věnovat přednostně logice samotného projektu
5. Debugging pomocí breakpoints a další pozitiva

Bohužel, vše má svůj rub a líc a každá výhoda může být také nevýhodou. Třeba ne vždy máme (nebo vůbec neexistuje) nějaký konkrétní modul, který bychom potřebovali. V tom případě nám nezbývá nic jiného, než si takový modul "zbastit" sami. K tomu ale budeme potřebovat krapet více znalostí. Ale o tom zase příště :)
Naposledy upravil(a) webwalker dne čtv 5. zář 2013, 13:46, celkem upraveno 1 x.
Chtěl bych se stát profesionálním pískačem. Už teď jsem v tom sice hvězda, ale chtěl bych se ještě zdokonalit a začít se tím živit.
GPUreport.cz
webwalker
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. úno 2010
Bydliště: Buranov vedle Prahy

Re: Gadgeteering aneb zábava pro pořádné chlapy

Příspěvek od webwalker »

Nevýhody NET Gadgeteer
Nevýhody tohoto systému, se kterými musíte již dopředu počítat, jsou prakticky dvě:

1. Realtime zpracování
Díky tomu, jak NETMF vnitřně interpretuje kód není po něm možné požadovat real-time zpracování požadavků.
To je jasná nevýhoda, nicméně pro naše účely a gadgety (blízké robotice), kde se s požadavky na real-time zpracování příliš nesetkáme, nám to prakticky vadit nebude vůbec. Samozřejmě, kdo vyvíjí něco náročnějšího jako kodéry, převodníky atp., ten ať se Gageteeru raději vyhne.

2. Moduly poněkud plýtvají I/O výstupy
Moduly jsou skvělá věc, ale pokud nějaký modul připojíme na 10ti pinový soket, "zabijeme" tím všechny ostatní piny na soketu, které tento konkrétní modul nevyužívá.
Příkladem může být modul tlačítka, který využívá pouze piny č.3 (pro tlačítko) a č.4 (pro vnitřní LED). Pokud modul tlačítka připojíme třeba do soketu typu Y, který obsahuje celkem 7 pinů s GPIO, přijdeme hned o 5 GPIO pinů pro další využití. Takže co s tím? Naštěstí existuje jeden modul, pomocí kterého můžete tuto nevýhodu obejít :)

Extender
Obrázek
Zapojením modulu extendéru do nějakého soketu, vyvedete vlastně tento soket mimo základní desku mcu. Všechny piny soketu jsou pak přístupné přímo na extenderu, který můžeme zastrčit třeba do nepájivého pole (Bread board) a tvořit na něm vlastní obvody.

Obrázek

Pokud však nebudeme požívat již hotové moduly, ale budeme si pomocí extenderu a breadboard "bastit" vlastní obvody, bude třeba se seznámit s tím, jak vlastně jednotlivé typy I/O fungují. Nás budou především zajímat výstupy digitální, analogové a PWM, se kterými si vystačíme na hodně dlouhou dobu.
Chtěl bych se stát profesionálním pískačem. Už teď jsem v tom sice hvězda, ale chtěl bych se ještě zdokonalit a začít se tím živit.
GPUreport.cz
webwalker
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. úno 2010
Bydliště: Buranov vedle Prahy

Re: Gadgeteering aneb zábava pro pořádné chlapy

Příspěvek od webwalker »

Digitální výstup
Digital Output je poměrně jednoduchý výstup. Na příslušném pinu je buďto pravda (true), nebo nepravda (false). Z pohledu elektroniky Spideru pak 3,3V (true) nebo 0V resp. zem (false).
Využívat tento výstup můžeme především pro zapínání/vypínání nějakých zařízení jako Led, žárovka či cokoliv jiného.
Další možností využití tohoto výstupu je pak pro modulaci výstupního signálu. Představme si, že na tento výstup máme připojenou Led, kterou můžeme tlačítkem zapínat a vypínat. Pokud budeme toto tlačítko zapínat a vypínat dostatečně rychle (rychleji než může lidské oko postřehnout) můžeme zdánlivě měnit jas té Led. Vše bude záviset na tom, jaký časový poměr bude mezi tím, jak dlouho bylo tlačítko sepnuté a vypnuté. Pokud se bude poměr času sepnutí tlačítka zvyšovat na úkor doby jeho vypnutí, Led se nám bude rozjasňovat a pokud bude trend opačný, bude nám naopak zhasínat. Tomu se říká modulace, kterou ale my na tomto digitálním výstupu používat nebudeme a schováme si jí až na PWM výstup, kde se modulace programuje mnohem snadněji.

Příklad:
Použijeme stejný projekt jako minule, kdy jsme rozsvěcovali modul multicolorLed pomocí tlačítka button. Jediná změna v projektu bude ta, že na soketu č.14 vyměníme modul multicolorLed za Extender. Budeme totiž "bastit" náš první jednoduchý obvod na nepájivém poli (breadboard), který se bude skládat z obyčejné Led a odporu. Tuto led pak budeme chtít pomocí tlačítka rozsvítit na digitálním výstupu. Náš obvod na breadboard bude vypadat následovně:
Obrázek
(Obrázek je vypůjčen od Pete Browna, další kód už ale nikoliv)

Obvod je to jednoduchý, Led je připojena mezi piny č.10 (GND) a č.3 (GPIO) extenderu. Odpor (100 ohm) slouží ke snížení napětí na diodě. Ačkoliv znám ohmův zákon, raději jsem dal na doporučení ostatních a zvolil odpor 100ohm podle nich. Pokud je tady někdo, kdo vysvětlí, jak správně vypočítat hodnotu odporu před diodou, jeho příspěvek je vítán. Já se raději vrátím do pro mě hlubších vod - programování.

Takže máme projekt s jedním tlačítkem a extenderem, který je píchnutý do breadboard s naším Led obvodem. Vše je zapojené ve správných soketech na Spideru, takže můžeme začít programovat.

1. Deklarujeme si proměnnou s názvem ledOnDigitalOutput, která je typu DigitalOutput a zároveň pin (č.3) na extenderu nastavíme jako digitální výstup:
GT.Interfaces.DigitalOutput ledOnDigitalOutput = extender1.SetupDigitalOutput(GT.Socket.Pin.Three, false);
Ten poslední argument funkce (false) určuje výchozí stav pinu výstupu. V tomto případě vypnut.

2. Nyní už můžeme pomocí proměnné LedOnDigitalOutput pin č.3 ovládat
ledOnDigitalOutput.Write(true); // nastavi hodnotu pinu digitalniho vystupu na true
ledOnDigitalOutput.Write(false); // nastavi hodnotu pinu digitalniho vystupu na false
Celý kód bude vypadat následovně:

Kód: Vybrat vše

    public partial class Program
    {
        // Deklarace promenne digitalniho vystupu
        private GT.Interfaces.DigitalOutput ledOnDigitalOutput;

        // This method is run when the mainboard is powered up or reset.   
        void ProgramStarted()
        {
            // Use Debug.Print to show messages in Visual Studio's "Output" window during debugging.
            Debug.Print("Program Started");

            // Iniciace promenne s nastavenim pinu
            ledOnDigitalOutput = extender1.SetupDigitalOutput(GT.Socket.Pin.Three, false);

            // Predplaceni eventu pro stisk tlacitka
            button1.ButtonPressed += new GTM.GHIElectronics.Button.ButtonEventHandler(button1_ButtonPressed);
            // Predplaceni eventu pro uvolneni tlacitka
            button1.ButtonReleased += new GTM.GHIElectronics.Button.ButtonEventHandler(button1_ButtonReleased);
        }

        // Obsluha eventu button1 stiknut
        void button1_ButtonPressed(GTM.GHIElectronics.Button sender, GTM.GHIElectronics.Button.ButtonState state)
        {
            ledOnDigitalOutput.Write(true); // rozsviti Led
        }
        // Obsluha eventu button uvolnen
        void button1_ButtonReleased(GTM.GHIElectronics.Button sender, GTM.GHIElectronics.Button.ButtonState state)
        {
            ledOnDigitalOutput.Write(false); // zhasne Led
        }
    }
To je vše, po zkompilování a odeslání kódu do Spidera by se vám měla Led dioda při stisknutí tlačítka rozsvítit a při jeho uvolnění zhasnout, stejně jako v předchozím příkladu s multicolorLed.
Chtěl bych se stát profesionálním pískačem. Už teď jsem v tom sice hvězda, ale chtěl bych se ještě zdokonalit a začít se tím živit.
GPUreport.cz
webwalker
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. úno 2010
Bydliště: Buranov vedle Prahy

Re: Gadgeteering aneb zábava pro pořádné chlapy

Příspěvek od webwalker »

Analogový výstup
Ačkoliv analogový výstup nebudeme v našich gadgetech příliš využívat, bylo by přeci jen dobré o něm alespoň něco málo vědět.
Na rozdíl od digitálního výstupu, který na svém pinu může nabývat pouze hodnot pravda/nepravda (3,3V/0V), analogový výstup na svém pinu umožňuje nabývání libovolných hodnot napětí v intervalu 0V až 3,3V. Analogového výstupu bychom tedy mohli použít u různých regulací.
My si tu ukážem, jak regulovat jas na Led diodě z předchozího příkladu.

Moduly zůstanou stejné - tedy tlačítko button i extender. Musíme však změnit napojení extenderu do správného soketu Spidera. Soket č.14 totiž neobsahuje žádný pin pro analogový výstup. Podle tabulky analogový pin obsahuje soket typu "O", který je na Spideru jediný a to pod číslem 9. Extender tedy zapojíme do soketu č.9 a na něm budeme využívat pin č.5. Tlačítko zůstává v původním soketu č.12 a budeme jím přepínat svítivost Led diody (bohužel nemám potenciometr pro plynulou změnu svítivosti).
Obrázek
Náš "zbastěnej" obvod s Led diodou bude pak vypadat následovně:
Obrázek
Dioda je připojena mezi zemí (GND) a pinem č.5 (AOUT). Vše zapojeno, můžeme tedy začít programovat.

1. Deklarujeme si proměnnou s názvem ledOnAnalogOutput, která je typu (třídy) AnalogOutput a nastavíme její startovací hodnotu.
GT.Interfaces.AnalogOutput ledOnAnalogOutput = extender1.SetupAnalogOutput(GT.Socket.Pin.Five);
ledOnAnalogOutput.Set(1); // Nastavime pocatecni napeti na 100%
2. Nyní už můžeme pomocí proměnné objektu ledOnAnalogOutput pin č.5 ovládat.
ledOnAnalogOutput.Set(1); // Nastavi pin na maximalni hodnotu (3,3V)
ledOnAnalogOutput.Set(0.6); // Nastavi pin na 60% maximalni hodnoty
Za zmínku stojí to, že jako argument metody Set se neuvádí přímá hodnota napětí, ale koeficient (procento) z maximální hodnoty. Pokud byste chtěli vkládat přímo napětí třeba 2,2V, pak použijeme výpočet:
ledOnAnalogOutput.Set(2.2 / ledOnAnalogOutput.MaxOutputVoltage); // Chci na pinu #5 napeti 2,2V
Celý kód bude vypadat následovně:

Kód: Vybrat vše

    public partial class Program
    {
        private GT.Interfaces.AnalogOutput ledOnAnalogOutput;

        // This method is run when the mainboard is powered up or reset.   
        void ProgramStarted()
        {
            ledOnAnalogOutput = extender1.SetupAnalogOutput(GT.Socket.Pin.Five);
            ledOnAnalogOutput.Set(1);     // Nastavime pocatecni napeti na 100%

            // Use Debug.Print to show messages in Visual Studio's "Output" window during debugging.
            Debug.Print("Program Started");

            // Predplaceni eventu pro stisk tlacitka
            button1.ButtonPressed += new GTM.GHIElectronics.Button.ButtonEventHandler(button1_ButtonPressed);
            // Predplaceni eventu pro uvolneni tlacitka
            button1.ButtonReleased += new GTM.GHIElectronics.Button.ButtonEventHandler(button1_ButtonReleased);
        }

        // Obsluha eventu button1 stiknut
        void button1_ButtonPressed(GTM.GHIElectronics.Button sender, GTM.GHIElectronics.Button.ButtonState state)
        {
            ledOnAnalogOutput.Set(1);     // Nastavi pin na maximalni hodnotu (3,3V)
        }
        // Obsluha eventu button uvolnen
        void button1_ButtonReleased(GTM.GHIElectronics.Button sender, GTM.GHIElectronics.Button.ButtonState state)
        {
            ledOnAnalogOutput.Set(0.6);     // Nastavi pin na 60% maximalni hodnoty
        }
    }
Po spuštění programu se nám Led dioda rozsvítí plným jasem. Po stisknutí tlačítka se jas sníží a po jeho uvolnění zas vrátí do původní hodnoty.
To je k analogovému výstupu vše. Z teorie nám tedy zbývá ještě výstup PWM a pak už honem na nějaký ten gadget, aby tu nebyla taková nuda :)
Chtěl bych se stát profesionálním pískačem. Už teď jsem v tom sice hvězda, ale chtěl bych se ještě zdokonalit a začít se tím živit.
GPUreport.cz
webwalker
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. úno 2010
Bydliště: Buranov vedle Prahy

Re: Gadgeteering aneb zábava pro pořádné chlapy

Příspěvek od webwalker »

PWM výstup (Pulse-Width modulation)
Pro nás hračičky je PWM výstup (i vstup) asi tím nejdůležitějším výstupem vůbec. Proč? Protože víceméně veškerá serva a regulátory pro el. motorky, ze kterých budeme skládat naše jezdící, skákající, plovoucí a kdoví co ještě dělající "hračky", tyto PWM výstupy využívají. Budete-li si chtít například "zbastit" nějaké to dálkově ovládané auto, budete pro jeho zatáčení potřebovat nějaké to servo a pro ovládání rychlosti zase nějaký regulátor.

Název PWM (Pulse-Width Modulation) napovídá, že se jedná o nějakou modulaci signálu. Na modulaci jsme už narazili u digitálního výstupu, kde jsme chtěli pomocí modulace (rychlého zapínání a vypínání dig. výstupu) regulovat jas Led diody. U PWM jde o něco podobného, jen to má vše určitý řád a pravidla.

Obrázek

V - Pulse voltage (v případě Spider je vždy 3,3V)
T - Pulse period (časová perioda mezi začátky pulsů)
t - Pulse width (jak dlouho je signál v sepnutém stavu)

Zní to složitě, ale je to velmi jednoduchý princip. Určující veličinou je vzájemný poměr hodnot t (pulse-width) a hodnoty T (period). V případě serva pak, čím déle je v dané periodě (T) digitální výstup v sepnutém stavu (t), tím více se servo otočí do své maximální polohy. A samozřejmě naopak, čím kratší bude doba sepnutí digitálního výstupu v dané periodě, tím blíže bude servo natočené ke své minimální poloze.

Pracovní rozsah
Teoreticky tedy platí, že doba sepnutí digitálního výstupu (t) se může pohybovat v rozsahu od min>0 do max<T(doba periody). V praxi ale zařízení, které využívají PWM signál, pracují s rozsahem mnohem omezenějším. Příkladem je standardní servo:

Standardní servo
T - perioda 50Hz (20ms)
tmin - 1 ms (servo natočeno v nulové poloze)
tmax - 2 ms (servo natočeno v max. poloze)
Obrázek

A jak PWM výstupy programovat? Díky tomu, že soket typu "P" na Spideru již obsahuje HW PWM výstupy a NETMF s nimi počítá také, programování je velice prosté a moc se neliší od toho, jak jsme dříve programovali digitální a analogový výstup.

1. Nadeklarujeme proměnnou servoOnPwmOutput, která je třídy PWMOutput a výstup aktivujeme.
GT.Interfaces.PWMOutput servoOnPwmOutput = extender1.SetupPWMOutput(GT.Socket.Pin.Seven);
servoOnPwmOutput.Active = true; // Aktivuj vystup
2. Nyní už můžeme pomocí proměnné objektu servoOnPwmOutput PWM výstup a na něj napojené servo ovládat
servoOnPwmOutput.SetPulse(20 * 1000 * 1000, 1 * 1000 * 1000); // Natoc servo do nulove polohy
servoOnPwmOutput.SetPulse(20 * 1000 * 1000, (uint)(1.5 * 1000 * 1000)); // Natoc servo do stredove polohy
servoOnPwmOutput.SetPulse(20 * 1000 * 1000, 2 * 1000 * 1000); // Natoc servo do maximalni polohy
První argument funkce SetPulse udává period, v našem případě 20ms (výraz 20*1000*1000 je převedením na ns).
Druhým argumentem funkce je pak hodnota t (pulse width), opět převedena na ns(nano sekundy).

Příště ukážu, jak fyzicky napojit servo přes extender na Spider a pěkně ho roztočit :)
Chtěl bych se stát profesionálním pískačem. Už teď jsem v tom sice hvězda, ale chtěl bych se ještě zdokonalit a začít se tím živit.
GPUreport.cz
webwalker
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. úno 2010
Bydliště: Buranov vedle Prahy

Re: Gadgeteering aneb zábava pro pořádné chlapy

Příspěvek od webwalker »

Zapojení serva
Servo zapojujeme do nějakého PWM výstupu. Podle tabulky tedy do soketu typu "P", který obsahuje 3xPWM výstup (piny č.7, 8 nebo 9). Spider obsahuje celkem dva sokety typu "P" (č.8 a 11) což znamená, že celkem můžeme na mcu připojit až 6 zařízení využívající PWM výstupů (2x3), tedy v našem případě až 6 serv.

Servo budeme zapojovat pomocí extenderu na nepájivé pole. Vzhledem k tomu, že hobby serva pracují s napětím 5V a Spider s napětím 3,3V, vzniká nám tady malý problém, který budeme muset řešit externím napájením serva.

Poznámka:
Každý soket Spidera na pinu č.2 sice poskytuje pomocnou 5V větev, nicméně s velmi nízkým výkonem. Na provozování jednoho serva by to sice stačit asi mohlo, na víc serv však rozhodně ne. Nebudeme raději riskovat a použijeme externí zdroj 5V i pro jedno servo. Jako externí zdroj lze použít třeba i 4xAAA tužkové baterie, síťový zdroj nebo BEC z regulátoru.

Gadget
Budeme chtít vytvořit úplně jednoduchý servotester, jehož funkce bude jednoduchá. Po stisknutí tlačítka se servo postupně natočí do své maximální polohy a po chvilce se zase vrátí do své nulové polohy.

Ve VS2010 vytvoříme tedy nový projekt s následujícími moduly:
Obrázek

Extender připojíme do nepájivého pole. Servo a pomocné napětí 5V připojíme podle následujícího obrázku:
Obrázek

1. Ovládací signál serva je veden z pinu č.7 (PWM) extenderu (žlutý drát)
2. Napájení serva je vedeno z pomocného zdroje 5V (červený + a modrý drát GND)
3. Pro zamezení různých rušivých "neplech", GND extenderu je napojen na GND externího zdroje (modrý drát z vykřičníkem)

Samotný kód servotesteru by pak vypadal následovně:

Kód: Vybrat vše

    public partial class Program
    {
        // Deklarace promenne servo
        private GT.Interfaces.PWMOutput servo1;

        // This method is run when the mainboard is powered up or reset.   
        void ProgramStarted()
        {
            // Use Debug.Print to show messages in Visual Studio's "Output" window during debugging.
            Debug.Print("Program Started");

            // Predplat si event stisknuti tlacitka
            button1.ButtonPressed += new GTM.GHIElectronics.Button.ButtonEventHandler(button1_ButtonPressed);

            // Iniciace promenne servo (pin #7 na extenderu)
            servo1 = extender1.SetupPWMOutput(GT.Socket.Pin.Seven);
        }

        void button1_ButtonPressed(GTM.GHIElectronics.Button sender, GTM.GHIElectronics.Button.ButtonState state)
        {
            // Aktivuj PWM vystup
            servo1.Active = true;

            // Presunuj servo od nulove do maximalni pozice po krocich 25us
            for (int i = 1000; i <= 2000; i += 25)
            {
                servo1.SetPulse(20 * 1000 * 1000, (uint)(i * 1000));    // Natoc servo
                Thread.Sleep(5);                                        // Vyckej 5ms
            }

            Thread.Sleep(1000);     // Vyckej 1s

            // Presunuj servo zpet z maximalni do nulove pozice po krocich 25us
            for (int i = 2000; i >= 1000; i -= 25)
            {
                servo1.SetPulse(20 * 1000 * 1000, (uint)(i * 1000));    // Natoc servo
                Thread.Sleep(5);                                        // Vyckej 5ms
            }

            // Deaktivuj PWM vystup
            servo1.Active = false;
        }
    }
Kód spustíme pomocí tlačítka F5.
Po stisknutí tlačítka, připojeného k desce Spidera, by se nám mělo servo natočit do své maximální pozice, kde vyčká jednu sekundu a následně se vrátí zpět.
Tento jednoduchý kód je opravdu jen ukázkový. Ono totiž řízení serva je tak trochu alchymie. Servo je "pomalá" mechanická součástka, takže by se v kódu měly ošetřit takové věci jako je rychlost serva nebo jeho "rozlišení". Určitě by se vyplatilo využít opravdu silné stránky jazyka C# a napsat si nějakou vlastní třídu objektu serva, ve které by byly všechny tyto faktory ošetřeny, ale nám to (alespoň pro začátek) stačit bude.
Chtěl bych se stát profesionálním pískačem. Už teď jsem v tom sice hvězda, ale chtěl bych se ještě zdokonalit a začít se tím živit.
GPUreport.cz
webwalker
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. úno 2010
Bydliště: Buranov vedle Prahy

Re: Gadgeteering aneb zábava pro pořádné chlapy

Příspěvek od webwalker »

Co dál? Jediné co dosud umíme v NET Gadgeteer je používání digitálních, analogových a PWM výstupů. Můžeme ale s těmito znalostmi vytvořit už konečně nějaký ten gadget? No, asi jo, ale žádná sláva to rozhodně nebude. Mohli bychom třeba pomocí serva a regulátoru motoru vytvořit nějaký jezdící model auta, ale to jako budeme vedle něj běhat a pomocí, na něm umístěných, tlačítek ho ovládat? A co něco autonomního, nějakého robota? To zas vyžaduje znalost vstupů, protože všechny možné senzory, podle kterých se robot v prostoru pohybuje, jsou napojeny právě na tyto vstupy :(

Pokud bychom si ale vytvořily nějaké dálkové ovládání pomocí počítačové sítě, otevřelo by se nám pro naše gadgety hafo možností. Malá ukázka z oblíbeného sitcomu všech gadgeteerů:

Obrázek

Z ukázky je patrné, jak by naše gadgety asi mohly vypadat. Od rozsvěcování lampiček či ovládání dalších spotřebičů (around the world) až po ovládání modelů aut.
V každém případě, vše bude realizováno pomocí počítačové sítě. Spider již síťový adaptér obsahuje, takže jediné co zbývá je, naprogramovat si nějaký ten jednoduchý server (http nebo Tcp), který bude přijímat naše vzdálené příkazy a následně podle typu příkazu ovládat výstupní porty na mcu.
A jaký server nejlépe zvolit? Http nebo TCP? Každý má něco pro a něco proti:

Http server
+ jednodušší na naprogramování
+ klientem je webový prohlížeč (nemusí se programovat klient)
+ díky tomu, že klientem je libovolný browser, je multiplatformní
- pomalý (na realtime ovládání raději zapomeňte)

TCP server
- trochu složitější na naprogramování (ale jen o fous)
- musí se programovat i klient
- klientská část se musí programovat pro danou platformu
+ je rychlý, dostatečně i pro realtime řízení

Příště, bude-li čas a nálada (toto vlákno není zrovna moc čtené, holt asi všichni opravdu mastí jen hry), bych ukázal jak na takový http server na platformě NET Gadgeteer jít a jak ho využít třeba k tomu rozsvícení lampičky z Big Bang Theory. Ale proč bychom vůbec chtěli rozsvěcovat lampičku "around the world"?
Kdo to ještě nepochopil, odpověď je jednoduchá :-D

Because We Can!
Chtěl bych se stát profesionálním pískačem. Už teď jsem v tom sice hvězda, ale chtěl bych se ještě zdokonalit a začít se tím živit.
GPUreport.cz
webwalker
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. úno 2010
Bydliště: Buranov vedle Prahy

Re: Gadgeteering aneb zábava pro pořádné chlapy

Příspěvek od webwalker »

Jak na Http Server
Naprogramovat si jednoduchý http server v NETMF pro Gadgeteer není příliš složitá záležitost. Nemusíte dokonce ani nic programovat, stačí se kouknout na internet, kde je již hotových kódů dostatečné množství.
Další možností je vzít už nějaký hotový kód a přizpůsobit si ho vlastním potřebám. Vždy je ale důležité, abyste jen tupě nepřepisovali kód, ale abyste věděli, co vlastně vůbec děláte. Doporučuji také psát kódy dostatečně "reusable", tedy tak, že tento kód budete moci využívat ve všech svých projektech, aniž byste museli tento kód vůbec či významněji upravovat. Nejlepším způsobem je tedy psát takovéto kódy do pomocných tříd (Class). Takto nějak vypadá moje třída HttpServer:

Kód: Vybrat vše

using System;
using Microsoft.SPOT;
using System.Net;
using System.Threading;

namespace webwalkerTools
{
    class HttpServer
    {
        public const int DEFAULT_SERVER_PORT = 80;      // Defaultni cislo portu

        private int port = DEFAULT_SERVER_PORT;         // port
        private HttpListener listener;                  // Http Listener

        // Verejne udalosti
        public delegate void ContextReceivedEventHandler(object sender, HttpContextReceivedEventArgs e);
        public event ContextReceivedEventHandler ContextReceived;

        // Defaultni konstruktor
        public HttpServer(): this(DEFAULT_SERVER_PORT) { }

        // Konstruktor s nastavenim portu
        public HttpServer(int port)                         
        {
            this.port = port;
        }

        // Start serveru
        public void Start()
        {
            // Spust server v novem vlaknu
            new Thread(StartServerInternal).Start();
        }

        private void StartServerInternal()
        {
            //Thread.CurrentThread.Priority = ThreadPriority.Lowest;
            
            while (true)
            {
                listener = new HttpListener("http", port);  // Nastaveni listeneru
                listener.Start();                           // Start naslouchani

                HttpListenerContext context = null;         // Obsah Request

                Debug.Print("Http Server is listening ...");

                while (listener.IsListening)                // Opakuj dokud je listener v behu
                {
                    try
                    {
                        context = listener.GetContext();    // Vezmi obsah zadosti
                        if (context == null) continue;

                        // Spust event ContextReceived
                        HttpContextReceivedEventArgs args = new HttpContextReceivedEventArgs(context);
                        OnContextReceived(args);

                        // Odesli data, ktera byla nastavena v eventu ContextReceived
                        SendResponse(args);
                    }
                    catch (Exception ex)
                    {
                        Debug.Print(ex.Message);
                    }
                    finally
                    {
                        context = null; // uvolni context
                    }

                }
                // Zastav a zavri HttpListener
                listener.Stop();
                listener.Close();
                Debug.Print("Http Server listening stopped");
            }
        }

        // Odesle odpoved
        private void SendResponse(HttpContextReceivedEventArgs args)
        {
            args.ReceivedContext.Response.StatusCode = 200;             // Vse je OK
            args.ReceivedContext.Response.ContentType = "text/html";    // Typ obsahu

            try
            {
                // Odesle odpoved pomoci OutputStream
                args.ReceivedContext.Response.OutputStream.Write(args.DataResponse, 0, args.DataResponse.Length);
            }
            finally
            {
                args.ReceivedContext.Response.Close();  // Uvolni objekt Response
            }
        }

        // Spusti event ContextReceived
        private void OnContextReceived(HttpContextReceivedEventArgs args)
        {
            if(ContextReceived != null)         // Spust pouze ma-li nekdo event predplacen
                ContextReceived(this, args);
        }

        // Trida Args pro ContextReceivedHandler
        public class HttpContextReceivedEventArgs : EventArgs
        {
            public HttpListenerContext ReceivedContext { get; private set; }    // Prijaty kontext
            public byte[] DataResponse { get; set; }                            // Data pro odeslani

            // Konstruktor
            public HttpContextReceivedEventArgs(HttpListenerContext context)
            {
                ReceivedContext = context;
            }
        }
    }
}
Jak vidíte, kód není nijak dlouhý. Vysvětlení jen v kostce:
1. Konstruktory jsou dva. Jeden default bez argumentů a druhý s argumentem port (číslo portu)
2. V nekonečné smyčce se neustále čeká na požadavek (Request) klienta context = listener.GetContext()
3. Protože metoda GetContext() je blokovací funkce, je nutné celou smyčku spustit v jiném threadu
4. Když požadavek (Request) od klienta dorazí, uloží se v proměnné context.
5. Je spuštěna událost ContextReceived, která předá proměnnou context přes argument HttpContextReceivedEventArgs hlavnímu vláknu, kde si ji uživatel třídy může odchytit.
6. V události ContextReceived uživatel zjistí, co po něm klient chce a dle toho připraví odpověď (Response).
7. Když se kód vrátí z události ContextReceived, odešle se na klienta odpověď (Response).

Pokud se v tom nebudete chtít babrat nevadí. Stačí si tento kód uložit v souboru (třeba httpServer.cs) a umístit ho v projektu. Použít třídu HttpServer pak můžete následovně:

Kód: Vybrat vše

            // Iniciace HttpServeru
            webwalkerTools.HttpServer server = new webwalkerTools.HttpServer();
            // Predplat si event pro prijem Request klienta
            server.ContextReceived += new webwalkerTools.HttpServer.ContextReceivedEventHandler(server_ContextReceived);
            server.Start();     // Nastartuj server

             // Odchycena udalost pro Request
             void server_ContextReceived(object sender, webwalkerTools.HttpServer.HttpContextReceivedEventArgs e)
             {
                   .
                   .
                   .
                   .
             }
Pozor na jednu věc. Pokud v konstruktoru zvolíte jiný port než 80 nezapomeňte, že browser počítá vždy s portem 80 (není-li nastaven jinak). Zvolíte-li kupříkladu port 2000, je nutné také v browseru tento http sever adresovat i s číslem portu třeba 192.168.0.2:2000.

Kompletní ukázka kódu, kdy si můžeme pomocí http serveru běžícího na Spideru rozsvítit třeba Led diodu přes svůj smartphone zase až příště (bude-li čas) :)
Chtěl bych se stát profesionálním pískačem. Už teď jsem v tom sice hvězda, ale chtěl bych se ještě zdokonalit a začít se tím živit.
GPUreport.cz
webwalker
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. úno 2010
Bydliště: Buranov vedle Prahy

Re: Gadgeteering aneb zábava pro pořádné chlapy

Příspěvek od webwalker »

Připojení k počítačové síti
Abychom mohli využívat Spidera jako http server je nutné ho nejdříve připojit do počítačové sítě. To se provádí pomocí modulu Ethernet_J11D. Tento modul je vlastně pouze konektorem, protože samotný síťový adaptér je již umístěn na základové desce. Připojení si ukážeme na následujícím příkladu.
Vytvoříme si nový projekt a zapojíme potřebné moduly podle obrázku
Obrázek
Chceme, aby se Spider po nastartování připojil do naší sítě, získal IP adresu a úspěšné/neúspěšné připojení signalizoval v modulu multicolorLed1 zelenou/červenou barvou.

Kód by vypadal asi takto:

Kód: Vybrat vše

        void ProgramStarted()
        {
            // Use Debug.Print to show messages in Visual Studio's "Output" window during debugging.
            Debug.Print("Program Started");

            ethernet_J11D.NetworkUp += new GTM.Module.NetworkModule.NetworkEventHandler(ethernet_J11D_NetworkUp);
            ethernet_J11D.NetworkDown += new GTM.Module.NetworkModule.NetworkEventHandler(ethernet_J11D_NetworkDown);
            ethernet_J11D.UseDHCP();        // Nastav na automaticke pridelovani IP adresy 
        }

        // Network down
        void ethernet_J11D_NetworkDown(GTM.Module.NetworkModule sender, GTM.Module.NetworkModule.NetworkState state)
        {
            Debug.Print("Network down");    // Rozsvit multicolor Led do cervena
            multicolorLed1.TurnRed();
        }
        // Network up
        void ethernet_J11D_NetworkUp(GTM.Module.NetworkModule sender, GTM.Module.NetworkModule.NetworkState state)
        {
            Debug.Print("Network Up with IP " + sender.NetworkSettings.IPAddress);
            multicolorLed1.TurnGreen();     // Rozsvit multicolor Led do zelena
        }
Kód je to opravdu jednoduchý
1. "Předplatíme" si zachycení události ethernet_J11D.NetworkUp a ethernet_J11D.NetworkDown modulu ethernet_J11D do patřičných procedur.
2. Nastavíme automatické přidělování IP ethernet_J11D.UseDHCP()
3. Podle toho, jak bylo připojení úspěšné, se nám spustí událost NetworkUp nebo NetworkDown.
4. V události NetworkDown pak rozsvítíme multicolorLed1 do červena a v NetworkUp do zelena.

To je vše. Pokud budeme tvořit nějaký stacionární gadget jako ovládání světel, topení nebo něčeho jiného přes intranet/internet, připojíme Spidera k domácí síti obyčejným kabelem k nejbližšímu routeru/switch. Pokud by byl problém s umístěním kabelu, vzdáleností nebo budete potřebovat mobilitu (RC auto, robot ap.), zapojíte Spidera k vlastnímu vyhrazenému WiFi routeru (AP).

Takže, už umíme ovládat výstupy, jsme připojení k síti a máme funkční http server. Teď už opravdu nezbývá nic jiného, než-li se pustit do prvního "opravdového" gadgetu. Třeba rozsvěcování lampičky. A to klidně i "around the world" :)
Chtěl bych se stát profesionálním pískačem. Už teď jsem v tom sice hvězda, ale chtěl bych se ještě zdokonalit a začít se tím živit.
GPUreport.cz
webwalker
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. úno 2010
Bydliště: Buranov vedle Prahy

Re: Gadgeteering aneb zábava pro pořádné chlapy

Příspěvek od webwalker »

Svítíme přes internet
Víme jak ovládat výstupy, jak připojit Spidera na počítačovou síť a máme připravenou třídu HttpServer pro komunikaci. Nezbývá tedy nic jiného, než si tyto tři věci spojit dohromady v jednom projektu a vytvořit "opravdový" gadget. V našem případě budeme chtít přes smartphone rozsvítit nějaké to světlo.

Budeme tedy potřebovat aby Spider po zapnutí prováděl následující:
1. Připojil se k počítačové síti a úspěšné připojení signalizovat zelenou Led v modulu multicolorLed (červenou pak neúspěšné připojení).
2. Nastartoval HttpServer a čekal na připojení nějakého klienta (browseru ve smartphone)
3. Pokud se klient přihlásí, odešle mu html stránku, která obsahuje ovládací tlačítko
4. Pokud klient stiskne tlačítko na html stránce, detekuje to a rozsvítí nebo zhasne světlo (v našem případě modrou Led v modulu multicolorLed)
5. Informuje klienta o zapnutí nebo vypnutí světla

Vytvoříme si tedy ten samý projekt jako minule, který bude obsahovat zapojení následujících modulů:
Obrázek

Do projektu si také přidáme soubor HttpServer.cs s naší třídou http serveru. Výsledný kód pak bude vypadat následovně:

Kód: Vybrat vše

    public partial class Program
    {
        private const string _zapniText = "Zapni modrou Led";       // Text pro tlacitko na zapnuti
        private const string _vypniText = "Vypni modrou Led";       // Text pro tlacitko na vypnuti
            
        private string buttonText = _zapniText;                     // Promenna textu tlacitka

        webwalkerTools.HttpServer server;                           // Deklarace HttpServeru (namespace webwalkerTools)

        // This method is run when the mainboard is powered up or reset.   
        void ProgramStarted()
        {
            // Use Debug.Print to show messages in Visual Studio's "Output" window during debugging.
            Debug.Print("Program Started");

            // Pripoj se k siti
            ethernet_J11D.NetworkUp += new GTM.Module.NetworkModule.NetworkEventHandler(ethernet_J11D_NetworkUp);
            ethernet_J11D.NetworkDown += new GTM.Module.NetworkModule.NetworkEventHandler(ethernet_J11D_NetworkDown);
            ethernet_J11D.UseDHCP();        // Nastav na automaticke pridelovani IP adresy 
        }

        // Network down
        void ethernet_J11D_NetworkDown(GTM.Module.NetworkModule sender, GTM.Module.NetworkModule.NetworkState state)
        {
            Debug.Print("Network down");    // Rozsvit multicolor Led do cervena
            multicolorLed1.TurnRed();
        }
        // Network up
        void ethernet_J11D_NetworkUp(GTM.Module.NetworkModule sender, GTM.Module.NetworkModule.NetworkState state)
        {
            Debug.Print("Network Up with IP " + sender.NetworkSettings.IPAddress);
            multicolorLed1.TurnGreen();     // Rozsvit multicolor Led do zelena

            // Iniciace HttpServeru
            server = new webwalkerTools.HttpServer();
            // Predplat si udalost pro prijem Request z klienta
            server.ContextReceived += new webwalkerTools.HttpServer.ContextReceivedEventHandler(server_ContextReceived);
            server.Start();     // Nastartuj server
        }

        // Obsluz Request klienta
        void server_ContextReceived(object sender, webwalkerTools.HttpServer.HttpContextReceivedEventArgs e)
        {
            // Bylo neco poslano pres POST?
            if (e.ReceivedContext.Request.HttpMethod == "POST")
            {
                byte[] requestData = new byte[e.ReceivedContext.Request.InputStream.Length];        // Buffer pro nacteni dat
                e.ReceivedContext.Request.InputStream.Read(requestData, 0, requestData.Length);     // Nacti data z Request
                string request = new string(System.Text.Encoding.UTF8.GetChars(requestData));       // Preved bytes na string

                // Bylo stiknuto tlacitko Button1? 
                if (request.IndexOf("Button1") != -1)
                {
                    if (multicolorLed1.GetCurrentColor().B == 255)  // Sviti uz modra Led?
                    {
                        multicolorLed1.RemoveBlue();                // Zhasni modrou Led
                        buttonText = _zapniText;                    // Text do tlacitka Button1
                    }
                    else
                    {
                        multicolorLed1.AddBlue();                   // Zapni modrou Led
                        buttonText = _vypniText;                    // Text do tlacitka Button1
                    }
                }
            }

            // html obsah pro klienta
            string htmlContent = @"<html>
                                    <head>
                                        <title>Embended http server</title>
                                    </head>
                                    <body bgcolor=""#3399ff"">
                                        <form method=""post"" action="""">
                                            <h1 align=""center"" style=""border: 2px solid #FFFFFF; background-color: #66CCFF; height: 40px;"">Ovladaci panel FEZ Spider</h1>
                                            <div align=""center"" style=""width: auto;"">
                                                <input name=""Button1"" type=""submit"" value=""" + buttonText + @""" style=""margin-top: 50px; margin-bottom: 50px; width: auto; height: 100px; font-size: large; font-weight: bold;"" />
                                            </div>
                                        </form>
                                    </body>
                                 </html>";

            e.DataResponse = System.Text.Encoding.UTF8.GetBytes(htmlContent);   // Prevedeme na bytes
        }
    }
Prakticky celý kód už známe z minula, snad jen popsat událost server_ContextReceived:
1. Bylo-li něco posláno klientem přes POST, je třeba tato data pomocí streamu přečíst a uložit v bufferu, který je následně převeden na string.
2. Pokud tento string obsahoval název tlačítka "Button1" víme, že toto tlačítko bylo stisknuto.
3. Pokud bylo tlačítko stisknuto, rozsvítíme nebo zhasneme modrou Led diodu. Závisí to na tom, jestli už svítí nebo ne (multicolorLed1.GetCurrentColor().B == 255).
4. Vytvoříme html stránku v proměnné htmlContent, kde dynamicky dosadíme text do tlačítka Button1 z proměnné buttonText.
5. Na konec převedeme html stránku v proměnné htmlContent na byty a uložíme do argumentu e.DataResponse. Http sever se následně postará o odeslání těchto dat (html stránky) do prohlížeče klienta. Dynamicky generovaná html stránka vypadá takto:
Obrázek
Samozřejmě si můžete přidat ovládacích tlačítek podle libosti a ovládat každým něco jiného.
Pokud byste raději, než nějakou Led diodu, chtěli ovládat silové spotřebiče, použijete v projektu moduly jako:

Relay X1 Module
https://www.ghielectronics.com/catalog/product/464

nebo

Relay ISOx16 Module
https://www.ghielectronics.com/catalog/product/391
kde můžete ovládat až 16 relátek.

Po spuštění a zkompilování projektu se pomocí smartphonu můžeme k http serveru běžícímu na Spideru připojit pomocí browseru. Do adresy browseru napíšeme http://xxx.xxx.xxx.xxx (přidělená IP adresa DHCP serverem vaší sítě) a můžete světlo ovládat.
Pokud byste chtěli tento gadget ovládat zvnějška pomocí internetu, je zapotřebí:
1. Znát "venkovní" IP adresu vašeho primárního routeru (přidělenou ISP)
2. Na tomto routeru nastavit přesměrování portu služby (nejlépe 80) na ip adresu Spidera
Toť vše. Nyní můžete ovládat svůj gadget odkudkoli na světě :)

Tímto bych tady své příspěvky o NET Gadgeteer ukončil. Jako představení zajímavého produktu to imho stačilo a i když se jedná opravdu o velmi zajímavé věci, které se s NET Gadgeteer dají dělat, čtenost nebyla taková v jakou jsem doufal. Holt hry vládnou a o programování se moc lidí nezajímá, což je škoda. Bude-li čas a nálada, někdy se tu pochlubím svými hotovými gadgety.
Chtěl bych se stát profesionálním pískačem. Už teď jsem v tom sice hvězda, ale chtěl bych se ještě zdokonalit a začít se tím živit.
GPUreport.cz
webwalker
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. úno 2010
Bydliště: Buranov vedle Prahy

Re: Gadgeteering aneb zábava pro pořádné chlapy

Příspěvek od webwalker »

Po delším čase zase trochu k hračičkování :)

Na Gadgeteering mi nyní moc času nezbývá, ale díky němu jsem se zase dostal k programování pro Windows Phone.
Chtěl jsem si totiž vytvořit univerzální "smarthphone" WiFi vysílačku, kterou bych mohl v budoucnu ovládat v reálném čase své gadgety založené na Arduino, Netduino a Gageteeru. Aplikace je prakticky hotová, jen jsem se ještě nedokopal ji zveřejnit v MS Store.

Jedná se o 10 kanálovou vysílačku, která vypadá nějak takto:
Obrázek

Podrobnější popis včetně videa z testování na PC najdete zde >>
Chtěl bych se stát profesionálním pískačem. Už teď jsem v tom sice hvězda, ale chtěl bych se ještě zdokonalit a začít se tím živit.
GPUreport.cz
Alfajk
Začátečník
Začátečník
Registrován: 15. kvě 2009

Re: Gadgeteering aneb zábava pro pořádné chlapy

Příspěvek od Alfajk »

hrajete si nekdo s raspberry? potreboval bych trochu navadet pri obsluze, spis nez o hardware se me jedna o software - retropie, najit si navod umim taky, ale chtel bych se spis zeptat "proc", abych pochopil souvislosti a funkcnost
CPU: AMD Ryzen 5 7600X@5,5GHz | GPU: ASUS TUF RTX 3070 GAMING 8GB@2000MHz | MB: ASUS PRIME X670-P WIFI | RAM: 32GB DDR5 6000MHz CL36 FURY EXPO | SSD: WD Black SN770 NVMe 2TB | PSU: Seasonic Focus GM-850 Gold | CPU Cooler: Noctua NH-D15 | Case: be quiet! Pure Base 500DX Black | OS: Win 10 Professional | Monitor: ASUS TUF Gaming VG27AQL1A
L!po
Začátečník
Začátečník
Registrován: 21. říj 2006
Bydliště: Dobrá Voda u Hořic, Jičín
Kontaktovat uživatele:

Re: Gadgeteering aneb zábava pro pořádné chlapy

Příspěvek od L!po »

je to emulator starejch konzoli, kde ses chopnej pripojit jak nejaky retro ovladace/klony ale treba i x360 ovladace.. nebo co si mel na mysli?
PC: CPU: R7 7800X3D, (NOCTUA NH-D14 + offset mnt ), RAM:2x16GB 6GHz CL30 G.Skill TridentZ5, MB: ROG STRIX X670E-A GAMING WIFI, GPU: Gainward Phoenix RTX 3080Ti, SSD: Samsung 960 PRO 1TB + 970 Evo plus 2TB + 850 EVO 1TB + 2x 860 EVO 500GB, PSU: Seasonic Prime GX-750W, Case: Corsair Obsidian 750D, Dell AW3418DW, Logitech G11 + MX518
Alfajk
Začátečník
Začátečník
Registrován: 15. kvě 2009

Re: Gadgeteering aneb zábava pro pořádné chlapy

Příspěvek od Alfajk »

snazim se rozbehnout emulator amigy, ale nedari se, mam hru Genetic Species jako image (cca 700MB), ale nedari se ji natahnout do raspbery pres flashku a ani se nijak nezobrazi v emulacich - je to image a podle informaci to podporuje jen adf jako disketky, da se s tim neco udelat?
CPU: AMD Ryzen 5 7600X@5,5GHz | GPU: ASUS TUF RTX 3070 GAMING 8GB@2000MHz | MB: ASUS PRIME X670-P WIFI | RAM: 32GB DDR5 6000MHz CL36 FURY EXPO | SSD: WD Black SN770 NVMe 2TB | PSU: Seasonic Focus GM-850 Gold | CPU Cooler: Noctua NH-D15 | Case: be quiet! Pure Base 500DX Black | OS: Win 10 Professional | Monitor: ASUS TUF Gaming VG27AQL1A
L!po
Začátečník
Začátečník
Registrován: 21. říj 2006
Bydliště: Dobrá Voda u Hořic, Jičín
Kontaktovat uživatele:

Re: Gadgeteering aneb zábava pro pořádné chlapy

Příspěvek od L!po »

netusim co to vsechno podporuje nebo ne.. asi bych se podival, kde se to da sehnat v pouzitelnejsim formatu pro tyhle ucely.. predpokladam ze vsechny ty navody jak tam nahrat image jsi zkousel.. ja mel predtim nejaky stranky, kde byla spousta her ale tedka uz sem to znova nenasel...
PC: CPU: R7 7800X3D, (NOCTUA NH-D14 + offset mnt ), RAM:2x16GB 6GHz CL30 G.Skill TridentZ5, MB: ROG STRIX X670E-A GAMING WIFI, GPU: Gainward Phoenix RTX 3080Ti, SSD: Samsung 960 PRO 1TB + 970 Evo plus 2TB + 850 EVO 1TB + 2x 860 EVO 500GB, PSU: Seasonic Prime GX-750W, Case: Corsair Obsidian 750D, Dell AW3418DW, Logitech G11 + MX518
Odpovědět

Zpět na „Ostatní hardware“