Test program for my Multi_WS2811 library that started out as a fork of heroic/WS2811. My library uses hardware DMA on the FRDM-KL25Z to drive up to 16 strings of WS2811 or WS2812 LEDs in parallel.

Dependencies:   Multi_WS2811 mbed MMA8451Q

Fork of WS2811 by Heroic Robotics

NOTE: I have accidentally pushed changes for another fork of this program that I used in the recent Georgetown Carnival Power Tool Races. When I get some time, I will restore the test program to its original glory.

You can see my power tool racer (Nevermore's Revenge) here

/media/uploads/bikeNomad/img_0482.jpg

This tests my FRDM-KL25Z multi-string WS2811/WS2812 library. It uses the accelerometer to change the rainbow phase on two strings of LEDs as well as the touch sense to change brightness.

A video of this program in operation is here.

Here is the library that I developed to run the LEDs:

Import libraryMulti_WS2811

Library allowing up to 16 strings of 60 WS2811 or WS2812 LEDs to be driven from a single FRDM-KL25Z board. Uses hardware DMA to do a full 800 KHz rate without much CPU burden.

Committer:
Ned Konz
Date:
Sat Jun 13 00:18:26 2015 -0700
Revision:
38:3b1ce6902a1b
Parent:
37:e25d212ee3fe
Child:
39:e735259e1d2e
Worked out flapping and color animation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Ned Konz 34:cd56c00ed910 1 #include "mbed.h"
Ned Konz 34:cd56c00ed910 2 #include "Colors.h"
Ned Konz 34:cd56c00ed910 3 #include "MMA8451Q.h"
Ned Konz 34:cd56c00ed910 4
Ned Konz 34:cd56c00ed910 5 #define MMA8451_I2C_ADDRESS (0x1d<<1)
Ned Konz 34:cd56c00ed910 6
Ned Konz 34:cd56c00ed910 7 #define INSTANTIATE_TEMPLATES 1
Ned Konz 34:cd56c00ed910 8 #include "WS2811.h"
Ned Konz 34:cd56c00ed910 9
Ned Konz 34:cd56c00ed910 10 // I/O pin usage
Ned Konz 34:cd56c00ed910 11 // PTD2 (D11) data output for strip# 1
Ned Konz 34:cd56c00ed910 12 // PTD3 (D12) data output for strip# 2
Ned Konz 34:cd56c00ed910 13 // PTA2 (D3) blinking eyes output (HI = ON)
Ned Konz 36:9ee1ec2135d5 14 // PTA5 (D5) servomotor (20 msec period; 1.0-2.0msec ON)
Ned Konz 34:cd56c00ed910 15
Ned Konz 36:9ee1ec2135d5 16 const unsigned DATA_OUT_PIN1 = 2; // PTD2
Ned Konz 36:9ee1ec2135d5 17 const unsigned DATA_OUT_PIN2 = 3; // PTD3
Ned Konz 38:3b1ce6902a1b 18
Ned Konz 38:3b1ce6902a1b 19 // actually, sides have 21 LEDs each, and ends have 10 LEDs each.
Ned Konz 38:3b1ce6902a1b 20 const unsigned MAX_LEDS_PER_STRIP = 31;
Ned Konz 34:cd56c00ed910 21
Ned Konz 34:cd56c00ed910 22 // per LED: 3 * 20 mA = 60mA max
Ned Konz 34:cd56c00ed910 23 // 60 LEDs: 60 * 60mA = 3600 mA max
Ned Konz 34:cd56c00ed910 24 // 120 LEDs: 7200 mA max
Ned Konz 36:9ee1ec2135d5 25 const unsigned nLEDs = MAX_LEDS_PER_STRIP;
Ned Konz 34:cd56c00ed910 26
Ned Konz 34:cd56c00ed910 27 template class WS2811<MAX_LEDS_PER_STRIP>;
Ned Konz 34:cd56c00ed910 28
Ned Konz 34:cd56c00ed910 29 typedef WS2811<MAX_LEDS_PER_STRIP> MyWS2811;
Ned Konz 34:cd56c00ed910 30
Ned Konz 38:3b1ce6902a1b 31 static MyWS2811 lightStrip1(nLEDs, DATA_OUT_PIN1);
Ned Konz 38:3b1ce6902a1b 32 static MyWS2811 lightStrip2(nLEDs, DATA_OUT_PIN2);
Ned Konz 34:cd56c00ed910 33
Ned Konz 34:cd56c00ed910 34 Serial pc(USBTX, USBRX);
Ned Konz 34:cd56c00ed910 35
Ned Konz 38:3b1ce6902a1b 36 // accelerometer
Ned Konz 38:3b1ce6902a1b 37 static MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);
Ned Konz 38:3b1ce6902a1b 38
Ned Konz 38:3b1ce6902a1b 39 // RGB LED on FRDM board
Ned Konz 38:3b1ce6902a1b 40 static PwmOut rled(LED_RED); // max = 0.0
Ned Konz 38:3b1ce6902a1b 41 static PwmOut gled(LED_GREEN); // max = 0.0
Ned Konz 34:cd56c00ed910 42 // LED_BLUE is on PTD1
Ned Konz 38:3b1ce6902a1b 43
Ned Konz 38:3b1ce6902a1b 44 static PwmOut eyes(D3); // also redLED1; max = 1.0
Ned Konz 38:3b1ce6902a1b 45 static PwmOut servo(D5);
Ned Konz 38:3b1ce6902a1b 46 static DigitalOut greenLED2(D4); // max = 1.0
Ned Konz 38:3b1ce6902a1b 47 static DigitalIn button1(D6); // low=ON, debounced
Ned Konz 38:3b1ce6902a1b 48 static DigitalIn button2(D7); // low=ON, debounced
Ned Konz 34:cd56c00ed910 49
Ned Konz 36:9ee1ec2135d5 50 // Limits
Ned Konz 36:9ee1ec2135d5 51 const float maxBrite = 0.5;
Ned Konz 36:9ee1ec2135d5 52 const float minServo = -0.7; // -1.0 = -60°
Ned Konz 36:9ee1ec2135d5 53 const float maxServo = 0.6; // 1.0 = +60°
Ned Konz 38:3b1ce6902a1b 54 const float minFlapTime = (maxServo - minServo) * 0.17; // 0.17 seconds / 60° at 4.8V
Ned Konz 38:3b1ce6902a1b 55 const float maxFlapTime = 1.0;
Ned Konz 38:3b1ce6902a1b 56
Ned Konz 38:3b1ce6902a1b 57 // Globals
Ned Konz 38:3b1ce6902a1b 58 // test run was about 6 meters in about 5 seconds, for
Ned Konz 38:3b1ce6902a1b 59 // a final velocity of 2.4m/s, and a uniform acceleration of 0.48 m/s^2
Ned Konz 38:3b1ce6902a1b 60 // or about 0.048g
Ned Konz 38:3b1ce6902a1b 61 static float restZAccel; // in m/s^2 1g = 9.8 m/s^2
Ned Konz 38:3b1ce6902a1b 62 static float currentZAccel; // in m/s^2
Ned Konz 38:3b1ce6902a1b 63 static float currentSpeed; // in m/s
Ned Konz 38:3b1ce6902a1b 64
Ned Konz 38:3b1ce6902a1b 65 const float speedUpdateInterval = 0.1;
Ned Konz 38:3b1ce6902a1b 66 static Ticker speedUpdateTicker;
Ned Konz 38:3b1ce6902a1b 67
Ned Konz 38:3b1ce6902a1b 68 static Ticker eyeUpdateTicker;
Ned Konz 38:3b1ce6902a1b 69
Ned Konz 38:3b1ce6902a1b 70 static Ticker stripUpdateTicker;
Ned Konz 38:3b1ce6902a1b 71
Ned Konz 38:3b1ce6902a1b 72 static float wingFlapTime = maxFlapTime;
Ned Konz 38:3b1ce6902a1b 73 static Ticker wingUpdateTicker;
Ned Konz 38:3b1ce6902a1b 74
Ned Konz 38:3b1ce6902a1b 75 // we have to know delta T to compute speed.
Ned Konz 38:3b1ce6902a1b 76 // So this is called at speedUpdateInterval seconds intervals.
Ned Konz 38:3b1ce6902a1b 77 static void updateSpeedAndAcceleration()
Ned Konz 38:3b1ce6902a1b 78 {
Ned Konz 38:3b1ce6902a1b 79 currentZAccel = acc.getAccZ() * 9.8;
Ned Konz 38:3b1ce6902a1b 80 currentSpeed += (currentZAccel - restZAccel) * speedUpdateInterval;
Ned Konz 38:3b1ce6902a1b 81 }
Ned Konz 38:3b1ce6902a1b 82
Ned Konz 38:3b1ce6902a1b 83 static void resetSpeedAndAcceleration()
Ned Konz 38:3b1ce6902a1b 84 {
Ned Konz 38:3b1ce6902a1b 85 restZAccel = currentZAccel;
Ned Konz 38:3b1ce6902a1b 86 currentSpeed = 0.0;
Ned Konz 38:3b1ce6902a1b 87 }
Ned Konz 34:cd56c00ed910 88
Ned Konz 34:cd56c00ed910 89 // @brief sets different colors in each of the LEDs of a strip
Ned Konz 34:cd56c00ed910 90 // @param strip the light strip
Ned Konz 34:cd56c00ed910 91 // @param sat saturation, 0.0 - 1.0
Ned Konz 34:cd56c00ed910 92 // @param brite brightness, 0.0 - 1.0
Ned Konz 34:cd56c00ed910 93 // @param hueShift shift, 0.0 - 1.0 is equivalent to 0 - 360 degrees
Ned Konz 38:3b1ce6902a1b 94 static void showRainbow(MyWS2811 &strip, float sat, float brite, float hueShift, float hueRange = 1.0)
Ned Konz 34:cd56c00ed910 95 {
Ned Konz 34:cd56c00ed910 96 unsigned nLEDs = strip.numPixels();
Ned Konz 38:3b1ce6902a1b 97 for (unsigned i = 0; i < nLEDs; i++)
Ned Konz 38:3b1ce6902a1b 98 {
Ned Konz 34:cd56c00ed910 99 uint8_t r, g, b;
Ned Konz 38:3b1ce6902a1b 100 float hue = (i * hueRange / nLEDs) + hueShift;
Ned Konz 34:cd56c00ed910 101 HSBtoRGB(hue, sat, brite, &r, &g, &b);
Ned Konz 34:cd56c00ed910 102 strip.setPixelColor(i, r, g, b);
Ned Konz 34:cd56c00ed910 103 }
Ned Konz 34:cd56c00ed910 104 strip.show();
Ned Konz 34:cd56c00ed910 105 }
Ned Konz 34:cd56c00ed910 106
Ned Konz 34:cd56c00ed910 107 static void showSolidColor(MyWS2811 &strip, uint8_t r, uint8_t g, uint8_t b)
Ned Konz 34:cd56c00ed910 108 {
Ned Konz 34:cd56c00ed910 109 unsigned nLEDs = strip.numPixels();
Ned Konz 38:3b1ce6902a1b 110 for (unsigned i = 0; i < nLEDs; i++)
Ned Konz 38:3b1ce6902a1b 111 {
Ned Konz 34:cd56c00ed910 112 strip.setPixelColor(i, r, g, b);
Ned Konz 34:cd56c00ed910 113 }
Ned Konz 34:cd56c00ed910 114 strip.show();
Ned Konz 34:cd56c00ed910 115 }
Ned Konz 34:cd56c00ed910 116
Ned Konz 36:9ee1ec2135d5 117 // range is -1.0 (full CCW) to +1.0 (full CW)
Ned Konz 36:9ee1ec2135d5 118 static void positionServo(float pos)
Ned Konz 36:9ee1ec2135d5 119 {
Ned Konz 38:3b1ce6902a1b 120 if (pos < minServo)
Ned Konz 38:3b1ce6902a1b 121 pos = minServo;
Ned Konz 38:3b1ce6902a1b 122 else if (pos > maxServo)
Ned Konz 38:3b1ce6902a1b 123 pos = maxServo;
Ned Konz 38:3b1ce6902a1b 124
Ned Konz 38:3b1ce6902a1b 125 if (pos < 0.0) {
Ned Konz 38:3b1ce6902a1b 126 rled = pos + 1.0;
Ned Konz 38:3b1ce6902a1b 127 gled = 1.0;
Ned Konz 38:3b1ce6902a1b 128 }
Ned Konz 38:3b1ce6902a1b 129 else if (pos > 0.0) {
Ned Konz 38:3b1ce6902a1b 130 rled = 1.0;
Ned Konz 38:3b1ce6902a1b 131 gled = 1.0 - pos ;
Ned Konz 38:3b1ce6902a1b 132 }
Ned Konz 38:3b1ce6902a1b 133 else {
Ned Konz 38:3b1ce6902a1b 134 rled = gled = 0.5;
Ned Konz 38:3b1ce6902a1b 135 }
Ned Konz 36:9ee1ec2135d5 136
Ned Konz 36:9ee1ec2135d5 137 servo.pulsewidth_us((1.5 + (pos / 2.0)) * 1000.0);
Ned Konz 36:9ee1ec2135d5 138 }
Ned Konz 36:9ee1ec2135d5 139
Ned Konz 36:9ee1ec2135d5 140 static void selfTestServo()
Ned Konz 34:cd56c00ed910 141 {
Ned Konz 36:9ee1ec2135d5 142 pc.printf("Servo:\r\n");
Ned Konz 36:9ee1ec2135d5 143 pc.printf("CCW, ");
Ned Konz 36:9ee1ec2135d5 144 positionServo(-1.0);
Ned Konz 36:9ee1ec2135d5 145 wait(1.0);
Ned Konz 36:9ee1ec2135d5 146 pc.printf("CW, ");
Ned Konz 36:9ee1ec2135d5 147 positionServo(+1.0);
Ned Konz 36:9ee1ec2135d5 148 wait(1.0);
Ned Konz 36:9ee1ec2135d5 149 pc.printf("center.\r\n");
Ned Konz 36:9ee1ec2135d5 150 positionServo(0.0);
Ned Konz 36:9ee1ec2135d5 151 }
Ned Konz 34:cd56c00ed910 152
Ned Konz 36:9ee1ec2135d5 153 static void selfTestLEDs()
Ned Konz 36:9ee1ec2135d5 154 {
Ned Konz 34:cd56c00ed910 155 pc.printf("LEDs .");
Ned Konz 34:cd56c00ed910 156 rled = 0.0; // red LED on
Ned Konz 38:3b1ce6902a1b 157 wait(0.5);
Ned Konz 34:cd56c00ed910 158 pc.printf(".");
Ned Konz 34:cd56c00ed910 159 rled = 1.0; // red LED off, green LED on
Ned Konz 34:cd56c00ed910 160 gled = 0.0;
Ned Konz 38:3b1ce6902a1b 161 wait(0.5);
Ned Konz 34:cd56c00ed910 162 pc.printf(".");
Ned Konz 34:cd56c00ed910 163 gled = 1.0; // green LED off, eyes on
Ned Konz 34:cd56c00ed910 164 eyes = 1.0;
Ned Konz 38:3b1ce6902a1b 165 wait(0.5);
Ned Konz 34:cd56c00ed910 166 pc.printf(".");
Ned Konz 34:cd56c00ed910 167 eyes = 0.0;
Ned Konz 36:9ee1ec2135d5 168 pc.printf("\r\n");
Ned Konz 36:9ee1ec2135d5 169 }
Ned Konz 34:cd56c00ed910 170
Ned Konz 38:3b1ce6902a1b 171 static void refreshLightStrips()
Ned Konz 38:3b1ce6902a1b 172 {
Ned Konz 38:3b1ce6902a1b 173 MyWS2811::startDMA();
Ned Konz 38:3b1ce6902a1b 174 // 24 bits per LED, 800kHz (1.25usec/bit)
Ned Konz 38:3b1ce6902a1b 175 // wait_us((MAX_LEDS_PER_STRIP * 24 * 10 / 8) + 100);
Ned Konz 38:3b1ce6902a1b 176 }
Ned Konz 38:3b1ce6902a1b 177
Ned Konz 38:3b1ce6902a1b 178 static void blankLightStrips()
Ned Konz 38:3b1ce6902a1b 179 {
Ned Konz 38:3b1ce6902a1b 180 showSolidColor(lightStrip1, 0, 0, 0);
Ned Konz 38:3b1ce6902a1b 181 showSolidColor(lightStrip2, 0, 0, 0);
Ned Konz 38:3b1ce6902a1b 182 refreshLightStrips();
Ned Konz 38:3b1ce6902a1b 183 }
Ned Konz 38:3b1ce6902a1b 184
Ned Konz 36:9ee1ec2135d5 185 static void selfTestLightStrips()
Ned Konz 36:9ee1ec2135d5 186 {
Ned Konz 38:3b1ce6902a1b 187 blankLightStrips();
Ned Konz 34:cd56c00ed910 188 pc.printf("light strips");
Ned Konz 37:e25d212ee3fe 189 uint8_t rgb[4] = { (uint8_t)(255 * maxBrite), 0, 0, 0 };
Ned Konz 38:3b1ce6902a1b 190 for (int i = 0; i < 3; i++)
Ned Konz 38:3b1ce6902a1b 191 {
Ned Konz 34:cd56c00ed910 192 showSolidColor(lightStrip1, rgb[0], rgb[1], rgb[2]);
Ned Konz 34:cd56c00ed910 193 showSolidColor(lightStrip2, rgb[1], rgb[2], rgb[0]);
Ned Konz 38:3b1ce6902a1b 194 refreshLightStrips();
Ned Konz 34:cd56c00ed910 195 wait(1.0);
Ned Konz 34:cd56c00ed910 196 rgb[3] = rgb[2];
Ned Konz 34:cd56c00ed910 197 rgb[2] = rgb[1];
Ned Konz 34:cd56c00ed910 198 rgb[1] = rgb[0];
Ned Konz 34:cd56c00ed910 199 rgb[0] = rgb[3];
Ned Konz 34:cd56c00ed910 200 pc.printf(".");
Ned Konz 34:cd56c00ed910 201 }
Ned Konz 38:3b1ce6902a1b 202 blankLightStrips();
Ned Konz 34:cd56c00ed910 203 pc.printf("\r\n");
Ned Konz 34:cd56c00ed910 204 }
Ned Konz 34:cd56c00ed910 205
Ned Konz 36:9ee1ec2135d5 206 static void selfTest()
Ned Konz 36:9ee1ec2135d5 207 {
Ned Konz 36:9ee1ec2135d5 208 pc.printf("self test: ");
Ned Konz 36:9ee1ec2135d5 209
Ned Konz 36:9ee1ec2135d5 210 selfTestServo();
Ned Konz 36:9ee1ec2135d5 211 selfTestLEDs();
Ned Konz 36:9ee1ec2135d5 212 selfTestLightStrips();
Ned Konz 36:9ee1ec2135d5 213 }
Ned Konz 36:9ee1ec2135d5 214
Ned Konz 38:3b1ce6902a1b 215 void updateEyes()
Ned Konz 38:3b1ce6902a1b 216 {
Ned Konz 38:3b1ce6902a1b 217 static float brite = 1.0;
Ned Konz 38:3b1ce6902a1b 218 static float increment = -0.1;
Ned Konz 38:3b1ce6902a1b 219
Ned Konz 38:3b1ce6902a1b 220 eyes = brite;
Ned Konz 38:3b1ce6902a1b 221
Ned Konz 38:3b1ce6902a1b 222 brite += increment;
Ned Konz 38:3b1ce6902a1b 223 if (brite >= 1.0)
Ned Konz 38:3b1ce6902a1b 224 {
Ned Konz 38:3b1ce6902a1b 225 increment = -0.05;
Ned Konz 38:3b1ce6902a1b 226 brite = 1.0;
Ned Konz 38:3b1ce6902a1b 227 }
Ned Konz 38:3b1ce6902a1b 228 else if (brite <= 0.0)
Ned Konz 38:3b1ce6902a1b 229 {
Ned Konz 38:3b1ce6902a1b 230 increment = 0.05;
Ned Konz 38:3b1ce6902a1b 231 brite = 0.0;
Ned Konz 38:3b1ce6902a1b 232 }
Ned Konz 38:3b1ce6902a1b 233 }
Ned Konz 38:3b1ce6902a1b 234
Ned Konz 38:3b1ce6902a1b 235 // rainbow that wraps around entire frame
Ned Konz 38:3b1ce6902a1b 236 void updateStripsRainbow()
Ned Konz 38:3b1ce6902a1b 237 {
Ned Konz 38:3b1ce6902a1b 238 showRainbow(lightStrip1, 1.0, maxBrite, currentSpeed, 0.5);
Ned Konz 38:3b1ce6902a1b 239 showRainbow(lightStrip2, 1.0, maxBrite, currentSpeed + 0.5, 0.5);
Ned Konz 38:3b1ce6902a1b 240 refreshLightStrips();
Ned Konz 38:3b1ce6902a1b 241 }
Ned Konz 38:3b1ce6902a1b 242
Ned Konz 38:3b1ce6902a1b 243 // callback
Ned Konz 38:3b1ce6902a1b 244 void updateWings()
Ned Konz 38:3b1ce6902a1b 245 {
Ned Konz 38:3b1ce6902a1b 246 static float currentPosition = 1.0;
Ned Konz 38:3b1ce6902a1b 247
Ned Konz 38:3b1ce6902a1b 248 currentPosition = -currentPosition;
Ned Konz 38:3b1ce6902a1b 249 positionServo(currentPosition);
Ned Konz 38:3b1ce6902a1b 250 }
Ned Konz 38:3b1ce6902a1b 251
Ned Konz 38:3b1ce6902a1b 252 void setWingFlapTime(float desired)
Ned Konz 38:3b1ce6902a1b 253 {
Ned Konz 38:3b1ce6902a1b 254 static float lastWingFlapTime = 0.0;
Ned Konz 38:3b1ce6902a1b 255 if (desired < minFlapTime)
Ned Konz 38:3b1ce6902a1b 256 desired = minFlapTime;
Ned Konz 38:3b1ce6902a1b 257 else if (desired > maxFlapTime)
Ned Konz 38:3b1ce6902a1b 258 desired = maxFlapTime;
Ned Konz 38:3b1ce6902a1b 259 wingFlapTime = desired;
Ned Konz 38:3b1ce6902a1b 260
Ned Konz 38:3b1ce6902a1b 261 if (lastWingFlapTime != wingFlapTime)
Ned Konz 38:3b1ce6902a1b 262 {
Ned Konz 38:3b1ce6902a1b 263 wingUpdateTicker.detach();
Ned Konz 38:3b1ce6902a1b 264 wingUpdateTicker.attach(updateWings, wingFlapTime);
Ned Konz 38:3b1ce6902a1b 265 lastWingFlapTime = wingFlapTime;
Ned Konz 38:3b1ce6902a1b 266 }
Ned Konz 38:3b1ce6902a1b 267 }
Ned Konz 38:3b1ce6902a1b 268
Ned Konz 34:cd56c00ed910 269 int main(void)
Ned Konz 34:cd56c00ed910 270 {
Ned Konz 34:cd56c00ed910 271 pc.baud(115200);
Ned Konz 36:9ee1ec2135d5 272 pc.printf("\r\n\r\nNevermore's Revenge!\r\ncompiled " __DATE__ ", " __TIME__ "\r\n");
Ned Konz 34:cd56c00ed910 273
Ned Konz 34:cd56c00ed910 274 lightStrip1.begin();
Ned Konz 34:cd56c00ed910 275 lightStrip2.begin();
Ned Konz 34:cd56c00ed910 276
Ned Konz 38:3b1ce6902a1b 277 rled = 1.0;
Ned Konz 38:3b1ce6902a1b 278 gled = 1.0;
Ned Konz 36:9ee1ec2135d5 279 greenLED2 = 0.0;
Ned Konz 36:9ee1ec2135d5 280 servo.period_ms(20);
Ned Konz 34:cd56c00ed910 281
Ned Konz 34:cd56c00ed910 282 selfTest();
Ned Konz 34:cd56c00ed910 283
Ned Konz 38:3b1ce6902a1b 284 eyeUpdateTicker.attach(updateEyes, 0.05);
Ned Konz 38:3b1ce6902a1b 285 wingUpdateTicker.attach(updateWings, wingFlapTime);
Ned Konz 38:3b1ce6902a1b 286
Ned Konz 38:3b1ce6902a1b 287 resetSpeedAndAcceleration();
Ned Konz 38:3b1ce6902a1b 288 speedUpdateTicker.attach(updateSpeedAndAcceleration, speedUpdateInterval);
Ned Konz 38:3b1ce6902a1b 289
Ned Konz 38:3b1ce6902a1b 290 stripUpdateTicker.attach(updateStripsRainbow, 0.1);
Ned Konz 34:cd56c00ed910 291
Ned Konz 38:3b1ce6902a1b 292 float lastCurrentSpeed = 0.0;
Ned Konz 38:3b1ce6902a1b 293 for (;; )
Ned Konz 38:3b1ce6902a1b 294 {
Ned Konz 38:3b1ce6902a1b 295 float relativeAccel = fabs(currentZAccel - restZAccel);
Ned Konz 38:3b1ce6902a1b 296 if ((relativeAccel < 1.0) || !button2.read())
Ned Konz 38:3b1ce6902a1b 297 {
Ned Konz 38:3b1ce6902a1b 298 resetSpeedAndAcceleration();
Ned Konz 38:3b1ce6902a1b 299 setWingFlapTime(maxFlapTime);
Ned Konz 38:3b1ce6902a1b 300 }
Ned Konz 38:3b1ce6902a1b 301 else
Ned Konz 38:3b1ce6902a1b 302 {
Ned Konz 38:3b1ce6902a1b 303 setWingFlapTime(minFlapTime);
Ned Konz 38:3b1ce6902a1b 304 }
Ned Konz 38:3b1ce6902a1b 305
Ned Konz 38:3b1ce6902a1b 306 if (lastCurrentSpeed != currentSpeed)
Ned Konz 38:3b1ce6902a1b 307 {
Ned Konz 38:3b1ce6902a1b 308 lastCurrentSpeed = currentSpeed;
Ned Konz 38:3b1ce6902a1b 309 pc.printf("%f %f %f\r\n", relativeAccel, currentSpeed, wingFlapTime);
Ned Konz 38:3b1ce6902a1b 310 }
Ned Konz 38:3b1ce6902a1b 311 wait(0.1);
Ned Konz 34:cd56c00ed910 312 }
Ned Konz 34:cd56c00ed910 313 }