Thursday, March 28, 2013

Adding Bluetooth remote control to computer speakers






 Introduction

Some time ago, I had to replace the volume pot/power switch in my Creative computer speakers.
Unfortunately, they use a non-standard pot with a switch, and I didn't bother finding a proper replacement, just did a quick fix with a generic pot and switch.
It worked well, but looked bad. So now I decided to repair it properly and put everything back together, while I'm working on it, might as well mod it a bit...


The volume control PCB and my quick fix

At first I just wanted to add a rotary encoder instead of the volume pot, but if I'm going to put a microcontroller inside I might as well add some more features, so I grabbed an LED and a Bluetooth module and got to work...


Hardware

Here's a list of hardware used in this project:
  • Creative 5.1 speakers
  • TPL0202 digital potentiometer
  • Rotary encoder with switch
  • ATmega8A
  • RGB SMD LED
  • BTM-5 Bluetooth SPP module
 And here's a basic diagram of the whole thing:

Basic diagram of the project

Speaker PCB

The original volume/power/bass control PCB is very simple, just two pots, two jack sockets, some resistors, cable connector and an LED.
The main speaker unit supplies 5V to this board, and the speakers are turned on when this 5V is applied to one of the pins.
Unfortunately I have overestimated the power of of that 5V source and so my modification requires an external 5V power supply, but that's no problem.
There is not much I had to do to the PCB, just removed the pot, removed the green power led, changed some resistors (because the original pot was 50k and the digital one is 10k) and cut out some more room for the rotary encoder.

Digital potentiometer

I'm using a TPL0202 digital potentiometer from Texas Instruments. It has two outputs, 256-position resolution and is controlled via SPI.
The chip is QFN16, but I have somehow managed to solder it (after a couple of tries :P) onto a home-made PCB using hot air.

Rotary encoder

It's just a 20-step encoder with a button. The button is used for a couple of functions. Firstly, it is used as a power switch. Secondly, when the button is pressed while turning the knob, the volume is changed in more precise steps. And lastly, when pressed during power-up, it causes the chip to enter the bootloader (yes! wireless software update!).
The shaft of the encoder sticks out higher than the original knob, but instead of shortening it, I've decided to make the knob a little taller (with a piece of PVC), so there is no gaping hole and it is easier to manipulate.

The microcontroller

The ATmega8A is the best chip ever, costs less than $1 and has so much to offer.
Here's the schematic:
Schematic of the microcontroller part

I've uploaded a serial bootloader to the chip, which allows me (thanks to the Bluetooth SPP module) to update the firmware wirelessly (trust me, I'm not opening that case ever again ;P).

RGB LED

Every project needs blinkenlights! I used a cheap SMD RGB LED, controlled with software PWM by the uC. It lights up when the speakers are turned on and shows the current volume in color (pink means 'ear damage imminent').

Bluetooth module

The module I'm using is a BTM-5 SPP module. It acts as a UART-Bluetooth bridge and works automatically and transparently. It's the easiest way to add wireless connectivity to your project.
You can get one of those off ebay for less than $10.

The communication protocol is just a couple of short commands sent over UART to the chip, for example: 'on', 'off', 'get' (get the current volume), 'v099' (set volume to 99).


Software

I wrote the uC firmware in C, compiled using avr-gcc of course, and a simple GUI application in PyQt.
Head over to GitHub for the sources:
https://github.com/Emeryth/avrdigipot


Putting it together

Here's some crazy kynar soldering action. I've managed to squeeze everything back into the original case, although I didn't tighten the screws all the way in. :P



All the components in place
At this point I though the soldering was over... (spoilers: it wasn't)
Now that I think of it, it might have been easier to redo the original PCB...

Conclusions

It works!
I can finally control my speakers without getting out of bed.
The clicking action of the rotary encoder is very nice, at last I can set the volume precisely, without fiddling with the pot.

It was a simple project in theory, but getting it done proved much more difficult.
I'm glad it works and that I've managed to make it look presentable (unlike some of my other projects).


Thursday, January 17, 2013

U-blox PCI-5S - a cheap GPS module for your projects


 [Update] I have found the timepulse output!

The U-blox PCI-5S is the cheapest GPS module on eBay right now (although you have to buy an additional antenna).
At first glance it seems useless for microcontroller projects because it's a mini PCIe card, but as it turns out it has an easily accessible UART port that can be connected to a microcontroller.

Here's the pinout:
The USB device is a standard CDC ACM serial port.

RX/TX pins are a second (independent of USB) UART port running at 9600bps by default.

You can use u-center to modify the module's configuration, for example set the update frequency to 4Hz.

Happy hacking!

Friday, December 7, 2012

USB mass storage bootloader for the Stellaris Launchpad


Edit: prebuilt binaries now available at github!

I wrote a a bootloader for the Stellaris Launchpad (and other Stellaris boards/chips) that acts as a USB mass storage device.
It's inspired by the bootloader found on some NXP LPC microcontrollers.


Just plug in your board while holding SW2, it shows up as a tiny external drive, copy your firmware.bin to it and *bam!* your board has new firmware!
You can also download the current firmware from the drive.

It takes up 16kB of flash memory.
Please test it and report any issues!
Usage instructions at github.

Source code and prebuilt binaries: https://github.com/Emeryth/Stellaris-mass-storage-bootloader