Arduino, Hardware, Motorcycle

Harley Neopixel Brake Lights

I chopped the rear fender of my brand new(almost) 2014 Harley Superlow 883 and purchased a new LED tail light to mount under the fender as the replacement. I also wanted some additional braking lights at the rear for my own peace of mind and decided to turn the rear turn signals into more than just turn signals; by adding some LEDs to use as brake lights ‘inside’ the turn signal housing. I designed a little circuit board that I will install under the seat to engage the rear LED’s when I brake.

Adafruit’s little Neopixel RGB LED rings fit perfectly into the existing turn signals (on my Harley). All that’s needed is 3 wires for power, signal, and ground to be soldered to the rings. You’ll need to drill 3 small strategically placed holes in the plastic reflector housing of the turn signals and route the wires to the circuit board; in my case, under the seat. Solder them all to the board to their respective solder pads and like magic, it just works!

When the brakes are activated, the 12v brake signal will power the ATTiny85 chip and activate the rear LED lights. There’s a 2-second racing animation and then they stay on solid as long as the brakes are applied…just like the normal brake light does. And….because these LED rings fit wonderfully well, I don’t have to modify the existing turn signal bulbs or function at all! They will still function just as intended.

Yes, yes, I could go and purchase new LED turn signals made by someone else, but what fun would that be? Here’s a picture of the LED rings mounted to the turn signal reflector with the 3 wires out the back. There’s also a rubber boot that slides onto the back side so you’ll need to run these wires through that as well. Besides the holes, no other modifications are necessary.

Be careful when soldering, just like Adafruit warns, the tolerances are TIGHT! I echo their recommendation for soldering from the back-side. Also, that plastic reflector housing, yep, that silver coating is CONDUCTIVE!! It’ll short out your rings if you’re not careful…lesson learned. I coated the back sides of my rings in waterproof mastic. Once you’re through that though, the hardest part was routing the wiring through the bike frame keeping it hidden and such. I used a socket instead of soldering the ATTiny85 directly to the board, that way, I or you, can modify the code running on the chip to accommodate state/country laws in your area if they don’t allow animations like I’m using. The large green annular rings are for zip-tying the cables to the board for strain-relief.

The board design is shared on OSHpark.com. Order one for yourself if you’d like.

YouTube link

Schematic

neobrakelight_schematic

Board


neobrakelight_board

Arduino Code

//——————————————————–
// HarleyBrakeLights v1
//
// Harley Run/Turn/Brake Signal Lights
//
// Author Darren Mathews
// Date May 4, 2015
//
// Copyright © Darren Mathews 2015
//
//——————————————————–

#include <Adafruit_NeoPixel.h>
#include <avr/power.h>

#define PINLEFT 3
#define PINRIGHT 4
#define NUMPIXELS 16

Adafruit_NeoPixel stripL = Adafruit_NeoPixel(NUMPIXELS, PINLEFT, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel stripR = Adafruit_NeoPixel(NUMPIXELS, PINRIGHT, NEO_GRB + NEO_KHZ800);

void setup() {
stripL.begin(); stripR.begin();
stripL.show(); stripR.show(); // Initialize all pixels to ‘off’
theaterChase(stripL.Color(127,0,0),40); // Red alternating pixels
theaterChase(stripR.Color(127,0,0),40); // Red alternating pixels
}

void loop() {
for (int i=0; i < NUMPIXELS; i++) {
stripL.setPixelColor(i, stripL.Color(222,0,0)); //adjusts brightness higher is brighter
stripR.setPixelColor(i, stripR.Color(222,0,0)); //adjusts brightness higher is brighter
}
stripL.show(); stripR.show();
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
for (int j=0; j<5; j++) { //do 5 cycles of chasing
for (int q=0; q<3; q++) {
for (int i=0; i < NUMPIXELS; i=i+3) {
stripL.setPixelColor(i+q, c); //every third pixel on – counter-clockwise
stripR.setPixelColor(i-q, c); //every third pixel on – clockwise
}
stripL.show(); stripR.show();
delay(wait);
for (int i=0; i < NUMPIXELS; i=i+3) {
stripL.setPixelColor(i+q, 0); //every third pixel off – counter-clockwise
stripR.setPixelColor(i-q, 0); //every third pixel off – clockwise
}}}}

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s