Говорящая игрушка

  • Принцип работы конструкции такой: Вы встряхиваете игрушку, срабатывает датчик вибрации и DFPayer, по очереди, воспроизводит звуки, записанные на sdmicro. Можно записать и воспроизвести до 3000 треков, в формате mp3. На sdmicro карте создаём папку с названием «mp3», свои треки помещаем в эту папку с названиями такого вида: 001.mp3, 002.mp3, 003.mp3 … 3000.mp3.

DFPlayer  может управляться кнопками, а можно управлять им по UART интерфейсу, что и используется в данной конструкции.

После сборки, прошивки и проверки , все это засунул в мягкую игрушку подходящего размера. Результат: ребенок трясет или переворачивает игрушку и слушает реплики мультяшных героев. Ниже представлен код С для CvAvr.

/*******************************************************

Chip type : ATmega8
Program type : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*******************************************************/

#include <mega8.h>

// Declare your global variables here
unsigned int cont = 1;
// Standard Input/Output functions
#include <delay.h>
#include <stdio.h>
//****************************************************************************************
int default_buffer[10] = {0x7E , 0xFF , 0x06 , 0x00 , 0x00 , 0x00 , 0x00 , 0xEF}; //Содержание буфера
int buffer_data[10] = {0x7E , 0xFF , 0x06 , 0x00 , 0x00 , 0x00 , 0x00 , 0xEF}; // Содержание буфера для отправки

// Отправка содержимого буфера UART TX Pin
void send_buffer(void) {
int i;
for( i=0; i< 10; i++){
putchar(buffer_data[i]);
buffer_data[i] = default_buffer[i];
}
}

// Усмановка громкости и отправкс по UART
void set_volume( int volume ) {
buffer_data[3] = 0x06;
buffer_data[6] = volume;
send_buffer();
}

// Установка команды выбора трека (1-3000) и отправка
void play_track(int track_id) {
buffer_data[3] = 0x03;
if(track_id < 256) {
buffer_data[6] = track_id;
} else {
buffer_data[5] = track_id / 256;
buffer_data[6] = track_id — 256 * buffer_data[6];
}
send_buffer();
}
/*
// Set a Track to Play Continuous
void play_current_track_continuous(void) {
buffer_data[3] = 0x08;
// buffer_data[6] = current_track_number;
send_buffer();
}
*/
// Пауза текущей дорожки воспроизведения
void pause_current_track() {
buffer_data[3] = 0x0E;
send_buffer();
}
//***********************************************
// Прерывание по входу INT0
interrupt [EXT_INT0] void ext_int0_isr(void)//Ждем встряски или поворота датчика
{
// Place your code here
#asm(«cli») // Отключаем прерывания (что бы не мешали воспроизведению)
set_volume(25 ); //Устанавливаем громкость воспроизведения
delay_ms(200); //Пауза
play_track(cont); //Запускаем воспроизведение очередного трека

// cont++;
if(cont++ > 3){ cont = 1;}; //Ститаем до трех
delay_ms(4000); //Ждем пока проиграет трек
pause_current_track();
// putchar(buffer_data[cont]);
#asm(«sei») //Включаем прерывания и ждем очередной встряски
}

void main(void)
{ //Настройка внешних прерываний
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Any change
// INT1: Off
GICR|=(0<<INT1) | (1<<INT0);
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (1<<ISC00);
GIFR=(0<<INTF1) | (1<<INTF0);
//Настройка UART
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
UBRRH=0x00;
UBRRL=0x33;
// Global enable interrupts
#asm(«sei»)

while (1) //Бесконечный цикл
{
// Place your code here

}
}

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *