Odtwarzanie dźwięku przez mikrokontroler PIC

Cele

Celem projektu jest opracowanie procedury odtwarzania dźwięku z pamięci mikrokotrolera PIC18F25K80 firmy Microchip. Dźwięki pochodzące z plików WAV  zostaną podłączane do kodu programu jako pliki nagłówkowe w języku C. Odtworzenie dźwięków będzie realizowane przez PWM. Należy opracować program konwertujący pliki WAV na pliki nagłówkowe w języku C.

Konwerter plików WAV

Program został oparty na kodzie opublikowanym w sierpniu 2007 roku przez João Figueiredo. Oryginalny kod pobierał próbki z plików dźwiękowych w formacie PCM i zapisywał je w zmiennej tablicowej generując kod w języku C++.
Program został zmodyfikowany by automatycznie z dowolnego pliku Wav generował kod w języku C++ zawierający zmienną tablicową z próbkami dźwięku.
W pierwszej kolejności następuje konwersja piku Wav do rozdzielczości 8 bitów na próbkę i częstotliwości próbkowania 8 kHz. Ma to na celu zmniejszenie wielkości danych tak by jedna sekunda zajmowała 7,81 kB i mogła zostać umieszczona w pamięci mikrokontrolera. Działanie to wykonywane jest poprzez automatyczne wykonanie programu SOX z parametrami:

sox inputfile.wav -r 8000 -b8 temp.wav

W ten sposób przygotowany plik jest następnie automatycznie konwertowany na format PCM poprzez wywołanie programu mplayer:

mplayer temp.wav -ao pcm:nowaveheader:file=temp.pcm

Plik PCM może zostać “przepisany” do postaci tablicy zawierającej poszczególne próbki. Fragment programu za to odpowiedzialny:

fprintf(headerFile, “const char “);
printSafeName(argv[1], headerFile);
fprintf(headerFile, “[%u]={“, (unsigned int) statData.st_size);
c = fgetc(pcmFile);
fprintf(headerFile, “0x%02X”, c);
while( (c=fgetc(pcmFile)) != EOF )
{
   fprintf(headerFile, “,%s 0x%02X”, ((++colBreak % 16) == 0?”\n”:””), c);
}
fprintf(headerFile, “};\n\n”);

Program jest dostępny w formie gotowego do zainstalowania pakietu DEB w systemie operacyjnym Linux Debian lub Ubuntu. Zarówno źródło programu jak i pakiet DEB jest dostępny w rozdziale “Pliki”.
Program instaluje się poprzez wydanie polecenia z uprawnieniami administratora

dpkg -i –force-depends wav2h.deb

Zostanie on zainstalowany w systemie wraz z programami zależnymi (SOX i Mplayer).

Wywołanie programu:

wav2h file.wav file.h

Wygenerowany przez program plik ma postać:

#ifndef REDALERT_H
#define REDALERT_H
const char redalert[6]={0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80};
#endif

Zmienna tablicowa redalert zawiera poszczególne próbki dźwięku. W powyższym przykładzie jest to tylko sześć próbek – nagranie o długości około sekundy zawiera kilka tysięcy próbek.

Kod programu mikrokontrolera

Przykład ustawienia fusebitów mikrokontrolera PIC18F25K80 i definicji ustawień:

#include
#fuses INTRC_IO, NOPROTECT, PUT, BROWNOUT, NOWDT
#use delay(clock=8000000)
#define T2_FREQ (8000) // from 8000Hz to 11025Hz
#define K_TMR2 (8000000/4)/(T2_FREQ)

Następnie podłączony jest wygenerowany plik z próbkami dźwięku:

#include “redalert.h”

Kod funkcji wysyłającej próbki dźwięku ze zmiennej tablicowej na port PWM mikrokontrolera:

void play()
{
int16 i;
for(i=0; i<7794; i++)
   {
     set_pwm2_duty(redalert[i]);
     delay_us(45);
   }

Kod głównej funkcji programu:

void main(void)
{
setup_timer_2(T2_DIV_BY_1, K_TMR2, 1);
setup_ccp2(CCP_PWM);
set_pwm2_duty(0L);
while(1)
{
play();
set_pwm2_duty(0L);
delay_ms(1000);
}
}

 

Układ elektroniczny

W celach testowych bezpośrednio do układu może zostać podłączony głośnik, jednak jakość dźwięku może nie być wystarczająca. Należy układ rozbudować o wzmacniacz oraz filtry.

Rys. Schemat połączeń

Pliki

WAV2H – Program generujący z dowolnego pliku WAV plik h w języku C++ zawierający zmienną tablicową z próbkami dźwięku dostępny jest w repozytorium wav2h

Program mikrokontrolera