2024. április 25., csütörtök

Gyorskeresés

Raspberry Pi mozgásérzékelő

Írta: |

[ ÚJ BEJEGYZÉS ]

Ez a kis leírás arról fog szólni, hogy hogyan használhatunk egy ultrahangos távolságmérőt (HC-SR04) mozgásérzékelőként, egy Pi vezérlésével.

Először is importáljuk a szükséges modulokat, beállítjuk a GPIO ki- és bemeneteket:

import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)

GPIO_TRIGGER = 23
GPIO_ECHO = 24

GPIO.setup(GPIO_TRIGGER,GPIO.OUT)
GPIO.setup(GPIO_ECHO,GPIO.IN)

GPIO.output(GPIO_TRIGGER, False)

Ezeket nem részletezném.

A következő lépésben egy függvényt hozunk létre, ami megállapítja a távolságot:

def tavolsag():

GPIO.output(GPIO_TRIGGER, True)
time.sleep(0.00001)
GPIO.output(GPIO_TRIGGER, False)
start = time.time()

while GPIO.input(GPIO_ECHO)==0:
start = time.time()

while GPIO.input(GPIO_ECHO)==1:
stop = time.time()

elapsed = stop-start
distance = (elapsed * 34300)/2

return distance

Itt megállapítja, hogy mennyi idő alatt teszi meg az ultrahang a távolságot a szenzor és a fal (vagy ami épp előtte van) között. Ezt az eltelt időt megszorozzuk 34300-al, majd elosztjuk 2-vel. Mivel valószínűleg csak levegőben fogjuk használni, nyugodtan számolhatunk 343 m/s-al. De én centiméterben szeretném meghatározni, nem méterben, így: 343 m/s = 34300 cm/s. Hogy miért osztjuk el kettővel? Az ultrahang elindul a szenzorból, megy, mendegél, míg belebotlik a falba. Úgy dönt, hogy nem hatol át rajta, inkább visszafordul. Amikor megérkezik a szenzorba, az ezt érzékeli. De így megmértük a teljes oda-vissza utat.

A következő lépésben megnézzük, hogy mozog-e valami a szenzor előtt:
while True:

elozo = tavolsag()
elozoplusz = elozo+10
elozominusz = elozo-10
time.sleep(0.1)
most = measure()
if elozominusz<most and most<elozoplusz:
print " "
else:
print "Mozgas!"
time.sleep(0.01)

Itt én 10 cm-es eltérést engedek meg neki. Ha kisebb, akkor érzékenyebb, viszont a mérési hibák miatt többször érzékel rosszul.
Nekem tökéletesen működik, sose érzékel mozgást amikor nincsen. A kezemet viszont el tudom rántani előtte úgy, hogy nem veszi észre. De ha átlagos sebességgel mozgatom előtte, mindig érzékel.

Végül így néz ki a kód. A végét betettem egy try-except-be, hogy ki tudak lépni belőle egy ctrl+c-vel:

import time
import RPi.GPIO as GPIO

def tavolsag():

GPIO.output(GPIO_TRIGGER, True)
time.sleep(0.00001)
GPIO.output(GPIO_TRIGGER, False)
start = time.time()

while GPIO.input(GPIO_ECHO)==0:
start = time.time()

while GPIO.input(GPIO_ECHO)==1:
stop = time.time()

elapsed = stop-start
distance = (elapsed * 34300)/2

return distance

GPIO.setmode(GPIO.BCM)

GPIO_TRIGGER = 23
GPIO_ECHO = 24

GPIO.setup(GPIO_TRIGGER,GPIO.OUT)
GPIO.setup(GPIO_ECHO,GPIO.IN)

GPIO.output(GPIO_TRIGGER, False)

try:

while True:

elozo = tavolsag()
elozoplusz = elozo+10
elozominusz = elozo-10
time.sleep(0.1)
most = measure()
if elozominusz<most and most<elozoplusz:
print " "
else:
print "Mozgas!"
time.sleep(0.01)

except KeyboardInterrupt:
GPIO.cleanup()

Forrás: [link]

Copyright © 2000-2024 PROHARDVER Informatikai Kft.