четверг, 25 декабря 2014 г.

FM передатчик на базе Raspberry Pi



Raspberry Pi может работать как небольшая FM радиостанция! Для этого почти ничего не нужно. Только Raspberry Pi и 20 см проволоки для антенны. Реальная дистанция вещания — до 100 метров. То есть, Вы можете создать свое домашнее FM радио.


Установим программу PiFm
  • mkdir PiFm
  • cd PiFm 
  • wget http://omattos.com/pifm.tar.gz
  • tar zxvf pifm.tar.gz


Подключите к GPIO4 провод длиной примерно 20 см. Настроим радиоприемник на свободную волну. В нашем примере 102.5 FM. И запустим нашу первую радиопередачу:
  • sudo ./pifm sound.wav 102.5
Попробуем стерео
  • sudo ./pifm left_right.wav 102.5 22050 stereo
Для проигрывания MP3 установим avconv
  • sudo apt-get install libav-tools 
Загрузите на Raspberry Pi свой ​​MP3 файл и запустите его проигрывание следующей командой
  • avconv -i './example.mp3' -ac 1 -ar 22050 -b 512k -f wav - | ./pifm - 102.5
После завершения проигрывания не забудьте выключить ваш FM канал:
  • sudo ./pifm stop
Также можно транслировать интернет радиостанции
Для этого нужно установить пакет sox
  • sudo apt-get install sox
  • sudo apt-get install libsox-fmt-mp3 libsox-fmt-all
Лично у меня малина транслирует блэк-метал ридостанцию в FM эфир :-)
  • #!/bin/bash
    sox -v .9 -t mp3 http://95.141.24.24:80/ -t wav --input-buffer 80000 -r 22050 -c 1 - | sudo /home/pi/pifm - 95.5
В основе программы, лежит модуляция сигнала на основе внутреннего тактового генератора, работающего на частоте 500 МГц. По-умолчанию, частота делится на пять, поэтому вещание и происходит на частоте 100 МГц (этот параметр можно изменить в настройках).
Модулируемый сигнал из памяти направляется на разъём ввода-вывода и, что удивительно, этой мощности оказывается достаточно для радиовещания.
//
// Set up a memory regions to access GPIO
//
void setup_io()
{
    /* open /dev/mem */
    if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0) {
        printf("can't open /dev/mem \n");
        exit (-1);
    }

    /* mmap GPIO */

    // Allocate MAP block
    if ((gpio_mem = malloc(BLOCK_SIZE + (PAGE_SIZE-1))) == NULL) {
        printf("allocation error \n");
        exit (-1);
    }

    // Make sure pointer is on 4K boundary
    if ((unsigned long)gpio_mem % PAGE_SIZE)
        gpio_mem += PAGE_SIZE - ((unsigned long)gpio_mem % PAGE_SIZE);

    // Now map it
    gpio_map = (unsigned char *)mmap(
                   gpio_mem,
                   BLOCK_SIZE,
                   PROT_READ|PROT_WRITE,
                   MAP_SHARED|MAP_FIXED,
                   mem_fd,
                   GPIO_BASE
               );

    if ((long)gpio_map < 0) {
        printf("mmap error %d\n", (int)gpio_map);
        exit (-1);
    }

    // Always use volatile pointer!
    gpio = (volatile unsigned *)gpio_map;


} // setup_io
 

1 комментарий:

  1. А идеи по усилению передатчика есть? Как думаете, простого прямого усиления через развязку хватит что бы увеличить дальность в 2-3 раза?

    ОтветитьУдалить