Hacking the Whistler Pro-3600 Radar Detector
I recently acquired an early release CANBus-Triple Developer Unit - designed by etx on MazdaSpeedForums. The device is basically an Arduino Leonardo with 3 CAN bus interfaces, designed to be able to override text on the OEM display, and be controlled through the OEM steering wheel buttons. Although the stock firmware is written to work with the Gen2 MazdaSpeed3, there is no reason it could not be adapted to work with any vehicle with displays controlled by the vehicle's CAN bus.
I have long sought after the ultimate 'stealth' radar detector integration. Many remote mount units are available on the market - they include a radar/laser antenna that you mount in your car's front grille area, and a small display and control unit that needs to be mounted somewhere accessible by the driver. But I've always imagined complete integration with the vehicle, stock display, stock controls... With this device in hand, my dream to ditch the control unit, and utilize my car's display and buttons finally came within reach...
I chose the Whistler Pro-3600 since it was a remote mount system that had decent performance, but had an excellent price point. Many other remote mount units on the market cost multiple times the price of this unit.
How To Get It Working
The Whistler unit operates on 3.3V logic, but the CANBus-Triple runs 5V logic. I didn't research if the parts in the Pro-3600 are 5V tolerant, so to prevent damage to the radar detector, you should convert the output voltage of the CBT down to about 3.3V. The Whistler unit also expects specific pull-down resistance on both lines. I do not know how close to these values you have to get - but this will definitely work with 5% tolerance parts.
CBT TX to Whistler RX : Basic voltage divider (to ground) using 2.2K and 1K resistors
CBT RX to Whistler TX : 3.3V is enough to drive the logic on the CBT, but you'll need a 10K pull-down resistor to ground
You may have luck with other voltage conversion designs, such as Sparkfun's Logic Level Converter. Just keep in mind you may need to be comfortable with SMD rework, since the Whistler unit seems to be a bit touchy with the pull down resistor values. For example, making your voltage divider out of 10K resistors I know will not work (from personal experience!)
Here's a picture of how I set this up in my unit. I've noticed some problems with D8 and D9 on my unit so I utilized D6 for TX and D10 for RX. Also note that I've replaced the connector supplied with the CBT with some ribbon cable - I found the connector it came with to be too sensitive for the amount of times I pulled this from my car into my lab.
Use an old phone cable or crimp on an RJ11 plug to a decent length cord. Don't connect the +12V or ground - this is designed to supply power to the display unit, but the CBT is already powered, and will share a ground through the car. IF YOU USE A PHONE CABLE - THE COLORS WILL PROBABLY BE DIFFERENT THAN SHOWN BELOW. CHECK YOUR WIRE.
Currently, the code is not included in the CANBus-Triple stock firmware trunk. You'll need to pull the code from my GitHub fork.
Be sure to edit
WhistlerPro3600.h to supply the digital pins you connect to the radar detector on the two
It is possible that in the future, the code will be included in the stock trunk, and you may just need to add a few lines to
loop(). I'll update this section if that happens. Since the CBT is so new, there haven't really been many add-ons written for it yet, so I'm unsure how this is going to be handled by the creator.
Technical Details (or Hacking the Whistler Pro-3600)
Here's a shot of the stock display (missing faceplate)
The display communicates to the central interface box using a basic serial connection, 9600 baud - 8N2 or 8M1 (both are equivalent.) The protocol for receiving messages to display, as well as transmitting button pushes was reverse engineered using a QuantAsylum QA100. I really recommend this oscilloscope/logic analyzer for this type of work - this isn't the first type of similar project where it has come in really handy. My only gripe about the QA100 is that the software leaves a little bit to be desired, I find it a little counter-intuitive. And the Intronix LogicPort looks like it has some amazing trigger features - I would love to get my hands on one soon.
Text for display arrives as 8 characters, within a 14 byte message, as shown below. To display 'ABCDEFGH':
The tail end bytes occasionally change but in order to figure out what you're supposed to display you really only have to look at the 8 bytes sandwiched in there. Here's a capture showing live data being sent to the display:
The display has a somewhat unique character map for a few 'special characters.' These are the ones I've discovered so far:
|Hex||Whistler Char||Result Char|
As for button pushes, the display unit sends a 5 byte status message to the interface box every 32 milliseconds. Through experimentation, I've verified that it is not important to send the current status every 32ms, as long as you send button down and button up events. It appears from my experiments so far that occasionally, the interface box misses one of the messages, so my code currently sends each event twice to ensure it is received. This could also be a timing bug with my code - so a little more investigation is warranted.
The way the protocol is designed, different bits are set low for different buttons. It is possible to support multiple simultaneous button presses, this is needed for some of the configuration options. I'll look into supporting it in a future build.
Idle (no buttons pushed):
The CBT already has the hardware serial port wired up for future use on two of the CAN bus interrupt lines. I've implemented the serial port through software (causes some timing bugs) but this seems to be pretty stable. Arduino's included SoftwareSerial library does not support 2 stop bits, so I modified it as "9 bit serial" for now (I mistakenly transcribed some of the messages wrong and thought the ninth bit was in use.) A cleanup of this code is in order sometime - possibly so that SoftwareSerial can support different parity and stop bit options.
With this information in hand, a little proof of concept was in order. Utilizing an Arduino UNO and prototyping shield I had kicking around - I made some proof of concept code to write the output to the USB Serial port - and accept some commands over the serial port to trigger button pushes.
If you want to work with the Whistler Pro-3600 on something other than the CBT, you can grab this proof of concept code here. You may want to check out my latest code for the CBT anyways in case I've worked out any bugs or timing issues.