Infrarood nabijheidsschakelaar FC-51

NabijheidsschakelaarNabijheids- schakelaar
Deze sensor reageert op een voorwerp dat binnen een bepaalde afstand van de schakelaar komt. De afstand ligt rond de 10 cm, waardoor deze goed te gebruiken is om te voorkomen dat (bijvoorbeeld) een auto ergens tegen op rijdt. De schakelaar werkt erg goed, echter niet in zonlicht (ook niet in gereflecteerd zonlicht). Sluit de GND en VCC pinnen aan op GND en 5V. Er gaat een rood lampje branden als teken dat alles goed is. Om de module te testen heb je geen programma nodig: er is een tweede rood lampje dat gaat branden als er een voorwerp voor de module staat. Als dit lampje steeds aan is, dan moet je misschien de gordijnen dichtdoen. Als je nog twijfelt of de module werkt, kijk dan met een digitale camera of webcam naar de transparante led, dan zie je dat deze licht geeft. Je kunt de gevoeligheid met de draaiknop regelen: met de klok mee: de sensor reageert bij grotere afstand (maar als je te ver draait dan is de schakelaar altijd "aan").
Om de module te testen met een Arduino moet je de signaalpin aansluiten op één van de digitale pinnen; in het voorbeeld pin 7. Als een voorwerp wordt gedetecteerd, dan wordt de digitale poort 0 en anders 1. Je hebt maar enkele statements nodig om dit te testen. Het uitroepteken in het if statement zorgt ervoor dat de led op pin 13 aangaat als het voorwerp nabij komt. Het werkt allemaal erg soepel.
void setup() {
  pinMode(7, INPUT);
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, !digitalRead(7));
}
Je kunt deze module niet gebruiken om de afstand te meten. Het is echter niet moeilijk om zelf zo'n sensor te maken. Hierbij kun je dan WEL afstanden meten. Zie de pagina hierover. Als je de module wilt gebruiken om een robot te laten stoppen, dan moet je interrupts gebruiken. Verderop geef ik hier een voorbeeld van.
Bij toepassingen bij robots wordt de module meestal horizontaal gemonteerd, zodat voorwerpen in de rijrichting gedetecteerd worden. In mijn tests zet ik de modules echter rechtop in een breadboard. Als ik dus schrijf boven de module dan wil dat zeggen voor de module.

Deze schakelaar is zeer snel. Je kunt hem daarom ook gebruiken om bijvoorbeeld de rotatiesnelheid van een motor te meten. Ik heb een strookje karton op een gelijkstroommotor aangesloten en deze boven de module laten draaien. De gemeten snelheid van 6,7 omwentelingen per seconde en de breedte van het strookje kloppen goed met mijn schattingen. Je ziet dat de schakeltijd in de grootte-orde van 1 ms ligt.

Toerental van een motor metenMeting van draaiende molen

Hieronder een voorbeeld van hoe je een interruptfunctie maakt. Je kunt hiervoor bij de meeste Arduino's pin 2 en 3 gebruiken. Gebruik je andere pinnen dan krijg je geen foutmelding, maar het zal niet werken. Je moet bij de functie attachInterrupt() het interruptnummer opgeven (dus niet het pinnummer), de functie die moet worden uitgevoerd, en op welk type verandering van het signaal de interrupt volgt. Je weet nooit zeker of de Arduino-software zal veranderen of dat nieuwe Arduino's andere interruptnummers zullen gaan gebruiken. Daarom kun je het best de functie digitalPinToInterrupt() aanroepen, met het juiste pinnummer. De sensor gaat van hoog (geen voorwerp) naar laag (wel een voorwerp), dus moet je een neergaande flank detecteren, door het woord FALLING. De opgegeven functie (hier objectInZicht()) mag geen parameters bevatten en hij mag geen waarde terug geven (dus "void"). Dat is vrij logisch, want hoe zou je er een parameter in moeten krijgen en hoe zou je een return kunnen gebruiken? De aangeroepen functie moet zeer kort zijn, omdat anders andere interrupts niet op tijd worden afgehandeld. Dus liever geen seriële communicatie. Ook mag je geen delays gebruiken in deze fumctie. Doe je dat toch, dan zullen ze niet werken. Het beste is om de interrupt functie meteen de noodprocedure te laten starten en vervolgens kenbaar te maken aan de rest van het programma dat dit gedaan is. In het voorbeeld zou de motor gestopt worden en vervolgens wordt doorgegeven dat een object is gedetecteerd. Ik gebruik hiervoor de variabele ObjectAanwezig. De hoofdlus heeft nu alle tijd om hierop te reageren, bijvoorbeeld door de richting van de motoren om te keren. Bedenk dat er alleen een interrupt komt als een object in zicht komt, maar niet meer als deze in zicht blijft.
Het werken met interrupts geeft nogal eens problemen. Zo zal een schakelaar (ook deze) bij inschakelen een paar keer open en dicht gaan, zodat de interrupt functie een aantal keer achter elkaar wordt aangeroepen. Het valt buiten het kader van mijn pagina's om uit te leggen hoe je dit kunt oplossen.

Uitvoer na interruptUitvoer normaal, en na interrupt
boolean ObjectAanwezig = false;
void setup() {
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(2), objectInZicht, FALLING);
}

void loop() {
  Serial.println("Niets in zicht... ");
  delay(500);
  if (ObjectAanwezig) {
    Serial.println("  Object gedetecteerd!");
    ObjectAanwezig = false;
  }
}

void objectInZicht() {
  // STOP MOTOREN -- hier niet geïmplementeerd !
  ObjectAanwezig = true;
}

Infrarood nabijheidsschakelaar XXXX

Nog te doen