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.
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