Introducere

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.

Descriere generală

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.

Hardware Design

Pe lângă componentele pentru plăcuţa de baza, a mai fost necesar să cumpăr:

  • 3 rezistente 3K3;
  • 3 rezistente 1K3;
  • 2 diode 1N4004;
  • 1 conector pentru Card SD;
  • 1 difuzor 10V;
  • 8 butoane push-button.
  • 1 condensator electrolitic 100uF

Schema electronica:

Software Design

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.

Download

Bibliografie/Resurse

pm/prj2010/dloghin/genersunete.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0