Maak een nabijheidssensor ongevoelig voor omgevingslicht
Nabijheidssensoren voor robots sturen infrarood-licht (IR) uit en meten daarna hoeveel van dat licht door een nabijgelegen object wordt teruggekaatst. Als er echter ook andere bronnen van IR-licht aanwezig zijn, bijvoorbeeld de zon, dan kan de sensor geen onderscheid maken tussen weerkaatst IR-licht dat hij zelf heeft uitgestuurd, en IR-licht afkomstig uit de omgeving. Hierdoor kan de sensor verkeerdelijk concluderen dat er een object vlakbij is, terwijl het eigenlijk gaat om omgevingslicht van de zon, van een gloeilamp of van een andere IR-lichtbron (dit probleem komt niet, of nauwelijks, voor bij TL-lampen of fluorescentielampen).
Dit probleem kan je eenvoudig oplossen door eerst afzonderlijk het omgevingslicht te meten en daar dan rekening mee te houden op het moment dat beslist wordt of er een object "in beeld" is. De nabijheidssensor is hierop voorzien: je kan immers de IR-LED in de sensor aan- of uitschakelen. Als de IR-LED uit staat, meet je enkel omgevingslicht, als de IR-LED aan staat, wordt zowel omgevingslicht als teruggekaatst licht opgemeten. De werkelijke hoeveelheid teruggekaatst licht kan dan berekend worden door het verschil te nemen van beide metingen. (Dit verschil zal niet exact gelijk zijn aan het teruggekaatste licht door de niet-lineariteit, clipping, ... maar voor een nabijheidssensor is het resultaat meestal wel voldoende nauwkeurig).
Om de IR-LED in de sensor uit te schakelen moet een kleine wijziging aangebracht worden in de schakeling: de positieve klem van de IR-LED is nu niet meer verbonden met een vaste spanning van 5 V, maar met een van de digitale uitgangen van de microcontroller, waardoor de LED via de software aan- of uitgeschakeld kan worden.

Onderstaand codefragment verondersteld dat de IR-LED met pin RC0 verbonden werd, dat RC0 reeds werd geconfigureerd als uitgang (via TRISCbits.PC0 = 0) en dat de functie readAnalog(channel) het resultaat teruggeeft van een A/D-conversie van het signaal op channel:
#define IRLED PORTCbits.PC0 int readActualReflectedLight(int channel) { int ambient, total; IRLED = 0; // turn IR LED off to measure ambient light only ambient = readAnalog(channel); IRLED = 1; // turn IR LED on to measure ambient + reflected light total = readAnalog(channel); return ambient - total; // compute and return reflected light }
- Type:
- login of registreer om te reageren
-


Uw winkelwagen