[PRZYKŁAD] Recorder v3.0 – moduł Grove pozwalający na nagrywanie oraz odtwarzanie dźwięków
Wstęp
W artykule przedstawiono działanie ciekawego modułu Grove Recorder v3.0. Pozwala on na nagrywanie, a następnie odtwarzanie krótkich dźwięków (maksymalna długość to 83 sekundy). Moduł może pracować samodzielnie lub być sterowany przez mikrokontroler. W artykule zostaną przedstawione obie możliwości.
Potrzebne elementy
Do realizacji układu przedstawionego w artykule będą potrzebne:
- Płytka Arduino UNO,
- Moduł Grove Recorder v3.0,
- Base Shield V2 – nakładka ze złączami Grove dla Arduino,
- Płytka stykowa,
- Przewody połączeniowe męsko-męskie,
- Czujnik wyzwalający odtwarzanie dźwięku (w tym przypadku Magnetyczny czujnik otwarcia drzwi),
- Rezystor 10 kΩ,
- Kabel USB A – USB B np. Kabel USB A – USB B, 1,8m z filtrem ferrytowym.
Rys. 1. Moduł Grove Recorder v3.0 (zawartość zestawu)
Recorder v3.0 to moduł z rodziny Grove który dzięki wbudowanemu mikrofonowi umożliwia nagrywanie dźwięków oraz odtwarzanie ich przez głośnik podłączony do modułu. Wyposażono go w układ SD9160FI z pamięcią Flash o pojemności 2 MB, co wystarcza na nagranie dźwięku o maksymalnej długości 83 sekund. W zestawie z modułem znajduje się niewielki głośnik.
Moduł ma 4 wyprowadzenia:
- P – pin wejściowy – podanie stanu niskiego włącza nagrywanie dźwięku,
- R – pin wejściowy – podanie stanu niskiego włącza odtwarzanie dźwięku,
- V – pin zasilania (plus),
- G – pin zasilania (minus).
Moduł może pracować w dwóch trybach: samodzielnym lub sterowanym przez mikrokontroler.
Praca w trybie samodzielnym
W trybie samodzielnym przełącznik REC na module musi być przestawiony w pozycję OFF. Na module znajduje się przycisk, za pomocą którego możliwe jest sterowanie pracą modułu. Moduł ma również zamontowany potencjometr, za pomocą którego można regulować głośność odtwarzanego dźwięku.
Rys. 2. Moduł Recorder v3.0
Aby nagrać dźwięk w trybie samodzielnym, należy przycisnąć przycisk REC/PLAY przez około 2 sekundy. Moduł sygnalizuje nagrywanie przez ciągłe świecenie czerwonej diody, znajdującej się od spodu płytki. Następnie należy trzymać przycisk wciśnięty do momentu, w którym chcemy zakończyć nagrywanie. Aby otworzyć nagranie wystarczy krótko przycisnąć przycisk REC/PLAY.
Moduł ma złącze zgodne z standardem Grove, dlatego w celu podłączeniu modułu do Arduino można wykorzystać dedykowany shield Base Shield V2.
Rys. 3. Base Shield V2 – shield ze złączami Grove dla Arduino
Base Shield V2 może być używany z płytkami, które mają złącze zgodne z Arduino. Moduł ma 16 złącz zgodnych z standardem Grove:
- 4 złącza z wejściem analogowym (A0-A3)
- 7 złącz z wejściem/wyjściem cyfrowym (D2-D8)
- 1 złącze z interfejsem UART
- 4 złącza z interfejsem I2C
Zestaw Recorder v3.0 wykorzystuje do sterowania sygnały cyfrowe. W tym przypadku podłączono go do złącza D4. Recorder v3.0 podłączony do Arduino przez rozszerzenie Base Shield V2 prezentuje się następująco:
Rys. 4. Moduł Recorder v3.0 podłączony do Arduino przy pomocy nakładki Base Shield V2.
Sterowanie modułu z Arduino
Podczas sterowania modułem z Arduino przełącznik REC musi być przestawiony w pozycję ON. W celu nagrania dźwięku, na wejście R (przewód biały) modułu należy podać stan niski, który musi być utrzymywany do momentu zakończenia nagrywania. Aby zakończyć nagrywanie, na wejście należy podać stan wysoki. W celu otworzeniu dźwięku, na pin wejściowy P (przewód żółty) należy podać stan niski przez 100 milisekund.
Zaprojektujemy teraz prosty program, w którym moduł Recorder v3.0 będzie sterowany za pomocą magnetycznego czujnika otwarcia drzwi. Gdy drzwi zostaną otwarte, zostanie odegrany dźwięk zapisany w pamięci modułu. Sposób nagrania dźwięku jest pokazany powyżej, przy okazji omawiania pracy w trybie samodzielnym.
Przed przystąpieniem do pisania programu należy podłączyć magnetyczny czujnik otwarcia do naszego Arduino UNO. Podłączenie jest podobne jak w przypadku przycisku monostabilnego. Wyjście czujnika należy podłączyć do pinu 2 płytki Arduino UNO, przy wykorzystaniu rezystora podciągającego o wartości 10 kΩ.
Magnetyczny czujnik otwarcia należy podłączyć do Arduino UNO jak na schemacie poniżej:
Rys. 5. Schemat podłączenia magnetycznego czujnika otwarcia drzwi do Arduino UNO
Pełny układ wygląda następująco:
Rys. 6. Ostateczny wygląd układu użytego w projekcie
Program i jego opis
Teraz opiszę kod programu służącego do realizowania zadań opisanych wyżej (pełen kod programu znajduje się w sekcji Do pobrania na końcu artykułu).
Na początku programy musimy zadeklarować odpowiednie zmienne:
const int pin_odtwarzania= 4; int ostatni_stan = 0;
Zmienna pin_odtwarzania zawiera informacje, do którego wyprowadzenia płytki Arduino podłączono wejście P modułu Recorder v3.0. Natomiast zmienna ostatni_stan przechowuje informacje o ostatnim odczytanym stanie otwarcia drzwi.
Następnie w funkcji Setup() inicjujemy działanie portu szeregowego oraz ustawiamy role poszczególnych wyprowadzeń. Piny, do których podłączono moduł Recorder v3.0 powinny być ustawione jako wyjścia, natomiast pin, do którego podłączono czujnik otwarcia drzwi powinien być zdefiniowany jako wejście. Następnie na wyjściach jest ustawiany stan wysoki.
void setup() { Serial.begin(9600); pinMode(pin_odtwarzania, OUTPUT); pinMode(2,INPUT); digitalWrite(pin_odtwarzania, HIGH); }
Funkcja odtworz_dzwiek ()
Teraz zaprojektowano prostą funkcję otworz_dzwiek(), która pozwoli na odtwarzanie nagranego dźwięku w module Recorder v3.0.
void otworz_dzwiek() { digitalWrite(pin_odtwarzania, LOW); delay(100); digitalWrite(pin_odtwarzania, HIGH); Serial.println("Odtwarzanie..."); }
Aby odtworzyć nagrany dźwięk, na pin 4 Arduino należy podać krótki stan niski (około 100 ms). Dodatkowo w monitorze portu szeregowego wyświetla się napis „Odtwarzanie...”.
Funkcja Otworzenie_drzwi ()
Następną funkcją jest Otworzenie_drzwi(), która odczytuje aktualny i poprzedni stan otwarcia drzwi, a gdy wykryje otwieranie drzwi, uruchamia nagrany dźwięk.
void Otworzenie_drzwi() { if (ostatni_stan==0 && (digitalRead(2)==1)) { otworz_dzwiek(); ostatni_stan =1; } else if (ostatni_stan==1 && (digitalRead(2)==0)) { ostatni_stan = 0; } }
Nagrany dźwięk ma być odtwarzany jedynie w przypadku otwierania drzwi, dlatego oprócz sprawdzenia czy drzwi są otwarte w danym momencie, należy również sprawdzać również poprzedni stan otwarcia drzwi.
W celu wykrycia czynności otwierania drzwi, zmienna ostatni_stan musi przyjąć stan 0 (drzwi zamknięte), a odczytany stan na wyprowadzeniu czyjnika magnetycznego powinien mieć stan wysoki.
Jeżeli warunek jest spełniony, następuje wywołanie funkcji Otworz_dzwiek, natomiast zmienna ostatni_stan jest ustawiana na 1. W przeciwnym przypadku sprawdzany jest warunek czy zmienna ostatni_stan przyjmuje wartość 1 oraz czy napięcie na czujniku ma stan niski (0). Taki warunek będzie spełniony przy czynności zamykania drzwi. Gdy taki warunek będzie spełniony, wartość zmiennej ostatni_stan będzie ustawiona na 0.
W pętli głównej programu znajduje się wywołanie funkcji Otworzenie_drzwi(), a także minimalne opóźnienie.
void loop() { Otworzenie_drzwi(); delay(100); }