mike na hračke

som spektrista

Raspberry Pi zvonček

2020-11-17 od mikezt

Úloha bola jednoduchá: Dostal som do ruky pohybový senzor SR505 a mal spraviť zvonček, ktorý zahrá melódiu, keď vstúpi zákazník do obchodu. Riešenie je síce jednoduché, ale cesta k nemu nebola úplne priamočiara. Tento článok sú teda skôr poznámky pre mňa, aby som podobné chyby neopakoval.

Čidlo SR505 je ideálne pre pythonového bastliča, pretože nepotrebuje žiadnu ďalšiu elektroniku a pripája sa troma káblikami na napájanie a GPIO.

čidlo SR505

Ako je z obrázka patrné, čidlo potrebuje napájanie a na výstupe OUT sa objaví log. 1, ak je detegovaný pohyb. Tu nastal prvý problém. Viaceré zapojenia na internete ukazujú, že sa má čidlo napájať s 3.3V. Dokonca som na nejakom fóre čítal, že ak si nechcem odpáliť GPIO pin, tak nesmiem čidlo napájať z 5V. Je to samozrejme hlúposť. Čidlo sa, podľa datasheetu, napája v rozmedzí +4.5V až 20V. Na výstupe dáva 3.3V signál, takže žiadna ujma na GPIO nehrozí. Kúpil som kvôli tomu aj ďalšie čidlo, aby som zistil, že sa chová tak isto.

Ďalší problém už bol softvérový. Ak čidlo deteguje pohyb, na výstupe sa objaví log. 1 po dobu 8 sekúnd. To je samozrejme dobré. Horšie je, ak použijete obľúbenú softvérvú techniku copy & paste a program reaguje na zostupnú hranu. Trochu ma to potrápilo, lebo 8 sekúnd je docela dlhá doba a na prvý pohľad to vyzeralo, že čidlo nefunguje.

Softvérové závislosti: Naštastie ich moc nie je. Raspberry Pi OS (aka Raspbian) už má v sebe Python a jediná závisloť je pygame, ktorú nainštalujeme pomocou:

sudo apt install python-pygame

A konečne finálny program:

import RPi.GPIO as GPIO
import time
import pygame
import os

os.system("amixer cset numid=3 1")
GPIO.setmode(GPIO.BCM)
PIR_PIN = 21
GPIO.setup(PIR_PIN, GPIO.IN)

pygame.mixer.init()
pygame.mixer.music.load("Music/nokia.mp3")

def MOTION(PIR_PIN):
  print "Motion Detected!"
  if pygame.mixer.music.get_busy() == True:
    return
  print "playing sound..."
  pygame.mixer.music.play()

print "PIR Module Test (CTRL+C to exit)"
time.sleep(2)
print "Ready"
try:
  GPIO.add_event_detect(PIR_PIN, GPIO.RISING, callback=MOTION)
  while 1:
    time.sleep(100)
except KeyboardInterrupt:
  print "Quit"
GPIO.cleanup()

A ešte na jednu vec som zabudol. Systém štandardne prehráva zvuk cez HDMI (aspoň na RPi4) a preto sa na začiatku programu volá amixer, ktorý volí výstup na vstavaný jack. To je k softvéru asi všetko. Čidlo som umiestnil do rúrky od toaletného papieru, ktorý som ešte prestriekal čiernou farbou. Predsalen má docela veľký uhol snímania pohybu, čo sa zrovna na detekciu prechodu cez dvere nehodí.

Veľa šťastných zvonení a zasa niekedy pri riešení počítačových záhad.




- 1 = jedna