Introduction: Ford CD Changer Emulator - Arduino Mega

Picture of Ford CD Changer Emulator - Arduino Mega

Well.. I've Ford Focus, and one day my original radio, Ford 6000, have stopped receiving any FM station. It turned up that the FM proccessor is down. I had another Ford radio - 5000, with a cassettes player.
I've started wondering - ok, there is a sign "changer support", let's check our polish ebay for changer. I've found the emulator of changer, but it was quite expensive, so I thought - there has to be the way, to build it on my own.
And then I've started to googling - I've found the yampp project, customized by Andrew Hammond, with ACP for Ford. But it was build 10 years ago, many of files wasn't available, links were down. But - I had a code and some instructions, and that was enough. I've ported Andrews code to Arduino Mega and made a Ford emulator for my own.

Check the progress:
and working beta version:

Step 1: Let's Get This Party Started!

Picture of Let's Get This Party Started!

Ok, so let's begin.

I've read about communication - radio is using RS485 protocol, so we need a MAX485 for communication. In included datasheet was basic schematic - everything is included on my schematic - I've used an led just as a indicator of communication.

You should use serial port no 1 (not 0) - RX1 and TX1 ports (18 and 19 pins of Mega) - basicly because of blocking ports etc.

Remember - don't include and don't use Serial library of Arduino - it's slowing things down (even for debbuging - it's better to use the lcd for that, but about lcd I'll mention later).

The basic problem was to get things synchronized - Yampp was prepared to use external oscilator with 7.37MHz clock, Arduino have 16MHz oscilator. And as I mentioned before - debugging with Serial library and arduino serial monitor on PC was causing errors while handshakes between radio and arduino.

After I've decided to resigne from using Serial library at all, I've discover (only by mistake) that handshakes are almost ok. It tourned up that even one more or less character on lcd may be a cause of synchro errors. That's why you shouldn't change the code.

My project looks like shield for Arduino - I've made it on universal pcb.

Step 2: Parts & Soft

Picture of Parts & Soft
Parts youre gonna need:
  • Arduino Mega (you can always use another, but remember to read manuals about blocking PORT etc.)
  • 100ohm resistor
  • 5v LED
  • transisotr L78509CV (this is an option)
  • two capacitors (I've used 10uF, but should be .. I don't know, 470uF was good ;) )
  • Ford 12pin multilock (search on the internet)
  • LCD compatibile with hd44780 (mine was jhd162a)
  • MAX485
I've decided to use L78509CV only to get 9V, you can get 12V from radio straight ahead.

Remember - check the code - on schematic pins for LCD may be diffrent, than settings in the code (I've created schematic first, then soldierd universal pcb).

"Why do I need capacitors?", you may ask. Well, you need them between your jack connection and L+ and R+ - I've got nice sound from my iPhone after adding capacitors. I have plans to build or use opamp (OPA! Amp should work fine).

I've used Arduino 1.0.5 software.

You need an TimerOne library:

Step 3: Finito

Picture of Finito

Full code is in the attachment.

Things to do:

  • nice box :)
  • better cable (I've used ethernet cabel, its sucks)
  • AND gate - you can get 8V or 9V from radio (pin CD ENABLE) when radio is on, I don't know how (right now of course) what to use to build AND gate, because 12V from radio is constantly alive, so you have to put on/off switch, or and gate (when 9V is on, put 12V into circuit)
  • use OP AMP ?


AnsonL10 made it! (author)2017-05-08

Great project! I ended up creating a non-Bluetooth version using an Arduino UNO. I haven't found a way to send forward/back signals to the iPhone through the TRRS audio connector though, so that is something to add in the future.

niou_ns (author)AnsonL102017-05-08

Awesome! :-)

AnsonL10 made it! (author)niou_ns2017-09-17

I did some more work on the setup and added the ability to control music playback on the iPhone through the audio cable. As well as made a printed circuit board.

I wrote more about the process here

igor5516 (author)AnsonL102017-09-21

Hello! Very good projects. I also have a problem with the radio tape recorder (Ford Windstar). Also I want to assemble a CD changer emulator (aux). Can sell a shild for uno. You can give it to the sketch.

rickpbush (author)2014-02-16

Hi, firstly let me say how awesome this is, I have made it using a mega and it works like a dream so thank you so much. Thing is I'd like to shrink this onto a pro mini, loose the LCD and pop it into a small project box to live behind my dash for ever more. Could you tell me if it is possible to install this onto a pro mini, I thought I'd port the code but I don't have a clue, obviously when you set the IDE to pro mini and try to compile you get the errors other people are mentioning. Before I try and overcome these errors and re-write the code to circumvent them, could you tell me if it's even possible, else I will waste hours researching :( Thanks again for a great project !!

niou_ns (author)rickpbush2014-02-16

Hey, I'm really happy and glad, that you've build your own emulator :)
I've made a software for you - it's attatched to last step - hope I've choosen right board for you. Switch pin for you is no. 23 on your Arduino Pro. Good luck with that and please llet me know if it's working.

rickpbush (author)niou_ns2014-02-16

Wow, thank you very much :) Sadly, I tried to compile it for the following board:

Arduino Pro or Pro mini(5v 16 Mhz) w/ ATmega 328

and I got the following errors,

FordACP.ino: In function 'void acp_txenable(boolean)':
FordACP:122: error: 'PC0' was not declared in this scope
FordACP:125: error: 'PC0' was not declared in this scope

I'm sorry I can't figure out the errors, I do appretiate what you have done for me, is there any chance you might be able to suggest why we are getting these errors please? I feel like a dope so I'm going to try and figure it out as well :)

niou_ns (author)rickpbush2014-02-16

Ok, my code was fine for mini with ATmega 168.
According to this:
and this:
I've changed the acp_txenable function:

void acp_txenable(boolean enable)


if (enable){

PORTC |= (1<<PCINT8); //set high state on A0


else {

PORTC &= ~(1<<PCINT8); // set low state on A0


asm volatile("nop");


rickpbush (author)niou_ns2014-02-17

Hi, the amended code compiles and uploads to the pro mini ! :) Unfortunately, when I connect the pro mini to the radio via the board I made for the mega with the max485 chip, the radio doesn't talk to it :( I don't know if this is a speed issue but when I substitue the pro mini for the mega it works again using the same little circuit with the max485. I'm using TX1, RX0 and A0 on the mini. This is the board I'm using

Thank you for all your help so far, I really need to read up on ports and bit masks etc, I noticed we are using pin 28 on the mega for switching which is a digital pin, but A0 on the pro mini which is analog, should we not use a digital pin on the pro mini instead of an analog one?

niou_ns (author)rickpbush2014-02-17

Hi, you're right ! I've used analog-in in previous code :) - check this out
So maybe lets try to use another pin, it has to be from other port, than RX and TX - try with portB, so maybe PB0 pin ?
( PORTB |= (1<<PB0); ) ? Don't forget to change "switchPin" in code. Let me know if it's working.

rickpbush (author)niou_ns2014-02-17

Ok, I've rewritten the code as follows :

int switchPin = 8;

void acp_txenable(boolean enable)
if (enable){
PORTB |= (1<<PCINT0); //set high state on D8
else {
PORTB &= ~(1<<PCINT0); // set low state on D8
asm volatile("nop");

I assume from the pin mapping that PB0 is PCINT0, it still is not recognised by the player though :( Is there something else I'm missing?

niou_ns (author)rickpbush2014-02-17

hmmm.. maybe you should start with basic solutions, like:
- check if the max485 is on when board is unplugged from radio
- try to make very simple circuit only with led, which will toggle led on and off on D8, which we try to use as gate for max485... I've never had an Arduino Mini (honestly - this was my first project with Arduino :-) ) so it's hard for me to be your advisor :)

rickpbush (author)niou_ns2014-02-18

Hey, I've found something really interesting, if I power the mega from the usb, this project works but if I try and power it from the jack plug or the vin, it doesn't work. I think this may be why the pro mini didn't work.

niou_ns (author)rickpbush2014-02-18

Did you removed the lcd part from code for mega ?

rickpbush (author)niou_ns2014-02-18

I did, I have a theory, if I power the mega from a usb battery pack used for recharging phones and the radio from a desktop 12v supply, all works well. If I power the mega using a 12v-9v dc-dc power board supplied from the same desktop psu I'm using to power the radio then it stops working. It seems as if I need to isolate the megas power supply from the radios power supply, it would almost seem there is feedback or noise if I use the same supply for the radio and the mega, I will continue to investigate.

niou_ns (author)rickpbush2014-02-18

I'll try to do the same, but I was almost sure, that without a lcd code board was working.. too fast (?) and didn't get it synchronized. But I left lcd for future, I've another plans with this project :) Anyway - which radio you're using ? Because I've got small solution for 5000 (it's working a little bit different than 6000).

rickpbush (author)niou_ns2014-02-18

Ok, I have found that it still works fine after removing both LCD hardware and LCD code, I built the emulator as per your instructions with an LCD to start with then removed it and it still works, I then wanted to reduce it to a pro mini but we know where that went ;) Im using a 6000NE radio, powering the mega from a usb port and the radio from a 12v PSU it works ok, problem is I need to power both radio and mega from the car battery which is where the problemstarts, if they are both powered from the sam source they stop talking. I think I need to decouple it with decoupling caps maybe?

TibiA1 (author)rickpbush2017-01-21

I supose my answer come very late but I solve the problem with the comunication . The problem come when the ground from atmega is connected to ground to radio. I connect true a diode and now it's ok. Thank to author for this project.I made it and work very well.

TibiA1 (author)TibiA12017-07-05

Hi. Sorry , but it sound like this when I translate directly from my language.You have to connect the Arduino ground to radio ground not directly but with diode. Cathode to radio and anode to Arduino..

MichałM37 (author)TibiA12017-07-04

Hi, what does it mean "connect true a diode" ?

rickpbush (author)niou_ns2014-02-18

Ok, well thanks for all your help, I will let you know if I solve it. Thanks again, it's great that you have gone out of your way to help, and thanks again for the project, to notch :)

rickpbush (author)niou_ns2014-02-17

I don't know if it means anything but the led on the max485 is almost constantly lit on the pro mini but flickers to show data on the mega, I'm guessing this has something to do with the enabling of the tx/rx or lack there of?

praktiskais_latvietis (author)2017-02-14

Hi! I made with arduino mega without connected display but it works only when i powering arduino from pc, but when i swich power from radio it stops working. Someone wrote that there is needed diode on GND input line. I put diodes on GND and on VIN input lines but anyway it not working when powering from radio. Alternatively i tryed make on arduino uno with pro mini code. It compiles, but doesnot work. I have one version why not working pro mini,uno ,nano. If we look in pinouts in mega there are assigned to 18(TX1),19(RX1) to interupt pins INT3, INT2, but in pro mini, uno there is no assigned interupt pins on RX, TX, and the interupt cant be rised whan data comes. I can't solve this now, this code is too complicated for me....

praktiskais_latvietis (author)2017-01-23

Hello, niou_ns! Very good job! I have 5000 rds model with cassete. You wrote that you have got small solution for 5000 and its working different. Can you tall more about that?

I found solution where one guy solder wires directly to schema:

And after that upgraded solution with bluetooth feature than uses old bluetooth headphones:

Hey! Actually it was more a workaround than solution - the trick was to quickly turn on, turn off and turn on radio :-) Like 3 fast clicks... on, off, and on - then the emulator was detected by 5000 :-)

Gouster4 (author)2016-08-12

Hi. I have Ford 6000CD and universal car bluetooth usb sd mp3 aux player, it has 12V input, aux output and 4 buttons (MODE, PLAY/PAUSE, NEXT, PREV)

I removed buttons and i want use arduino to control this circuit, and emulate cd changer for radio to get aux working, and grab radio buttons to that circuit.

Arduino should have this pinout:

+12V - Voltage input (or 9v)

GND - Ground

Acp+ (comunication

Acp- with radio)

Toggle - input pin - button Turn changer on/off

Next - output pin - when pressed next track button on radio

Prev - output pin - when pressed previous track button on radio

CD1 - output pin - when pressed CD1 button on radio

CD2 - output pin - when pressed CD2 button on radio

CD3 - output pin - when pressed CD3 button on radio

CD4 - output pin - when pressed CD4 button on radio

CD5 - output pin - when pressed CD5 button on radio

CD6 - output pin - when pressed CD6 button on radio

I want to use this buttons from radio (arduino output) to control that circuit:





+ one Toggle on/off button connected to arduino to control if i will able to listen internal cd reader in radio or emulated cd changer.

I have arduino nano. I think when arduino mega can emulate cd changer arduino nano can it probably too.

Is it possible? if yes, can anyone post here code please? i am using Arduino IDE to flash program to my arduino.


Gouster4 (author)Gouster42016-08-13

Wow, i used code for Pro Mini and it compiled for nano. so what is the pinout for this project on nano? same as on circuit?

niou_ns (author)Gouster42016-08-15

Hey! You have to figure it out on your own - I haven't touched Arduino since I've made that project, so I won't help you with that ... ;)

Gouster4 (author)2016-08-14

Hi. what exactly means #define switchPin X ?
X means number of digital output? (like D1...D13)

or it means number of pin in atmega pinout?

niou_ns (author)Gouster42016-08-15

PHermansson (author)2015-12-31

Exactly what I need. Can you tell me more about the Ford connector, typer, link, etc?

dthomas34 made it! (author)2014-12-06

I made this! Thanks for sharing! Check out my Instructable here:

ManLu (author)2014-02-07

Hey men, the code gives me a lot of errors, by example, undeclared constants. Can you help me, please?

An example of the errors:


sketch_feb07a:74: error: 'UCSR1B' was not declared in this scope

sketch_feb07a:74: error: 'RXB81' was not declared in this scope

sketch_feb07a:75: error: 'UDR1' was not declared in this scope


And much more... u.u

mysta.fixit (author)ManLu2014-08-13

great work...has anybody converted the software to work with the atmel328p (uno)? I'ld be very interested in that...

niou_ns (author)ManLu2014-02-07

are u using arduino mega ? all of these errors might be caused by using arduino uno (for example), because it doesn't have a serial1 (and above).

ManLu (author)2014-02-07

Well, I use an arduino due and arduino duenilanove. The error is the same with both arduinos, and with differents IDE versions (1.0.5 and 1.5.5). I've tried to debug it by myself, but I don't know how to define correctly this ports. Thanks for all!!

ManLu (author)2014-02-01

Hey! and... what if you put a relay between 9V in and GND? It can connect the 12V from the radio to the arduino when 9V is on. (I'm MrManlu, from youtube. Good luck with that!! :D)

niou_ns (author)ManLu2014-02-03

Hey, I've already done it :)

About This Instructable




More by niou_ns:Ford CD Changer Emulator - Arduino Mega
Add instructable to: