V předchozím článku jsme si ukázali, jak můžeme ovládat digitální výstupy. Dnes budeme LED ovládat na základě vstupů ze senzorů. Senzorů je nepřeberné množství a můžete s nimi komunikovat různými způsoby. Asi nejjednodušším senzorem je tlačítko, které se připojí na digitální pin. Použití senzorů, konkrétně infračerveného dálkoměru, si ukážeme na jednoduchém příkladu parkovacího „radaru“.

Co budeme potřebovat?

  • FEZ Panda II nebo jinou podobnou desku
  • Infračervený odrazový senzor vzdálenosti, např. GP2Y0A21 (rozsah 0,1 – 0,8 m)
  • Červenou, žlutou a zelenou LED

Zapojení

LED zapojíme stejně, jako v předchozím článku na digitální piny.

Dálkoměr se připojuje pomocí tří vodičů – zem (GND), napájení (5V) a signál (A0). Na vybraném analogovém pinu budeme číst napětí, které odpovídá vzdálenosti. V našem případě vyšší hodnota znamená bližší předmět. Průběh napětí není lineární a je závislý na typu senzoru. Potřebné informace najdete v katalogovém listu příslušného senzoru. Nejjednodušším řešením, když nepotřebujete získávat přesné hodnoty nebo hodnotu přepočítanou na měřenou veličinu, je určit hranice, na které budete reagovat, experimentálně. Prostě a jednoduše nastavíte senzor do vzdálenosti, kdy chcete zhasnout zelenou LED (místa dost) a rozsvítit žlutou LED (opatrně), a přímo přečtete hodnotu ze senzoru, kterou si uložíme. To samé uděláme pro hranici žlutá LED – červená LED. Tím, že budeme používat přímo hodnotu ze senzoru a nebudeme ji dále přepočítávat, také ušetříme systémové zdroje, kterých je na těchto malých procesorech nedostatek. Je třeba si také uvědomit, že analogový vstup poskytuje informaci v určitém rozsahu, typicky 0 = 0 V, 1023 = 5 V. Tento rozsah můžete změnit.

image

image

Aplikace

Nezapomeňte přidat referenci na GHIElectronics.NETMF.Hardware, kde najdete objekt AnalogIn.

public static void Main()
{
 
    OutputPort ledRed = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.Di0, false);
    OutputPort ledYellow = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.Di1, false);
    OutputPort ledGreen = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.Di2, false);
 
    AnalogIn distanceSensor = new AnalogIn(AnalogIn.Pin.Ain0);
            
    int distance = 0;
 
    while (true)
    {                
        ledRed.Write(false);
        ledYellow.Write(false);
        ledGreen.Write(false);
 
        // načte hodnotu, rozmezí 0 - 1023
        distance = distanceSensor.Read();
        // 20 cm, 416, červená
        // 60 cm, 100, žlutá
 
        if (distance <= 100)
        {
            ledGreen.Write(true);
        }
        else if (distance > 100 && distance <= 416)
        {
            ledYellow.Write(true);
        }
        else
        {
            ledRed.Write(true);
        }
 
        // Počkáme na další měření
        Thread.Sleep(250);
    }
}

Štěpán