Group riding would be much safer if bikes had brake lights. The lack of brake lighting on bicycles has lead to the audio cues of "SLOWING" or "STOPPING" being shouted at every turn. While this may enhance safety, it certainly cuts into the serenity of a ride.
This project offers a viable solution that can increase both safety and serenity on a group ride. With embedded programming made easy by the Arduino integrated development environment, electronics getting smaller, more capable, and cheaper, this project is possible for the do-it-yourselfer.
BEBL Challenge! Be the first, and get your hardware cost reimbursed. I will award a $35 reimbursement, by mail or PayPal, to the first person to post a video online that demonstrates a functioning and mounted Bar End Brake Light made from these plans. Looking forward to seeing your project.
Other than the obvious criterion -- light up when braking, I wanted this light to look cool, cool enough to mount on any expensive racing bike. This rules out any visible wiring. I also wanted the light to be portable, meaning it will work on more than one bike. Thus no brake-lever specific triggering should be used.
The final design is centered around a 3-axis accelerometer board provided by Pololu.com. This product is simple to use with an Arduino, small enough to fit inside the handle bars, and best of all cheap at $15. Also, this accel has an on-board voltage regulator that we will take advantage of to power the whole circuit.
The processing takes place in an ATmega328 programmed with Arduino. These chips can be also be programmed directly in C, but Arduino takes care of a lot of setup and generally makes programming less tedious. Arduino has everything this project needs. The ATmega168 would probably suffice for this project but the ATmeta328 at $1 more, provides 2X the program space.
Mounting the computer inside the handlebars provides an enclosure for the project.
Step 1: Schematic, layout, and bill of materials
Let me know if you are interested in a printed board. We can combine orders and save!
Accel -- 3-axis accel breakout $15
6V battery -- Lithium 28L $5 each
S2 -- Surface mount right angle switch $1
IC1 -- AVR ATMega328 w/ arduino bootloader $5.50 (Consider getting this from ladyada.com, for her supped up bootloader)
LED1 -- Super bright LED red $1 each x 2
Osc1 -- 16 MHz oscillator $1
28-pin DIP socket $1.50
C1, C2 -- .1 uF ceramic cap
R1, R2 -- 220 Ohm resistor
Project board $2
Bar tape and plugs.
Total cost around $35, battery included. I'm not including the cost of the bar tape, since you need to have that anyway.
Step 2: Prepare board
The outside pins on the oscillator (Osc1) will be aligned with pins 9 and 11 on the socket but need to connect to pins 9 and 10 on the socket however. To prevent the unwanted connection, cut a slice out of the copper to isolate pin10 from the other holes (shown in white on the diagram). With a multimeter, verify that the connection is severed.
Step 3: Solder master board
Solder the pieces in place:
–28-pin DIP socket.
Remove socket PIN11 from the socket. We will not be using this pin and it gets in the way.
PIN1 of the socket should be in the 2nd row of the PCB on the left (2-hole) side. This saves the first row for the LED, (yes, I learned this the hard way). Solder only the corner pins of the socket at this time. The remainder will be soldered later.
–The oscillator is a large piece that just barely fits in my bar. For a better fit, the leads on Osc1 are notched so that they rest on the board. Trim those notches off, so that the base of the oscillator slides all the way down to the board. Place Osc1 next to pins 9, 10, and 11 on the socket (Either direction is fine). Solder PIN1 of Osc1 to connect it to PIN9 of the socket. Solder a jumper, sharing the hole with the middle PIN2 of Osc1 to the ground rail. Finally, arch the uncut lead of PIN3 of Osc1 and PIN10 of the socket together and solder them both in place.
–Solder the remaining pins of the socket.
–C1 to socket pins 7 and 8 (Either direction is fine).
Before trimming the leads, bend the lead of C1 connected to pin 7 across to the VCC rail and trim to length. Solder in place. Add a piece of insulation to the other pin of C1 connected to socket PIN8 long enough to reach the ground rail. Trim to length and solder in place.
–C2 to socket pins 20 and 22 (Either direction is fine) in the outer most holes of the PCB. This will allow room for the accel jumpers later. Before trimming the leads of C2, bend the lead connected to socket PIN22 over to ground, trim to length and solder in place. Bend the other lead of C2 connected to socket PIN20 over to PIN21, trim to length and solder in place.
–Solder jumper from socket PIN20 over GND rail to VCC rail.
-- Solder Accelerometer
The voltage regulator on the accel saves us from having to add a separate power supply circuit. The Accel VIN pin is powered directly from the battery. Then the regulated 3.3V on the Accel powers the VCC rail on the board.
Test all junctions for connectivity and shorts. If the board checks out this far, you're ready for the accelerometer. If not, start over with a new board and parts. Mistakes get expensive at this point. Short GS2 on accelerometer by adding a jumper between the two holes labeled GS2. This provides medium sensitivity of plus or minus 4 Gs. Unfortunately, there is not enough room in the handlebar to use the provided jumper.
Solder Accel pins next to the socket. On the top side of the board, connect Accel analog output to the A2D pins. Leave no excess wire here. These wires should nestle tightly between the socket and C2.
–Jumper Accel z to pin 28
–Jumper Accel y to pin 27
–Jumper Accel x to pin 26
On the bottom side of the board, solder Accel 3.3 to the VCC rail. Solder a
jumper Accel GND to the GND rail,
Solder one end of a flexible 6-inch lead Accel VIN. This will eventually connect to the bar end switch S2. We will trim to length and attach the other end later.
Solder one end of a flexible 2-inch wire to the ground rail. This will connect the negative battery terminal to ground.
Step 4: Solder slave board
-- the four pins of the right angle header onto slave board.
-- a jumper wire to pin2 of the right angle header. Leave the other end of the jumper free for now.
-- resistor R2 to pin3 of the right angle header. Make sure the other end of the resistor can reach the LED lead. Leave that end of the resistor free for now.
Step 5: Prepare master bar end
Orient the bar end to the desired angle. In my case I wanted the "B" to be upright. With a hobby knife cut away the top portion where the board will sit, up to the second rib of the bar end as shown in the diagram below. This will provide a platform for the PCB.
Drill a 13/64-inch hole for the LED D1 through the center of the bar end. This size allows the back ring of the LED to seat nicely against the inside of the bar end.
Delicately remove the rubber behind the face of the bar end with a hobby knife for the switch to fit snugly. The back surface of the face will provide a surface to glue the switch to and leave a nice finished look.
Bend the leads of the surface mount switch flat. (You may not need to do this, depending on your switch.)
Install the switch. Hot glue or epoxy the switch in place with leads pointing toward the PCB, leaving the switch accessible from the bottom. Use the glue sparingly to avoid gumming up the switch mechanism.
Drill two tiny holes through ribs to provide wire access to the leads of the switch. Well-placed holes will make soldering easier. Align the holes with the middle lead and an outside lead. The holes should be next to the shaft of the bar end so they don’t inhibit installation on the bike later. If you don’t have a tiny drill bit, a wedge cut with a hobby knife will serve the same function.
Trim jumper from socket pin4 so that it just reaches the switch through the recently drilled hole. Delicately solder in place.
In the other hole, insert a 6-inch jumper and solder to the switch.
Step 6: Install LED D1
Connect one end of a different colored 50-inch wire to the ground rail. We will trim to length and attach it later.
Insert the LED into the bar end, making sure the LED is pushed against the back side of the plug. The LED should poke out of the bar end. Test fit the bar end to the board and note how much the anode (long LED lead) overlaps with the lead from R1.
Remove the bar end and solder anode to R2 so that the LED reached the end of the bar end. Redo if necessary to get a good fit.
Solder the cathode (short lead) of the LED to the ground rail making sure to preserve the LED placement.
The PCB is held in place with a wire around the bottom half of the last rib. Drill two small holes in the PCB just past the first rib of the bar end on either side of the shaft. Wire the PCB in place, twist and snip excess.
Hot glue four long wires through PCB.
Step 7: Prepare slave bar end
Drill 13/64-inch hole for LED.
Step 8: Install LED D2 on slave
As with D1, insert D2 into the bar end plug until it stops. Fit the PCB into the slit and bend the LED leads so that they reach the holes adjacent to the free lead of R2 and jumper wires. Solder in place.
Fasten slave PCB to bar end plug with thin gauge wire, as the master was done.
Step 9: Battery holder
Pass the ground rail jumper with one free end through the PCB and trim excess wire. Solder one of the newly created battery connectors to the end.
Pass free end of the jumper connected to the middle terminal on the switch through the PCB. Trim and solder to other battery connector.
Secure battery to coiled leads with a zip tie pulled tight over the battery. With the fat part of a cheap soldering iron, melt the zip tie just a bit to make corners to hold the battery in place.
Tape battery wires to zip tie.
Step 10: Master/slave connector
Solder two anchor wires to the outside pins of the 4-pin female header.
Place several half-inch heat shrink segments over the two long wires. On the end, slide a heat shrink segment onto each of the long wires individually.
Solder long wires to the two middle pins of the 4-pin female header.
Solder two short wire segments to the outside pins of the 4-pin female header.
To relieve stress on the LED wires, heat shrink the middle wires to the outside anchor wires using the pre-placed segments on the ends of the long wires.
Heat shrink the long wires together evenly spaced all the way back with the remaining segments.
Step 11: Program with arduino IDE
The code can be found here: BEBL2.pde. Copy and paste into a new project on Arduino. If you take a look at the code, you will find that it is more complex than you might expect due to the digital filtering, without which the brake light would be going on and off constantly. You will also see some calibration routines I used to figure out the accelerometer readings. One funny thing about the breakout board, is that a different analog RC filter is on each axis. So each axis behaves a little differently. I put default values in the the code that work well with all three of the accelerometers I've gotten from pololu, but you can overwrite them using your own values or by the calibration routines.
Program the chip using a standard Diecmila or your favorite board with removable MEGA IC.
Remove the MEGA from the programming board and insert into the 28-pin socket with pin1 toward the bar end plug.
Congratulations if you should see a blinking light!
If not try flipping the battery over. Still not? Flip switch the other way.
If it still does not work go on to the next step: Debugging.
Step 12: Debugging
Here is a series of debugging steps to consider:
1. Start at the battery. My fresh battery reads 5.5 Volts. Replace the battery if necessary.
2. Ensure the switch is turned on and check Accel power in. Accel pins VIN and GND should have the same voltage as the battery. If so go to 3.
2.a Check that the positive battery terminal has connectivity to VIN. If so, goto 2.b.
2.a.1 If it is not, remove the battery and check connectivity from the battery positive terminal to the middle switch pin.
2.a.2 Check that the other switch pin has connectivity to positive battery terminal when the switch is on.
2.b Check that the negative battery terminal has connectivity to Accel GND. If so, replace the battery and start over -- you've got power to the Accel.
2.b.1 Check battery - to ground rail.
2.b.2 Ground rail to Accel GND. If so, replace battery and start over. You should have power to the Accel.
3. Check Accel power out. A volt meter on Accel GND and +3.3V should read about 3.3 volts.
-- Yikes, bad Accel voltage regulator. Replace.
4. Check that the voltage potential between ground rail and VCC rail is 3.3V. If not, check the connection between Accel 3.3V to VCC rail.
5. Check power on MEGA chip pins 7 and 8. They should have a 3.3V potential. Check jumpers to central rails.
6. Check that the LED is in the soldered with the correct polarity.
Set the multimeter to read resistance. Connect red probe to the cathode of the LED, black probe to the anode (see diagram). You should read about 1000 Ohms resistance. If not, flip it the other way.
7. Reprogram the chip with this line near the bottom of the file un-commented:
"// digitalWrite(DBG_LED_PIN, ((count % 1200) < 600));"
This sets the Arduino pin4 (physical pin6) on an off in one second intervals. Put a volt meter between pin6 of the socket and ground. Voltage should vary in one-second intervals. If it does not, you have a bad LED -- swap it out.
8. If the LED blinks but brake light never comes on, check Accel pins x and z. for voltage between 0.5 and 2.5 volts. If not replace Accel.
9. If master works but not slave, recheck connections.
10. If all else fails, recheck every connection in schematic. Then ask me. I'll respond to your questions.
Step 13: Installing on the bike
If you don't have magnets, I've heard a compressor can be used to blow the string through the bar.
Better yet, jomaro suggests using a vacuum cleaner to suck the string through:
I once succeeded to pass a cord through 15 meters of plastic pipe like this. In case of long pipes it is better to do any type of not at the front end (or tie any light plastic part) to increase air resistance."
Post any other method you've found to work here.
Step 14: Improvement Ideas
Auto shutoff. The schematic below show how the voltage regulator circuit could be modified to allow digital shutoff (for instance when the vibrations cease for a specified duration).
Use right angle header on GS1 and GS2. This should still fit in bar and allow easy modification of Accel sensitivity.
Or better yet, connect GS1, GS2 to digital pins for digital gain control
I'll add this to the next version for sure. No need for this project, but the design should be as flexible as possible.
Put long cord on slave board so that master can be installed easily on different bike
This is an obvious choice. It'll be in the next version.
Use an independent pin to control slave LED.
There are plenty of pins on the MEGA, why double up on pin4 and loose independent control of the other LED? I've played around with this, the extra logic slows down the tracking loop.
Next up ... a printed circuit board would make this a really fun and easy project. Let me know if your interested. I'd like to print up a few boards.