Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@0:e4ea0ca99174, 2010-11-04 (annotated)
- Committer:
- mrfurious
- Date:
- Thu Nov 04 23:00:34 2010 +0000
- Revision:
- 0:e4ea0ca99174
1.1.1
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| mrfurious | 0:e4ea0ca99174 | 1 | /* |
| mrfurious | 0:e4ea0ca99174 | 2 | Date: 04/08/10 |
| mrfurious | 0:e4ea0ca99174 | 3 | Version 0.1.3 |
| mrfurious | 0:e4ea0ca99174 | 4 | |
| mrfurious | 0:e4ea0ca99174 | 5 | Notes |
| mrfurious | 0:e4ea0ca99174 | 6 | Write strings to display |
| mrfurious | 0:e4ea0ca99174 | 7 | Update speed reporting based on calculated time |
| mrfurious | 0:e4ea0ca99174 | 8 | |
| mrfurious | 0:e4ea0ca99174 | 9 | |
| mrfurious | 0:e4ea0ca99174 | 10 | Bugs |
| mrfurious | 0:e4ea0ca99174 | 11 | Can update displayed strings, but cant stay at constant speed |
| mrfurious | 0:e4ea0ca99174 | 12 | at value not equal to 0, 10, or 20. during accel it will increase |
| mrfurious | 0:e4ea0ca99174 | 13 | from 10 to 20 1 at a time. |
| mrfurious | 0:e4ea0ca99174 | 14 | |
| mrfurious | 0:e4ea0ca99174 | 15 | Known Issues |
| mrfurious | 0:e4ea0ca99174 | 16 | 1.Pin20 seems a bit dodgy. InterruptIn does not work on that pin. |
| mrfurious | 0:e4ea0ca99174 | 17 | 2. Pin19 seems a bit dodgy. InterruptIn does not work on that pin. |
| mrfurious | 0:e4ea0ca99174 | 18 | |
| mrfurious | 0:e4ea0ca99174 | 19 | */ |
| mrfurious | 0:e4ea0ca99174 | 20 | |
| mrfurious | 0:e4ea0ca99174 | 21 | #include "mbed.h" |
| mrfurious | 0:e4ea0ca99174 | 22 | #include "FontPack.h" |
| mrfurious | 0:e4ea0ca99174 | 23 | |
| mrfurious | 0:e4ea0ca99174 | 24 | using namespace FontPack; |
| mrfurious | 0:e4ea0ca99174 | 25 | |
| mrfurious | 0:e4ea0ca99174 | 26 | #define true 1 |
| mrfurious | 0:e4ea0ca99174 | 27 | #define false 0 |
| mrfurious | 0:e4ea0ca99174 | 28 | |
| mrfurious | 0:e4ea0ca99174 | 29 | #define MSEC_USEC 1000 |
| mrfurious | 0:e4ea0ca99174 | 30 | /* |
| mrfurious | 0:e4ea0ca99174 | 31 | we get msec/rev, what we want is miles/hour |
| mrfurious | 0:e4ea0ca99174 | 32 | [1rev/(PI*Dia)in]*[12in/ft]*[5280ft/1mi]*[1sec/1000ms]*[1hr/3600sec] |
| mrfurious | 0:e4ea0ca99174 | 33 | % has units of hr/mi, so invert |
| mrfurious | 0:e4ea0ca99174 | 34 | */ |
| mrfurious | 0:e4ea0ca99174 | 35 | #define POV_DIAMETER 26.5 |
| mrfurious | 0:e4ea0ca99174 | 36 | #define PI 3.14 |
| mrfurious | 0:e4ea0ca99174 | 37 | |
| mrfurious | 0:e4ea0ca99174 | 38 | #define POV_NUM_SAMPLES 3 |
| mrfurious | 0:e4ea0ca99174 | 39 | |
| mrfurious | 0:e4ea0ca99174 | 40 | #define POV_NUM_COLS 360 //how many cols make up the whole wheel |
| mrfurious | 0:e4ea0ca99174 | 41 | #define POV_MIN_SPEED_MPH 3 |
| mrfurious | 0:e4ea0ca99174 | 42 | |
| mrfurious | 0:e4ea0ca99174 | 43 | #define POV_NUM_LEDS 8 //leds to paint |
| mrfurious | 0:e4ea0ca99174 | 44 | #define POV_HALL_DEBOUNCE_US 2000*MSEC_USEC //debug code - long suppression |
| mrfurious | 0:e4ea0ca99174 | 45 | |
| mrfurious | 0:e4ea0ca99174 | 46 | //#define POV_HALL_DEBOUNCE_US 250*POV_MSEC_TO_USEC |
| mrfurious | 0:e4ea0ca99174 | 47 | |
| mrfurious | 0:e4ea0ca99174 | 48 | //DigitalOut led[POV_NUM_LEDS] = { p21, p22, p23, p24, p25, p26, p27, p28}; |
| mrfurious | 0:e4ea0ca99174 | 49 | DigitalOut led[POV_NUM_LEDS] = {p28, p27, p26, p25, p24, p23, p22, p21}; |
| mrfurious | 0:e4ea0ca99174 | 50 | InterruptIn hall(p17); |
| mrfurious | 0:e4ea0ca99174 | 51 | Ticker paintTimer; //repeating ISR call |
| mrfurious | 0:e4ea0ca99174 | 52 | //Timeout suppressHallTimer; //single ISR call |
| mrfurious | 0:e4ea0ca99174 | 53 | Timer wheelSpeedTimer; //true timer, not an ISR call |
| mrfurious | 0:e4ea0ca99174 | 54 | /* |
| mrfurious | 0:e4ea0ca99174 | 55 | CONVERTER when multiplied by msec/rev results in hr/mi |
| mrfurious | 0:e4ea0ca99174 | 56 | so the inversion of the product is mph |
| mrfurious | 0:e4ea0ca99174 | 57 | pov_converter = [12in/1ft]*[5280ft/1mi]*[1sec/1000msec]*[1hr/3600s] |
| mrfurious | 0:e4ea0ca99174 | 58 | pov_converter = pov_diameter/pov_converter |
| mrfurious | 0:e4ea0ca99174 | 59 | mph = pov_converter/ (ms/rev) |
| mrfurious | 0:e4ea0ca99174 | 60 | */ |
| mrfurious | 0:e4ea0ca99174 | 61 | static double POV_CONVERTER=.0056; |
| mrfurious | 0:e4ea0ca99174 | 62 | |
| mrfurious | 0:e4ea0ca99174 | 63 | static bool hallFlag = false; |
| mrfurious | 0:e4ea0ca99174 | 64 | static bool hallSuppressed = false; |
| mrfurious | 0:e4ea0ca99174 | 65 | static bool paintFlag = false; |
| mrfurious | 0:e4ea0ca99174 | 66 | static int columnCounter = 0; |
| mrfurious | 0:e4ea0ca99174 | 67 | static int wheelSpeedCounter_ms = 0; |
| mrfurious | 0:e4ea0ca99174 | 68 | |
| mrfurious | 0:e4ea0ca99174 | 69 | |
| mrfurious | 0:e4ea0ca99174 | 70 | |
| mrfurious | 0:e4ea0ca99174 | 71 | /*FUNCTION DECLARATIONS*/ |
| mrfurious | 0:e4ea0ca99174 | 72 | static void paintInterrupt(void); |
| mrfurious | 0:e4ea0ca99174 | 73 | //static void suppressInterrupt(void); |
| mrfurious | 0:e4ea0ca99174 | 74 | static void hallEffectDetected(void); |
| mrfurious | 0:e4ea0ca99174 | 75 | static void paint(char canvas[]); |
| mrfurious | 0:e4ea0ca99174 | 76 | static void updateCanvas(char canvas[], float wheelSpeed_mph); |
| mrfurious | 0:e4ea0ca99174 | 77 | static int writeString(char canvas[], const char* msg, int index) ; |
| mrfurious | 0:e4ea0ca99174 | 78 | |
| mrfurious | 0:e4ea0ca99174 | 79 | float updateWheelSpeed(int wheelSpeedCtr_us); |
| mrfurious | 0:e4ea0ca99174 | 80 | static void turnLightsOn(bool isOn); |
| mrfurious | 0:e4ea0ca99174 | 81 | |
| mrfurious | 0:e4ea0ca99174 | 82 | int main() { |
| mrfurious | 0:e4ea0ca99174 | 83 | float wheelSpeed_mph = 0; |
| mrfurious | 0:e4ea0ca99174 | 84 | int colSpeed_us = 0; |
| mrfurious | 0:e4ea0ca99174 | 85 | char canvas[POV_NUM_COLS] = {0}; |
| mrfurious | 0:e4ea0ca99174 | 86 | POV_CONVERTER = POV_DIAMETER / POV_CONVERTER; |
| mrfurious | 0:e4ea0ca99174 | 87 | |
| mrfurious | 0:e4ea0ca99174 | 88 | turnLightsOn(false); |
| mrfurious | 0:e4ea0ca99174 | 89 | hall.fall(&hallEffectDetected); // attach the address of the handling routine |
| mrfurious | 0:e4ea0ca99174 | 90 | hall.mode(PullUp); |
| mrfurious | 0:e4ea0ca99174 | 91 | wheelSpeedTimer.start(); |
| mrfurious | 0:e4ea0ca99174 | 92 | paintTimer.attach(&paintInterrupt, 1); |
| mrfurious | 0:e4ea0ca99174 | 93 | |
| mrfurious | 0:e4ea0ca99174 | 94 | while (true) { |
| mrfurious | 0:e4ea0ca99174 | 95 | if (hallFlag) { |
| mrfurious | 0:e4ea0ca99174 | 96 | hallFlag = false; |
| mrfurious | 0:e4ea0ca99174 | 97 | colSpeed_us = wheelSpeedCounter_ms*MSEC_USEC / POV_NUM_COLS; |
| mrfurious | 0:e4ea0ca99174 | 98 | wheelSpeed_mph = updateWheelSpeed(wheelSpeedCounter_ms); |
| mrfurious | 0:e4ea0ca99174 | 99 | updateCanvas(canvas, wheelSpeed_mph); |
| mrfurious | 0:e4ea0ca99174 | 100 | if (wheelSpeed_mph > POV_MIN_SPEED_MPH) { |
| mrfurious | 0:e4ea0ca99174 | 101 | //if (true) { |
| mrfurious | 0:e4ea0ca99174 | 102 | paintFlag = true; |
| mrfurious | 0:e4ea0ca99174 | 103 | paintTimer.attach_us(&paintInterrupt, colSpeed_us); |
| mrfurious | 0:e4ea0ca99174 | 104 | columnCounter = 0; |
| mrfurious | 0:e4ea0ca99174 | 105 | //paintTimer.attach(&paintInterrupt, 1); //debug - msec, slow update |
| mrfurious | 0:e4ea0ca99174 | 106 | } |
| mrfurious | 0:e4ea0ca99174 | 107 | hallSuppressed = false; |
| mrfurious | 0:e4ea0ca99174 | 108 | } |
| mrfurious | 0:e4ea0ca99174 | 109 | |
| mrfurious | 0:e4ea0ca99174 | 110 | if (paintFlag) { |
| mrfurious | 0:e4ea0ca99174 | 111 | paintFlag = false; |
| mrfurious | 0:e4ea0ca99174 | 112 | paint(canvas); |
| mrfurious | 0:e4ea0ca99174 | 113 | } |
| mrfurious | 0:e4ea0ca99174 | 114 | } |
| mrfurious | 0:e4ea0ca99174 | 115 | } |
| mrfurious | 0:e4ea0ca99174 | 116 | |
| mrfurious | 0:e4ea0ca99174 | 117 | static void paintInterrupt(void) { |
| mrfurious | 0:e4ea0ca99174 | 118 | ++columnCounter; |
| mrfurious | 0:e4ea0ca99174 | 119 | paintFlag = true; |
| mrfurious | 0:e4ea0ca99174 | 120 | } |
| mrfurious | 0:e4ea0ca99174 | 121 | |
| mrfurious | 0:e4ea0ca99174 | 122 | |
| mrfurious | 0:e4ea0ca99174 | 123 | static void hallEffectDetected(void) { |
| mrfurious | 0:e4ea0ca99174 | 124 | if (!hallSuppressed) { |
| mrfurious | 0:e4ea0ca99174 | 125 | hallSuppressed = true; |
| mrfurious | 0:e4ea0ca99174 | 126 | paintFlag = false; |
| mrfurious | 0:e4ea0ca99174 | 127 | wheelSpeedCounter_ms = wheelSpeedTimer.read_ms(); |
| mrfurious | 0:e4ea0ca99174 | 128 | wheelSpeedTimer.reset(); |
| mrfurious | 0:e4ea0ca99174 | 129 | hallFlag = true; |
| mrfurious | 0:e4ea0ca99174 | 130 | } |
| mrfurious | 0:e4ea0ca99174 | 131 | } |
| mrfurious | 0:e4ea0ca99174 | 132 | |
| mrfurious | 0:e4ea0ca99174 | 133 | static void paint(char canvas[]) { |
| mrfurious | 0:e4ea0ca99174 | 134 | if (columnCounter >= POV_NUM_COLS) return; |
| mrfurious | 0:e4ea0ca99174 | 135 | int LED = canvas[columnCounter]; |
| mrfurious | 0:e4ea0ca99174 | 136 | for (int i=0; i < POV_NUM_LEDS; i++) { |
| mrfurious | 0:e4ea0ca99174 | 137 | led[i] = (LED >> i) & 0x01; //just get the last bit for comparison |
| mrfurious | 0:e4ea0ca99174 | 138 | } |
| mrfurious | 0:e4ea0ca99174 | 139 | } |
| mrfurious | 0:e4ea0ca99174 | 140 | |
| mrfurious | 0:e4ea0ca99174 | 141 | |
| mrfurious | 0:e4ea0ca99174 | 142 | static void updateCanvas(char canvas[], float wheelSpeed_mph) { |
| mrfurious | 0:e4ea0ca99174 | 143 | int index = 120; |
| mrfurious | 0:e4ea0ca99174 | 144 | char msg[30]; |
| mrfurious | 0:e4ea0ca99174 | 145 | memset(canvas, 0x00, POV_NUM_COLS); |
| mrfurious | 0:e4ea0ca99174 | 146 | float bike_distance = 0; |
| mrfurious | 0:e4ea0ca99174 | 147 | //sprintf(msg, "Distance: %2f Speed: %2.2f MPH", wheelSpeed_mph); |
| mrfurious | 0:e4ea0ca99174 | 148 | // sprintf(msg, "Speed: %2.1fMPH Distance: %2.1f", wheelSpeed_mph); |
| mrfurious | 0:e4ea0ca99174 | 149 | |
| mrfurious | 0:e4ea0ca99174 | 150 | |
| mrfurious | 0:e4ea0ca99174 | 151 | |
| mrfurious | 0:e4ea0ca99174 | 152 | sprintf(msg, "Speed: %2.1f MPH", wheelSpeed_mph); |
| mrfurious | 0:e4ea0ca99174 | 153 | |
| mrfurious | 0:e4ea0ca99174 | 154 | index = writeString(canvas, msg, 90); |
| mrfurious | 0:e4ea0ca99174 | 155 | |
| mrfurious | 0:e4ea0ca99174 | 156 | } |
| mrfurious | 0:e4ea0ca99174 | 157 | |
| mrfurious | 0:e4ea0ca99174 | 158 | static int writeString(char canvas[], const char* msg, int index) { |
| mrfurious | 0:e4ea0ca99174 | 159 | |
| mrfurious | 0:e4ea0ca99174 | 160 | while ((msg != NULL) && (*msg != '\0')) { |
| mrfurious | 0:e4ea0ca99174 | 161 | index = writeChar(*msg, canvas, index); |
| mrfurious | 0:e4ea0ca99174 | 162 | msg++; |
| mrfurious | 0:e4ea0ca99174 | 163 | } |
| mrfurious | 0:e4ea0ca99174 | 164 | return index; |
| mrfurious | 0:e4ea0ca99174 | 165 | } |
| mrfurious | 0:e4ea0ca99174 | 166 | |
| mrfurious | 0:e4ea0ca99174 | 167 | |
| mrfurious | 0:e4ea0ca99174 | 168 | static void turnLightsOn(bool isOn) { |
| mrfurious | 0:e4ea0ca99174 | 169 | for (int i=0; i < POV_NUM_LEDS; i++) { |
| mrfurious | 0:e4ea0ca99174 | 170 | led[i]=isOn; |
| mrfurious | 0:e4ea0ca99174 | 171 | } |
| mrfurious | 0:e4ea0ca99174 | 172 | } |
| mrfurious | 0:e4ea0ca99174 | 173 | |
| mrfurious | 0:e4ea0ca99174 | 174 | |
| mrfurious | 0:e4ea0ca99174 | 175 | //Aggregates and stores num samples in the averager |
| mrfurious | 0:e4ea0ca99174 | 176 | //computes running average by always replacing value at index |
| mrfurious | 0:e4ea0ca99174 | 177 | //with new measured value, then updating sample with new measured value |
| mrfurious | 0:e4ea0ca99174 | 178 | |
| mrfurious | 0:e4ea0ca99174 | 179 | float updateWheelSpeed(int wheelSpeedCtr_ms) { |
| mrfurious | 0:e4ea0ca99174 | 180 | static float samples[POV_NUM_SAMPLES] = {0}; |
| mrfurious | 0:e4ea0ca99174 | 181 | static char index = 0; |
| mrfurious | 0:e4ea0ca99174 | 182 | static float avgSpeed_mph = 0; |
| mrfurious | 0:e4ea0ca99174 | 183 | |
| mrfurious | 0:e4ea0ca99174 | 184 | //float lin = POV_CONVERTER/((float) wheelSpeedCtr_ms); |
| mrfurious | 0:e4ea0ca99174 | 185 | //return lin; |
| mrfurious | 0:e4ea0ca99174 | 186 | |
| mrfurious | 0:e4ea0ca99174 | 187 | if (wheelSpeedCtr_ms != 0) { |
| mrfurious | 0:e4ea0ca99174 | 188 | float linearSpeed_mph = POV_CONVERTER/((float) wheelSpeedCtr_ms); |
| mrfurious | 0:e4ea0ca99174 | 189 | //calculate new running average |
| mrfurious | 0:e4ea0ca99174 | 190 | avgSpeed_mph = avgSpeed_mph - samples[index]/POV_NUM_SAMPLES + linearSpeed_mph/POV_NUM_SAMPLES; |
| mrfurious | 0:e4ea0ca99174 | 191 | //store new sample |
| mrfurious | 0:e4ea0ca99174 | 192 | samples[index] = linearSpeed_mph; |
| mrfurious | 0:e4ea0ca99174 | 193 | //update averager index |
| mrfurious | 0:e4ea0ca99174 | 194 | index = ++index % POV_NUM_SAMPLES; |
| mrfurious | 0:e4ea0ca99174 | 195 | } |
| mrfurious | 0:e4ea0ca99174 | 196 | |
| mrfurious | 0:e4ea0ca99174 | 197 | return avgSpeed_mph; |
| mrfurious | 0:e4ea0ca99174 | 198 | } |