Obsługa czujników i mierników z poziomu pyMCU

Miernik odległości, czujnik par alkoholu oraz brzęczyk obsługiwany przez pyMCU

Do Arduino dostępnych jest wiele płytek i części więc zawsze znajdzie się jakaś nowa. W tym artykule zaprezentuję trzy kolejne moduły współpracujące z pyMCU - brzęczyk, czujnik alkoholu oraz ultradźwiękowy miernik odległości.

Pasywny brzęczyk

Pasywny brzęczyk podłączony do pyMCU

Pasywny brzęczyk (buzzer) to prosty głośnik, który potrafi piszczeć (z różnymi tonami). Posiada trzy piny na GND (-), VCC (+) oraz pin sygnałowy (oznaczony jako "S") podłączany do pinu cyfrowego pyMCU (np. D1). Dźwięk wydawany jest poprzez wysyłanie impulsów na pinie sygnałowy. W pyMCU można zrobić to na trzy różne sposoby:

for freq in range(0, 32):
    mb.freqOut(1, 500, freq*1000)

for i in range(1, 500):
    mb.pinHigh(1)
    mb.pinLow(1)

mb.dtmfOut(1, 1)
mb.dtmfOut(1, 2)
mb.dtmfOut(1, 3)
mb.dtmfOut(1, 4)
mb.dtmfOut(1, 5)
mb.dtmfOut(1, 6)
mb.dtmfOut(1, 7)
mb.dtmfOut(1, 8)
mb.dtmfOut(1, 9)
mb.dtmfOut(1, 0)

Pierwszy sposób to użycie metody freqOut do generowania częstotliwości na podanym pinie cyfrowym. Metoda oprócz numeru pinu przyjmuje czas trwania w milisekundach oraz częstotliwość (od 0 do 32767 Hz). Buzzer nie jest w stanie odwzorować wszystkich częstotliwości więc jego jęki będą się zmieniać dość losowo wraz ze wzrostem częstotliwości.

Druga metoda to natychmiastowe zmiana stanu pina pomiędzy wartościami 0 i 1 (pinHigh, pinLow). Ta metoda pozwala zmusić brzęczyk to typowego głośnego piszczenia.

Trzecie rozwiązanie to użycie metody dtmfOut, która generuje częstotliwości odpowiadające tonom klawiatur numerycznych stosowanych (kiedyś) w telefonach (sygnalizacja tonowa DTMF). Do dyspozycji may "klawisze" od 0 do 9 i każdy to inny ton na brzęczyku.

Czujnik par alkoholu MQ-3

Czujnik par alkoholu

Czujnik par etanolu to jeden z serii czujników wykrywający gazy lub opary określonych substancji. Posiada cztery piny: VCC (+), GND (-), D0 (wyjście cyfrowe) oraz A0 (wyjście analogowe). Obsługuje się go tak samo jak czujnik pola magnetycznego, z tym że model, który testowałem daje odwrotną odpowiedź (0 gdy pojawią się opary alkoholu).

import pymcu

mb = pymcu.mcuModule()
mb.digitalState(1, 'input')

while 1:
    if not mb.digitalRead(1):
        print 'hit'
    else:
        print '.'

Z tyłu modułu znajduje się potencjometr do regulacji czułości sensora. Trzeba ustawić go tak by przy braku oparów alkoholu wskazywał 1, a w ich obecności dość szybko przełączał się na 0 (w innych modelach może to być na odwrót).

Moduł ten wykrywa opary i np. po odsunięciu znad pojemnika z alkoholem czujnik zachowa pewną bezwładność (opary muszą opuścić jego komorę).

Ultradźwiękowy miernik odległości HC-SR04

Ultradźwiękowy miernik odległości HC-SR04
Miernik odległości podłączony do pyMCU

Ultradźwiękowy miernik odległości jest już nieco bardziej skomplikowany w obsłudze. Zawiera cztery piny: VCC (+), Trig (do pinu cyfrowego), Echo (do pinu cyfrowego), GND (-). Ja do D1 podłączyłem "Trig" a do D2 "Echo".

Wysłanie impulsu do czujnika na pinie "Trig" o długości 10 mikrosekund (jedni podają co najmniej, inni dokładnie 10) powoduje wysłanie ośmiu impulsów ultradźwiękowych. Jeżeli impulsy te odbiją się od przeszkody i wrócą do miernika to na pinie "Echo" pojawi się stan wysoki (1). Czas trwania tego stanu pozwoli wyliczyć odległość.

Dłuższy sygnał wysłany do "Trig" wydaje się wpływać na pomiary (ich powtarzalność/dokładność na różnych odległościach). Jeżeli zależy ci na dokładności pomiarów w danych warunkach musisz to sprawdzić eksperymentalnie.

pyMCU pozwala wygenerować odpowiedni sygnał dla "Trig". Da się też pośrednio mierzyć czas trwania echa:

from datetime import datetime
import pymcu

mb = pymcu.mcuModule()
mb.digitalState(2, 'input')

start = datetime.now()
mb.pinHigh(1)
mb.pauseus(10)
mb.pinLow(1)


response_start = None
response_end = None

for i in range(0, 500):
    ret = mb.digitalRead(2)
    if ret == 1:
        end = datetime.now()
        response_end = end
        if not response_start:
            response_start = end

if response_end and response_start:
    echo_delta = response_end - response_start
    delta = echo_delta.total_seconds()
    print (delta * 340) / 2, ' m'
else:
    print 'no echo captured'

Powyższy skrypt na początku generuje impuls dla "Trig" korzystając z metody pauseus to przetrzymania stanu przez określoną ilość mikrosekund. Następnie "nasłuchuje" pinu "echa" przez jakiś czas (do tego użyłem pętli z range). Kod zapisuje obecny czas (datetime) początku i końca trwania stanu wysokiego, wylicza z nich różnicę. Uzyskany czas trwania pozwala wyliczyć odległość.

Zaprezentowany skrypt sprawdzi się przy odległościach od około pół metra. Przy krótszych echo wraca zanim kod zacznie nasłuchiwać pinu echa (albo czujnik nie daje odpowiedzi). Powtarzalność i dokładność czasami nie jest zbyt wysoka.

blog comments powered by Disqus

Kategorie

Strony