Proiectul reprezinta un dispozitiv care genereaza sunete la apasarea unor butoane. Sunetul este redat la apasarea unui buton de catre un difuzor, si in acelasi timp semnalul primit de la buton este prelucrat de microcontroler si este scris intr-un fisier pe un card SD. Sunetele mai apoi vor putea fi reproduse de pe cardul SD. Dispozitivul poate fi comparat cu un pian ce are posibilitatea de a inregistra melodia, iar mai apoi poate fi reprodusa.
Am folosit placa de baza cu microcontrolerul ATmega16. La placa existenta, au fost adaugate urmatoarele componente: un conector pentru card SD, un difuzor conectat la pinul OC1A al microcontrolerului (schema electronica de mai jos - Hardware Design) si 7 butoane push-button. Un picior al butoanului este conectat la pinii PA0-PA6 respectiv, iar celalalt picior este conectat la masa.
Pe lângă componentele pentru plăcuţa de baza, a mai fost necesar să cumpăr:
Setam pinii PA0-PA6 ca input, scriind in DDRA bitii - 1111 1110, PB7 nu va fi folosit in aceasta schema. La apasarea unui buton, se genereaza un semnal pe pinul la care este conectat butonul. Fiecare pin are o frecventa setata, care prin PWM este reprodusa de difuzor. In acelasi timp semnalul primit de la pin va fi prelucrat pentru a fi scris pe cardul SD. Pentru scrierea pe card SD folosesc biblioteca Petit FAT Filesystem, si anume functia f_write(FIL*, const void*, UINT, UINT*), pentru scrierea in fisier. FRESULT f_write (
FIL* FileObject, /* Pointer to the file object structure */ const void* Buffer, /* Pointer to the data to be written */ UINT ByteToWrite, /* Number of bytes to write */ UINT* ByteWritten /* Pointer to the variable to return number of bytes written */ );
Parametri:
FileObject - Pointer to the open file object structure.
Buffer - Pointer to the data to be written.
ByteToWrite - Specifies number of bytes to write in range of UINT.
ByteWritten - Pointer to the UINT variable to return the number of bytes written. The value is always valid after the function call regardless of the result.
The canonical WAVE format starts with the RIFF header:
0 4 ChunkID Contains the letters “RIFF” in ASCII form
(0x52494646 big-endian form).
4 4 ChunkSize 36 + SubChunk2Size, or more precisely:
4 + (8 + SubChunk1Size) + (8 + SubChunk2Size) This is the size of the rest of the chunk following this number. This is the size of the entire file in bytes minus 8 bytes for the two fields not included in this count: ChunkID and ChunkSize.
8 4 Format Contains the letters “WAVE”
(0x57415645 big-endian form).
The “WAVE” format consists of two subchunks: “fmt ” and “data”: The “fmt ” subchunk describes the sound data's format:
12 4 Subchunk1ID Contains the letters “fmt ”
(0x666d7420 big-endian form).
16 4 Subchunk1Size 16 for PCM. This is the size of the
rest of the Subchunk which follows this number.
20 2 AudioFormat PCM = 1 (i.e. Linear quantization)
Values other than 1 indicate some form of compression.
22 2 NumChannels Mono = 1, Stereo = 2, etc. 24 4 SampleRate 8000, 44100, etc. 28 4 ByteRate == SampleRate * NumChannels * BitsPerSample/8 32 2 BlockAlign == NumChannels * BitsPerSample/8
The number of bytes for one sample including all channels. I wonder what happens when this number isn't an integer?
34 2 BitsPerSample 8 bits = 8, 16 bits = 16, etc.
2 ExtraParamSize if PCM, then doesn't exist X ExtraParams space for extra parameters
The “data” subchunk contains the size of the data and the actual sound:
36 4 Subchunk2ID Contains the letters “data”
(0x64617461 big-endian form).
40 4 Subchunk2Size == NumSamples * NumChannels * BitsPerSample/8
This is the number of bytes in the data. You can also think of this as the size of the read of the subchunk following this number.
44 * Data The actual sound data.