Po drobnej modyfikacji kodu i układu z posta "Przycisk start/stop..." zrobiłem prosty alarm.
Do układu dodałem buzzer 5V w obwód migającej diody. W obsłudze klawisza start stop pozostawiłem jedynie funkcjonalność stop do wyłączania alarmu. Jako inicjator start (wzbudzenie alarmu) dołączyłem do GPIO 23. Czujnik ruchu podłączyłem do zasilania 5V i masy, pin sygnałowy wystawia przez chwilę wysoki stan 3,3V po wykryciu ruchu.
Wracam do tematu opisanego w jednym z poprzednich postów, dotyczącego kamery USB dla RasPi.
Dziś robiłem zakupy w jednym z marketów i trafiłem na wyprzedaż sprzętu elektronicznego. Wśród masy gadżetów znalazłem kamerkę Logitech-a C170. Szybko sprawdziłem w necie czy jest kompatybilna z maliną. Okazało się, że jest więc ją nabyłem za jedyne 50 zł. Cała konfiguracja aplikacji motion ograniczyłem do wpisania odpowiedniej nazwy urządzenia(video0) i wszystko ruszyło :-). Jakość i prędkość pozostawiają wiele do życzenia, ale działa.
Teraz troszkę wstępu w temacie obsługi wejść.
Zacznę skromnie od 1 przycisku i w miarę bezpiecznie - ze względu na brak buforów wejściowych.
W dzisiejszym zadaniu wykonałem przycisk start stop uruchamiający program migotania diody, do tego celu użyłem metody event_detected, która wykrywa zmianę stanu logicznego danego pinu. Ta metoda idealnie nadaje się do obsługi funkcji start/stop.
Przycisk połączony jest z jednej strony z masą a z drugiej z pine GPIO.12, który jest ustawiony w tryb INPUT i stan natywny wysoki (3,3V).
Wciśniecie przycisku powoduje zwarcie pinu 12 z masą i zmianę stanu z wysokiego na niski.
Inne metody dotyczące obsługi wejść opiszę na końcu tego postu.
Szczegóły działania programu opisane w kodzie.
kod programu startstopdiody.py:
#!/usr/bin/python
#program start-stop diody
#steruje steruje startem i zatrzymaniem pulsowania diody
#biblioteka time
import time
#biblioteka random
import random
#biblioteka GPIO
import RPi.GPIO as GPIO
#wyłączenie ostrzeżeń GPIO
GPIO.setwarnings(False)
#ustawienie typu interpretacji pinów GPIO
GPIO.setmode(GPIO.BCM)
#czyszczenie rejestrów GPIO
GPIO.cleanup()
#ustawienie wybranych pinów w trym OUT
GPIO.setup(21,GPIO.OUT)
#ustawienie wybranych pinów w tryb IN i ustawienie domyślnego stanu wejścia #na stan#wysoki 3,3V
GPIO.setup(12,GPIO.IN, pull_up_down=GPIO.PUD_UP)
#dodanie obslugi zdazenia na pinie 12 GPIO
GPIO.add_event_detect(12, GPIO.RISING)
#główna pętla programu
while True:
#jesli zostanie wykryte przyciśnięcie klawisza (zwarcie do masy) #wyświetlonyzostanie komunikat i uruchomiona kolejna pętla
if GPIO.event_detected(12):
print "start"
#wykonuje pętle do kolejnego wykrycia przyciśnięcia klawisza
Zagłębiając się w arkana elektroniki cyfrowej zdałem sobie sprawę, że podłączanie bezpośrednio do pinów GPIO odbiorników, mogę narazić swoją malinkę na poważne uszkodzenia. Żeby zabezpieczyć piny GPIO należy stosować bufory. Na początek wziąłem na tapetę układ ULN2803A i zaimplementowałem go do mojego testowego sterowania diodami LED. Przedmiotowy scalak jest macierzą tranzystorów w układzie Darlingtona.
ULN2803A
Do dyspozycji mamy osiem kanałów, które sterowane są poprzez stany logiczne 3,3V w naszym wypadku z Raspberki. Układ pozwala na sterowanie napięciem wyjściowym do 50V i umożliwia podłączanie odbiorników o większym zapotrzebowaniu na prąd (do 0,5A). Układ jednocześnie zabezpiecza wyjścia GPIO przed przeciążeniami i uszkodzeniami. Można go wykorzystać jako prosty bufor dla napięć 3,3V, jako bufor konwertujący napięcie 3,3V na 5V, jako układ sterujący małymi odbiornikami o wyższych napięciach (małe przekaźniki, mikro silniczki i serwa). Wadą układu jest jego jednokierunkowość, więc możemy zabezpieczać nim jedynie wyjścia.
Nowa bezpieczniejsza implementacja układu sterowania diodami.
Mam Rasperkę, mam płytkę prototypową i trochę podzespołów, czas więc zrobić coś "efektownego".
Na początek sterowanie diodami LED.
1 dioda (czerwona) aktywowana jest poprzez zmianę stanu pinu GPIO naprzemiennie co 1s z niskiego na wysoki (0 na 1).
2 dioda (zielona) aktywowana jest funkcją PWM (wypełnieniem mocą)
3 dioda RGB sterowana jest również przez PWM na 3 pina GPIO z tą różnicą, że stopień wypełnienia mocą dla każdego pinu RGB jest losowany cyklicznie w każdym kroku głównej pętli programu co skutkuje cyklicznymi i losowymi zmianami koloru i natężenia tej diody.
Więcej wyjaśnień w kodzie programu poniżej.
Schemat połączeń dla tego zadania:
Schemat połączeń z programu Fritzing
Kod programu diody.py: #!/usr/bin/python #program diody #steruje 3 diodami #1 poprzez ustawianie naprzemiennie stan wysoki iniski #2 porzez jednorazowe ustawienie funkcji PWM na jednym z pnow #3 dioda RGB sterowana poprzez losowanie wypelnienia funkcji PWM na kazdy z 3 pinow #biblioteka time import time #biblioteka random import random #biblioteka GPIO import RPi.GPIO as GPIO #wylaczenie ostrzezen GPIO GPIO.setwarnings(False) #ustawienie typu interpretacji pinow GPIO GPIO.setmode(GPIO.BCM) #czyszczenie rejestrow GPIO GPIO.cleanup() #ustawienie wybranych pinow w trym OUT GPIO.setup(21,GPIO.OUT) GPIO.setup(20,GPIO.OUT) GPIO.setup(26,GPIO.OUT) GPIO.setup(19,GPIO.OUT) GPIO.setup(13,GPIO.OUT) #ustalenie stalych parametrow PWM dla 20 GPIO na 10Hz i wypelnienie 30% do sterowania dioda 2 pwm = GPIO.PWM(20, 10) #start funkcji PWM pwm.start(30) #zerowanie zmiennych rgb r=0 g=0 b=0 #ustawienia wartosci poczatkowych PWM dla pinow diody 3 RGB i start funkcji PWM rpwm = GPIO.PWM(26,50) rpwm.start(10) gpwm = GPIO.PWM(19,50) gpwm.start(10) bpwm = GPIO.PWM(13,50) bpwm.start(10) #glowna petla programu while True: #losowanie wartosci rgm dla diody 3 wielo kolorowej r=random.randint(1,100) g=random.randint(1,100) b=random.randint(1,100) #zmiana wartosci RGB (wypenienia PWM)na wylosowane powyzej rpwm.ChangeDutyCycle(r) gpwm.ChangeDutyCycle(g) bpwm.ChangeDutyCycle(b) #stan wysoki na pinie diody 1 GPIO.output(21,GPIO.HIGH) #wstrzymanie programu na 1s time.sleep(1) #stan niski na pinie diody 1 GPIO.output(21,GPIO.LOW) time.sleep(1)
W celu zwiększenia zakresu pomiarowego mojego prostego oscyloskopu i zabezpieczenia karty dźwiękowej lapka przed uszkodzeniem, postanowiłem poszperać w sieci w poszukiwaniu jakiegoś fajnego rozwiązania. Początkowo chciałem zrobić jakiś prosty dzielnik napięcia ale na tej stronie, znalazłem fajne i proste rozwiązanie problemu.
Schemat ideowy przystawki oscyloskopowej
Układ TL082
Podłączenie elementów
A to moja implementacja przystawki zrezygnowałem z zasilania przez port RS bo zwyczajnie mój lapek go nie posiada i do tego celu wykorzystam zewnętrzny zasilacz 12V.
brakuje jeszcze gniazda zasilacza
Wewnętrzna pajęczynka
prosta obudowa kupiona w Castoramie za 4 zł nadała siermiężnemu wnętrzu profesjonalny wygląd
Kilka dni temu w końcu dotarł zestaw prototypowy który zamówiłem tu. Nie pisałem o tym wcześniej bo ze względu na chroniczny brak czasu wolałem się nim nacieszyć i nie trwonić czasu na pisanie ;-).
Paczka z zestawem podstawowych podzespołów do prac prototypowych.
Najważniejszy element - stykowa płytka prototypowa z interfejsem do GPIO i dodatkowym zasilaczem
Reszta elementów - całkiem sporo
To co dotarło w paczce nie jest jeszcze kompletem elementów potrzebnych do budowy robota. Jest to raczej zestaw edukacyjno-wdrożeniowy na którym będę ćwiczył zasady obsługi elementów wykonawczych i sensorów.
Cały zestaw składa się z:
Płytka stykowa 830 pól - duża płytka z osobnymi liniami zasilania umożliwiająca tworzenie układów elektronicznych.
Moduł zasilający - ułatwia podłączenie zasilania do płytki stykowej.
Moduł ProtoPi Plus z taśmą 40 pin - umożliwia proste połączenie wszystkich wyprowadzeń GPIO minikomputera Raspberry w wersji B+ z dowolną płytką stykową bez potrzeby lutowania.
Zestaw rezystorów THT 1/4 W 200 szt. - po 20 szt. najpopularniejszych wartości, umożliwiających np. podłączenie diod LED. Poszczególne wartości znajdują się w podpisanych woreczkach strunowych.
Cyfrowy termometr DS18B20+ - popularny, prosty w obsłudze termometr, podłączany poprzez magistralę 1-wire.
Tranzystor bipolarny NPN BC639 80V/1A 5 szt. - układy półprzewodnikowe pozwalające m.in. sterować elementami, które pobierają większy prąd niż może dostarczyć pojedynczy pin mikrokontrolera.