Tuesday, August 13, 2013

Controlling a receiver using an raspberry pi and an ir transmitter

The aim of this project was to stream music from my computer to my receiver wirelessly and to control the power and input selection of my audio receiver.

The streaming part was resolved by adding a raspberry pi next to the receiver, connecting it via the aux input and using shairport to emulate AirTunes, https://github.com/abrasive/shairport/commits/master  

This allows me to stream from any audio source from my macbook air via the excellent airfoil utility, http://www.rogueamoeba.com/airfoil/.

There was still a problem that was nagging me: I needed to manually power up the receiver and set the correct audio source before I could enjoy the sweet music my ears were craving.

My receiver, a Yamaha RX-396RDS has an infrared-interface with a remote.
Thus I built the hardware and software to control the receiver from my pi using an infrared led.

IR receiver
To clone the ir commands of the my remote I had to build an IR receiver and connect it to the PI.
Buy an ir receiver transistor, solder it to a female header pins and connect it to the PI.
As always, be careful when attaching stuff to the GPIO pins, as you might destroy the PI GPIO pins.

IR-receiver with its headers
IR transmitter
I've seen other projects connecting an ir-transmitter LED directly to one of the pins.
This is risky as you might damage the pins or the pi by drawing too much current.

I didn't want to take my chances and decided instead to build my own support board where power to the LED is taken directly from the 3.3V pin and the GPIO pin is merely used as a switch using a NPN transistor.

Parts needed:
1 NPN transistor, I used a C1815
1 resistor, 22 Ω
1 resistor, 600 Ω
1 IR-transmitter LED
Resistor values may change depending on what setup you have. 
You can probably swap out the 600 Ω for a higher one.


Connect the parts as the schematic indicates. 
The resistor values are adapted for the 3.3V supply voltage of the raspberry pi but R2 can probably be swapped out to a resistor with higher value. It depends on what transistor you are using.

Board is assembled and plugged in. Black and blue wires goes to the IR-led

I did some debugging at this part to ensure the design was sound.
The light spectrum that the IR LED transmits is invisible to our eyes. 
Fortunately cell phone cameras do detect them due to how their filters are designed.
What I did was to film the LED with my cell camera in order to verify the functionality.

IR-board connected to the pi

I connected the VCC, GND and GPIO pins to a female header and connected it to the PI.

Take care to connect it correctly, I connected the pi input to pin 10.
I positioned the IR LED in such a way I was sure that it had a clear line of sight to the Yamaha receiver IR-receiver.

The LIRC software was installed on the pi. 
If you use the raspian linux distro, it is available in the package manager.
Just issue an apt-get install lirc.

First I tried to use the existing yamaha RAX7 remote control firmware, but couldn't get it to work.
I then had to proceed to capture the input from my remote. 

After connecting the ir receiver to my pi, I had to load the lirc kernel module and instruct it to understand which pin I wanted to use as input.
The command modinfo lirc_rpi gives you the exact properties to use.
In my case I had connected the ir receiver input to pin 10 and used the following command:
sudo modprobe lirc_rpi gpio_in_pin=10

I checked the kernel log using dmesg to verify that the lirc module was properly loaded.

The command irrecord was used to to create a new firmware for the remote.
I had to use the force mode for proper functionality but your milage may vary.

After having created a proper firmware I needed to place it in /etc/lirc and rename it to lircd.conf.

I then removed the IR receiver from the pi and removed the lirc_rpi module by issuing:
sudo rmmod lirc_rpi

Then the lirc_rpi_module was inserted again but now with the gpio_out_pin=10 argument and the ir transmitter module was inserted, with the GPIO pin connected to pin 10.

The irsend was then used to send ir commands to the receiver via the ir transmitter circuit.
For debug the SEND_START command is useful as it repeats the signal indefinitely.

I got the receiver to react to the commands sent from the PI. 


Interaction with shairport
The final piece of the project was to start the Yamaha receiver and switch to the correct input when I connected to the shairport server and to do the reverse when disconnecting from the pi.

I first wrote some minor scripts and placed the in /usr/local/bin, taking care to make them executable.

irsend SEND_ONCE yamaha_rax7 KEY_POWER
irsend SEND_ONCE yamaha_rax7 KEY_TV2

irsend SEND_ONCE yamaha_rax7 KEY_TV2
irsend SEND_ONCE yamaha_rax7 KEY_POWER

Lastly, I edited the /etc/init.d/shairport and added --play_prog=start_tuner --stop_prog=stop_tuner to the DAEMON_ARGS line.

That's it!

Here's a video showing it all in action.

Caveats, future improvements
The system has no feedback structure and relies on dead counting i.e the volume must be sane, the receiver must be positioned in its nominal setup.
However, fixing this issue this is much more complex task.
If one would add some kind of relay switch killing the power fully to the receiver it would return to its default state that would be a way forward.

The volume dial is mechanical so the startup would then need to turn the volume down for a long time ensuring that we always start off from a zero state.

Labels: , , , ,


Blogger Unknown said...

Dude, that setup looks awesome..
I worked on a similar project:
I linked to your site..
I installed OpenELEC on the Pi. I have 10s delay before the music plays. It appears you also have some delay.

10:45 AM  
Blogger Unknown said...

Dude, that setup looks awesome..
I worked on a similar project:
I linked to your site..
I installed OpenELEC on the Pi. I have 10s delay before the music plays. It appears you also have some delay.

10:46 AM  
Blogger Vanley said...

Hi there, amazing project!
do You think there is possibility to add remote controller to raspberry to switch to next song or pause music?

5:12 AM  

Post a Comment

<< Home