Copyright 2009-2012 by djg. All Rights Reserved.

Wonky Gibbon Ramblings

Raspberry Pi Wireless Radio – Part 2 0

Posted on March 25, 2013 by danny

To control the Raspberry Pi radio, you’re going to need to connect a bunch of switches to the GPIO header block. How many switches and the functions they perform is up to you. For example you could use them as presets, or channel up/down. And don’t forget you’ll need something to control volume.

I purchased some ribbon cable, veroboard, tactile switches, an IDC connector and a bunch of resistors to make my control board (see pic below) but you could go a breadboard route at least initially to get something working. This post is an excellent introduction to the wiring required:

To interface with my external switch board (via the GPIO header block), I’m going to use Python.

Installing Python

Although installing python in itself was straightforward, finding information on how to install the gpio library was more challenging, most users having used it with raspbian or debian. In the case of archlinux it was clearly going to have to be compiled from scratch which given I haven’t compiled anything from scratch, was a bit daunting.

However, whilst standing on my own shoelaces and generally face planting, I stumbled across this post on the subject which outlines everything needed to install both python and the gpio library as well as a host of other development tools required along the way such as gcc and so forth.

First install the development tools you’re going to need (including things like gcc)

$ sudo pacman -Sy file base-devel abs git

Next download the gpio source code and unpack it

$ wget
$ tar xf raspberry-gpio-python.tar.gz

Now run the make process that will create a package that can be imported by pacman, and import it

$ cd raspberry-gpio-python
$ makepkg -Acs --asroot
$ sudo pacman -U raspberry-gpio-python

By this point you now have Python 2 and 3 installed, plus a variety of other development tools and the gpio library.

NB: If at any point you see error message that look a bit like this:
error: failed retrieving file ‘libpulse-2.0-2-arm.pkg.tar.xz’ from : The requested URL returned error: 404
the chances are that the package database in pacman is out of sync with what’s out on the internet. The following command will resync the database:

$ sudo pacman -Syy

If that doesn’t work try changing the download mirror

$ cd /etc/pacman.d
$ nano mirrorlist

Comment out the original mirror and remove a comment from one of the others, then save and update

A Simple Python Radio Control Program

This simple program has three radio stations and two mp3s assigned to various input buttons, plus a volume up and a volume down.

import RPi.GPIO as GPIO
import time
import os

def PlayRadio(station_url):
    os.system("mpc stop")
    os.system("mpc clear")
    os.system("mpc add " + station_url)
    os.system("mpc play")

def PlayMp3(mp3_file):
    os.system("mpc stop")
    os.system("mpc clear")
    os.system("mpc add " + mp3_file)
    os.system("mpc play")

def VolumeUp():
    os.system("mpc volume +2")

def VolumeDown():
    os.system("mpc volume -2")

def mainProg():
    # to use Raspberry Pi board pin numbers

    # set up unused GPIO as output channels and 0V
    # set up GPIO input with pull-down control
    #   (pull_up_down be PUD_OFF, PUD_UP or PUD_DOWN, default PUD_OFF)
    GPIO.setup(14, GPIO.OUT)
    GPIO.setup(15, GPIO.OUT)
    GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    GPIO.setup(25, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    GPIO.setup(8, GPIO.OUT)
    GPIO.setup(7, GPIO.OUT)

    GPIO.setup(2, GPIO.OUT)
    GPIO.setup(3, GPIO.OUT)
    GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    GPIO.setup(17, GPIO.OUT)
    GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    GPIO.setup(10, GPIO.OUT)
    GPIO.setup(9, GPIO.OUT)
    GPIO.setup(11, GPIO.OUT)

    # set RPi GPIO output pins low
    GPIO.output(14, GPIO.LOW)
    GPIO.output(15, GPIO.LOW)
    GPIO.output(8, GPIO.LOW)
    GPIO.output(7, GPIO.LOW)

    GPIO.output(2, GPIO.LOW)
    GPIO.output(3, GPIO.LOW)
    GPIO.output(17, GPIO.LOW)
    GPIO.output(10, GPIO.LOW)
    GPIO.output(9, GPIO.LOW)
    GPIO.output(11, GPIO.LOW)

    # look for inputs on RPi board pins
    prev_input = 0
    while True:
        #take readings
        this_cycle = 0
        input = GPIO.input(25)
        if ((prev_input == 0) and input):
            print ("Button 1 pressed")
            this_cycle = 25
            # ISA FM
        input = GPIO.input(24)
        if ((prev_input == 0) and input):
            print ("Button 2 pressed")
            this_cycle = 24
            # LBC
        input = GPIO.input(23)
        if ((prev_input == 0) and input):
            print ("Button 3 pressed")
            this_cycle = 23
            # Fun Kids
        input = GPIO.input(22)
        if ((prev_input == 0) and input):
            print ("Button 4 pressed")
            this_cycle = 22
            # Rock Lobster mp3 Test
        input = GPIO.input(27)
        if ((prev_input == 0) and input):
            print ("Button 5 pressed")
            # Beethoven mp3 Test
            this_cycle = 27
        input = GPIO.input(18)
        if ((prev_input == 0) and input):
            print ("Button 6 pressed")
            this_cycle = 18
        input = GPIO.input(4)
        if ((prev_input == 0) and input):
            print ("Buttpon 7 pressed")
            this_cycle = 4

        prev_input = 0
        if (this_cycle > 0):
            prev_input = 1

        # software switch debounce
def main():

if __name__ == "__main__":

From here you can really go to town. I followed this up with a web interface coded in Python and Django to allow button configuration and all sorts. Far to long to blog about here. But plenty of fun to be had!

References: describes wiring describes GPIO describes GPIO describes python programming with GPIO python for newbies for finding IP URLs for radio stations how to unpack BBC tokenised streams

↑ Top