zz
Dependencies: WS2812 PixelArray final_project
main.cpp@0:c96221a59771, 2019-06-16 (annotated)
- Committer:
- kimhyunjun
- Date:
- Sun Jun 16 17:35:35 2019 +0000
- Revision:
- 0:c96221a59771
aaa
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kimhyunjun | 0:c96221a59771 | 1 | #include "mbed.h" |
kimhyunjun | 0:c96221a59771 | 2 | #include "WS2812.h" |
kimhyunjun | 0:c96221a59771 | 3 | #include "PixelArray.h" |
kimhyunjun | 0:c96221a59771 | 4 | #include "Adafruit_SSD1306.h" |
kimhyunjun | 0:c96221a59771 | 5 | |
kimhyunjun | 0:c96221a59771 | 6 | #include "time.h" |
kimhyunjun | 0:c96221a59771 | 7 | |
kimhyunjun | 0:c96221a59771 | 8 | #define LOW 0 |
kimhyunjun | 0:c96221a59771 | 9 | #define HIGH 1 |
kimhyunjun | 0:c96221a59771 | 10 | #define KEY2 0x18 //Key:2 |
kimhyunjun | 0:c96221a59771 | 11 | #define KEY7 0x42 //Key:2 |
kimhyunjun | 0:c96221a59771 | 12 | #define KEY9 0x4A //Key:2 |
kimhyunjun | 0:c96221a59771 | 13 | #define KEY8 0x52 //Key:8 |
kimhyunjun | 0:c96221a59771 | 14 | #define KEY4 0x08 //Key:4 |
kimhyunjun | 0:c96221a59771 | 15 | #define KEY6 0x5A //Key:6 |
kimhyunjun | 0:c96221a59771 | 16 | #define KEY1 0x0C //Key:1 |
kimhyunjun | 0:c96221a59771 | 17 | #define KEY3 0x5E //Key:3 |
kimhyunjun | 0:c96221a59771 | 18 | #define KEY5 0x1C //Key:5 |
kimhyunjun | 0:c96221a59771 | 19 | #define Repeat 0xFF //press and hold the key |
kimhyunjun | 0:c96221a59771 | 20 | #define Minus 0x07; |
kimhyunjun | 0:c96221a59771 | 21 | #define Plus 0x15; |
kimhyunjun | 0:c96221a59771 | 22 | #define PIN 7 |
kimhyunjun | 0:c96221a59771 | 23 | |
kimhyunjun | 0:c96221a59771 | 24 | |
kimhyunjun | 0:c96221a59771 | 25 | #define WS2812_BUF 77 //number of LEDs in the array |
kimhyunjun | 0:c96221a59771 | 26 | #define NUM_COLORS 6 //number of colors to store in the array |
kimhyunjun | 0:c96221a59771 | 27 | #define NUM_STEPS 8 //number of steps between colors |
kimhyunjun | 0:c96221a59771 | 28 | #define I2C_ADDR (0x20) |
kimhyunjun | 0:c96221a59771 | 29 | |
kimhyunjun | 0:c96221a59771 | 30 | //사용 중인 핀 : D4, D5, D6, D7, D9, D10, D11, D12, D13, D14, D15 |
kimhyunjun | 0:c96221a59771 | 31 | // A0, A1, A2, A3 |
kimhyunjun | 0:c96221a59771 | 32 | PixelArray px(WS2812_BUF); |
kimhyunjun | 0:c96221a59771 | 33 | //WS2812 ws(D7, WS2812_BUF, 0, 5, 5, 0); |
kimhyunjun | 0:c96221a59771 | 34 | WS2812 ws(D7, WS2812_BUF, 6,17,9,14); //nucleo-f411re |
kimhyunjun | 0:c96221a59771 | 35 | |
kimhyunjun | 0:c96221a59771 | 36 | //HCSR04 sensor(D3, D2,pc,0.5); |
kimhyunjun | 0:c96221a59771 | 37 | DigitalIn IR(D4); |
kimhyunjun | 0:c96221a59771 | 38 | InterruptIn remote(D4); |
kimhyunjun | 0:c96221a59771 | 39 | SPI spi(D11, D12, D13); |
kimhyunjun | 0:c96221a59771 | 40 | DigitalOut spi_cs(D10,1); |
kimhyunjun | 0:c96221a59771 | 41 | I2C i2c(I2C_SDA, I2C_SCL); |
kimhyunjun | 0:c96221a59771 | 42 | Adafruit_SSD1306_I2c myOled(i2c, D9, 0x78, 64, 128); |
kimhyunjun | 0:c96221a59771 | 43 | |
kimhyunjun | 0:c96221a59771 | 44 | |
kimhyunjun | 0:c96221a59771 | 45 | PwmOut PWMA(D6); //left motor speed |
kimhyunjun | 0:c96221a59771 | 46 | PwmOut PWMB(D5); //right motor speed |
kimhyunjun | 0:c96221a59771 | 47 | DigitalOut AIN1(A1); //Mortor-L backward |
kimhyunjun | 0:c96221a59771 | 48 | DigitalOut AIN2(A0); //Motor-L forward |
kimhyunjun | 0:c96221a59771 | 49 | DigitalOut BIN1(A2); //Mortor-R forward |
kimhyunjun | 0:c96221a59771 | 50 | DigitalOut BIN2(A3); //Mortor-R backward |
kimhyunjun | 0:c96221a59771 | 51 | |
kimhyunjun | 0:c96221a59771 | 52 | |
kimhyunjun | 0:c96221a59771 | 53 | int printflag = 0; |
kimhyunjun | 0:c96221a59771 | 54 | int value=0; |
kimhyunjun | 0:c96221a59771 | 55 | int index=0; |
kimhyunjun | 0:c96221a59771 | 56 | int lspeed = 2000; |
kimhyunjun | 0:c96221a59771 | 57 | int rspeed = 2000; |
kimhyunjun | 0:c96221a59771 | 58 | int speed=2000; |
kimhyunjun | 0:c96221a59771 | 59 | int leftcnt = 0; |
kimhyunjun | 0:c96221a59771 | 60 | int oledflag=0; |
kimhyunjun | 0:c96221a59771 | 61 | int values[] = {0,0,0,0,0}; |
kimhyunjun | 0:c96221a59771 | 62 | int whiteMin[]={1000,1000,1000,1000,1000}; |
kimhyunjun | 0:c96221a59771 | 63 | int blackMax[]={0,0,0,0,0}; |
kimhyunjun | 0:c96221a59771 | 64 | int distancecnt=0; |
kimhyunjun | 0:c96221a59771 | 65 | int stopcnt = 0; |
kimhyunjun | 0:c96221a59771 | 66 | int exitcnt =0; |
kimhyunjun | 0:c96221a59771 | 67 | |
kimhyunjun | 0:c96221a59771 | 68 | int driveflag=0; |
kimhyunjun | 0:c96221a59771 | 69 | volatile int flag; |
kimhyunjun | 0:c96221a59771 | 70 | volatile int TRflag=0; |
kimhyunjun | 0:c96221a59771 | 71 | |
kimhyunjun | 0:c96221a59771 | 72 | char IR_decode(unsigned char * code, unsigned char * result1,unsigned char * result2,unsigned char * result3); |
kimhyunjun | 0:c96221a59771 | 73 | |
kimhyunjun | 0:c96221a59771 | 74 | unsigned char results; |
kimhyunjun | 0:c96221a59771 | 75 | unsigned char results1; |
kimhyunjun | 0:c96221a59771 | 76 | unsigned char results2; |
kimhyunjun | 0:c96221a59771 | 77 | unsigned char results3; |
kimhyunjun | 0:c96221a59771 | 78 | |
kimhyunjun | 0:c96221a59771 | 79 | void IR_interrupt(); |
kimhyunjun | 0:c96221a59771 | 80 | void translateIR(); |
kimhyunjun | 0:c96221a59771 | 81 | |
kimhyunjun | 0:c96221a59771 | 82 | |
kimhyunjun | 0:c96221a59771 | 83 | int s=1000; |
kimhyunjun | 0:c96221a59771 | 84 | void forward(int s); |
kimhyunjun | 0:c96221a59771 | 85 | void backward(int s); |
kimhyunjun | 0:c96221a59771 | 86 | void right(int s); |
kimhyunjun | 0:c96221a59771 | 87 | void left(int s); |
kimhyunjun | 0:c96221a59771 | 88 | |
kimhyunjun | 0:c96221a59771 | 89 | void stop(); |
kimhyunjun | 0:c96221a59771 | 90 | void setting(); |
kimhyunjun | 0:c96221a59771 | 91 | void rx_ISR(void); |
kimhyunjun | 0:c96221a59771 | 92 | void whiteTR(); |
kimhyunjun | 0:c96221a59771 | 93 | void blackTR(); |
kimhyunjun | 0:c96221a59771 | 94 | |
kimhyunjun | 0:c96221a59771 | 95 | |
kimhyunjun | 0:c96221a59771 | 96 | unsigned long n = 0; |
kimhyunjun | 0:c96221a59771 | 97 | |
kimhyunjun | 0:c96221a59771 | 98 | int color_set(uint8_t red,uint8_t green, uint8_t blue) |
kimhyunjun | 0:c96221a59771 | 99 | { |
kimhyunjun | 0:c96221a59771 | 100 | return ((red<<16) + (green<<8) + blue); |
kimhyunjun | 0:c96221a59771 | 101 | } |
kimhyunjun | 0:c96221a59771 | 102 | |
kimhyunjun | 0:c96221a59771 | 103 | // 0 <= stepNumber <= lastStepNumber |
kimhyunjun | 0:c96221a59771 | 104 | int interpolate(int startValue, int endValue, int stepNumber, int lastStepNumber)// |
kimhyunjun | 0:c96221a59771 | 105 | { |
kimhyunjun | 0:c96221a59771 | 106 | return (endValue - startValue) * stepNumber / lastStepNumber + startValue; |
kimhyunjun | 0:c96221a59771 | 107 | } |
kimhyunjun | 0:c96221a59771 | 108 | |
kimhyunjun | 0:c96221a59771 | 109 | |
kimhyunjun | 0:c96221a59771 | 110 | int main(void) |
kimhyunjun | 0:c96221a59771 | 111 | { |
kimhyunjun | 0:c96221a59771 | 112 | |
kimhyunjun | 0:c96221a59771 | 113 | int colorIdx = 0; |
kimhyunjun | 0:c96221a59771 | 114 | int colorTo = 0; |
kimhyunjun | 0:c96221a59771 | 115 | int colorFrom = 0; |
kimhyunjun | 0:c96221a59771 | 116 | |
kimhyunjun | 0:c96221a59771 | 117 | uint8_t ir = 0; |
kimhyunjun | 0:c96221a59771 | 118 | uint8_t ig = 0; |
kimhyunjun | 0:c96221a59771 | 119 | uint8_t ib = 0; |
kimhyunjun | 0:c96221a59771 | 120 | |
kimhyunjun | 0:c96221a59771 | 121 | clock_t start, end; |
kimhyunjun | 0:c96221a59771 | 122 | //LED제어///////////////////////////////////////////////////////////////////////////////////// |
kimhyunjun | 0:c96221a59771 | 123 | ws.useII(WS2812::PER_PIXEL); // use per-pixel intensity scaling |
kimhyunjun | 0:c96221a59771 | 124 | int colorbuf[NUM_COLORS] = {0x2f0000,0x2f2f00,0x002f00,0x002f2f}; |
kimhyunjun | 0:c96221a59771 | 125 | |
kimhyunjun | 0:c96221a59771 | 126 | |
kimhyunjun | 0:c96221a59771 | 127 | |
kimhyunjun | 0:c96221a59771 | 128 | |
kimhyunjun | 0:c96221a59771 | 129 | // sensor.setMode(true); |
kimhyunjun | 0:c96221a59771 | 130 | remote.fall(&IR_interrupt); |
kimhyunjun | 0:c96221a59771 | 131 | setting(); |
kimhyunjun | 0:c96221a59771 | 132 | spi.format(16,0); |
kimhyunjun | 0:c96221a59771 | 133 | spi.frequency(2000000); |
kimhyunjun | 0:c96221a59771 | 134 | while(driveflag<2) |
kimhyunjun | 0:c96221a59771 | 135 | { |
kimhyunjun | 0:c96221a59771 | 136 | if(results == KEY7 && TRflag ==1) |
kimhyunjun | 0:c96221a59771 | 137 | { |
kimhyunjun | 0:c96221a59771 | 138 | whiteTR(); |
kimhyunjun | 0:c96221a59771 | 139 | printf("=======================================================\r\n"); |
kimhyunjun | 0:c96221a59771 | 140 | wait_us(21); |
kimhyunjun | 0:c96221a59771 | 141 | driveflag++; |
kimhyunjun | 0:c96221a59771 | 142 | |
kimhyunjun | 0:c96221a59771 | 143 | } |
kimhyunjun | 0:c96221a59771 | 144 | |
kimhyunjun | 0:c96221a59771 | 145 | if(results == KEY9 && TRflag ==1) |
kimhyunjun | 0:c96221a59771 | 146 | { |
kimhyunjun | 0:c96221a59771 | 147 | blackTR(); |
kimhyunjun | 0:c96221a59771 | 148 | printf("=======================================================\r\n"); |
kimhyunjun | 0:c96221a59771 | 149 | wait_us(21); |
kimhyunjun | 0:c96221a59771 | 150 | driveflag++; |
kimhyunjun | 0:c96221a59771 | 151 | |
kimhyunjun | 0:c96221a59771 | 152 | } |
kimhyunjun | 0:c96221a59771 | 153 | } |
kimhyunjun | 0:c96221a59771 | 154 | while(driveflag<3){ wait(1);} |
kimhyunjun | 0:c96221a59771 | 155 | start=clock(); |
kimhyunjun | 0:c96221a59771 | 156 | myOled.printf("\n\n\nRun!"); |
kimhyunjun | 0:c96221a59771 | 157 | myOled.display(); |
kimhyunjun | 0:c96221a59771 | 158 | |
kimhyunjun | 0:c96221a59771 | 159 | while(1) |
kimhyunjun | 0:c96221a59771 | 160 | { |
kimhyunjun | 0:c96221a59771 | 161 | for(int i=0; i<6; i++) |
kimhyunjun | 0:c96221a59771 | 162 | { |
kimhyunjun | 0:c96221a59771 | 163 | spi_cs=0; |
kimhyunjun | 0:c96221a59771 | 164 | wait_us(2); |
kimhyunjun | 0:c96221a59771 | 165 | value=spi.write(i<<12); |
kimhyunjun | 0:c96221a59771 | 166 | spi_cs=1; |
kimhyunjun | 0:c96221a59771 | 167 | wait_us(21); |
kimhyunjun | 0:c96221a59771 | 168 | value=value>>6; |
kimhyunjun | 0:c96221a59771 | 169 | if(i>0 && i<6) |
kimhyunjun | 0:c96221a59771 | 170 | { |
kimhyunjun | 0:c96221a59771 | 171 | values[5-i]=value; |
kimhyunjun | 0:c96221a59771 | 172 | } |
kimhyunjun | 0:c96221a59771 | 173 | |
kimhyunjun | 0:c96221a59771 | 174 | } |
kimhyunjun | 0:c96221a59771 | 175 | |
kimhyunjun | 0:c96221a59771 | 176 | |
kimhyunjun | 0:c96221a59771 | 177 | if(values[0]*0.8<blackMax[0] &&values[1]*0.8<blackMax[1] &&values[2]*0.8<blackMax[2] &&values[3]*0.8<blackMax[3] && values[4]*0.8<blackMax[4]) |
kimhyunjun | 0:c96221a59771 | 178 | { |
kimhyunjun | 0:c96221a59771 | 179 | backward(1800); |
kimhyunjun | 0:c96221a59771 | 180 | forward(2300); |
kimhyunjun | 0:c96221a59771 | 181 | stopcnt++; |
kimhyunjun | 0:c96221a59771 | 182 | if(stopcnt>20) |
kimhyunjun | 0:c96221a59771 | 183 | { |
kimhyunjun | 0:c96221a59771 | 184 | stop(); |
kimhyunjun | 0:c96221a59771 | 185 | wait(3); |
kimhyunjun | 0:c96221a59771 | 186 | end=clock(); |
kimhyunjun | 0:c96221a59771 | 187 | if(oledflag==0) |
kimhyunjun | 0:c96221a59771 | 188 | { |
kimhyunjun | 0:c96221a59771 | 189 | myOled.printf("\rDriving time: %.2f",((float)(end-start)/CLOCKS_PER_SEC)); |
kimhyunjun | 0:c96221a59771 | 190 | myOled.display(); |
kimhyunjun | 0:c96221a59771 | 191 | oledflag=1; |
kimhyunjun | 0:c96221a59771 | 192 | } |
kimhyunjun | 0:c96221a59771 | 193 | break; |
kimhyunjun | 0:c96221a59771 | 194 | } |
kimhyunjun | 0:c96221a59771 | 195 | } |
kimhyunjun | 0:c96221a59771 | 196 | else if(values[4]*0.7<blackMax[4] && values[0]*1.2>whiteMin[0]) |
kimhyunjun | 0:c96221a59771 | 197 | { |
kimhyunjun | 0:c96221a59771 | 198 | stopcnt=0; |
kimhyunjun | 0:c96221a59771 | 199 | forward(2300); |
kimhyunjun | 0:c96221a59771 | 200 | left(2300); |
kimhyunjun | 0:c96221a59771 | 201 | } |
kimhyunjun | 0:c96221a59771 | 202 | else if(values[0]*0.7<blackMax[0]&& values[4]*1.2>whiteMin[4]) |
kimhyunjun | 0:c96221a59771 | 203 | { |
kimhyunjun | 0:c96221a59771 | 204 | stopcnt=0; |
kimhyunjun | 0:c96221a59771 | 205 | forward(2300); |
kimhyunjun | 0:c96221a59771 | 206 | right(2300); |
kimhyunjun | 0:c96221a59771 | 207 | |
kimhyunjun | 0:c96221a59771 | 208 | } |
kimhyunjun | 0:c96221a59771 | 209 | |
kimhyunjun | 0:c96221a59771 | 210 | else{ |
kimhyunjun | 0:c96221a59771 | 211 | stopcnt=0; |
kimhyunjun | 0:c96221a59771 | 212 | forward(2300); |
kimhyunjun | 0:c96221a59771 | 213 | } |
kimhyunjun | 0:c96221a59771 | 214 | |
kimhyunjun | 0:c96221a59771 | 215 | |
kimhyunjun | 0:c96221a59771 | 216 | } |
kimhyunjun | 0:c96221a59771 | 217 | while(1) |
kimhyunjun | 0:c96221a59771 | 218 | { |
kimhyunjun | 0:c96221a59771 | 219 | std::size_t c1 = colorbuf[colorFrom]; |
kimhyunjun | 0:c96221a59771 | 220 | std::size_t r1 = (c1 & 0xff0000) >> 16; |
kimhyunjun | 0:c96221a59771 | 221 | std::size_t g1 = (c1 & 0x00ff00) >> 8; |
kimhyunjun | 0:c96221a59771 | 222 | std::size_t b1 = (c1 & 0x0000ff); |
kimhyunjun | 0:c96221a59771 | 223 | |
kimhyunjun | 0:c96221a59771 | 224 | //get ending RGB components for interpolation |
kimhyunjun | 0:c96221a59771 | 225 | std::size_t c2 = colorbuf[colorTo]; |
kimhyunjun | 0:c96221a59771 | 226 | std::size_t r2 = (c2 & 0xff0000) >> 16; |
kimhyunjun | 0:c96221a59771 | 227 | std::size_t g2 = (c2 & 0x00ff00) >> 8; |
kimhyunjun | 0:c96221a59771 | 228 | std::size_t b2 = (c2 & 0x0000ff); |
kimhyunjun | 0:c96221a59771 | 229 | |
kimhyunjun | 0:c96221a59771 | 230 | for (int i = 0; i <= NUM_STEPS; i++) |
kimhyunjun | 0:c96221a59771 | 231 | { |
kimhyunjun | 0:c96221a59771 | 232 | ir = interpolate(r1, r2, i, NUM_STEPS); |
kimhyunjun | 0:c96221a59771 | 233 | ig = interpolate(g1, g2, i, NUM_STEPS); |
kimhyunjun | 0:c96221a59771 | 234 | ib = interpolate(b1, b2, i, NUM_STEPS); |
kimhyunjun | 0:c96221a59771 | 235 | |
kimhyunjun | 0:c96221a59771 | 236 | //write the color value for each pixel |
kimhyunjun | 0:c96221a59771 | 237 | px.SetAll(color_set(ir,ig,ib)); |
kimhyunjun | 0:c96221a59771 | 238 | |
kimhyunjun | 0:c96221a59771 | 239 | //write the II value for each pixel |
kimhyunjun | 0:c96221a59771 | 240 | px.SetAllI(32); |
kimhyunjun | 0:c96221a59771 | 241 | |
kimhyunjun | 0:c96221a59771 | 242 | for (int i = WS2812_BUF; i >= 0; i--) |
kimhyunjun | 0:c96221a59771 | 243 | { |
kimhyunjun | 0:c96221a59771 | 244 | ws.write(px.getBuf()); |
kimhyunjun | 0:c96221a59771 | 245 | } |
kimhyunjun | 0:c96221a59771 | 246 | } |
kimhyunjun | 0:c96221a59771 | 247 | // |
kimhyunjun | 0:c96221a59771 | 248 | colorFrom = colorIdx; |
kimhyunjun | 0:c96221a59771 | 249 | colorIdx++; |
kimhyunjun | 0:c96221a59771 | 250 | |
kimhyunjun | 0:c96221a59771 | 251 | if (colorIdx >= NUM_COLORS) |
kimhyunjun | 0:c96221a59771 | 252 | { |
kimhyunjun | 0:c96221a59771 | 253 | colorIdx = 0; |
kimhyunjun | 0:c96221a59771 | 254 | } |
kimhyunjun | 0:c96221a59771 | 255 | |
kimhyunjun | 0:c96221a59771 | 256 | colorTo = colorIdx; |
kimhyunjun | 0:c96221a59771 | 257 | wait(1); |
kimhyunjun | 0:c96221a59771 | 258 | } |
kimhyunjun | 0:c96221a59771 | 259 | } |
kimhyunjun | 0:c96221a59771 | 260 | |
kimhyunjun | 0:c96221a59771 | 261 | void whiteTR() |
kimhyunjun | 0:c96221a59771 | 262 | { |
kimhyunjun | 0:c96221a59771 | 263 | whiteMin[0]=1000; |
kimhyunjun | 0:c96221a59771 | 264 | whiteMin[1]=1000; |
kimhyunjun | 0:c96221a59771 | 265 | whiteMin[2]=1000; |
kimhyunjun | 0:c96221a59771 | 266 | whiteMin[3]=1000; |
kimhyunjun | 0:c96221a59771 | 267 | whiteMin[4]=1000; |
kimhyunjun | 0:c96221a59771 | 268 | for(int j=0; j<100;j++) |
kimhyunjun | 0:c96221a59771 | 269 | { |
kimhyunjun | 0:c96221a59771 | 270 | for(int i=0; i<7; i++) |
kimhyunjun | 0:c96221a59771 | 271 | { |
kimhyunjun | 0:c96221a59771 | 272 | spi_cs=0; |
kimhyunjun | 0:c96221a59771 | 273 | wait_us(2); |
kimhyunjun | 0:c96221a59771 | 274 | value=spi.write(i<<12); |
kimhyunjun | 0:c96221a59771 | 275 | spi_cs=1; |
kimhyunjun | 0:c96221a59771 | 276 | wait_us(21); |
kimhyunjun | 0:c96221a59771 | 277 | value=value>>6; |
kimhyunjun | 0:c96221a59771 | 278 | if(i>0 && i<6) |
kimhyunjun | 0:c96221a59771 | 279 | { |
kimhyunjun | 0:c96221a59771 | 280 | if(value<whiteMin[5-i]) whiteMin[5-i]=value/1.4; |
kimhyunjun | 0:c96221a59771 | 281 | |
kimhyunjun | 0:c96221a59771 | 282 | } |
kimhyunjun | 0:c96221a59771 | 283 | } |
kimhyunjun | 0:c96221a59771 | 284 | } |
kimhyunjun | 0:c96221a59771 | 285 | TRflag=0; |
kimhyunjun | 0:c96221a59771 | 286 | } |
kimhyunjun | 0:c96221a59771 | 287 | |
kimhyunjun | 0:c96221a59771 | 288 | void blackTR() |
kimhyunjun | 0:c96221a59771 | 289 | { |
kimhyunjun | 0:c96221a59771 | 290 | blackMax[0]=0; |
kimhyunjun | 0:c96221a59771 | 291 | blackMax[1]=0; |
kimhyunjun | 0:c96221a59771 | 292 | blackMax[2]=0; |
kimhyunjun | 0:c96221a59771 | 293 | blackMax[3]=0; |
kimhyunjun | 0:c96221a59771 | 294 | blackMax[4]=0; |
kimhyunjun | 0:c96221a59771 | 295 | for(int j=0; j<100;j++) |
kimhyunjun | 0:c96221a59771 | 296 | { |
kimhyunjun | 0:c96221a59771 | 297 | for(int i=0; i<7; i++) |
kimhyunjun | 0:c96221a59771 | 298 | { |
kimhyunjun | 0:c96221a59771 | 299 | spi_cs=0; |
kimhyunjun | 0:c96221a59771 | 300 | wait_us(2); |
kimhyunjun | 0:c96221a59771 | 301 | value=spi.write(i<<12); |
kimhyunjun | 0:c96221a59771 | 302 | spi_cs=1; |
kimhyunjun | 0:c96221a59771 | 303 | wait_us(21); |
kimhyunjun | 0:c96221a59771 | 304 | value=value>>6; |
kimhyunjun | 0:c96221a59771 | 305 | if(i>0 && i<6) |
kimhyunjun | 0:c96221a59771 | 306 | { |
kimhyunjun | 0:c96221a59771 | 307 | if(value>blackMax[5-i]) blackMax[5-i]=value*1.7; |
kimhyunjun | 0:c96221a59771 | 308 | |
kimhyunjun | 0:c96221a59771 | 309 | } |
kimhyunjun | 0:c96221a59771 | 310 | } |
kimhyunjun | 0:c96221a59771 | 311 | } |
kimhyunjun | 0:c96221a59771 | 312 | TRflag=0; |
kimhyunjun | 0:c96221a59771 | 313 | } |
kimhyunjun | 0:c96221a59771 | 314 | |
kimhyunjun | 0:c96221a59771 | 315 | void translateIR() |
kimhyunjun | 0:c96221a59771 | 316 | { |
kimhyunjun | 0:c96221a59771 | 317 | switch(results) |
kimhyunjun | 0:c96221a59771 | 318 | { |
kimhyunjun | 0:c96221a59771 | 319 | case KEY1: |
kimhyunjun | 0:c96221a59771 | 320 | driveflag++; |
kimhyunjun | 0:c96221a59771 | 321 | return; |
kimhyunjun | 0:c96221a59771 | 322 | case KEY2: |
kimhyunjun | 0:c96221a59771 | 323 | forward(1500); |
kimhyunjun | 0:c96221a59771 | 324 | return; |
kimhyunjun | 0:c96221a59771 | 325 | case KEY3: |
kimhyunjun | 0:c96221a59771 | 326 | lspeed-=50; |
kimhyunjun | 0:c96221a59771 | 327 | rspeed-=50; |
kimhyunjun | 0:c96221a59771 | 328 | PWMA.pulsewidth_us(lspeed); |
kimhyunjun | 0:c96221a59771 | 329 | PWMB.pulsewidth_us(rspeed); |
kimhyunjun | 0:c96221a59771 | 330 | return; |
kimhyunjun | 0:c96221a59771 | 331 | case KEY4: |
kimhyunjun | 0:c96221a59771 | 332 | left(1000); |
kimhyunjun | 0:c96221a59771 | 333 | return; |
kimhyunjun | 0:c96221a59771 | 334 | case KEY5: |
kimhyunjun | 0:c96221a59771 | 335 | stop(); |
kimhyunjun | 0:c96221a59771 | 336 | return; |
kimhyunjun | 0:c96221a59771 | 337 | case KEY6: |
kimhyunjun | 0:c96221a59771 | 338 | right(1000); |
kimhyunjun | 0:c96221a59771 | 339 | return; |
kimhyunjun | 0:c96221a59771 | 340 | case KEY7: |
kimhyunjun | 0:c96221a59771 | 341 | TRflag=1; |
kimhyunjun | 0:c96221a59771 | 342 | return; |
kimhyunjun | 0:c96221a59771 | 343 | case KEY8: |
kimhyunjun | 0:c96221a59771 | 344 | backward(1500); |
kimhyunjun | 0:c96221a59771 | 345 | return; |
kimhyunjun | 0:c96221a59771 | 346 | case KEY9: |
kimhyunjun | 0:c96221a59771 | 347 | TRflag = 1; |
kimhyunjun | 0:c96221a59771 | 348 | return; |
kimhyunjun | 0:c96221a59771 | 349 | |
kimhyunjun | 0:c96221a59771 | 350 | }// End Case |
kimhyunjun | 0:c96221a59771 | 351 | } |
kimhyunjun | 0:c96221a59771 | 352 | |
kimhyunjun | 0:c96221a59771 | 353 | char IR_decode(unsigned char * code, unsigned char * result1,unsigned char * result2,unsigned char * result3) |
kimhyunjun | 0:c96221a59771 | 354 | { |
kimhyunjun | 0:c96221a59771 | 355 | char flag = 0; |
kimhyunjun | 0:c96221a59771 | 356 | unsigned int count = 0; |
kimhyunjun | 0:c96221a59771 | 357 | unsigned char i, index, cnt = 0, data[4] = {0, 0, 0, 0}; |
kimhyunjun | 0:c96221a59771 | 358 | if (IR.read() == LOW) |
kimhyunjun | 0:c96221a59771 | 359 | { |
kimhyunjun | 0:c96221a59771 | 360 | count = 0; |
kimhyunjun | 0:c96221a59771 | 361 | while (IR.read() == LOW && count++ < 200) //9ms |
kimhyunjun | 0:c96221a59771 | 362 | wait_us(60); |
kimhyunjun | 0:c96221a59771 | 363 | count = 0; |
kimhyunjun | 0:c96221a59771 | 364 | while (IR.read() == HIGH && count++ < 80) //4.5ms |
kimhyunjun | 0:c96221a59771 | 365 | wait_us(60); |
kimhyunjun | 0:c96221a59771 | 366 | for (i = 0; i < 32; i++) |
kimhyunjun | 0:c96221a59771 | 367 | { |
kimhyunjun | 0:c96221a59771 | 368 | count = 0; |
kimhyunjun | 0:c96221a59771 | 369 | while (IR.read() == LOW && count++ < 15) //0.56ms |
kimhyunjun | 0:c96221a59771 | 370 | wait_us(60); |
kimhyunjun | 0:c96221a59771 | 371 | count = 0; |
kimhyunjun | 0:c96221a59771 | 372 | while (IR.read() == HIGH && count++ < 40) //0: 0.56ms; 1: 1.69ms |
kimhyunjun | 0:c96221a59771 | 373 | wait_us(60); |
kimhyunjun | 0:c96221a59771 | 374 | if (count > 20)data[index] |= (1 << cnt); |
kimhyunjun | 0:c96221a59771 | 375 | if (cnt == 7) |
kimhyunjun | 0:c96221a59771 | 376 | { |
kimhyunjun | 0:c96221a59771 | 377 | cnt = 0; |
kimhyunjun | 0:c96221a59771 | 378 | index++; |
kimhyunjun | 0:c96221a59771 | 379 | } |
kimhyunjun | 0:c96221a59771 | 380 | else cnt++; |
kimhyunjun | 0:c96221a59771 | 381 | } |
kimhyunjun | 0:c96221a59771 | 382 | if (data[0] + data[1] == Repeat && data[2] + data[3] == Repeat) //check |
kimhyunjun | 0:c96221a59771 | 383 | { |
kimhyunjun | 0:c96221a59771 | 384 | code[0] = data[2]; |
kimhyunjun | 0:c96221a59771 | 385 | result1[0] = data[3]; |
kimhyunjun | 0:c96221a59771 | 386 | result2[0] = data[0]; |
kimhyunjun | 0:c96221a59771 | 387 | result3[0] = data[1]; |
kimhyunjun | 0:c96221a59771 | 388 | printflag=1; |
kimhyunjun | 0:c96221a59771 | 389 | flag = 1; |
kimhyunjun | 0:c96221a59771 | 390 | translateIR(); |
kimhyunjun | 0:c96221a59771 | 391 | return flag; |
kimhyunjun | 0:c96221a59771 | 392 | } |
kimhyunjun | 0:c96221a59771 | 393 | if (data[0] == Repeat && data[1] == Repeat && data[2] == Repeat && data[3] == Repeat) |
kimhyunjun | 0:c96221a59771 | 394 | { |
kimhyunjun | 0:c96221a59771 | 395 | code[0] = Repeat; |
kimhyunjun | 0:c96221a59771 | 396 | flag = 1; |
kimhyunjun | 0:c96221a59771 | 397 | return flag; |
kimhyunjun | 0:c96221a59771 | 398 | } |
kimhyunjun | 0:c96221a59771 | 399 | } |
kimhyunjun | 0:c96221a59771 | 400 | return flag; |
kimhyunjun | 0:c96221a59771 | 401 | } |
kimhyunjun | 0:c96221a59771 | 402 | |
kimhyunjun | 0:c96221a59771 | 403 | void forward(int speed) |
kimhyunjun | 0:c96221a59771 | 404 | { |
kimhyunjun | 0:c96221a59771 | 405 | PWMA.pulsewidth_us(speed); |
kimhyunjun | 0:c96221a59771 | 406 | PWMB.pulsewidth_us(speed); |
kimhyunjun | 0:c96221a59771 | 407 | AIN1.write(0); |
kimhyunjun | 0:c96221a59771 | 408 | AIN2.write(1); |
kimhyunjun | 0:c96221a59771 | 409 | BIN1.write(0); |
kimhyunjun | 0:c96221a59771 | 410 | BIN2.write(1); |
kimhyunjun | 0:c96221a59771 | 411 | } |
kimhyunjun | 0:c96221a59771 | 412 | |
kimhyunjun | 0:c96221a59771 | 413 | void backward(int s) |
kimhyunjun | 0:c96221a59771 | 414 | { |
kimhyunjun | 0:c96221a59771 | 415 | PWMA.pulsewidth_us(s); |
kimhyunjun | 0:c96221a59771 | 416 | PWMB.pulsewidth_us(s); |
kimhyunjun | 0:c96221a59771 | 417 | AIN1.write(1); |
kimhyunjun | 0:c96221a59771 | 418 | AIN2.write(0); |
kimhyunjun | 0:c96221a59771 | 419 | BIN1.write(1); |
kimhyunjun | 0:c96221a59771 | 420 | BIN2.write(0); |
kimhyunjun | 0:c96221a59771 | 421 | } |
kimhyunjun | 0:c96221a59771 | 422 | |
kimhyunjun | 0:c96221a59771 | 423 | void right(int s) |
kimhyunjun | 0:c96221a59771 | 424 | { |
kimhyunjun | 0:c96221a59771 | 425 | |
kimhyunjun | 0:c96221a59771 | 426 | PWMA.pulsewidth_us(s); |
kimhyunjun | 0:c96221a59771 | 427 | PWMB.pulsewidth_us(s); |
kimhyunjun | 0:c96221a59771 | 428 | AIN1.write(0); |
kimhyunjun | 0:c96221a59771 | 429 | AIN2.write(1); |
kimhyunjun | 0:c96221a59771 | 430 | BIN1.write(1); |
kimhyunjun | 0:c96221a59771 | 431 | BIN2.write(0); |
kimhyunjun | 0:c96221a59771 | 432 | } |
kimhyunjun | 0:c96221a59771 | 433 | |
kimhyunjun | 0:c96221a59771 | 434 | void left(int s) |
kimhyunjun | 0:c96221a59771 | 435 | { |
kimhyunjun | 0:c96221a59771 | 436 | PWMA.pulsewidth_us(s); |
kimhyunjun | 0:c96221a59771 | 437 | PWMB.pulsewidth_us(s); |
kimhyunjun | 0:c96221a59771 | 438 | AIN1.write(1); |
kimhyunjun | 0:c96221a59771 | 439 | AIN2.write(0); |
kimhyunjun | 0:c96221a59771 | 440 | BIN1.write(0); |
kimhyunjun | 0:c96221a59771 | 441 | BIN2.write(1); |
kimhyunjun | 0:c96221a59771 | 442 | } |
kimhyunjun | 0:c96221a59771 | 443 | |
kimhyunjun | 0:c96221a59771 | 444 | |
kimhyunjun | 0:c96221a59771 | 445 | |
kimhyunjun | 0:c96221a59771 | 446 | void stop() |
kimhyunjun | 0:c96221a59771 | 447 | { |
kimhyunjun | 0:c96221a59771 | 448 | PWMA.pulsewidth_us(0); |
kimhyunjun | 0:c96221a59771 | 449 | PWMB.pulsewidth_us(0); |
kimhyunjun | 0:c96221a59771 | 450 | AIN1.write(0); |
kimhyunjun | 0:c96221a59771 | 451 | AIN2.write(0); |
kimhyunjun | 0:c96221a59771 | 452 | BIN1.write(0); |
kimhyunjun | 0:c96221a59771 | 453 | BIN2.write(0); |
kimhyunjun | 0:c96221a59771 | 454 | } |
kimhyunjun | 0:c96221a59771 | 455 | |
kimhyunjun | 0:c96221a59771 | 456 | void setting(){ |
kimhyunjun | 0:c96221a59771 | 457 | PWMA.period_ms(10); |
kimhyunjun | 0:c96221a59771 | 458 | PWMB.period_ms(10); |
kimhyunjun | 0:c96221a59771 | 459 | } |
kimhyunjun | 0:c96221a59771 | 460 | |
kimhyunjun | 0:c96221a59771 | 461 | void IR_interrupt() |
kimhyunjun | 0:c96221a59771 | 462 | { |
kimhyunjun | 0:c96221a59771 | 463 | IR_decode(&results, &results1,&results2, &results3); |
kimhyunjun | 0:c96221a59771 | 464 | } |