Category: AVR


Bluetooth Media Remote

It is finally finished. My Bluetooth Media Remote!

With each module* working as it should, I set out to build it onto my breadboard. Just to make sure that it works together.

*See previous posts for each module and how they work.

The final Micro-controller I decided to use on the final product was a ATMEGA8. In the first post I used an ATMEGA8515. For several reasons I decided not to use this one in the final product. Firstly, it’s a 40 pin package. I do not need that many I/O lines. It draws more power. And finally, I need that one for my studies at uni. So an ATMEGA8 was used.

Here, I noticed a slight problem…
The buttons double press sometimes. Thus sending the data twice. I think this is a limitation of the tactile switches I am using. I’m not quite sure. Later on I might write some code to only allow the data to transmit after a certain amount of time has passed using a timer interrupt on the ATMEGA8. This is for future work though.

From here, I built it on a set of prototype boards. Modular of course. In hind sight this wasn’t a very good idea, because I still hadn’t decided what I was going to enclose it in, but I was excited to build it. And build it I did.

Ahh. Its working on the prototype boards..

Now, the problem that faces every hacker, what to build it in? It’s gotta be classy, something on hand, and easy to put together.

Thanks to a brilliant idea from my mate, Damo, I thought “Why not in one of my broken Xbox controllers?”

After pulling it apart and trying to jiggle the circuits into it, I decided it just wasn’t feasible.

Back to square one.

Then, like a ray of sunshine, I remember I had a broken N64 controller as well. Thus the decision was made. It’s classy, it’s on hand. Easy of assembly went out the window when I realised how awesome it would be to use nostalgia to control my music.

After rebuilding the circuits onto new prototype boards (about the 5th time I had built the same circuit), I attacked the controller with a jigsaw blade and the file on my pocket knife. Not the best tools, but what I had on hand.
And so the N64 Media Remote was born…

And a video just to prove it works…

For those interested. The source code for the remote. The polling of the buttons is not quite neat, but it works.

I might implement an external interrupt to activate the polling, but at the moment, it’s not needed. Even the interrupt polling double transmits.

And thus the project is complete. Any questions, don’t hesitate to ask!

Later on I might get a full circuit diagram. If someone requests it I’ll make it a priority, but until then it’s on the back burner. Uni work has suffered enough…

Onto my next project! A set of analogue panel meters to monitor my CPU and RAM usage with data logged to an SD card. Stay tuned!

EDIT: Debounced the buttons. Thanks for the idea Matthew Wiebe and BohemianHacks! Here’s the updated source code

Well. Here is quite an important part, yes? What’s the point of having a remote that is powered by a wall socket? Not much, really. And, unless you haven’t noticed, there are no 5V batteries available, not on the cheap at any rate. Which really is quite annoying. So. Let’s use a voltage regulator. The following circuit is a 9V to 5V regulator using a 7805 regulator transistor.

This gives us a nice, regulated, smooth output. Very handy. And a pretty LED to boot!

This power supply can be used for any application needing 5V, so as a result, I will be using this circuit pretty much all the time, apart from prototyping on my dev boards.

Next up, the server code I re wrote in Python.

This module is rather simple. Just a simple method of connecting a bank of buttons to an AVR and checking the results using polling. You have already seen the code for polling, that was in module #1.

The theory is rather simple. We drive the input lines at 5V when off and send it to zero when on. This is known as ACTIVE LOW, because the line will be active, when the voltage is low.

The diagram is as follows.

Simple no?

When the button is not pressed, the 5V is fed into the AVR. But when the button is pressed, we are driving the line down to ground. Hence sending the AVR line to 0V.

Next module. The power supply.

Wireless Remote Module #2: LCD Display

Ahh, it’s been too long since I’ve updated this. As you can guess from the title, module #2 for my wireless media remote is complete. Well, module #3 is ready too, but I’ll put that in another post later on. (Don’t tell anyone, but so is module #4. I’m actually up to building it on prototype boards as opposed to my bread board)

A few weeks ago, I went down to Jaycar and picked up a few things. One of them being a 16×2 LCD character display. Key code QP-5512.
As it turns out, this particular LCD character display from Jaycar, has no datasheet. Which is quite in convenient for anyone, especially someone just learning about micro-controllers. After many hours of research, I found this: Oz electronic forums where several board members figured out its wiring and instruction sets. For the PICAXE.
Now this is wonderful…Except its code is in PICAXE Assembly syntax.

First things first, let’s wire up the circuit. I opted for 460 ohm current limiting resistors because that’s just what I had with me.

D0 -> D3 are the data lines. Because i opted to use the LCD in 4 bit mode, we only need 4 of the data lines for data transmission. EN is the enable line and RS is register select. The 10k trim pot on line 3 is contrast adjustment.

Onto the code. Once again, I would like to point out that this isn’t exactly all my code. The structure and implementation of it in C is, but the enabling and writing to the LCD logic is thanks to SABorn at ozeleforum (See above link).

LCDSource

Compile it, upload it and run it. Works a charm eh?

Note it is displaying the current playing song from my PC. See the serial connection? I’m tying them slowly together… More on this in later posts though.

I have actually found that on the enable pulses, you can decrease the delay to 35 us. This may cause some slight unstable reactions, but I have never had a problem with it. Just don’t go any faster.

Now, I liked this so much, I decided to put my screen on a prototype board.

So that’s pretty much it for now. Chew on that while I get bothered to write up more on the next few modules.

EDIT:
Here is the instruction set for the LCD screen:
DisplayOff = 8
DisplayOn = 12
Home = 2
Clear = 1
Start of line 1 = 128
End of line 1 = 145
Start of line 2 = 192
End of line 2 = 209
Master reset = 0
Scroll screen left to right = 5
Scroll screen right ot left = 7
Screen off = 4
Display top line only = 32
Display both lines = 44
Cursor on = 14
Cursor off = 12
Cursor Blink = 15

Thanks to SABorn @ Oz Electronic Forum.