Joshua Newth / Mbed 2 deprecated POV01

Dependencies:   mbed

Committer:
mrfurious
Date:
Thu Nov 04 23:00:34 2010 +0000
Revision:
0:e4ea0ca99174
1.1.1

Who changed what in which revision?

UserRevisionLine numberNew 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 }