Проект Wi-Fi- радиоприемника - ФОРУМ ДВ Робот dvrobot.ru
Суббота, 24.02.2018, 20:26
Главная Мой профиль Регистрация Выход
  • НАШ МАГАЗИН
  • Вы вошли как Гость | Группа "Гости"Приветствую Вас, Гость
    [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
    Страница 1 из 11
    Модератор форума: GRACH, Serg 
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » Проект Wi-Fi- радиоприемника (Будем слушать любимые станции с помощью Arduino и роутера)
    Проект Wi-Fi- радиоприемника
    SergДата: Воскресенье, 21.04.2013, 22:01 | Сообщение # 1
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Нам понадобятся:
    вот такой роутер- самый маленький из всех, которые можно купить в магазинах города.



    внутри он выглядит так :



    вот такая звуковая карта с USB интерфейсом- самая дешевая из всех доступных... примерно 120 руб.



    внутри она выглядит так :



    дисплей был выбран такой исключительно из-за поддержки русского языка. Да и лежит он без дела, давно просится в дело. biggrin



    Если следовать принципу миниатюризации, логичнее было бы применить вот такой дисплей.



    маленький USB-хаб, например вот такой:



    акустическая система с голубой подсветкой регулятора громкости:



    продолжение следует...
    Прикрепления: 8350959.jpg(184Kb) · 9541185.jpg(38Kb) · 9712676.jpg(43Kb) · 7287052.jpg(325Kb) · 3338832.jpg(345Kb)
     
    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 адресов онлайн-радиостанций.
    Все время, кроме моментов нажатия на кнопки, микроконтроллер находится в спящем режиме.

    Прикрепления: 8033378.gif(1390Kb)
     
    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
    Радио стоит на столе и радует своим звучанием.Звуковая карта ноутбука наконец то освободилась от лишних проводов.
     
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » Проект Wi-Fi- радиоприемника (Будем слушать любимые станции с помощью Arduino и роутера)
    Страница 1 из 11
    Поиск:

    ДВ Робот - Чат