Teensy Audio Board – Halloweenowy straszak

Pumpkiny nie są nawet w połowie tak straszne jak nasz straszak!
Pumpkiny nie są nawet w połowie tak straszne jak nasz straszak!

Halloween już tuż tuż, zróbmy więc z tej okazji szybki projekt z wykorzystaniem Teensy oraz płytki Audio Board. Ciekawym pomysłem wpisującym się w klimaty święta jest straszak oparty o czujkę ruchu. Kiedy ktoś pojawi się w obszarze widzenia naszego „straszaka” zostanie zupełnie znienacka potraktowany jakimś strasznym dźwiękiem. Bierzmy się więc do pracy!

Na początek lista części, których będziemy potrzebowali:

Jeśli nie macie wyprowadzonych pinów Teensy gdzieś na zewnątrz (wszystkie są wpięte w Audio Boarda) to dużym ułatwieniem będzie wytrawienie sobie płytki, za pomocą której podłączycie Teensy do Audio Boarda i będziecie mogli wpiąć się do niej kabelkami.

Płytka z wyprowadzeniami Teensy Archiwum .zip ze schematem i płytką w EAGLE możecie pobrać tutaj.

Piny opisane na obrazku jako Teensy i wyprowadzone dla użytkownika lutujemy na wierzchu płytki, a piny Audio Board na spodzie. Mi niestety skończyły się goldpiny i musiałem męczyć się z sondami, które gdzieś wygrzebałem.

Podłączmy teraz czujkę ruchu do Teensy. Mój czujnik wymaga zasilania minimum 4V, więc zasilam go z pinu +5V z Teensy. Na jego wyjściu pojawia się masa, jeżeli nie wykryto ruchu oraz +5V w przeciwnym wypadku. Większość pinów Teensy 3.2 toleruje napięcie 5V, jednak bezpieczniej będzie jeżeli pracując z tą płytką będziemy używali napięć z zakresu 0 do 3.3V (a nuż z rozpędu podłączymy 5V tam gdzie nie trzeba i usmażymy procesor). Z tej okazji zbudowałem sobie prosty konwerter oparty o tranzystor BC547.

Konwerter z 5V na 3.3V

Do INPUT podłączamy wyjście czujnika PIR, a OUTPUT podłączamy do pinu naszego mikrokontrolera. Należy zwrócić uwagę że jest to układ inwertera, więc teraz to stan niski (masa) na wejściu Teensy będzie oznaczał wykrycie ruchu. U siebie dodałem jeszcze diodę sygnalizującą stan czujki, ale nie jest ona konieczna.

Zaprojektujmy teraz zależności wejść/wyjść audio w kreatorze na stornie http://www.pjrc.com/teensy/gui/. Tutaj dużo pracy nie ma, powinno to wyglądać tak:

Zależności

  • sdraw –  obiekt klasy AudioPlaySdRaw
  • speaker – obiekt klasy AudioOutputI2S

Oznacza to, że pliki przechowywane na karcie SD w formacie RAW będziemy odtwarzać na wyjściu słuchawkowym Audio Board.

Nie chcemy też aby nasz straszak straszył nas samych. Potrzebujemy więc zrobić przełącznik, który będzie uzbrajał nasze urządzenie i dawał nam 10 sekund na oddalenie się. Tutaj wystarczy zwykły przełącznik, który w pozycji ON zewrze pin Teensy z masą, a w pozycji OFF zostawi pin latający (podciągniemy go do stanu wysokiego wewnętrznym rezystorem).

Tak powinno wyglądać zmontowane urządzenie (oczywiście Teensy wpinamy dodatkowo w Audio Boarda):

Schemat połączeń na płytce stykowej
Schemat połączeń na płytce stykowej

Skoro mamy już założenia projektowe to przejdźmy do pisania kodu. Pozwolę sobie wrzucić tutaj cały kod do pobrania, który napisałem i później omówić ważniejsze fragmenty.

Do obsługi przycisku i czujki wybrałem piny 16 i 17, gdyż nie są one używane ani przez klasę Serial, ani przez Audio Board.

Do obsługi czujki ruchu oraz przełącznika używam klasy Bounce (należy dołączyć plik Bounce.h). Tworząc obiekt tej klasy definiujemy na jakim pinie chcemy mieć nasz przycisk, oraz czas drgania styków. Klasa ta udostępnia nam 3 metody:

  • update() – aktualizuje stan przycisków oraz zwraca true, jeżeli stan się zmienił, false w przeciwnym wypadku.
  • risingEdge() – zwraca true, jeżeli stan przycisku zmienił się z niskiego na wysoki.
  • fallingEdge() – zwraca true, jeżeli stan przycisku zmienił się z wysokiego na niski.

Kolejną ciekawą klasą, której użyłem jest  elapsedMillis. Obiekt tej klasy działa podobnie jak funkcja millis() z tym, że można sobie ją wyzerować dzięki czemu nie trzeba używać dodatkowej zmiennej i samemu robić obliczeń.

Na uwagę zasługuje także fragment kodu znajdujący się w funkcji setup(). Mianowicie chodzi o 2 linijki:

SPI.setMOSI(7);
SPI.setSCK(14);

Musimy wykonać te 2 operacje, ponieważ interfejs SPI karty microSD jest w Audio Boardzie wyprowadzony na pinach 7 i 14.

Linijkę niżej wywołujemy SD.begin(10). 10 jest tutaj numerem pinu, do którego podłączony jest pin CS karty SD. Tak jak w poprzednim wypadku jest to uwarunkowane konstrukcją Audio Boarda.

Reszta kodu nie wprowadza żadnych rewelacji stąd myślę, że nie ma konieczności opisywania go. Jeśli jednak mielibyście pytania odnośnie kodu piszcie śmiało w komentarzach :)

Ostatnią rzeczą, której potrzebujemy jest karta microSD z plikami dźwiękowymi w surowym formacie. Przygotowałem kilka takich plików do pobrania tutaj. Jeśli jednak chcecie użyć innych dźwięków to możecie je przerobić na format RAW programem Sox. Pamiętajmy, aby zapisać je z rozszerzeniem .raw.

Jak działa program? Jeśli przełącznik podpięty do pinu 17 jest w pozycji OFF to świeci pomarańczowa dioda na Teensy sygnalizując, że urządzenie nie jest uzbrojone. Jeśli przełączymy go w pozycję ON dioda zgaśnie, aby nie demaskować swojej obecności potencjalnej ofierze i da nam 10 sekund na oddalenie się. Po tym czasie wzbudzenie czujki spowoduje odtworzenie kolejnych dźwięków z głównego katalogu karty SD. Jeśli po uruchomieniu urządzenia dioda zacznie migać oznacza to, że wystąpił błąd. Należy sprawdzić o co chodzi na monitorze protu szeregowego.

Skoro mamy już złożony układ i wgrany kod to zobaczmy efekty naszej pracy:

Halloweenowy straszak oparty o Teensy i Audio Board
Halloweenowy straszak oparty o Teensy i Audio Board

Teraz pozostaje nam ukryć układ w jakimś niewidocznym miejscu i czekać na pierwsze ofiary ]:->