Ogólny opis układu
Chociaż do działania samego rejestratora wystarczyłby sam moduł ewaluacyjny, to w ramach projektu został on rozbudowany o kartę SD (zewnętrzna pamięć znacznie powiększa pojemność rejestratora – czyli długość zapisywanych dźwięków) oraz kolorowy wyświetlacz. To drugie rozwiązanie uprościło obsługę urządzenia, co więcej: aby konstrukcja prezentowała się atrakcyjniej, projekt wzbogacono o wizualizację widma sygnału oraz korektor graficzny. W roli ekranu zastosowano wyświetlacz kolorowy 4” ze sterownikiem ILI9488, dostępny na rynku od niedawna. Jest on wyposażony w szeregowy interfejs SPI (co bardzo ułatwia konstrukcję), a do jego zalet należy również bardzo niska cena i łatwa dostępność na popularnych portalach handlowych. Do sterowania programem zastosowano enkoder 24-pozycyjny oraz dwa przełączniki monostabilne. Elementy te wpięto do złączy, na które wyprowadzone zostały sygnały procesora.
Algorytm programu
Ogólny algorytm działania programu składa się z części przetwarzania sygnału akustycznego (która odpowiada za odczyt dźwięku z kodeka, korekcję częstotliwościową dźwięku za pomocą equalizera, zapis na karcie SD oraz wyznaczanie amplitud używanych przez procedurę wizualizacji widma sygnału) oraz bloku obsługującego interfejs graficzny, tworzący na wyświetlaczu obiekty przeznaczone do regulacji parametrów programu, a także wyświetlania użytecznych danych. Interfejs jest sterowany za pomocą enkodera z przyciskiem oraz dwóch mikroprzełączników.
Rejestracja sygnału polega na zapisywaniu danych na kartę SD, co odbywa się za pomocą interfejsu sprzętowego realizującego transmisję. Jak widać na schemacie, z filtrów cyfrowych korzystają zarówno algorytm korektora graficznego, jak i procedura pomiaru wartości sygnału w poszczególnych pasmach częstotliwości. W celu poprawy działania filtru, jego kod wykonywany jest 4 razy w czasie jednego cyklu taktowania. Tak więc rzeczywista częstotliwość pracy filtrów wynosi: 4×fP. Cała procedura przetwarzania sygnału została umieszczona w pamięci RAM, a z myślą o dalszym zwiększeniu prędkości jej wykonywania wyeliminowano stosowanie wywołań funkcji, zamiast których wprowadzone zostały makra. Jeśli Czytelnik chciałby zmodyfikować program, należy zwrócić szczególną uwagę na to, aby do przechowywania wartości sygnału i wykonywania na nim operacji matematycznych stosować zmienne typu float (pojedynczej precyzji), a stałe zamieniać (metodą konwersji jawnej) także na typ float, gdyż tylko on jest obsługiwany sprzętowo. Operacje na zmiennych typu double są o wiele bardziej czasochłonne i mogą spowodować nieprawidłowe działanie programu.
Rejestrowane dane zapisywane są na karcie SD podzielonej na 22 fragmenty. Na każdym z nich można zapisać około pół godziny dźwięku.
Do wykonania części interfejsu graficznego użytkownika zastosowano bibliotekę napisaną przez autora. Składa się ona z 5 obiektów oraz 5 procedur graficznych, które są stosowane przez interfejs, ale można także korzystać z nich niezależnie od tego ostatniego.
Do budowy interfejsu graficznego służą następujące obiekty:
- Słupek – umożliwia ustawianie wartości,
- Wybór – wywołuje procedurę zdarzenia po wciśnięciu przycisku enkodera,
- Opcja – pozwala ustawić wartość pojedynczej flagi,
- Lista – umożliwia wybranie jednej pozycji z listy napisów,
- Statyczna – wyświetla tekst lub bitmapę.
Do zmiany obiektu na ekranie służą dwa przyciski.
Aby umieścić obiekt interaktywny na wyświetlaczu, należy odpowiednio wypełnić jego strukturę oraz wywołać funkcję: „GUI_Add” i jako parametr podać wspomnianą strukturę konfiguracyjną. Wszystkie deklaracje obiektów używanych przez interfejs użytkownika znajdują się w pliku nagłówkowym GUI.
Oto wszystkie zaimplementowane funkcje GUI:
- void InicjujPG(),
- void GUI_Init() – inicjalizuje Framework,
- void GUI_Add(E_Kontrol*) – wstawia kontrolkę i wyświetla ją na ekranie,
- void GUI_New() – usuwa wszystkie obiekty,
- void GUI_Hide() – zaciemnia ekran,
- void GUI_Show() – usuwa zaciemnienie ekranu,
- void GUI_Zatwierdz(E_Kontrol*) – rysuje ponownie obiekt,
- void GUI_UstawKontrol(int id) – ustawia aktywny obiekt,
- E_Kontrol* GUI_Podaj(int id) – zwraca strukturę obiektu na podstawie jego numeru identyfikacyjnego.