Department of InformatiX
Microsoft .NET Micro Framework Tools & Resources

První krůčky s Visual Studiem a GPIO

Tato část má za úkol úplné začátečníky seznámit s vývojem pro .NET Micro Framework. Napíšeme jednoduchý program, který bude svítit diodou LED, pokud bude stisknuté tlačítko. Jako hardware použijeme desku Tahoe, ale stejně tak je možné postupovat v případě jiného hardwaru nebo emulátoru.

Instalace potřebného softwaru

  1. Budete potřebovat Visual Studio 2008 SP1, nebo Visual C# 2008 Express Edition. Pokud nemáte, 90-denní trial verze Professional edice je ke stažení zdarma zde (k programování .NET Micro Frameworku stačí, pokud si nainstalujete podporu C#), Express edice zde. Studenti mají k dispozici vývojové nástroje zdarma na serveru DreamSpark.
    • Visual Studio 2008 podporuje pouze vývoj pro .NET Micro Framework 4.0 a 3.0. Pokud potřebujete vyvíjet pro nižší verzi, potřebujete Visual Studio 2005.
    • Microsoft zatím podporuje vývoj pouze v C#. Pokud jste pokročilí uživatelé, můžete do zařízení dostat assembly z kteréhokoliv .NET jazyka, ale bez podpory ladění.
  2. Dále potřebujete vlastní .NET Micro Framework. Ten získáte ve formě tzv. SDK (Software Development Kit). Poslední, tedy čtvrtou verzi můžete stáhnout zde.
    • Další verze můžete najít v odkazech.
    • SDK potřebujete i pokud chcete používat jen emulátor. V takovém případě si můžete vybrat verzi, která vám vyhovuje.
    • Originální Tahoe deska je dodáváná s frameworkem 2.5. Upgradovat firmware na verzi 3.0 je možné jednoduchým prográmkem od výrobce.
  3. Stáhněte si a nainstalujte SDK k vašemu hardware. V tomto příkladě používám SDK k desce Tahoe, které lze získat zde.
    • I v případě, že hardware zatím nemáte, lze SDK ve většině případů nainstalovat a používat.
    • Někteří výrobci se svým SDK dodávají i emulátory, které více odpovídají jejich zařízení, a detailnější dokumentaci k jejich produktům.
    • Pokud chcete používat jen základní emulátor od Microsoftu, můžete tento krok vynechat.
  4. Máte-li hardware, připojte jej k počítači přiloženým USB kabelem. Pokud Windows zařízení samy nenainstalují, najdete ovladače v případě Tahoe ve složce, kam jste rozbalili jeho SDK, podsložka Drivers.
    • Pokud napájíte hardware pouze po USB kabelu, dbejte na to, aby byl připojen do portu, který poskytuje potřebné napájecí napětí dle standardu USB. Typicky se vyvarujte hubům a pozor na některé notebooky. Pokud zjistíte, že má zařízení starosti (nenastartuje, prázdný displej), připojte jej přímo do stolního počítače.

Vytvoření projektu

  1. Založte nový projekt. V menu File vyberte New | Project.... Instalace SDK rozšířila Visual Studio o nové typy projektů:
    Dialog New Project
    V levém stromu najděte položku Visual C#, rozbalte ji a klikněte na Micro Framework. Pro tento příklad nám postačí Console Application. Vyberte ji a projekt vytvořte.
  2. Je třeba nastavit, do kterého zařízení se bude naše aplikace nahrávat. V Solution Exploreru klikněte pravým tlačítkem na název projektu
    Properties v menu
    a vyberte Properties. Otevře se dokument se záložkami. Vyberte .NET Micro Framework a v seznamu Transport zvolte USB:
    Vlastnosti projektu
    Pokud je vše v pořádku, objeví se v seznamu Device název vašeho zařízení, v tomto případě Meridian_ a jedinečný identifikátor.
    Device: Meridian_xxxxxxxx
    Vlastnosti projektu můžete zase zavřít.
    • Pokud nemáte hardware, vyberte v seznamu Transport položku Emulator a v seznamu Device položku TahoeEmulator.
    • Název zařízení si můžete změnit dle libosti utilitkou MFDeploy umístěnou ve složce, kam jste nainstalovali .NET Micro Framework SDK, podsložka Tools.
  3. Protože chceme pracovat se vstupy a výstupy, musíme přidat referenci na některé assembly. Klikněte v Solution Exploreru pravým tlačítkem na složku References
    Add Reference... v menu
    a vyberte Add Reference.... Určitě potřebujeme Microsoft.SPOT.Hardware a pro komfort vyberte ještě DeviceSolutions.SPOT.Hardware.Meridian a DeviceSolutions.SPOT.Hardware.Tahoe (využijeme z nich akorát konstanty pro piny).
    Dialog Add Reference
    • Více položek najednou můžete vybrat přidržením klávesy Ctrl.

Psaní programu

  1. Dvojklikem na Program.cs v Solution Exploreru otevřete kód programu. Nadeklarujeme dvě proměnné, LED, která představuje svítivou diodu a SW7, která představuje prostřední tlačítko na desce Tahoe. Pro práci s výstupními porty je určena třída Microsoft.SPOT.Hardware.OutputPort, pro vstupní porty s podporou přerušení pak Microsoft.SPOT.Hardware.InterruptPort. Proměnné budou statické, abychom na ně mohli přistupovat ze statických metod. Před metodu Main tedy napište static OutputPort:
    Deklarace proměnných
    Podle barvy i seznamu vidíme, že OutputPort není pro Visual Studio známá třída. To proto, že je schovaná v namespace Microsoft.SPOT.Hardware, kterou zatím nevyužíváme. Pod písmenem t se ale objevil malý obdélníček, na který když kliknete,
    nabídka Smart Tag
    dostane se vám možností, jak situaci napravit. Vybereme using Microsoft.SPOT.Hardware;, abychom tak nemuseli činit při každém použití tříd z tohoto prostoru a udrželi kód přehledný.
    Výsledná deklarace tedy vypadá takto:
    public class Program { static OutputPort LED; static InterruptPort SW7; public static void Main() { ...
    • Klávesová zkrátka pro zobrazení nabídky Smart Tagu (rozbalení obdélníčku) je Alt+Shift+F10.
  2. Inicializujeme proměnné, a to v metodě Main, která se zavolá při spuštění programu v procesoru.
    Konstruktor třídy OutputPort má dva parametry - číslo pinu a výchozí stav. Vyberte například GPIO1 z třídy DeviceSolutions.SPOT.Hardware.Meridian a false.
    Konstruktor třídy InterruptPort toho potřebuje víc:
    • Číslo pinu je DeviceSolutions.SPOT.Hardware.Tahoe.SW7.
    • Dále máte možnost na tomto pinu zapnout ochranu proti zákmitům, což nyní nepotřebujeme; zvolte false.
    • Pak je třeba uvést, jaký pull resistor chcete, aby procesor na tomto pinu používal. Podporované hodnoty lze většinou najít v dokumentaci, anebo prostě zkusit (program hodí výjimku, pokud se netrefíte). Tahoe používá pouze pull-up resistory, pro které je určena hodnota Microsoft.SPOT.Hardware.Port.ResistorMode.PullUp.
    • A jako poslední parametr máte možnost si zvolit, kdy chcete vyvolat přerušení. Nás zajímá jak náběžná tak sestupná hrana (v obou případech chceme změnit stav LEDky) - Microsoft.SPOT.Hardware.Port.InterruptMode.InterruptEdgeBoth.
    Tedy pokud jste přidali další jmenné prostory, vypadá inicializace následovně:

    LED = new OutputPort(Meridian.Pins.GPIO1, false); SW7 = new InterruptPort(Tahoe.Pins.SW7, false, Port.ResistorMode.PullUp, Port.InterruptMode.InterruptEdgeBoth);
    • Ne všechen hardware podporuje sledování přerušení na obě hrany nebo ochranu proti zákmitům, pozorně si přečtěte dokumentaci.
  3. Vytvoříme rutinku, která se zavolá když přerušení nastane. K tomu využijeme událost OnInterrupt třídy InterruptPort. Napišme tedy za inicializaci SW7.OnInterrupt +=
    přihlášení k události
    a dvakrát stiskneme klávesu Tab, což vygeneruje příslušnou metodu i přihlášení k události:
    ... SW7.OnInterrupt += new NativeEventHandler(SW7_OnInterrupt); } static void SW7_OnInterrupt(uint data1, uint data2, TimeSpan time) { } }
    • Jak už napovídá operátor +=, může přerušení zavolat více metod. Stejně tak mohou různá přerušení zavolat stejnou metodu.
  4. Delegát typu NativeEventHandler je nový delegát pro zpracovávání všech druhů nativních událostí. Z toho důvodu jsou názvy a typy jeho parametrů zvoleny poněkud obecně. V případě událostí z InterruptPortu máme v těle metody SW7_OnInterrupt k dispozici tyto údaje:
    • data1 - číslo pinu, který přerušení vyvolal (lze převést na Cpu.Pin, Tahoe.Pins či jakýkoliv jiný enum)
    • data2 - aktuální hodnota na portu (v našem případě nenulová hodnota znamená, že byla hrana vzestupná, nulová sestupná)
    • time - čas procesoru, kdy přerušení nastalo
    Při přerušení uděláme dvě věci: vypíšeme, kdy přerušení nastalo a změníme odpovídajícím způsobem stav diody. Výstup pro účely ladění lze vypsat metodou Debug.Print a hodnotu na výstupním portu změníme metodou OutputPort.Write:
    static void SW7_OnInterrupt(uint data1, uint data2, TimeSpan time) { Debug.Print(time + ": Tlačítko " + (data2 == 0 ? "stisknuto" : "uvolněno")); LED.Write(data2 == 0); }
    • Při použití pull-up resistorů tlačítka spojují procesor se zemí. Pokud jsou rozepnuta, je na procesoru napětí. Proto stav 1 znamená rozepnuto a 0 sepnuto. Rovněž proto musíme na diodu zapsat opačnou hodnotu.
    • V .NET Micro Frameworku není metoda Console.WriteLine, ani žádná jiná, která by formátovala řetězce typu "{0}: Tlačítko {1}".
    • Debug.Print se při kompilaci zcela vynechává, pokud zvolíte konfiguraci Release.
    • Není úplně od věci si přejmenovat parametry data1 a data2 na něco více smysluplného, například port a state.
  5. A nakonec musíme procesor zaměstnat po dobu, co se tlačítko nemačká. Program tak jak jej nyní máme by po spuštění totiž okamžitě skončil. Provedeme to tak, že vlákno uspíme příkazem System.Threading.Thread.CurrentThread.Suspend(), což procesoru umožní přepnout se v době nečinnosti do režimu s nízkou spotřebou.
    Celý program vypadá tedy takto:

    using System; using System.Threading; using Microsoft.SPOT; using Microsoft.SPOT.Hardware; using DeviceSolutions.SPOT.Hardware; namespace MFConsoleApplication1 { public class Program { static OutputPort LED; static InterruptPort SW7; public static void Main() { LED = new OutputPort(Meridian.Pins.GPIO1, false); SW7 = new InterruptPort(Tahoe.Pins.SW7, false, Port.ResistorMode.PullUp, Port.InterruptMode.InterruptEdgeBoth); SW7.OnInterrupt += new NativeEventHandler(SW7_OnInterrupt); Thread.CurrentThread.Suspend(); } static void SW7_OnInterrupt(uint data1, uint data2, TimeSpan time) { Debug.Print(time + ": Tlačítko " + (data2 == 0 ? "stisknuto" : "uvolněno")); LED.Write(data2 == 0); } } }

Spuštění aplikace a ladění

  1. Spustit aplikaci je snadné. Prostě v menu zvolíte Debug | Start Debugging. Za běhu můžete mačkat prostřední tlačítko na Tahoe (nebo jeho emulátoru) a sledovat okno Output. ladění
    Pokud dáte kurzor na řádek s LED.Write(data2 == 0); a kliknete na Debug | Toggle Breakpoint, vytvoří se zde breakpoint, což znamená, že běh programu se pozastaví, jakmile se dostane na označený příkaz (zkuste po vytvoření breakpointu stisknout tlačítko).
    • Klávesová zkratka pro spuštění je F5, pro nastavení/smazání breakpointu F9.
    • Pokud nevidíte okno Output, lze jej za běhu zobrazit pomocí menu View | Output.
  2. A co teď? Například:
    • Najedete-li kurzorem přes název proměnné, zobrazí se vám její aktuální hodnota. Kliknutím na ni můžete hodnotu i změnit.
    • V okně Autos (menu Debug | Windows | Autos) vidíte všechny proměnné, jejich typ a hodnotu, které se používají v okolí příkazu, na kterém se právě nacházíte.
    • Do okna Immediate (menu Debug | Windows | Immediate) můžete psát příkazy, které se ihned vykonají,
      okno Immediate
      například rozsvítit nebo zhasnout diodu ručně, jen to zkuste!
    • V okně Threads (menu Debug | Windows | Threads) vidíte seznam všech vláken, která na zařízení právě běží.
      okno Threads
      Dvojklikem na vlákno snadno zjistíte, kde se právě nachází a co dělá.
    • Bohužel nemůžete program upravovat za běhu.
  3. Ukončit ladění lze příkazem Debug | Stop Debugging (nebo Shift+F5).

Připojení diody k hardware

Běžnou svítivou diodu nemůžete jen tak připojit k procesoru, protože ten je schopen dát pouze určité množství proudu. Abychom procesor nezničili, musíme tedy proudové zatížení omezit odporem. Máte dvě možnosti: spočítat si příslušnou hodnotu a zapojit ho do série s diodou, anebo někde sehnat diodu s odporem už vestavěným, například v GES Electronics.

Jak spočítat hodnotu odporu? Potřebujete znát tři údaje.

Hodnota odporu pak je (Upin – Uf) / Isrc, v našem případě (3.3 V – 2 V) / 0.004 A = 325 Ω.

Další možnost je také nic nehledat, nepočítat a dát tam třeba 5 kΩ pro jistotu. Jediné co se může stát je, že bude dioda svítit slabě.

GPIO0V/GND

Zbývá otázka, jak diodu připojit fyzicky. Například Tahoe má piny vyvedené na 0.1" konektory, ale samečky:
fotka konektorů na Tahoe

LED s koncovkamiMůžete si samozřejmě vyrobit kablíky, nebo přiletovat opačné koncovky rovnou na diodu. Pokud máte ale po ruce volný IDE kabel od pevného disku nebo od disketové mechaniky, můžete jej rovnou připojit na Tahoe! Získáte tak stejné rozložení pinů, ale na konektoru, do kterého můžete snadno drátky zastrkat. V tomto případě ovšem, kdy potřebujeme zapojit dva drátky, si vystačíte i s nějakým kablíkem z počítače, například ze základní desky (k tlačítkům, větrákům nebo diodám) nebo třeba mezi CD mechanikou a zvukovou kartou (ať už analogový nebo digitální).

Pin GPIO1, který jsme si (ne náhodou) vybrali v programu je hned naproti zemi (0V), takže oba konce, které potřebujeme připojit, jsou hned u sebe. Diodu můžete ještě předtím vyzkoušet zapojením mezi 0V a 3.3V, které jsou také na sousedním pinu. Na zem patří katoda diody, kterou poznáte buď podle kratší nožičky, nebo podle toho, že je na té straně svítivá část diody seřízlá. Pokud diodu zapojíte obráceně, nebude akorát svítit.

Upravená LED připojená přímo na Tahoe.
Všimněte si seřízlé strany připojené na 0V.

Tyto mají vestavěný rezistor,
bez něj diodu přímo nepřipojujte!

LED připojená pomocí IDE kabelu.

No není to snadné? ;-)

Comments
Sign in using Live ID to be able to post comments.