Проект Wi-Fi- радиоприемника
|
|
|
Ivan-771 | Дата: Вторник, 23.04.2013, 06:47 | Сообщение # 2 |
 5 Вольт
Группа: Пользователи
Сообщений: 39
Репутация: 0
Статус: Offline
| На радиосканер, это будет похоже?
|
|
| |
Serg | Дата: Вторник, 23.04.2013, 07:25 | Сообщение # 3 |
Ампер
Группа: Модераторы
Сообщений: 510
Репутация: 28
Статус: Offline
| Нет, просто вещательные станции, которые есть в сети.
|
|
| |
Serg | Дата: Воскресенье, 12.05.2013, 22:42 | Сообщение # 4 |
Ампер
Группа: Модераторы
Сообщений: 510
Репутация: 28
Статус: Offline
| Что бы запитать радио от любого подходящего источника питания, нам потребуется вот такой регулируемый понижающий модуль Baite.
В качестве блока питания подойдет вот такой блок питания для Ардуино 12 В.
|
|
| |
Serg | Дата: Четверг, 16.05.2013, 23:52 | Сообщение # 5 |
Ампер
Группа: Модераторы
Сообщений: 510
Репутация: 28
Статус: Offline
| Кому нужна такая звуковая карта, пишите, объединимся для закупки
|
|
| |
Serg | Дата: Суббота, 25.05.2013, 22:03 | Сообщение # 6 |
Ампер
Группа: Модераторы
Сообщений: 510
Репутация: 28
Статус: Offline
| Роутер следует прошить OpenWrt и установить пакет МР3 проигрывателя Madplay. Arduino будет управлять роутером через UART-интерфейс на скорости 115200 бит/секунду. Предумотрено всего три кнопки управления "Пауза-Воспроизведение", "Следущая станция", "Предыдущая станция". Сделано запоминание станции при выключении питания. Теперь не нужно листать список, что бы добраться до любимой станции. Памяти ATMega328 хватило на 20 адресов онлайн-радиостанций. Все время, кроме моментов нажатия на кнопки, микроконтроллер находится в спящем режиме.
|
|
| |
Serg | Дата: Суббота, 25.05.2013, 22:19 | Сообщение # 7 |
Ампер
Группа: Модераторы
Сообщений: 510
Репутация: 28
Статус: Offline
| Вот и сама программа
Код #include <avr/io.h> #include <avr/interrupt.h> #include <inttypes.h> #include <avr/sleep.h> #include <avr/eeprom.h> #define BAUDRATE 115200 // Скорость обмена данными #define F_CPU 14745600L // Рабочая частота контроллера unsigned char flag = 0; // флаг play/pause unsigned char count = 0; unsigned char i = 1; unsigned char run; unsigned char eeprom_var EEMEM; // определяем переменную в EEPROM
// Функция задержки в мкс void _delay_us(unsigned char time_us) { register unsigned char i;
for(i = 0; i < time_us; i++) { asm volatile(" PUSH R0 "); asm volatile(" POP R0 "); } }
// Функция задержки в мс void _delay_ms(unsigned int time_ms) { register unsigned int i;
for(i = 0; i < time_ms; i++) { _delay_us(250); _delay_us(250); _delay_us(250); _delay_us(250); } }
#define RS PC0 #define EN PC2
// Функция передачи команды void lcd_com(unsigned char p) { PORTC &= ~(1 << RS); // RS = 0 (запись команд) PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (p & 0xF0); // старший нибл _delay_us(100); PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (p << 4); // младший нибл _delay_us(100); PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); }
// Функция передачи данных void lcd_data(unsigned char p) { PORTC |= (1 << RS)|(1 << EN); // RS = 1 (запись данных), EN - 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (p & 0xF0); // старший нибл _delay_us(100); PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (p << 4); // младший нибл _delay_us(100); PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); }
// Функция инициализации LCD void lcd_init(void) { _delay_ms(50); // Ожидание готовности ЖК-модуля
// Конфигурирование четырехразрядного режима PORTD |= (1 << PD5); PORTD &= ~(1 << PD4);
// Активизация четырехразрядного режима PORTC |= (1 << EN); PORTC &= ~(1 << EN); _delay_ms(5);
lcd_com(0x28); // шина 4 бит, LCD - 2 строки lcd_com(0x08); // полное выключение дисплея lcd_com(0x01); // очистка дисплея _delay_us(100); lcd_com(0x06); // сдвиг курсора вправо lcd_com(0x0C); // включение дисплея, курсор не видим }
// Функция вывода строки на LCD void lcd_string(unsigned char command, char *string) { lcd_com(0x0C); lcd_com(command); while(*string != '\0') { lcd_data(*string); string++; } }
// Функция передачи данных по USART void uart_send(char data) { while(!( UCSR0A & (1 << UDRE0))); // Ожидаем когда очистится буфер передачи UDR0 = data; // Помещаем данные в буфер, начинаем передачу }
// Функция передачи строки по USART void str_uart_send(char *string) { while(*string != '\0') { uart_send(*string); string++; } } /* // Функция приема данных по USART int uart_receive(void) { while(!(UCSRA & (1 << RXC))); // Ожидаем, когда данные будут получены return UDR; // Читаем данные из буфера и возвращаем их при выходе из подпрограммы } */ // Функция инициализации USART void uart_init(void) { // Параметры соединения: 8 бит данные, 1 стоповый бит, нет контроля четности // USART Приемник: Включен // USART Передатчик: Включен // USART Режим: Асинхронный // USART Скорость обмена: 9600
UBRR0L = (F_CPU/BAUDRATE/16-1); // Вычисляем скорость обмена данными UBRR0H = (F_CPU/BAUDRATE/16-1) >> 8;
UCSR0B |= /*(1 << RXCIE0)| // Разрешаем прерывание по завершению приема данных (1 << RXEN0)|*/(1 << TXEN0); // Включаем приемник и передатчик UCSR0C |= //(1 << URSEL0)| // Для доступа к регистру UCSRC выставляем бит URSEL (1 << UCSZ01)|(1 << UCSZ00); // Размер посылки в кадре 8 бит }
void playRadio (int run) { if(run==1) { lcd_com(0x01); // Очищаем LCD _delay_ms(500); uart_send(0x03); lcd_string(0x80, "1 AUTO-RADIO"); // Выводим строку на LCD _delay_ms(500); str_uart_send("wget -q -O- http://stream02.media.rambler.ru/auto128.mp3 | madplay -\r\n"); // Передаем строку по USART } if(run==2) { lcd_com(0x01); // Очищаем LCD _delay_ms(500); uart_send(0x03); lcd_string(0x80, "2 RUSSIAN RAP"); // Выводим строку на LCD _delay_ms(500);
str_uart_send("wget -q -O- http://music.myradio.com.ua:8000/rep128.mp3 | madplay -\r\n"); // Передаем строку по USART } if(run==3) { lcd_com(0x01); // Очищаем LCD _delay_ms(500); uart_send(0x03); lcd_string(0x80, "3 RADIO YUNOST'"); // Выводим строку на LCD _delay_ms(500); str_uart_send("wget -q -O - http://w01-cn01.akadostream.ru:8000/radioyunost128.mp3 | madplay -\r\n"); // Передаем строку по USART } if(run==4) { lcd_com(0x01); // Очищаем LCD _delay_ms(500); uart_send(0x03); lcd_string(0x80, "4 RADIO RAP"); // Выводим строку на LCD _delay_ms(500); str_uart_send("wget -q -O- http://music.myradio.com.ua:8000/rep128.mp3 | madplay -\r\n"); // Передаем строку по USART } if(run==5) { lcd_com(0x01); // Очищаем LCD _delay_ms(500); uart_send(0x03); lcd_string(0x80, "5 RADIO Gothica"); // Выводим строку на LCD _delay_ms(500); str_uart_send("wget -q -O- http://streaming202.radionomy.com:80/Gothica | madplay -\r\n"); // Передаем строку по USART } if(run==6) { lcd_com(0x01); // Очищаем LCD _delay_ms(500); uart_send(0x03); lcd_string(0x80, "6 RADIO Goth-N-Metal"); // Выводим строку на LCD _delay_ms(500);
str_uart_send("wget -q -O- http://streaming204.radionomy.com:80/Goth-N-Metal | madplay -\r\n"); // Передаем строку по USART } if(run==7) { lcd_com(0x01); // Очищаем LCD _delay_ms(500); str_uart_send("^C\r\n"); lcd_string(0x80, "7 RADIO"); // Выводим строку на LCD _delay_ms(500); str_uart_send("wget -q -O- http://st4ree5am02.media.rambler.ru/auto128.mp3 | madplay -\r\n"); // Передаем строку по USART } if(run==8) { lcd_com(0x01); // Очищаем LCD _delay_ms(500); str_uart_send("^C\r\n"); lcd_string(0x80, "8 RADIO"); // Выводим строку на LCD _delay_ms(500); str_uart_send("wget -q -O- http://mus35ic.myradio.com.ua:8000/rep128.mp3 | madplay -\r\n"); // Передаем строку по USART } if(run==9) { lcd_com(0x01); // Очищаем LCD _delay_ms(500); str_uart_send("^C\r\n"); lcd_string(0x80, "9 RADIO"); // Выводим строку на LCD _delay_ms(500);
str_uart_send("wget -q -O- htt11p://mu6sic.myrad54io.com.ua:8000/rep128.mp3 | madplay -\r\n"); // Передаем строку по USART } if(run==10) { lcd_com(0x01); // Очищаем LCD _delay_ms(500); str_uart_send("^C\r\n"); lcd_string(0x80, "10 RADIO"); // Выводим строку на LCD _delay_ms(500); str_uart_send("10wget -q -O- h1ttp://st4ree5am02.media.rambler.ru/auto128.mp3 | madplay -\r\n"); // Передаем строку по USART } if(run==11) { lcd_com(0x01); // Очищаем LCD _delay_ms(500); str_uart_send("^C\r\n"); lcd_string(0x80, "11 RADIO"); // Выводим строку на LCD _delay_ms(500); str_uart_send("11wget -q -O- http://mu2s35ic.myradio.com.ua:8000/rep128.mp3 | madplay -\r\n"); // Передаем строку по USART } } ISR(INT1_vect) //SIGNAL(SIG_INTERRUPT1) { if((PIND & (1 << PD3)) == 0) // Если нажата кнопка 1 { while((PIND & (1 << PD3)) == 0) {} // Ждем отпускания кнопки 1 run++; if(run>11) run=1; playRadio (run); } eeprom_write_byte(&eeprom_var, run); // записываем "run" в EEPROM _delay_ms(200); } ISR(INT0_vect) //SIGNAL(SIG_INTERRUPT0)
{ if((PIND & (1 << PD2)) == 0) // Если нажата кнопка 1 { while((PIND & (1 << PD2)) == 0){} // Ждем отпускания кнопки 1 run--; if(run<1) run=11; playRadio (run); } eeprom_write_byte(&eeprom_var, run); // записываем "run" в EEPROM _delay_ms(200); } // обработчик прерывания PD0 ISR(PCINT2_vect) { if((PIND & (1 << PD0)) == 0 && flag == 0) // Если нажата кнопка 1 {
while((PIND & (1 << PD0)) == 0){} // Ждем отпускания кнопки 1 playRadio (run); flag=1; } if((PIND & (1 << PD0)) == 0 && flag == 1) // Если нажата кнопка 1 {
while((PIND & (1 << PD0)) == 0){} // Ждем отпускания кнопки 1 lcd_com(0x01); // Очищаем LCD _delay_ms(500); uart_send(0x03); lcd_string(0x80, "Pause"); // Выводим строку на LCD _delay_ms(500); flag=0; } }
// Главная функция int main(void) {
run = eeprom_read_byte(&eeprom_var); // считываем байт из EEPROM и помещаем его в "run"
DDRC |= (1 << PC2)|(1 << PC0); //выходы PORTC = 0x00;// ноль на выходе DDRD |=(0<< PD0)|(0<< PD1)|(0<< PD2)|(0<< PD3)|(1<< PD4)|(1<< PD5)|(1<< PD6)|(1<< PD7);
PORTD |= (1<< PD2)|(1<< PD3) |(1<< PD0);// - Подтягивающие резисторы для PD 2,3 lcd_init(); // Инициализация LCD uart_init(); // Инициализация USART //cli(); SREG|= (1<<7); //разрешаем общие прерывания EIMSK |= (1<<1) | (1<<0); EICRA = (1<<ISC11) | (0<<ISC10) | (1<<ISC01) | (0<<ISC00); PCICR |= (1<<PCIE2) | (1<<PCIE1) | (1<<PCIE0); PCMSK2 |= (1<<PCINT16);//// маскирование всех ног, кроме PD0 lcd_com(0x01); // Очищаем LCD _delay_ms(500); //str_uart_send("Initialization system\r\n"); // Передаем строку по USART lcd_string(0x80, "Internet-Radio"); // Выводим строку на LCD _delay_ms(2500); lcd_com(0x01); // Очищаем LCD while(1) { sleep_mode(); } } При написании программы очень помогли статьи с сайта radioparty.ru
|
|
| |
Serg | Дата: Суббота, 25.05.2013, 22:31 | Сообщение # 8 |
Ампер
Группа: Модераторы
Сообщений: 510
Репутация: 28
Статус: Offline
| Радио стоит на столе и радует своим звучанием.Звуковая карта ноутбука наконец то освободилась от лишних проводов.
|
|
| |