DIY aux input on Alpine car stereo (M-BUS)

If anything in this article is unclear or confusing, please let me know in the comments and I’ll do my best to clarify.

Disclaimer: by following the instructions below, you may end up destroying your stereo, car, MP3 player, interpersonal relationships, and everything else you hold dear. I am not responsible for any of this. That being said, it worked fine for me.

This method will work on any Alpine stereos with an 8-pin M-BUS connector in the back. (The stereo I performed this on was an Alpine CDM-9821.) The connector itself should look something like this:
2dj-0108psa2

After some searching around, I located the functions of each pin on this connector at pinouts.ru. The pins on interest are the bottom three:
2dj-0108psa2asdfasdf

This corresponds perfectly with the contacts on a 3.5mm headphone plug:
ak203mm

So all that’s left to do is make an adapter between the two. I ordered these parts from Digi-Key: CP-1080-ND, AE9918-ND, and CP1-3513-ND.

Gather up some solder, a soldering iron, and wire. Make the following connections:

  1. “Audio Ground” pin from the M-BUS connector goes to the pin closest to the hole on the 3.5mm audio jack
  2. “Right Audio Input” goes to the pin farthest from the hole
  3. “Left Audio Input” goes to the only remaining pin.

You should end up with an adapter cable like this:
sj1-3513

Plug the M-BUS connector into the back of your stereo and mount the audio jack somewhere on the dash.

Now turn on your car. If all went well, nothing will start on fire. Hold the “Setup” button on the stereo and enable aux input in the menu. Now hit the “Source” button until you get to AUX. At this point, you should be able to plug in an MP3 player and have the audio routed to your car’s speakers.

Posted in Electronics | 5 Comments

SparkFun’s FTDI Basic Breakout as an AVR programmer

This guide has been merged into my AVRDUDE 5.10 bitbang guide. Original post follows (left here for reference).
Continue reading

Posted in Electronics, Programming | 4 Comments

AVRDUDE 5.8 with FTDI bitbang patch on Linux

I updated this walkthrough for AVRDUDE 5.10. Original guide for AVRDUDE 5.8 follows.
Continue reading

Posted in Electronics, Programming | 14 Comments

Accessing AVR GPIOs via bit fields

atmega328

I noticed that the TMS320F2809 examples accessed GPIOs by bits rather than as 32-bit ints. For example, it’s possible to set a GPIO like this on the TMS320F280x:

GpioDataRegs.GPADAT.bit.GPIO12 = 1; // Sets GPIO12 to high.

Normally when working with AVRs, I would set bits like this:

PORTB |= (1<<PB3); // Sets port b, bit 3 to high.

After a bit of tinkering, I came up with this (for AVRs):

portb.bit.b3 = HIGH; // Sets port b, bit 3 to high.

I personally think it looks a bit cleaner, so I’ll probably be using it in the future. If you’re interested in trying it out, you can download a full example here: bitfields.zip.



Side note: It is also possible to access GPIOs as 32-bit ints on the TMS320F280x like this:

GpioDataRegs.GPADAT.all |= (1<<12); // Sets GPIO12 to high.


Edit: Looks like I’m not alone.

Posted in Electronics, Programming | Leave a comment

Arduino 0017 on 64-bit Ubuntu 9.04 and 9.10

Edit: This post isn’t really relevant anymore—Arduino 0018 has a 64 bit binary. Original post follows.
Continue reading

Posted in Electronics, Linux | 1 Comment

Computers are toys, not tools.

Posted in Silly Ideas | 1 Comment

RK4 in Haskell

Ran across this today. It’s a well written implementation of RK4.
4th order Runge-Kutta (RK4) integration in Haskell

Posted in Mathematics, Programming | Leave a comment

Line Segment to Circle Collision/Intersection Detection

Style and Notation

  • All variables are represented in italics except in the diagrams and Python code.
  • Vectors are shown in bold except in the diagrams and Python code.
  • The notation |a| is used to represent the length of a vector named a.

Introduction to the problem

Start by defining a few points (vectors from the world origin):
2

Now, from these points, you can easily calculate two useful values, the segment vector, seg_v (from seg_a to seg_b) and the position of circ_pos relative to seg_a, pt_v.

31

seg_v = seg_bseg_a

pt_v = circ_posseg_a

Closest point to the circle’s center on the segment

The next step is to find the closest point to the circle’s center on the segment (labeled “closest” on the diagram). To do this, we must project pt_v onto seg_v:

4

To project on vector onto another, take the dot product of the vector and the unit vector of the projection target. That is:

|proj\_v| = \textbf{pt\_v} \cdot \frac{\textbf{seg\_v}}{|seg\_v|}

Note that this dot product returns a scalar value (the length of proj_v), not a vector.

We now need to take a small break from the main goal and look into a special case: the ends of the segment. If |proj_v| is less than 0 or greater than |seg_v|, the closest point to circ_pos on the segment will be one of the segment’s endpoints. That is:
if |proj_v| < 0: closest = seg_a
if |proj_v| > |seg_v|: closest = seg_b

Next, calculate the actual proj_v vector, rather than just its length (|proj_v|). To do this, simply multiply by the seg_v unit vector:

\textbf{proj\_v} = |proj\_v| \frac{\textbf{seg\_v}}{|seg\_v|}

The only thing left to do is to convert this into world coordinates (rather than coordinates relative to seg_a) to get the closest point:

closest = seg_a + proj_v

Checking for a intersection

Now that we’ve calculated the closest point on the segment (the variable “closest“), we can check if the circle and segment intersect. To do this, first find the vector from closest to circ_pos:

dist_v = circ_posclosest

If the length of this vector is less than the circle’s radius, the circle and segment are intersecting:
if |dist_v| < circ_rad: They are intersecting
else: They are not intersecting

Collision response

A useful bit of data in collision response is the amount of overlap between two shapes and the direction a shape must be moved in order to resolve the collision. This can be represented as a vector that points in the same direction as dist_v whose length is equal to the difference between circ_rad and |dist_v|.

\textbf{offset} = (circ\_rad - |dist\_v|) \frac{\textbf{dist\_v}}{|dist\_v|}

Python implementation

Here is a Python implementation of everything in this post. For the sake of clarity, I avoided optimizations. vec is assumed to be a fully implemented 2d vector class.

def closest_point_on_seg(seg_a, seg_b, circ_pos):
	seg_v = seg_b - seg_a
	pt_v = circ_pos - seg_a
	if seg_v.len() <= 0:
		raise ValueError, "Invalid segment length"
	seg_v_unit = seg_v / seg_v.len()
	proj = pt_v.dot(seg_v_unit)
	if proj <= 0:
		return seg_a.copy()
	if proj >= seg_v.len():
		return seg_b.copy()
	proj_v = seg_v_unit * proj
	closest = proj_v + seg_a
	return closest
 
def segment_circle(seg_a, seg_b, circ_pos, circ_rad):
	closest = closest_point_on_seg(seg_a, seg_b, circ_pos)
	dist_v = circ_pos - closest
	if dist_v.len() > circ_rad:
		return vec(0, 0)
	if dist_v.len() <= 0:
		raise ValueError, "Circle's center is exactly on segment"
	offset = dist_v / dist_v.len() * (circ_rad - dist_v.len())
	return offset

Similar algorithms

Collisions involving stadiums (a type of rounded rectangle) can be calculated in a similar manner. A stadium is essentially a line segment with a radius.

A stadium-point collision is the same as a segment-circle collision with a circle whose radius is equal to the stadium’s radius.

A stadium-circle collision is the same as a segment-circle collision with a circle whose radius is equal to the sum of the original circle’s radius and the stadium’s radius.

Download

segment_circle.zip – An implementation in Python and Cython.

Conclusion

If you find this post useful or have any questions, please leave a comment.

Posted in Computational Geometry, Mathematics, Physics, Programming | 6 Comments

JavaScript Image Animation

I made a small script to produce an animation with a series of images and JavaScript. I only tested it in Firefox 3, but I don’t see any reason why it wouldn’t work in other browsers.

Try it: http://doswa.com/projects/animate/
Download it: http://doswa.com/projects/animate/animate.zip

http://trac.sagemath.org/sage_trac/ticket/1483 inspired me to make this, since the sagenb.org server doesn’t have ImageMagick installed.

Posted in Programming | Leave a comment

PHPNotify: Debug Notifications From PHP

This is a little program to help debug AJAX (or anything else) from PHP.

PHP Debug Notification

Read the README file to instructions on setting it up on Ubuntu. Note that you must first install python-notify through apt-get for this to work correctly.

Download PHPNotify

If the function name notify() conflicts with any of your functions, you can change it on lines 2 and 3 of prepend.php

Posted in Programming | Leave a comment