Favoriet

Social distancing met Raspberry Pi

In dit project leer je hoe je een social distancing sensor kunt maken. We maken gebruik van een HC-SR04 sensor. Dit is een ultrasone afstand sensor. Door deze aan te sluiten op een Raspberry Pi kunnen we de data omzetten naar een afbeelding. Tijdens dit project maken we gebruik van de OpenCV library.

Achtergrondinformatie

Het circuit

Bij het aansluiten van de afstand sensor moet je op een paar dingen letten. De groene draad zit via een 1k weerstand aangesloten op echo. Dit is omdat de ECHO pin op de HC-SR04 sensor ook een ground (GND) nodig heeft.

De Code

Voordat we kunnen beginnen aan de code hebben we 2 afbeeldingen nodig dit mag alles zijn wat je wilt. Deze kan je dan opslaan onder /home/pi/Pictures vergeet ze niet een naam te geven.

De code bestaat uit drie delen:

  1. Het initialiseren van de pins en afbeeldingen.
  2. Het berekenen van de afstand.
  3. De afbeeldingen laten zien op basis van de afstand.
import RPi.GPIO as GPIO
import time
import cv2

Deze drie lijnen codes zorgen ervoor dat de library’s voor de pins, timer en afbeeldingen in de code kunnen worden gebruikt.

GPIO.setmode(GPIO.BOARD)

De RPi.GPIO llibrary maakt het gebruik van de pins op de raspberry pi makkelijker. Bij deze library zijn er twee manieren om pins te nummeren: BOARD-nummers of broadcom (BCM). Wij gebruiken BOARD numbers omdat dit overzichtelijker is in de code. Deze lijn code zorgt ervoor dat wij voor de rest van de code de BOARD functie gebruiken.

PIN_TRIGGER = 7
PIN_ECHO = 11

Met deze twee lijnen code zorg je ervoor dat we de pins 7 en 11 makkelijker kunnen herkennen in onze code.

GPIO.setup(PIN_TRIGGER, GPIO.OUT)
GPIO.setup(PIN_ECHO, GPIO.IN)

Met deze twee lijnen code zet je de pins op output en input.

GPIO.output(PIN_TRIGGER, GPIO.LOW)

Hiermee zet je het signaal op pin 7 op laag (0 volt).

Time.sleep(2)

Neemt 2 seconden pauze in de code.

Img = cv2.imread(‘/home/pi/Pictures/naam van afbeelding’)
Img2 = cv2.imread(‘/home/pi/Pictures/naam van afbeelding’)

Met deze twee lijnen code link je de afbeeldingen aan een waarde. Zo kan je later in de code img en img2 gebruiken om een afbeelding te laten zien.

Winname = ‘venster’

Met deze waarde kan je later de afmetingen en plek van je afbeeldingen veranderen.

For i in range(10):

Deze code zorgt ervoor dat je alles eronder 10 keer herhaalt.

Time.sleep(1)

Zorgt voor een korte pauze van een seconde.

GPIO.output (PIN_TRIGGER, GPIO.HIGH)

Hiermee zet je de trigger pin aan op de hc-sr04 deze pin geeft aan dat de sensor moet beginnen met het meten van de afstand.

time.sleep (0.00001)

omdat de sensor werkt met ultrasonische meting gaat dit met een snelheid van 343 meter per seconde. Daarom is er nooit veel tijd nodig om een meting te krijgen.

GPIO.output (PIN_TRIGGER, GPIO.LOW)

Hiermee zet je de trigger pin uit.

While GPIO.input(PIN_ECHO)==0:
    Pulse_start_time = time.time()
While GPIO.input(PIN_ECHO)==1:
    Pulse_end_time = time.time()

Deze vier lijnen code werken doormiddel van de timer library en de sensor. De hc-sr04 sensor werkt doormiddel van de trigger en input pin. Als de TRIGGER pin een signaal krijgt zal deze beginnen met meten en tegelijkertijd de ECHO pin naar 0 zetten. Als de sensor dan een signaal ontvang zal de ECHO pin naar 1 gaan.

Omdat je aan het begin van de code de time library hebt toegevoegd kan je gebruik maken van de code time.time(). Deze meet de tijd in seconden (met een precisie van +- 1 microseconden). Hij meet de tijd vanaf 1 januari 1970. Daarom is het belangrijk dat we de tijd op twee punten meten en deze van elkaar aftrekken. Daarvoor is pulse_start_time en pulse_end_time.

Pulse_duration = pulse_end_time – pulse_start_time

Deze code berekent de tijd tussen een lezing van de sensor dus als je bijvoorbeeld bij

Pulse_start_time de waarde 1616403270 seconden sinds epoch ( 1 januari 1970).

En pulse_end_time 1616403275 seconden sind epoch krijgt betekent dat je pulse_duration 5 seconden is.

distance = round(pulse_duration * 17150, 2)

deze code meet de afstand uit in cm. De waarde van 17150 is de snelheid van het licht in cm/s (34300 cm) gedeeld door twee. We delen deze waarde door twee omdat de sensor heen en terug moet kaatsen naar de sensor dus hij anders de dubbele afstand meet. Met de round functie ronden we de waarde af naar 2 achter de komma.

distance = round(pulse_duration * 17150, 2)
Print (“Distance:”,distance,”cm”)

 

Hiermee print je de afstand uit die de sensor heeft gemeten. Als dit goed gaat zou je bijvoorbeeld dit moeten zien

Distance: 45,44 cm

Als je met de opencv library een foto wilt laten zien zal deze altijd links onderin het scherm komen te staan. Omdat je daar ook de afstand van de sensor kan zien willen we de afbeelding rechts bovenin neerzetten. Om dit te doen moeten we voordat we de afbeelding laten zien een window maken waarin we hem gaan laten zien.

Om een window te maken gebruiken we:

cv2.namedWindow(winname, cv2.WINDOW_NORMAL)

Je kan een window maken op twee manieren WINDOW_AUTOSIZE en WINDOW_NORMAL.

Met autosize zal je window links onderin staan.

Met normal kan je je window zelf een plek en groote geven.

cv2.resizeWindow(winname, 100,100)
cv2.moveWindow(winname, 1200,30)

Met deze twee lijnen code kan je de window aanpassen.

If (distance < 150):

Als de afstand van de sensor minder dan 150 cm is zal die de volgende code gebruiken.

cv2.imshow(winname, img)
cv2.waitKey(1000)

Met deze code zal de code de eerste afbeelding laten zien. dit kan een kruis zijn of een groot rood scherm daarna zal die 1000 milliseconden (1 seconde) wachten.

else:

Als de afstand hoger dan 150 cm is zal de volgende code gebruikt worden

cv2.imshow(winname, img2)
cv2.waitKey(1000)

Deze code werkt hetzelfde het enige verschil is dat je de tweede afbeelding laat zien. Dit kan bijvoorbeeld een groen scherm zijn of een duim omhoog.

cv2.destroyAllWindows()

Nadat je de afbeelding hebt laten zien sluit deze lijn code hem weer. Daarna kan de volgende meting uitgevoerd worden.

GPIO.cleanup()

Hiermee zet je aan het eind van je code al je GPIO pins naar input. Dit is om kortsluiting te voorkomen als je iets wilt veranderen of losmaken.

Als dit gelukt is krijg je uiteindelijk de volgende code.

import RPi.GPIO as GPIO
import time
import cv2

GPIO.setmode(GPIO.BOARD)
PIN_TRIGGER = 7
PIN_ECHO = 11
GPIO.setup(PIN_TRIGGER, GPIO.OUT)
GPIO.setup(PIN_ECHO, GPIO.IN)
GPIO.output(PIN_TRIGGER, GPIO.LOW)
Time.sleep(2)
Img = cv2.imread(‘/home/pi/Pictures/naam van afbeelding’)
Img2 = cv2.imread(‘/home/pi/Pictures/naam van afbeelding’)
Winname = ‘venster’ 

For i in range(10):
    Time.sleep(1)
    GPIO.output (PIN_TRIGGER, GPIO.HIGH)
    time.sleep (0.00001)
    GPIO.output (PIN_TRIGGER, GPIO.LOW)
    While GPIO.input(PIN_ECHO)==0:
        Pulse_start_time = time.time()
While GPIO.input(PIN_ECHO)==1:
        Pulse_end_time = time.time()
    Pulse_duration = pulse_end_time – pulse_start_time
distance = round(pulse_duration * 17150, 2)
    Print (“Distance:”,distance,”cm”)

cv2.namedWindow(winname, cv2.WINDOW_NORMAL) 
cv2.resizeWindow(winname, 100,100)
cv2.moveWindow(winname, 1200,30)
    If (distance < 150):
        cv2.imshow(winname, img)
cv2.waitKey(1000)
    else:
        cv2.imshow(winname, img2)
cv2.waitKey(1000)
cv2.destroyAllWindows()
GPIO.cleanup() 


 

 

Downloads

Besturing

Raspberry Pi

Niveau / klas

VMBO

Lessen

1 les

50 minuten

Benodigdheden

1K Ohm weerstand 1X

2K Ohm weerstand 1X

Breadboard

F/M Jumper Wire 5X

HC-SR04 1X

OpenCV Library

Raspberry Pi

2 Reacties

Een reactie versturen

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *