neděle 7. července 2013

Lekce 5. Co je přerušení a jak funguje - infračervené čidlo pohybu

 Jak již název článku napovídá, v této lekci se budeme věnovat přerušení. A aby to bylo trošku zajímavější, tak namísto nudného tlačítka použijeme infračervené pohybové čidlo.
Pohybové čidlo je snadné zapojit. Má totiž jen dva kontakty od tlačítka Tamper (pokud otevřete kryt čidla tak se rozepne). Další dva kontakty jsou od spínacího relé čidla (pokud čidlo zaznamená pohyb tak je rozepne). No a nakonec jsou dva napájecí kontakty pro +12V.


 
Zapojení:
Do nepájivého pole si zapojíme adapter s +12V pro napájení čidla. Kontakty relé a tlačítka Tamper připojíme přes Pull-Up rezistory na vstupní porty D3 a D5. Dále si zapojíme dvě diody na porty D7 a D9.

Detail zapojení svorek pohybového čidla
Detail zapojení svorek čidla
Pohled na celé pohybové čidlo
Pohled na celé pohybové čidlo
 
Přerušení je příjemnou abstrakcí nad digitálními vstupy. Při změně jejich hodnoty je automaticky vygenerována událost na kterou můžeme reagovat.
Při deklaraci máme na výběr z několika způsobů detekování přerušení:

  • InterruptNone
  • InterruptEdgeLow
  • InterruptEdgeHigh
  • InterruptEdgeBoth
  • InterruptEdgeLevelHigh
  • InterruptEdgeLevelLow

Pokud použijete při deklaraci hodnotu InterruptNone tak při přidávání reakce na událost OnInterrupt obdržíte výjímku An unhandled exception of type 'System.ArgumentException' occurred in Microsoft.SPOT.Hardware.dll. Nejčastěji použijete asi hodnotu InterruptEdgeBoth, která vyvolá přerušení při změně stavu z LOG1 na LOG0 a zpět. Další dvojice InterruptEdgeLow a InterruptEdgeHigh reaguje pouze na náběžnou, nebo sestupnou hranu.
To jak funguje poslední dvojice se mi nepodařilo rozklíčovat. Při použití těchto hodnot se mi podařilo přerušení vyvolat pouze jedenkrát. Potom už na stisknutí tlačítka nereagovalo.

Reakci na přerušení připojíme stejně jako reakci na běžnou událost.
Tamper.OnInterrupt += new NativeEventHandler(Tamper_OnInterrupt);

Metoda reagující na přerušení má potom tři parametry.
data1 obsahuje číslo pinu na kterém došlo k přerušení. data2 obsahuje hodnotu 0 nebo 1 odpovídající úrovni vstupu. Poslední parametr time pak obsahuje čas vzniku přerušení.
static void Tamper_OnInterrupt(uint data1, uint data2, DateTime time)
        {
            GreenLed.Write(data2 == 1);
        }

Video:

Zdrojový kód:
namespace Lekce05
{
    using System;
    using System.Threading;
    using Microsoft.SPOT.Hardware;
    using SecretLabs.NETMF.Hardware.NetduinoPlus;

    public class Program
    {
        public static readonly OutputPort AlarmLed = new OutputPort(Pins.GPIO_PIN_D7, false);
        
        public static readonly OutputPort TemperLed = new OutputPort(Pins.GPIO_PIN_D9, false);

        public static readonly InterruptPort Temper = new InterruptPort(Pins.GPIO_PIN_D3, false, ResistorModes.Disabled, Port.InterruptMode.InterruptEdgeBoth);
        
        public static readonly InterruptPort Alarm = new InterruptPort(Pins.GPIO_PIN_D5, false, ResistorModes.Disabled, Port.InterruptMode.InterruptEdgeBoth);

        public static void Main()
        {
            Temper.OnInterrupt += new NativeEventHandler(Temper_OnInterrupt);

            Alarm.OnInterrupt += new NativeEventHandler(Alarm_OnInterrupt);

            Thread.Sleep(Timeout.Infinite);
        }

        static void Temper_OnInterrupt(uint data1, uint data2, DateTime time)
        {
            TemperLed.Write(data2 == 1);
        }

        static void Alarm_OnInterrupt(uint data1, uint data2, DateTime time)
        {
            AlarmLed.Write(data2 == 1);
        }
    }
}


Pokud tlačítko zapojíte mezi nulu a vstupní pin tak vhodná konfigurace portu vypadá něka takto:
public static readonly InterruptPort d = new InterruptPort(Pins.GPIO_PIN_D5, false, ResistorModes.PullUp, Port.InterruptMode.InterruptEdgeBoth);


PullUp rezistor zajistí filtrování kolísavého napětí pokud u tlačítka nezapojíte rezistor. Jinak se Vám bude přerušení generovat stále dokola podle toho kterou hodnotu se v rušení podaří detekovat.

V dalším díle se podíváme jak zjistit stav tlačítka
Zdrojové kódy ze všech lekcí jsou dostupné na https://csharpduino.codeplex.com/
Budu rád za každý komentář a konstruktivní kritiku.

Žádné komentáře:

Okomentovat