• This repository has been archived on 13/Dec/2018
  • Stars
    star
    524
  • Rank 84,541 (Top 2 %)
  • Language
    C++
  • License
    GNU General Publi...
  • Created almost 12 years ago
  • Updated about 7 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Copy of http://www.icrobotics.co.uk/wiki/index.php/Turning_the_Raspberry_Pi_Into_an_FM_Transmitter
- Note: this project is no longer maintained

UPDATE

### https://github.com/richardghirst/PiBits/blob/master/PiFmDma/PiFmDma.c presents a rewrite using DMA, which uses much less CPU than this version. Please use that version in preference.

This has been updated by the original authors to use DMA, as well as allow tuning and stereo. Richard Hirst is no longer maintaining PiBits, and refers users to this solution.

Turning the Raspberry Pi Into an FM Transmitter

Steps to play sound:

(Created by Oliver Mattos and Oskar Weigl. Code is GPL)

sudo python
>>> import PiFm
>>> PiFm.play_sound("sound.wav")

Now connect a 20cm or so plain wire to GPIO 4 (which is pin 7 on header P1) to act as an antenna, and tune an FM radio to 103.3Mhz

from a post on MAKE by Matt Richardson

The antenna is optional, but range is reduced from ~100 meters to ~10cm without the antenna. The sound file must be 16 bit mono wav format.

New! Now with stereo

sudo ./pifm left_right.wav 103.3 22050 stereo

# Example command lines
# play an MP3
ffmpeg -i input.mp3 -f s16le -ar 22.05k -ac 1 - | sudo ./pifm -

# Broadcast from a usb microphone (see arecord manual page for config)
arecord -d0 -c2 -f S16_LE -r 22050 -twav -D copy | sudo ./pifm -

How to change the broadcast frequency

Run the ./pifm binary with no command line arguments to find usage.

The second command line argument is the frequency to transmit on, as a number in Mhz. Eg. This will transmit on 100.0

sudo ./pifm sound.wav 100.0

It will work from about 1Mhz up to 250Mhz, although the useful FM band is 88 Mhz to 108 Mhz in most countries.

Most radio receivers want a signal to be an odd multiple of 0.1 MHz to work properly.

The details of how it works

Below is some code that was hacked together over a few hours at the Code Club pihack. It uses the hardware on the raspberry pi that is actually meant to generate spread-spectrum clock signals on the GPIO pins to output FM Radio energy. This means that all you need to do to turn the Raspberry-Pi into a (ridiculously powerful) FM Transmitter is to plug in a wire as the antenna (as little as 20cm will do) into GPIO pin 4 and run the code posted below. It transmits on 100.0 MHz.

When testing, the signal only started to break up after we went through several conference rooms with heavy walls, at least 50m away, and crouched behind a heavy metal cabinet. The sound quality is ok, but not amazing, as it currently plays some clicks when the CPU gets switched away to do anything else than play the music. The plan was to make a kernel mode driver that would be able to use the DMA controller to offload the CPU and play smooth music without loading the CPU, but we ran out of time. Now Done and working, DMA from userspace is awesome and awful at the same time!

If you're v. smart, you might be able to get stereo going! Done!

Accessing Hardware

The python library calls a C program. The C program maps the Peripheral Bus (0x20000000) in physical memory into virtual address space using /dev/mem and mmap. To do this it needs root access, hence the sudo. Next it sets the clock generator module to enabled and sets it to output on GPIO4 (no other accessible pins can be used). It also sets the frequency to 100.0Mhz (provided from PLLD@500Mhz, divided by 5) 103.3, which provides a carrier. At this point, radios will stop making a "fuzz" noise, and become silent.

Modulation is done by adjusting the frequency using the fractional divider between 103.325Mhz and 103.275Mhz, which makes the audio signal. ~~The fractional divider doesn't have enough resolution to produce more than ~6 bit audio, but since the PI is very fast, we can do oversampling to provide about 9.5 bit audio by using 128 subsamples per real audio sample.~~ We were being naive with our subsampling algorithm - you can now get full 16 bit quality sound, and it even does FM pre-emphasis so that the result doesn't sound bass-heavy.

Notes

This is a copy of the updated documentation and code from http://www.icrobotics.co.uk/wiki/index.php/Turning_the_Raspberry_Pi_Into_an_FM_Transmitter,

The only changes are removal of the download link (since the source can be downloaded here), and formatting in Github Markdown.

All rights of the original authors reserved.

References

More Repositories

1

luma.oled

Python module to drive a SSD1306 / SSD1309 / SSD1322 / SSD1325 / SSD1327 / SSD1331 / SSD1351 / SH1106 OLED
Python
809
star
2

luma.led_matrix

Python module to drive LED Matrices & 7-segment displays (MAX7219) and RGB NeoPixels (WS2812 / APA102)
Python
519
star
3

luma.examples

Companion repo for running examples against the luma.oled, luma.lcd, luma.led_matrix and luma.emulator display drivers.
Python
348
star
4

nvd-clojure

National Vulnerability Database dependency checker for Clojure projects
Clojure
268
star
5

OPi.GPIO

RPi.GPIO drop-in replacement library for Orange Pi Zero and other SBCs
Python
185
star
6

luma.lcd

Python module to drive PCD8544, HT1621, ST7735, ST7567 and UC1701X-based LCDs
Python
157
star
7

luma.core

A component library providing a Pillow-compatible drawing canvas, and other functionality to support drawing primitives and text-rendering capabilities for small displays on the Raspberry Pi and other single board computers.
Python
148
star
8

programming-enchiladas

A ClojureScript-based HTML5 Canvas and SVG Graphics Playground, much like http://bl.ocks.org/ but specifically for showcasing small ClojuresScript code demos: The underlying agenda is to show how small simple functional programs can generate complex behaviour.
JavaScript
138
star
9

sql_graphviz

Generates graphviz commands to graphically display tables and show foreign key links.
Python
138
star
10

infix

A Clojure library for expressing LISP expressions as infix rather than prefix notation
Clojure
101
star
11

bme280

Raspberry PI schematics & python module to drive a Bosch BME280 digital sensor module
Python
96
star
12

spidev-test

C
88
star
13

big-bang

ClojureScript event loop abstraction, loosely based on Racket's big-bang and implemented on top of core.async
Clojure
66
star
14

barebones-toolchain

Barebones [ i686-elf / ARMv7-eabi / MIPS ] cross-compiler & toolchain
C
64
star
15

jasentaa

A parser combinator library for Clojure and ClojureScript
Clojure
60
star
16

wireframes

A lightweight 3D graphics rendering engine in Clojure & ClojureScript.
Clojure
60
star
17

byok

A bare-metal x86 Forth interpreter & compiler
C
54
star
18

skull-canyon

Notes on setting up Ubuntu 18.04 (Bionic Beaver) on Intel NUC6i7KYK
46
star
19

luma.emulator

Provides a series of pseudo-display devices which allow the luma.core components to be used without running a physical device.
Python
43
star
20

inkspot

A small Clojure/ClojureScript library for creating colour swatches
Clojure
39
star
21

lindenmayer-systems

An L-system or Lindenmayer system is a parallel rewriting system, namely a variant of a formal grammar, most famously used to model the growth processes of plant development, but also able to model the morphology of a variety of organisms. Clojure / Heroku.
Clojure
38
star
22

clj-wordnet

An interface to the WordNet database using idiomatic Clojure
Clojure
35
star
23

markov-chains

A library (and application examples) of stochastic discrete-time Markov Chains (DTMC) in Clojure
Clojure
31
star
24

st7735fb

Schematics and build info for assembling a custom Raspberry Pi kernel with ST7735 TFT-LCD framebuffer drivers
Python
28
star
25

k8055

Velleman k8055 linux driver and GUI sources for the Raspberry Pi
C
27
star
26

wam

Gradual WAM implementation using Hassan Aรฏt-Kaci's tutorial reconstruction
Clojure
25
star
27

hmc5883l

Python wrapper class for HMC5883L magnetometer (using smbus I2c)
Python
22
star
28

clustering

Implementation of K-Means, Self-Organising Maps, QT and Hierarchical clustering algorithms, in Clojure.
Clojure
21
star
29

weatherstation

TypeScript
16
star
30

project-euler

Clojure solutions to Project Euler problems
Clojure
14
star
31

turtle

A logo-style turtle graphics library for Clojure & ClojureScript (renders to SVG, bitmaps & HTML5 Canvas)
Clojure
11
star
32

wiringPi

A fork of Gordon Henderson's git://git.drogon.net/wiringPi but with python bindings
C
10
star
33

corewar

A clojure / clojurescript / core.async implementation of A. K. Dewdney's Core War
Clojure
9
star
34

linux-journal-archive

Copy of the Linux Journal archives (issues 1โ€“293)
HTML
8
star
35

local-cast

Stream local video/audio content to a Chromecast on your network
JavaScript
7
star
36

maze

Maze generator and solver, in ClojureScript with a HTML5 canvas
Clojure
7
star
37

turmites

A turmite is a Turing machine which has an orientation as well as a current state and a "tape" that consists of an infinite two-dimensional grid of cells. ClojureScript / HTML5 Canvas / Heroku.
Clojure
6
star
38

yalix

Seven LISPs in seven languages
Python
5
star
39

task-scheduler

Fork/Join task scheduling in Clojure
Clojure
5
star
40

luma.docs

Python
5
star
41

ars-magna

A multi-word anagram solver, based on the article "Anagrams and Pangrams" from The Armchair Universe
Clojure
5
star
42

byok3

A forth interpreter and compiler implemented in scala using typelevel/cats
Scala
4
star
43

ambages

A small prolog interpreter, implemented in Clojure.
Clojure
4
star
44

table

Display ascii tables for almost any data structure with ease.
Clojure
4
star
45

apds9960

Python
4
star
46

mcp23017

Schematics and build info for assembling a Raspberry Pi breakout board with multiple MCP23017 input/output port expanders
Python
3
star
47

jwi

(Mavenized version of) JWI 2.3.3
Java
3
star
48

zaup

TOTP authentication using ZeroSeg
Python
3
star
49

8-bit-trip

Algorithmic music streaming
TypeScript
3
star
50

helpmate

A Clojure library for emitting SGML (HTML,SVG,XML,MathML) fragments
Clojure
3
star
51

implicit-equations

A graphing library for implicit equations, in Clojure
Clojure
3
star
52

colorforth

cvs->git conversion of http://colorforth.cvs.sourceforge.net/viewvc/colorforth/colorforth/
Assembly
3
star
53

loose-labels

An implementation of "Nice numbers for graph labels" from Graphics Gems, vol. 1
Clojure
2
star
54

TR4-monitor

Small utility script to display TR4 system information on a 2.42" SSD1309 OLED
Python
2
star
55

treebank-viz

SVG graph generation of treebank language parsing
Clojure
2
star
56

zaup2

A TOTP authenticator for the web
TypeScript
2
star
57

newell-teapot

Shadow of ftp://ftp.funet.fi/pub/sci/graphics/packages/objects/teaset.tar.Z
C
2
star
58

image-preview

CLI takes in an image file, and using ANSI escape sequences, outputs a low-fidelity preview of the image in the terminal.
Rust
2
star
59

pysensors3

Python3 bindings to libsensors (via ctypes)
Python
1
star
60

rg-matrix

Python library to drive a 32x16 red/green LED matrix
1
star
61

vim-locate

A vim plugin that integrates the unix locate database
Vim Script
1
star
62

henry

HTML
1
star
63

glsl-transpiler

A ClojureScript to GLSL cross compiler ... probably
1
star
64

webrot

Clojure, Noir and Clojurescript toy implementations for mandlebrot, julia & sierpinski fractals
Clojure
1
star
65

sound-flour

An experiment in collaborative broadcast streaming computer-generated music, in Clojure
Clojure
1
star
66

polyhedra

A Clojure/Clojurescript library for reading netlib polyhedra data files
Clojure
1
star
67

boyer-moore-search

Boyer-Moore string search library in Clojure
Clojure
1
star
68

ods-search-appliance

A JSON full-text search endpoint API onto NHS ODS data
Clojure
1
star
69

kebab

An ad-scrubbing web proxy, focusing on subverting commercial tracking and other general panoptic shenanigans. [Scala / Play 2.1]
CSS
1
star
70

proliant-microserver

1
star
71

led-blaster

C
1
star
72

nostalgia

A trip back though some personal 1980's & 90's computing memorabilia
1
star
73

cellular-automata

Migrating from CA code in webrot into separate stand-alone project
Clojure
1
star
74

cljs-dataview

A ClojureScript library for asynchronously fetching & dicing remote binary objects
Clojure
1
star
75

dotfiles

Essentials pour le vim exigeants basรฉs programmeur informatique agiotage
Vim Script
1
star
76

speedtest-logger

Broadband speedtest logger
JavaScript
1
star