sobota, czerwca 03, 2017

Czy się stoi czy się siedzi... Rasbperry Pi z czujnikami ultradźwiękowymi to stwierdzi ;-)

Chwaliłem się ostatnio, że zrobiłem coś co ma posłużyć jako czujnik SIT/STAND przy moim biurku.

Zamontowałem wszystko i działa ;-)

Schemat połączeń wygląda tak:

Czujnik, który ma sprawdzać czy ktoś jest przy biurku został zamontowany na podstawie monitora, tak by "patrzał" w kierunku w którym powinien być "operator":


Czujnik, który ma ustalać na jakiej wysokości jest biurko został zamontowany na podstawce pod monitor i ślepi w górę:


Na razie wszystko kontroluje prosty programik, który jest przeróbką programu stąd.
Program wygląda tak:

import RPi.GPIO as GPIO                    #Import GPIO library
import time                                #Import time library
GPIO.setmode(GPIO.BCM)                     #Set GPIO pin numbering

# Define outputs & inputs
_TRIG1 = 23 # TRIG for checking if somebody is near desk
_ECHO1 = 24 # ECHO for checking if somebody is near desk

_TRIG2 = 25 # TRIG for sit/stand
_ECHO2 = 18 # ECHO for sit/stand


GPIO.setup([_TRIG1,_TRIG2],GPIO.OUT)                  #Set pins as GPIO out
GPIO.setup([_ECHO1,_ECHO2],GPIO.IN)                   #Set pins as GPIO in

def measure(TRIG1,ECHO1,txt):
      GPIO.output(TRIG1, False)                 #Set TRIG as LOW
      time.sleep(2)                            #Delay of 2 seconds
      GPIO.output(TRIG1, True)                  #Set TRIG as HIGH
      time.sleep(0.00001)                      #Delay of 0.00001 seconds
      GPIO.output(TRIG1, False)                 #Set TRIG as LOW
      while GPIO.input(ECHO1)==0:               #Check whether the ECHO is LOW
        pulse_start = time.time()              #Saves the last known time of LOW pulse
      while GPIO.input(ECHO1)==1:               #Check whether the ECHO is HIGH
        pulse_end = time.time()                #Saves the last known time of HIGH pulse

      pulse_duration = pulse_end - pulse_start #Get pulse duration to a variable
      distance = pulse_duration * 17150        #Multiply pulse duration by 17150 to get distance
      distance = round(distance, 2)            #Round to two decimal points

      GPIO.output(TRIG1,False)
      return distance


while True:
    dist1=measure(_TRIG1,_ECHO1,"Sensor1")
    dist2=measure(_TRIG2,_ECHO2,"Sensor2")
    print dist1,dist2
    if dist2<150:
       print "desk in STAND mode"
    else:
       print "desk in SIT mode"
    if dist1<80:
       print "somebody at the desk"

Jego działanie jest proste jak konstrukcja cepa ;-)
Po prostu instruuje Raspberry Pi by ustawiło na wyjściu (TRIG) 1 przez 10 µs, co powinno spowodować wyemitowanie ultradźwięku przez HC-SR04, po czym ustawiło 0 i czekało aż na wejściu (ECHO) pojawi się sygnał.
Gdy to się zdarzy liczy różnicę czasu między ustawieniem 1 na TRIG, a pojawieniem się 1 na ECHO.

W tym czasie dźwięk wystartuje z czujnika, doleci do celu, odbije się i wróci do czujnika. Pokona więc drogę 2 razy.
Przyjmujemy tutaj, że prędkość dźwięku w powietrzu to 343 m/s.
Stąd:
odległość = 343 m/s * czas / 2

A, że wynik chcemy w centymetrach to zamiast 343 m/s używamy 34300 cm / s, które to 34300 po podzieleniu przez dwa daje 17150.

Dokonujemy za każdym razem pomiaru na 2 czujnikach (w pętli) i jeśli z czujnika 1 dostaniemy odległość mniejszą niż 80 to zakładamy, że ktoś jest przy biurku. Gdy z czujnika 1 dostajemy informację, że do sufitu jest mniej niż 150 cm to stwierdzamy, że biurko jest w trybie stand :-)





Podobne postybeta
Roboty są trudne ;-)
Czy się stoi czy się siedzi.... kamerka w laptopie jako detektor tego czy biurko jest w trybie stand czy sit ;-)
Matematyczne podstawy zakupu skarpetek ;-)
Raport z planety Z ;-)
~ - czyli "tak sobie"