Temp Fork
Dependencies: MMA8451Q Multi_WS2811 NVIC_set_all_priorities TSI cc3000_hostdriver_mbedsocket mbed
Fork of CubicHand by
led.cpp@8:c06f5046c9f7, 2014-12-05 (annotated)
- Committer:
- joseoyola
- Date:
- Fri Dec 05 22:20:34 2014 +0000
- Revision:
- 8:c06f5046c9f7
- Parent:
- 5:41f28ce7f5a9
- Child:
- 10:9d87a886f066
Added more functions to led.cpp
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
joseoyola | 2:45b90e8d7d82 | 1 | /* |
joseoyola | 2:45b90e8d7d82 | 2 | * LED Cube library |
joseoyola | 5:41f28ce7f5a9 | 3 | * by Robert Bui and Jose Oyola |
joseoyola | 2:45b90e8d7d82 | 4 | * UC Berkeley 2014 |
joseoyola | 2:45b90e8d7d82 | 5 | */ |
joseoyola | 2:45b90e8d7d82 | 6 | |
joseoyola | 2:45b90e8d7d82 | 7 | #include "main.h" |
joseoyola | 2:45b90e8d7d82 | 8 | #include "mbed.h" |
joseoyola | 5:41f28ce7f5a9 | 9 | #include "WS2811.h" |
joseoyola | 5:41f28ce7f5a9 | 10 | #include "Colors.h" |
joseoyola | 5:41f28ce7f5a9 | 11 | #include "TSISensor.h" |
joseoyola | 5:41f28ce7f5a9 | 12 | #include "MMA8451Q.h" |
joseoyola | 5:41f28ce7f5a9 | 13 | |
joseoyola | 5:41f28ce7f5a9 | 14 | |
joseoyola | 5:41f28ce7f5a9 | 15 | #define MMA8451_I2C_ADDRESS (0x1d<<1) |
joseoyola | 5:41f28ce7f5a9 | 16 | |
joseoyola | 5:41f28ce7f5a9 | 17 | #define X 0 |
joseoyola | 5:41f28ce7f5a9 | 18 | #define Y 1 |
joseoyola | 5:41f28ce7f5a9 | 19 | #define Z 2 |
joseoyola | 5:41f28ce7f5a9 | 20 | |
joseoyola | 5:41f28ce7f5a9 | 21 | #define PANEL1 0 |
joseoyola | 5:41f28ce7f5a9 | 22 | #define PANEL2 1 |
joseoyola | 5:41f28ce7f5a9 | 23 | #define PANEL3 2 |
joseoyola | 5:41f28ce7f5a9 | 24 | |
joseoyola | 5:41f28ce7f5a9 | 25 | int pos[3]; |
joseoyola | 8:c06f5046c9f7 | 26 | int size = 0; |
joseoyola | 5:41f28ce7f5a9 | 27 | |
joseoyola | 5:41f28ce7f5a9 | 28 | // per LED: 3 * 20 mA = 60mA max |
joseoyola | 5:41f28ce7f5a9 | 29 | // 60 LEDs: 60 * 60mA = 3600 mA max |
joseoyola | 5:41f28ce7f5a9 | 30 | // 120 LEDs: 7200 mA max |
joseoyola | 5:41f28ce7f5a9 | 31 | unsigned const nLEDs = 60;//MAX_LEDS_PER_STRIP; |
joseoyola | 8:c06f5046c9f7 | 32 | unsigned const nROWs = 10; |
joseoyola | 8:c06f5046c9f7 | 33 | unsigned const nCOLs = 10; |
joseoyola | 5:41f28ce7f5a9 | 34 | |
joseoyola | 5:41f28ce7f5a9 | 35 | |
joseoyola | 5:41f28ce7f5a9 | 36 | |
joseoyola | 5:41f28ce7f5a9 | 37 | // I/O pin usage |
joseoyola | 5:41f28ce7f5a9 | 38 | // PTD0 TPM0 CH0 monitor |
joseoyola | 5:41f28ce7f5a9 | 39 | // PTD1 TPM0 CH1 monitor |
joseoyola | 5:41f28ce7f5a9 | 40 | // PTD2 data output |
joseoyola | 5:41f28ce7f5a9 | 41 | // PTD3 debug output |
joseoyola | 5:41f28ce7f5a9 | 42 | |
joseoyola | 5:41f28ce7f5a9 | 43 | unsigned const DATA_OUT_PIN1 = 2; // PTD2 |
joseoyola | 5:41f28ce7f5a9 | 44 | unsigned const DATA_OUT_PIN2 = 3; // PTD3 |
joseoyola | 8:c06f5046c9f7 | 45 | unsigned const DATA_OUT_PIN3 = 4; // PTD3 |
joseoyola | 5:41f28ce7f5a9 | 46 | |
joseoyola | 5:41f28ce7f5a9 | 47 | Serial pc(USBTX, USBRX); |
joseoyola | 5:41f28ce7f5a9 | 48 | Timer timeRunning; |
joseoyola | 5:41f28ce7f5a9 | 49 | |
joseoyola | 5:41f28ce7f5a9 | 50 | TSISensor touchSensor; |
joseoyola | 5:41f28ce7f5a9 | 51 | MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS); |
joseoyola | 5:41f28ce7f5a9 | 52 | PwmOut rled(LED_RED); |
joseoyola | 5:41f28ce7f5a9 | 53 | PwmOut gled(LED_GREEN); |
joseoyola | 5:41f28ce7f5a9 | 54 | // LED_BLUE is on PTD1 |
joseoyola | 5:41f28ce7f5a9 | 55 | |
joseoyola | 5:41f28ce7f5a9 | 56 | float touchPercentage; |
joseoyola | 5:41f28ce7f5a9 | 57 | unsigned frames; |
joseoyola | 5:41f28ce7f5a9 | 58 | |
joseoyola | 5:41f28ce7f5a9 | 59 | float const minBrite = 0.2; |
joseoyola | 5:41f28ce7f5a9 | 60 | float const maxBrite = 0.5; |
joseoyola | 5:41f28ce7f5a9 | 61 | float brightness; |
joseoyola | 5:41f28ce7f5a9 | 62 | |
joseoyola | 5:41f28ce7f5a9 | 63 | |
joseoyola | 5:41f28ce7f5a9 | 64 | uint8_t r = 255*0.1; |
joseoyola | 5:41f28ce7f5a9 | 65 | uint8_t g = 255*0.1; |
joseoyola | 5:41f28ce7f5a9 | 66 | uint8_t b = 255*0.1; |
joseoyola | 5:41f28ce7f5a9 | 67 | |
joseoyola | 5:41f28ce7f5a9 | 68 | |
joseoyola | 5:41f28ce7f5a9 | 69 | WS2811 lightStrip1(nLEDs, DATA_OUT_PIN1); |
joseoyola | 5:41f28ce7f5a9 | 70 | WS2811 lightStrip2(nLEDs, DATA_OUT_PIN2); |
joseoyola | 8:c06f5046c9f7 | 71 | WS2811 lightStrip3(nLEDs, DATA_OUT_PIN2); |
joseoyola | 5:41f28ce7f5a9 | 72 | |
joseoyola | 5:41f28ce7f5a9 | 73 | void readTouchSensor() |
joseoyola | 5:41f28ce7f5a9 | 74 | { |
joseoyola | 8:c06f5046c9f7 | 75 | touchPercentage *= 0.(nCOLs - 1); |
joseoyola | 5:41f28ce7f5a9 | 76 | touchPercentage += touchSensor.readPercentage() * 0.1; |
joseoyola | 5:41f28ce7f5a9 | 77 | brite = minBrite + (maxBrite - minBrite) * touchPercentage; |
joseoyola | 5:41f28ce7f5a9 | 78 | } |
joseoyola | 2:45b90e8d7d82 | 79 | |
joseoyola | 2:45b90e8d7d82 | 80 | |
joseoyola | 5:41f28ce7f5a9 | 81 | void move(deltaX, deltaY, deltaZ) { |
joseoyola | 5:41f28ce7f5a9 | 82 | //Moving in X direction |
joseoyola | 8:c06f5046c9f7 | 83 | if(pos[Y] == 0 || pos[Z] == (nCOLs - 1)) { //Making sure square is "stuck" to panel 1 or 3 |
joseoyola | 8:c06f5046c9f7 | 84 | if((pos[X] + size + deltaX) < nCOLs && (pos[X] + deltaX) >= 0) { |
joseoyola | 5:41f28ce7f5a9 | 85 | pos[X] += deltaX; |
joseoyola | 5:41f28ce7f5a9 | 86 | } |
joseoyola | 5:41f28ce7f5a9 | 87 | } |
joseoyola | 5:41f28ce7f5a9 | 88 | |
joseoyola | 5:41f28ce7f5a9 | 89 | //Moving in Y direction |
joseoyola | 8:c06f5046c9f7 | 90 | if(pos[X] == (nCOLs - 1) || pos[Z] == (nCOLs - 1)) {//Making sure square is "stuck" to panel 2 or 3 |
joseoyola | 8:c06f5046c9f7 | 91 | if((pos[Y] + size + deltaY) < nCOLs && (pos[Y] + deltaY) >= 0) { |
joseoyola | 5:41f28ce7f5a9 | 92 | pos[Y] += deltaY; |
joseoyola | 5:41f28ce7f5a9 | 93 | } |
joseoyola | 5:41f28ce7f5a9 | 94 | } |
joseoyola | 5:41f28ce7f5a9 | 95 | |
joseoyola | 5:41f28ce7f5a9 | 96 | //Moving in Z direction |
joseoyola | 8:c06f5046c9f7 | 97 | if(pos[X] == (nCOLs - 1) || pos[Y] == 0) {//Making sure square is "stuck" to panel 1 or 2 |
joseoyola | 8:c06f5046c9f7 | 98 | if((pos[Z] + size + deltaZ) < nCOLs && (pos[Z] + deltaZ) >= 0) { |
joseoyola | 5:41f28ce7f5a9 | 99 | pos[Z] += deltaZ; |
joseoyola | 5:41f28ce7f5a9 | 100 | } |
joseoyola | 5:41f28ce7f5a9 | 101 | } |
joseoyola | 5:41f28ce7f5a9 | 102 | |
joseoyola | 5:41f28ce7f5a9 | 103 | cubeUpdate(); |
joseoyola | 5:41f28ce7f5a9 | 104 | } |
joseoyola | 5:41f28ce7f5a9 | 105 | |
joseoyola | 5:41f28ce7f5a9 | 106 | void cubeUpdate() { |
joseoyola | 5:41f28ce7f5a9 | 107 | updateLEDs(false); //Turn off LEDs from previous state |
joseoyola | 5:41f28ce7f5a9 | 108 | updateLEDs(true); //Turn on new LEDs for new state |
joseoyola | 5:41f28ce7f5a9 | 109 | } |
joseoyola | 5:41f28ce7f5a9 | 110 | |
joseoyola | 5:41f28ce7f5a9 | 111 | void updateLEDs(bool on) { |
joseoyola | 5:41f28ce7f5a9 | 112 | //Panel 1 |
joseoyola | 5:41f28ce7f5a9 | 113 | if(pos[Y] == 0) { |
joseoyola | 5:41f28ce7f5a9 | 114 | for(int i = pos[X]; i < pos[X] + size; i++) { |
joseoyola | 5:41f28ce7f5a9 | 115 | for(int j = pos[Z]; j < pos[Z] + size; j++) { |
joseoyola | 5:41f28ce7f5a9 | 116 | int led = getLedIndex(PANEL1, i, j); |
joseoyola | 5:41f28ce7f5a9 | 117 | if(on) { |
joseoyola | 5:41f28ce7f5a9 | 118 | ledStrip1(led, r, g, b); |
joseoyola | 5:41f28ce7f5a9 | 119 | } else { |
joseoyola | 5:41f28ce7f5a9 | 120 | ledStrip1(led, 0, 0, 0); |
joseoyola | 5:41f28ce7f5a9 | 121 | } |
joseoyola | 5:41f28ce7f5a9 | 122 | } |
joseoyola | 5:41f28ce7f5a9 | 123 | } |
joseoyola | 5:41f28ce7f5a9 | 124 | } |
joseoyola | 5:41f28ce7f5a9 | 125 | |
joseoyola | 5:41f28ce7f5a9 | 126 | //Panel 2 |
joseoyola | 8:c06f5046c9f7 | 127 | if(pos[X] + size == (nCOLs - 1)) { |
joseoyola | 8:c06f5046c9f7 | 128 | for(int i = pos[Y]; i < pos[Y] + size; i++) { |
joseoyola | 5:41f28ce7f5a9 | 129 | for(int j = pos[Z]; j < pos[Z] + size; j++) { |
joseoyola | 8:c06f5046c9f7 | 130 | int led = getLedIndex(PANEL2, i, j); |
joseoyola | 5:41f28ce7f5a9 | 131 | if(on) { |
joseoyola | 8:c06f5046c9f7 | 132 | ledStrip2(led, r, g, b); |
joseoyola | 5:41f28ce7f5a9 | 133 | } else { |
joseoyola | 8:c06f5046c9f7 | 134 | ledStrip2(led, 0, 0, 0); |
joseoyola | 8:c06f5046c9f7 | 135 | } |
joseoyola | 8:c06f5046c9f7 | 136 | } |
joseoyola | 8:c06f5046c9f7 | 137 | } |
joseoyola | 8:c06f5046c9f7 | 138 | } |
joseoyola | 8:c06f5046c9f7 | 139 | |
joseoyola | 8:c06f5046c9f7 | 140 | //Panel 3 |
joseoyola | 8:c06f5046c9f7 | 141 | if(pos[Z] + size == (nCOLs - 1)) { |
joseoyola | 8:c06f5046c9f7 | 142 | for(int i = pos[X]; i < pos[X] + size; i++) { |
joseoyola | 8:c06f5046c9f7 | 143 | for(int j = pos[Y]; j < pos[Y] + size; j++) { |
joseoyola | 8:c06f5046c9f7 | 144 | int led = getLedIndex(PANEL3, i, j); |
joseoyola | 8:c06f5046c9f7 | 145 | if(on) { |
joseoyola | 8:c06f5046c9f7 | 146 | ledStrip3(led, r, g, b); |
joseoyola | 8:c06f5046c9f7 | 147 | } else { |
joseoyola | 8:c06f5046c9f7 | 148 | ledStrip3(led, 0, 0, 0); |
joseoyola | 5:41f28ce7f5a9 | 149 | } |
joseoyola | 5:41f28ce7f5a9 | 150 | } |
joseoyola | 5:41f28ce7f5a9 | 151 | } |
joseoyola | 5:41f28ce7f5a9 | 152 | } |
joseoyola | 5:41f28ce7f5a9 | 153 | } |
joseoyola | 5:41f28ce7f5a9 | 154 | |
joseoyola | 5:41f28ce7f5a9 | 155 | |
joseoyola | 5:41f28ce7f5a9 | 156 | |
joseoyola | 5:41f28ce7f5a9 | 157 | |
joseoyola | 8:c06f5046c9f7 | 158 | |
joseoyola | 8:c06f5046c9f7 | 159 | |
joseoyola | 8:c06f5046c9f7 | 160 | static int getLedIndex(int panel, int x, int y) { |
joseoyola | 8:c06f5046c9f7 | 161 | if (panel == PANEL1) { |
joseoyola | 8:c06f5046c9f7 | 162 | if (y % 2 == 0) { |
joseoyola | 8:c06f5046c9f7 | 163 | return nCOLs*2 * y + x; |
joseoyola | 8:c06f5046c9f7 | 164 | } |
joseoyola | 8:c06f5046c9f7 | 165 | else { |
joseoyola | 8:c06f5046c9f7 | 166 | return nCOLs*2 * y + nCOLs + ((nCOLs - 1) - x); |
joseoyola | 8:c06f5046c9f7 | 167 | } |
joseoyola | 5:41f28ce7f5a9 | 168 | } |
joseoyola | 8:c06f5046c9f7 | 169 | |
joseoyola | 8:c06f5046c9f7 | 170 | if (panel == PANEL2) { |
joseoyola | 8:c06f5046c9f7 | 171 | if (y % 2 == 0) { |
joseoyola | 8:c06f5046c9f7 | 172 | return nCOLs*2 * y + nCOLs + x; |
joseoyola | 8:c06f5046c9f7 | 173 | } |
joseoyola | 8:c06f5046c9f7 | 174 | else { |
joseoyola | 8:c06f5046c9f7 | 175 | return nCOLs*2 * y + ((nCOLs - 1) - x); |
joseoyola | 8:c06f5046c9f7 | 176 | } |
joseoyola | 5:41f28ce7f5a9 | 177 | } |
joseoyola | 8:c06f5046c9f7 | 178 | |
joseoyola | 8:c06f5046c9f7 | 179 | if (panel == PANEL3) { |
joseoyola | 8:c06f5046c9f7 | 180 | if (y % 2 == 0) { |
joseoyola | 8:c06f5046c9f7 | 181 | return nCOLs * y + x; |
joseoyola | 8:c06f5046c9f7 | 182 | } |
joseoyola | 8:c06f5046c9f7 | 183 | else { |
joseoyola | 8:c06f5046c9f7 | 184 | return nCOLs * y + ((nCOLs - 1) - x); |
joseoyola | 8:c06f5046c9f7 | 185 | } |
joseoyola | 8:c06f5046c9f7 | 186 | } |
joseoyola | 8:c06f5046c9f7 | 187 | |
joseoyola | 8:c06f5046c9f7 | 188 | else return -1; |
joseoyola | 5:41f28ce7f5a9 | 189 | } |
joseoyola | 5:41f28ce7f5a9 | 190 | |
joseoyola | 8:c06f5046c9f7 | 191 | /* |
joseoyola | 5:41f28ce7f5a9 | 192 | static void move( int delta_x, int delta_y, int old_size, int new_size) |
joseoyola | 5:41f28ce7f5a9 | 193 | { |
joseoyola | 5:41f28ce7f5a9 | 194 | for( int i = pos_y; i < pos_y + old_size; i++){ |
joseoyola | 5:41f28ce7f5a9 | 195 | for( int j= pos_x; j < pos_x + old_size; j++){ |
joseoyola | 5:41f28ce7f5a9 | 196 | int pos_off = matrixtolinear(i,j); |
joseoyola | 5:41f28ce7f5a9 | 197 | if( pos_off >= nLEDs){lightStrip2.setPixelColor(pos_off-nLEDs, 0, 0, 0);} |
joseoyola | 5:41f28ce7f5a9 | 198 | else |
joseoyola | 5:41f28ce7f5a9 | 199 | {lightStrip1.setPixelColor(pos_off, 0, 0, 0);} |
joseoyola | 5:41f28ce7f5a9 | 200 | |
joseoyola | 5:41f28ce7f5a9 | 201 | } |
joseoyola | 5:41f28ce7f5a9 | 202 | } |
joseoyola | 5:41f28ce7f5a9 | 203 | if ( (pos_y + (new_size-1) + delta_y < nROWs) && (pos_y + delta_y ) >= 0 ) { |
joseoyola | 5:41f28ce7f5a9 | 204 | pos_y = pos_y + delta_y;} |
joseoyola | 5:41f28ce7f5a9 | 205 | if ( (pos_x + (new_size-1) + delta_x < nCOLs ) && (pos_x + delta_x ) >= 0) { |
joseoyola | 5:41f28ce7f5a9 | 206 | pos_x = pos_x + delta_x;} |
joseoyola | 5:41f28ce7f5a9 | 207 | |
joseoyola | 5:41f28ce7f5a9 | 208 | for( int i = pos_y; i < pos_y + new_size; i++){ |
joseoyola | 5:41f28ce7f5a9 | 209 | for( int j= pos_x; j < pos_x + new_size; j++){ |
joseoyola | 5:41f28ce7f5a9 | 210 | int pos_on = matrixtolinear(i,j); |
joseoyola | 5:41f28ce7f5a9 | 211 | if( pos_on >= nLEDs){lightStrip2.setPixelColor(pos_on-nLEDs, 0, g, 0);} |
joseoyola | 5:41f28ce7f5a9 | 212 | else |
joseoyola | 5:41f28ce7f5a9 | 213 | {lightStrip1.setPixelColor(pos_on, 0, g, 0);} |
joseoyola | 5:41f28ce7f5a9 | 214 | } |
joseoyola | 5:41f28ce7f5a9 | 215 | } |
joseoyola | 5:41f28ce7f5a9 | 216 | |
joseoyola | 5:41f28ce7f5a9 | 217 | lightStrip1.show(); |
joseoyola | 5:41f28ce7f5a9 | 218 | lightStrip2.show(); |
joseoyola | 5:41f28ce7f5a9 | 219 | lightStrip1.startDMA(); |
joseoyola | 5:41f28ce7f5a9 | 220 | lightStrip2.startDMA(); |
joseoyola | 5:41f28ce7f5a9 | 221 | } |
joseoyola | 8:c06f5046c9f7 | 222 | */ |