Arduino - Bewegingssensor

Wanneer u zich bij plaatsen bevindt waar deuren automatisch openen/sluiten, lampen automatisch aan/uit gaan of een roltrap automatisch wordt geactiveerd, heeft u zich ooit de vraag gesteld: “Hoe kan dat?”? Als dat zo is, dan beantwoordt deze handleiding die vraag én leert hij u hoe u het zelf kunt maken. Laten we beginnen!

In deze handleiding leert u:

Hardware Benodigd

1×Arduino Uno R3
1×USB 2.0 kabel type A/B
1×HC-SR501 Bewegingssensor
1×Verbindingsdraden
1×(Aanbevolen) Schroefklem Block Shield voor Arduino Uno
1×(Aanbevolen) Breadboard-Shield voor Arduino Uno
1×(Aanbevolen) Behuizing voor Arduino Uno
1×(Aanbevolen) Prototyping Basisplaat & Breadboard Kit voor Arduino Uno

Of u kunt de volgende kits kopen:

1×DIYables Sensorkit (30 sensoren/displays)
1×DIYables Sensorkit (18 sensoren/displays)
Openbaarmaking: Sommige van de links in deze sectie zijn Amazon-affiliate links. We kunnen een commissie ontvangen voor aankopen die via deze links worden gedaan, zonder extra kosten voor u. We waarderen uw steun.

Over de HC-SR501 Bewegingssensor

HC-SR501 Bewegingssensor

De HC-SR501 PIR sensor is een sensor die beweging van mensen (of dieren) kan detecteren. Hij wordt veel gebruikt om de aanwezigheid van mensen te herkennen in diverse toepassingen (automatisch in- of uitschakelen van een lamp, openen/sluiten van een deur, activeren/deactiveren van een roltrap, detecteren van indringers, enz.)

Pinout

De HC-SR501 bewegingssensor heeft 3 pinnen:

  • GND pin: moet worden verbonden met GND (0V)
  • VCC pin: moet worden verbonden met VCC (5V)
  • OUTPUT pin: dit is een output-pin; LOW wanneer er geen beweging wordt gedetecteerd, HIGH als beweging wordt waargenomen. Deze pin moet aangesloten worden op een input-pin van de Arduino.

De HC-SR501 heeft ook één jumper en twee potentiometers waarmee de sensorinstellingen aangepast kunnen worden. Voor nu houden we de standaardinstelling aan. Details staan beschreven in de Geavanceerde toepassingen sectie.

HC-SR501 Bewegingssensor Pinout

Hoe het werkt

De HC-SR501 sensor detecteert beweging door verandering in infrarode straling van een bewegend object te meten. Om door de sensor gedetecteerd te worden moet het object aan twee voorwaarden voldoen:

  • Het moet bewegen of schudden
  • Het moet infrarode straling uitstralen

Dus:

  • Als een object beweegt maar GEEN infrarode straling uitstraalt (bijvoorbeeld een robot of speelgoedauto), wordt het NIET door de sensor gedetecteerd.
  • Als een object infrarode straling uitstraalt maar NIET beweegt (bijvoorbeeld een stilstaande persoon), wordt het NIET door de sensor gedetecteerd.

Mensen en dieren stralen van nature infrarode warmte uit. Daarom kan de sensor de beweging van mensen en dieren detecteren.

Status van de OUTPUT pin:

  • Als er GEEN mens (of dier) beweegt binnen het detectiebereik, is de OUTPUT pin van de sensor LOW.
  • Zodra een mens (of dier) binnen het detectiebereik beweegt, gaat de OUTPUT pin van LOW naar HIGH (⇒ beweging gedetecteerd).
  • Wanneer de mens (of dier) het detectiebereik verlaat, gaat de OUTPUT pin van HIGH terug naar LOW (⇒ beweging gestopt).

De bovenstaande video toont hoe de bewegingssensor in principe werkt. In de praktijk werkt hij iets anders, afhankelijk van de sensorinstellingen (uitgelegd in de Geavanceerde toepassingen sectie).

Detecteren van menselijke aanwezigheid

De sensor detecteert zelf NIET direct de aanwezigheid van mensen, maar alleen beweging. Wij gebruiken Arduino (of een MCU) om op basis van bewegingsdetectie van de sensor te bepalen of er mensen aanwezig zijn, aan de hand van de volgende regel:

  • Als beweging gedetecteerd wordt, zijn er mensen aanwezig
  • Als er GEEN beweging wordt gedetecteerd, zijn er geen mensen aanwezig

Deze regel klopt in de praktijk niet helemaal: er kunnen mensen aanwezig zijn in het sensorbereik zonder te bewegen. In dat geval wordt er geen beweging gedetecteerd en concludeert de Arduino (of MCU) dat er niemand aanwezig is.

Bijvoorbeeld: als een vergaderruimte de bewegingssensor gebruikt om automatisch de verlichting in- en uit te schakelen, gaat het licht aan als mensen bewegen in de ruimte. Als iedereen tijdens de vergadering stil zit, wordt er geen beweging gedetecteerd, dus denkt het systeem dat er niemand is en gaat het licht uit. Om het licht weer aan te krijgen moet iemand bewegen.

Dit nadeel is echter niet groot en de sensor is goedkoop. Daarom wordt hij veelvuldig gebruikt om aanwezigheidsdetectie op basis van beweging toe te passen.

Arduino - HC-SR501 Bewegingssensor

Als een Arduino-pin is geconfigureerd als digitale ingang kan deze de status (LOW of HIGH) lezen van wat erop is aangesloten.

Door de OUTPUT pin van de HC-SR501 sensor te verbinden met een digitale ingang van de Arduino, kunnen we met Arduino code de waarde van deze pin uitlezen om beweging te detecteren.

Aansluitschema

Arduino Bewegingssensor Aansluitschema

This image is created using Fritzing. Click to enlarge image

Eerste instellingen

Time Delay Adjuster Draai deze helemaal tegen de klok in.
Detection Range Adjuster Draai deze helemaal met de klok mee.
Repeat Trigger Selector Plaats de jumper zoals op de afbeelding.
Arduino Bewegingssensor eerste instelling

Hoe te programmeren voor Bewegingssensor

  • Configureer een Arduino-pin als digitale ingang met de pinMode() functie
pinMode(PIN_TO_SENSOR, INPUT);
  • Lees de status van de OUTPUT pin van de sensor uit met de digitalRead() functie
pinStateCurrent = digitalRead(PIN_TO_SENSOR);
  • Detecteer start van beweging (pinstatus verandert van LOW naar HIGH)
pinStatePrevious = pinStateCurrent; // sla oude status op pinStateCurrent = digitalRead(PIN_TO_SENSOR); // lees nieuwe status if (pinStatePrevious == LOW && pinStateCurrent == HIGH) { // pinstatus veranderd: LOW -> HIGH Serial.println("Beweging gedetecteerd!"); }
  • Detecteer stoppen van beweging (pinstatus verandert van HIGH naar LOW)
pinStatePrevious = pinStateCurrent; // sla oude status op pinStateCurrent = digitalRead(PIN_TO_SENSOR); // lees nieuwe status if (pinStatePrevious == HIGH && pinStateCurrent == LOW) { // pinstatus veranderd: HIGH -> LOW Serial.println("Beweging gestopt!"); }

Arduino Code

/* * Deze Arduino code is ontwikkeld door newbiely.nl * Deze Arduino code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/arduino/arduino-motion-sensor */ const int PIN_TO_SENSOR = 2; // pin die verbonden is met de OUTPUT pin van de sensor int pinStateCurrent = LOW; // huidige pinstatus int pinStatePrevious = LOW; // vorige pinstatus void setup() { Serial.begin(9600); // initialiseer serial communicatie pinMode(PIN_TO_SENSOR, INPUT); // zet Arduino pin in input modus om OUTPUT pin van sensor te lezen } void loop() { pinStatePrevious = pinStateCurrent; // sla vorige status op pinStateCurrent = digitalRead(PIN_TO_SENSOR); // lees nieuwe status if (pinStatePrevious == LOW && pinStateCurrent == HIGH) { // pinstatus verandert: LOW -> HIGH Serial.println("Beweging gedetecteerd!"); // TODO: hier alarm aanzetten, licht inschakelen of apparaat activeren } else if (pinStatePrevious == HIGH && pinStateCurrent == LOW) { // pinstatus verandert: HIGH -> LOW Serial.println("Beweging gestopt!"); // TODO: hier alarm uitzetten, licht uitschakelen of apparaat deactiveren } }

Snelle stappen

  • Kopieer bovenstaande code en open deze in Arduino IDE
  • Klik op de Upload knop in Arduino IDE om de code naar Arduino te sturen
  • Open de Seriële Monitor
  • Beweeg uw hand voor het sensorbereik
  • Bekijk de output in de Seriële Monitor
COM6
Send
Motion detected! Motion stopped!
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Video Tutorial

We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.

Geavanceerde toepassingen

Deze sectie is gewijd aan diepgaande kennis. Maak u GEEN zorgen als u het niet begrijpt. Sla deze sectie over als deze u overweldigt en kom op een andere dag terug. Lees verder met de volgende secties.

Zoals hierboven vermeld kunnen we de sensorinstelling aanpassen met één jumper en twee potentiometers.

Detection Range Adjuster

Deze potentiometer wordt gebruikt om het detectiebereik aan te passen (ongeveer 3 tot 7 meter).

  • Helemaal met de klok mee draaien geeft een detectiebereik van ongeveer 3 meter.
  • Helemaal tegen de klok in draaien geeft een bereik van ongeveer 7 meter.
Detectiebereik aanpassen

We kunnen hem instellen op een gewenste waarde tussen 3m en 7m.

Time Delay Adjuster

Deze potentiometer regelt de tijdvertraging.

  • Helemaal met de klok mee gedraaid betekent ongeveer 5 minuten tijdvertraging.
  • Helemaal tegen de klok in gedraaid betekent ongeveer 3 seconden tijdvertraging.

De betekenis van de tijdvertraging wordt in combinatie met Repeat Trigger uitgelegd in het volgende onderdeel.

Time delay instellen

Repeat Trigger Selector

Deze jumper bepaalt het triggermechanisme: single trigger (één keer triggeren) of repeatable trigger (herhaaldelijk triggeren).

Trigger selectie

We noemen de ingestelde tijdvertraging (via de Time Delay Adjuster) time_delay. Stel dat u langere tijd binnen het sensorbereik blijft bewegen (genoemd motion_time), meerdere keren langer dan time_delay:

  • Single trigger modus: de OUTPUT pin verandert verschillende keren tussen LOW en HIGH. De HIGH periode is gelijk aan time_delay. De LOW periode is vast op 3 seconden.
Single trigger modus
  • Repeatable trigger modus: de OUTPUT pin blijft gedurende (motion_time + time_delay) op HIGH staan.
Repeatable trigger modus

Testen

Om de triggermodi te bekijken, doen we de volgende test. Zet de Time Delay Adjuster helemaal tegen de klok in op 3 seconden.

  • Single trigger modus:
    • Zet de jumper op single trigger mode
    • Beweeg uw hand ongeveer 10 seconden voor de sensor
    • Haal uw hand weg uit het sensorbereik
    • Wacht 3 seconden; de seriële monitor toont:
    COM6
    Send
    Motion detected! Motion stopped! Motion detected! Motion stopped! Motion detected! Motion stopped!
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  
    • Repeatable trigger modus:
      • Zet de jumper op repeatable trigger mode
      • Beweeg uw hand ongeveer 10 seconden voor de sensor
      • Haal uw hand weg uit het sensorbereik
      • Wacht 3 seconden; de seriële monitor toont:
      COM6
      Send
      Motion detected! Motion stopped!
      Autoscroll Show timestamp
      Clear output
      9600 baud  
      Newline  

      Zoals te zien is, triggert de sensor bij single trigger meerdere keren, terwijl hij in repeatable trigger slechts één keer triggert.

      ※ Notiz:

      In beide modi kan de sensor tijdens de vaste LOW periode van 3 seconden geen beweging detecteren, oftewel de sensor is in deze periode geblokkeerd. In de praktijk veroorzaakt dit geen problemen.

      Wij raden aan de repeatable trigger modus te gebruiken.

      In veel toepassingen:

      • Worden apparaten direct ingeschakeld zodra een mens wordt gedetecteerd
      • Worden apparaten pas met vertraging uitgeschakeld nadat er geen mens meer wordt gedetecteerd

      Hoe de tijdvertraging te gebruiken

      Wanneer er geen mens meer wordt gedetecteerd, voert het systeem actie uit na een ingestelde tijdvertraging.

      Deze vertraging kan op twee plekken ingesteld worden:

      • Op de bewegingssensor zelf: minimum 3 seconden, maximum 5 minuten via de Time Delay Adjuster
      • In de Arduino code: vrij instelbaar via programmering

      Als u geen timeout in de Arduino code instelt, geldt de timeout vanuit de sensorinstelling.

      Als u wel een timeout in de Arduino code instelt, is de effectieve timeout de som van de sensorvertraging en de codevertraging.

      Tijdvertraging instellen in Arduino code

      /* * Deze Arduino code is ontwikkeld door newbiely.nl * Deze Arduino code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/arduino/arduino-motion-sensor */ const int PIN_TO_SENSOR = 2; // pin die verbonden is met de OUTPUT pin van sensor int pinStateCurrent = LOW; // huidige pinstatus int pinStatePrevious = LOW; // vorige pinstatus const unsigned long DELAY_TIME_MS = 30000; // 30000 milliseconden = 30 seconden bool delayEnabled = false; unsigned long delayStartTime; void setup() { Serial.begin(9600); // initialiseer serial communicatie pinMode(PIN_TO_SENSOR, INPUT); // zet Arduino pin in input modus om OUTPUT pin van sensor te lezen } void loop() { pinStatePrevious = pinStateCurrent; // sla status op pinStateCurrent = digitalRead(PIN_TO_SENSOR); // lees nieuwe status if (pinStatePrevious == LOW && pinStateCurrent == HIGH) { // status verandert: LOW -> HIGH Serial.println("Beweging gedetecteerd!"); Serial.println("Inschakelen / activeren"); delayEnabled = false; // schakel vertraging uit // TODO: hier alarm aanzetten, licht inschakelen of apparaat activeren } else if (pinStatePrevious == HIGH && pinStateCurrent == LOW) { // status verandert: HIGH -> LOW Serial.println("Beweging gestopt!"); delayEnabled = true; // schakel vertraging in delayStartTime = millis(); // zet starttijd } if (delayEnabled == true && (millis() - delayStartTime) >= DELAY_TIME_MS) { Serial.println("Uitschakelen / deactiveren"); delayEnabled = false; // schakel vertraging uit // TODO: hier alarm uitzetten, licht uitschakelen of apparaat deactiveren } }

      Stel dat de repeatable trigger modus is gekozen. In deze code is de vertraging 30 seconden. Dat betekent dat de totale vertraging 30 seconden plus time_delay (ingesteld via de Time Delay Adjuster op de sensor) bedraagt.

Daag uzelf uit

Gebruik de bewegingssensor om een van de volgende projecten te maken:

  • Schakel automatisch het licht aan zodra u een kamer binnengaat en laat het licht uitgaan 30 seconden nadat u vertrekt. Tip: Raadpleeg Arduino - Relay.
  • Activeer automatisch een alarm wanneer iemand dichtbij uw waardevolle spullen komt. Tip: Raadpleeg Arduino - Piezo Buzzer.

Functiereferenties

※ ONZE BERICHTEN

  • U bent welkom om de link naar deze tutorial te delen. Gebruik onze inhoud echter niet op andere websites. We hebben veel moeite en tijd gestoken in het maken van de inhoud, respecteer alstublieft ons werk!