zz

Dependencies:   WS2812 PixelArray final_project

Committer:
kimhyunjun
Date:
Sun Jun 16 17:35:35 2019 +0000
Revision:
0:c96221a59771
aaa

Who changed what in which revision?

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