Robotický den s .NET Micro Framework – FEZ Panda II, senzory

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