With the interrupts at least demonstrated (https://astrospanner.wordpress.com/2014/02/02/bike-spoke-images-timer-interrupt-woes/), hall effect switching demonstrated (https://astrospanner.wordpress.com/2014/01/24/magnetic-switching-pov/) and LED control demonstrated (https://astrospanner.wordpress.com/2014/01/27/bike-spoke-images-pic-leds/), two things are true:
- all the hardware has been demonstrated to work
- conceptually, the “hard” bits of the software have been demonstrated to work.
So there are two more steps; a final software build and a final hardware build.
Feel free to listen to this (http://www.youtube.com/watch?v=9jK-NcRmVcw) whilst reading this post.
Final Software Build
The software is structured into three sections: a timer interrupt routine, a hall effect interrupt routine and a main() routine. It’s generally a good idea for interrupt routines to be quick to execute, so that further interrupts are not missed. As such, the display driving has been moved to the main() routine. The three routines communicate via a set of global variables. The global variables are:
|Change Display Flag||Set||Set||Read & Reset|
Flowcharts for the three sections are
hall effect switch
And in words, the idea is whenever the magnet passes the Hall Effect switch, the following things happen:
- the number of timer ticks since that last happened, divided by the number of radial lines to display is stored (in “DisplayCounterSet”)
- DisplayCounter is reset (to DsiplayCounterSet)
- The radial line to display is reset to zero
- The zero radial line is displayed
The timer is counting down DisplayCounter, and when it reaches zero, the DisplayCounter is reset to DisplayCounterSet and a new line gets displayed.
Because the wheel rotation speed is changing (reasonably) slowly, this scheme uses the last rotation speed to guess where to display each radial line. If we didn’t do this, he orientation of the displayed image would drift, unless the wheel was going at the exactly correct speed (which would also be dependent on battery voltage and temperature).
With the code working, this can be implemented on a breadboard. It’s the same breadboard as used before, just with the addition of the magnetic switch onto pin 4 of the PIC. (Pin 4 is the input only pin of the PIC12f675 so it makes sense to use it as the only input.) For aliveness testing I also added an LED driven by pin 3 and an additional line into the Hall Effect routine to toggle the GPIO so I could check that a) the PIC was doing something and b) all magnet passes were identified.
And it works!
Video here: http://www.youtube.com/watch?v=nfqQzUZzInU
You can see in the video that there is a fast pattern for the first 3 seconds, and then I pass a magnet near the Hall Effect sensor (which is on the bottom right of the board). The pattern then repeats after the next pass at 7 seconds. The pattern certainly repeats.
The pattern is hardcoded to 64 lines. It intends to say “CYCLING ROCKS”. The font is hand designed to fit into the 64 lines to be 8×4 sets, to look like this:
The circuit board (as seen in the video) was actually built a couple of years ago for a 16 pin PIC. Fortunately, the power connections for different PICs are presumably deliberately pin 1 and the last numbered pin, so a 8 pin PIC can be put into the same socket. After wrapping with some duct tape, I then mounted on the front of wheel of my daughter’s bike. (Smallest bike to get into the
kitchen work area).
The magnet was duct-taped to the fork, and with the lights off, can be tested properly, as can be seen below:
This was stable for different rotation speeds. So apart from senses of letters, this can probably be declared a success!
Next steps are to try this on a bike that we can actually cycle along to see what it looks like to a random passersby before going for a full up 24 LED version. (Still slightly worried about fitting all the data into the PIC…)