finalllll

Dependencies:   WS2812 PixelArray

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "hcsr04.h"
00003 #include "WS2812.h"
00004 #include "PixelArray.h"
00005 #include "Adafruit_SSD1306.h"
00006 
00007 #include "time.h"
00008 
00009 #define LOW 0
00010 #define HIGH 1
00011 #define KEY2 0x18                 //Key:2 
00012 #define KEY7 0x42                 //Key:2 
00013 #define KEY9 0x4A                 //Key:2 
00014 #define KEY8 0x52                 //Key:8 
00015 #define KEY4 0x08                 //Key:4 
00016 #define KEY6 0x5A                 //Key:6 
00017 #define KEY1 0x0C                 //Key:1 
00018 #define KEY3 0x5E                 //Key:3 
00019 #define KEY5 0x1C                 //Key:5
00020 #define Repeat 0xFF               //press and hold the key
00021 #define Minus 0x07;
00022 #define Plus 0x15;
00023 #define PIN 7
00024 
00025 
00026 #define WS2812_BUF 77   //number of LEDs in the array
00027 #define NUM_COLORS 6    //number of colors to store in the array
00028 #define NUM_STEPS 8    //number of steps between colors
00029 #define I2C_ADDR (0x20)
00030 
00031 //사용 중인 핀 : D4, D5, D6, D7, D9, D10, D11, D12, D13, D14, D15
00032 // A0, A1, A2, A3
00033 PixelArray px(WS2812_BUF);
00034 //WS2812 ws(D7, WS2812_BUF, 0, 5, 5, 0);
00035 WS2812 ws(D7, WS2812_BUF, 6,17,9,14);   //nucleo-f411re
00036 
00037 RawSerial pc(SERIAL_TX, SERIAL_RX,115200);
00038 HCSR04 sensor(D3, D2,pc,0.5);
00039 DigitalIn IR(D4);
00040 InterruptIn remote(D4);
00041 SPI spi(D11, D12, D13);
00042 DigitalOut spi_cs(D10,1);
00043 I2C i2c(I2C_SDA, I2C_SCL);
00044 Adafruit_SSD1306_I2c myOled(i2c, D9, 0x78, 64, 128);
00045 
00046 
00047 PwmOut PWMA(D6);    //left motor speed
00048 PwmOut PWMB(D5);    //right motor speed
00049 DigitalOut AIN1(A1);    //Mortor-L backward
00050 DigitalOut AIN2(A0);    //Motor-L forward
00051 DigitalOut BIN1(A2);    //Mortor-R forward
00052 DigitalOut BIN2(A3);    //Mortor-R backward
00053 
00054 
00055 int printflag = 0;
00056 int value=0;
00057 int index=0;
00058 int lspeed = 2000;
00059 int rspeed = 2000;
00060 int speed=2000;
00061 int leftcnt = 0;
00062 
00063 int values[] = {0,0,0,0,0};
00064 int whiteMin[]={1000,1000,1000,1000,1000};
00065 int blackMax[]={0,0,0,0,0};
00066 int distancecnt=0;
00067 int stopcnt = 0;
00068 
00069 int driveflag=0;
00070 volatile int flag;
00071 volatile int TRflag=0;
00072 
00073 char IR_decode(unsigned char * code, unsigned char * result1,unsigned char * result2,unsigned char * result3);
00074 
00075 unsigned char results;
00076 unsigned char results1;
00077 unsigned char results2;
00078 unsigned char results3;
00079 
00080 void IR_interrupt();
00081 void translateIR();
00082 
00083 int s=1000;
00084 void forward(int s);
00085 void backward(int s);
00086 void right(int s);
00087 void left(int s);
00088 
00089 void stop();
00090 void setting();
00091 void rx_ISR(void);
00092 void whiteTR();
00093 void blackTR();
00094 
00095 uint8_t rx_buffer[10];
00096 
00097 unsigned long n = 0;
00098 
00099 int color_set(uint8_t red,uint8_t green, uint8_t blue)
00100 {
00101   return ((red<<16) + (green<<8) + blue);   
00102 }
00103 
00104 // 0 <= stepNumber <= lastStepNumber
00105 int interpolate(int startValue, int endValue, int stepNumber, int lastStepNumber)//
00106 {
00107     return (endValue - startValue) * stepNumber / lastStepNumber + startValue;
00108 }
00109 
00110 
00111 int main(void)
00112 {
00113     
00114     int colorIdx = 0;
00115     int colorTo = 0;
00116     int colorFrom = 0;
00117     
00118     uint8_t ir = 0;
00119     uint8_t ig = 0;
00120     uint8_t ib = 0;
00121     
00122     clock_t start, end;
00123     //LED제어/////////////////////////////////////////////////////////////////////////////////////
00124     ws.useII(WS2812::PER_PIXEL); // use per-pixel intensity scaling
00125     int colorbuf[NUM_COLORS] = {0x2f0000,0x2f2f00,0x002f00,0x002f2f};
00126 
00127 
00128 
00129     ////////////////////////////////////////////////////////////////////////////////////////////
00130     
00131     sensor.setMode(true);
00132     remote.fall(&IR_interrupt);
00133     setting(); 
00134     pc.attach(&rx_ISR);
00135     spi.format(16,0);
00136     spi.frequency(2000000);
00137     while(driveflag<2)
00138     {
00139         if(results == KEY7 && TRflag ==1)
00140         {
00141             whiteTR();
00142             printf("=======================================================\r\n");
00143             wait_us(21);
00144             driveflag++;
00145 //            gOled2.printf("%d\r\n",driveflag);
00146             pc.printf("%d\r\n",driveflag);
00147         }
00148             
00149         if(results == KEY9 && TRflag ==1)
00150         {
00151             blackTR();
00152             printf("=======================================================\r\n");
00153             wait_us(21);
00154             driveflag++;
00155 //            gOled2.printf("%d\r\n",driveflag);
00156             pc.printf("%d\r\n",driveflag);
00157         }
00158     }
00159     while(driveflag<3){ wait(1);}
00160     int distance;
00161     start=clock();
00162     myOled.printf("\n\n\nRun!");
00163     myOled.display();
00164 
00165     while(1)
00166     {
00167         if(distancecnt%500==1)
00168         {
00169             distance = sensor.distance();
00170             if(distance <20)
00171             {
00172                 leftcnt++;
00173                 if(leftcnt>20)
00174                 {
00175                     right(2300);
00176                     wait(3);
00177                     forward(2300);
00178                 }
00179             }
00180         }
00181         distancecnt++;
00182         for(int i=0; i<6; i++) 
00183         {
00184             //int ch=0;
00185             spi_cs=0;
00186             wait_us(2);
00187             value=spi.write(i<<12);
00188             spi_cs=1;
00189             wait_us(21);
00190             value=value>>6;
00191             if(i>0 && i<6)
00192             {
00193                 values[5-i]=value;
00194                 pc.printf("value%d : %d\r\n",i-1,values[i-1]);
00195             }
00196             
00197         }
00198 
00199 
00200         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])
00201         {
00202             
00203             stopcnt++;
00204             //forward(100);
00205             if(stopcnt>10)
00206             {
00207                 stop();
00208                 pc.printf("stopcnt>10_stop");
00209             }
00210             if(stopcnt>50)
00211             {
00212 
00213                 wait(3);
00214                 stopcnt=0;
00215                 end=clock();
00216                 myOled.printf("\rDriving time: %.2f",((float)(end-start)/CLOCKS_PER_SEC));
00217                 myOled.display();
00218                 pc.printf("시간측정: %.2f",((float)(end-start)/CLOCKS_PER_SEC));
00219                 
00220                 //get starting RGB components for interpolation
00221                 std::size_t c1 = colorbuf[colorFrom];
00222                 std::size_t r1 = (c1 & 0xff0000) >> 16;
00223                 std::size_t g1 = (c1 & 0x00ff00) >> 8;
00224                 std::size_t b1 = (c1 & 0x0000ff);
00225         
00226                 //get ending RGB components for interpolation
00227                 std::size_t c2 = colorbuf[colorTo];
00228                 std::size_t r2 = (c2 & 0xff0000) >> 16;
00229                 std::size_t g2 = (c2 & 0x00ff00) >> 8;
00230                 std::size_t b2 = (c2 & 0x0000ff);
00231     
00232                 for (int i = 0; i <= NUM_STEPS; i++)
00233                 {       
00234                     ir = interpolate(r1, r2, i, NUM_STEPS);
00235                     ig = interpolate(g1, g2, i, NUM_STEPS);
00236                     ib = interpolate(b1, b2, i, NUM_STEPS);
00237             
00238                     //write the color value for each pixel
00239                     px.SetAll(color_set(ir,ig,ib));
00240             
00241                     //write the II value for each pixel
00242                     px.SetAllI(32);
00243             
00244                     for (int i = WS2812_BUF; i >= 0; i--) 
00245                     {
00246                         ws.write(px.getBuf());
00247                     }
00248                 }
00249 //        
00250                 colorFrom = colorIdx;
00251                 colorIdx++;
00252         
00253                 if (colorIdx >= NUM_COLORS)
00254                 {
00255                     colorIdx = 0;
00256                 }
00257             
00258                 colorTo = colorIdx;
00259                 
00260             }
00261         }
00262         else if(values[4]*0.8<blackMax[4])
00263         {
00264             left(1800);
00265             stopcnt=0;
00266             
00267         //---
00268             forward(10);
00269             
00270 //            gOled2.printf("left");
00271           //  pc.printf("left");
00272         }
00273         else if(values[0]*0.8<blackMax[0])
00274         {
00275             right(1800);
00276             stopcnt=0;
00277             //--
00278             forward(10);
00279 //            gOled2.printf("right");
00280           //  pc.printf("right");
00281         }
00282 //        else if(values[1]<blackMax[1] | values[2]<blackMax[2] | values[3]<blackMax[3])
00283 //        {
00284 //            stopcnt=0;
00285 //            forward(2000);
00286 //            pc.printf("fffforward");
00287 //        }
00288         else if(values[2]*0.8<blackMax[2])
00289         {
00290             stopcnt=0;
00291             forward(1800);
00292 //            gOled2.printf("fffforward");
00293            // pc.printf("fffforward");
00294         }
00295         else if(values[1]*0.8<blackMax[1]){
00296             right(600);
00297             stopcnt=0;
00298             //right(300);
00299             forward(1800);
00300             
00301            // pc.printf("r_foward, values1:%d, blackMax1:%d values4:%d blackMax4: %d",values[1],blackMax[1],values[4],blackMax[4]);
00302         }
00303         else if(values[3]*0.85<blackMax[3]){
00304             left(600);
00305             stopcnt=0;
00306             //left(300);
00307             forward(1800);
00308             
00309            // pc.printf("l_forward");
00310         }
00311         else{
00312             stopcnt=0;
00313             forward(100);
00314         }
00315             
00316         
00317     }
00318     
00319 }
00320 
00321 void whiteTR()
00322 {
00323     whiteMin[0]=1000;
00324     whiteMin[1]=1000;
00325     whiteMin[2]=1000;
00326     whiteMin[3]=1000;
00327     whiteMin[4]=1000;
00328     for(int j=0; j<100;j++)
00329     {
00330         for(int i=0; i<7; i++)
00331         {
00332             spi_cs=0;
00333             wait_us(2);
00334             value=spi.write(i<<12);
00335             spi_cs=1;
00336             wait_us(21);
00337             value=value>>6;
00338             if(i>0 && i<6)
00339             {
00340                 if(value<whiteMin[5-i]) whiteMin[5-i]=value/1.4;
00341                 
00342             }
00343         }
00344     }
00345     for(int k=0;k<5;k++)
00346     {
00347 //        gOled2.printf("value%d : %d\r\n",k,whiteMin[k]);
00348         pc.printf("value%d : %d\r\n",k,whiteMin[k]);
00349     }
00350     TRflag=0;
00351 }
00352 
00353 void blackTR()
00354 {
00355     blackMax[0]=0;
00356     blackMax[1]=0;
00357     blackMax[2]=0;
00358     blackMax[3]=0;
00359     blackMax[4]=0;
00360     for(int j=0; j<100;j++)
00361     {
00362         for(int i=0; i<7; i++)
00363         {
00364             spi_cs=0;
00365             wait_us(2);
00366             value=spi.write(i<<12);
00367             spi_cs=1;
00368             wait_us(21);
00369             value=value>>6;
00370             if(i>0 && i<6)
00371             {
00372                 if(value>blackMax[5-i]) blackMax[5-i]=value*1.7;
00373                 
00374             }
00375         }
00376     }
00377     for(int k=0;k<5;k++)
00378     {
00379 //        gOled2.printf("value%d : %d\r\n",k,blackMax[k]);
00380         pc.printf("value%d : %d\r\n",k,blackMax[k]);
00381     }
00382     TRflag=0;
00383 }
00384 
00385 void translateIR() 
00386 {  
00387   switch(results)
00388   {
00389     case KEY1:
00390 
00391       driveflag++;
00392       return;
00393     case KEY2: 
00394       forward(speed);
00395       return;
00396     case KEY3: 
00397       lspeed-=50;
00398       rspeed-=50;
00399       PWMA.pulsewidth_us(lspeed);
00400       PWMB.pulsewidth_us(rspeed);
00401       return;
00402     case KEY4: 
00403       left(1000);
00404       return;
00405     case KEY5: 
00406       stop();
00407       return;
00408     case KEY6: 
00409       right(1000);
00410       return;
00411     case KEY7: 
00412       TRflag=1;
00413       return;
00414     case KEY8: 
00415       backward(speed);
00416       return;
00417     case KEY9: 
00418       TRflag = 1;
00419       return;
00420 
00421     }// End Case
00422 }
00423 
00424 char IR_decode(unsigned char * code, unsigned char * result1,unsigned char * result2,unsigned char * result3)
00425 {
00426   char flag = 0;
00427   unsigned int count = 0;
00428   unsigned char i, index, cnt = 0, data[4] = {0, 0, 0, 0};
00429   if (IR.read() == LOW)
00430   {
00431     count = 0;
00432     while (IR.read() == LOW && count++ < 200)  //9ms
00433       wait_us(60);
00434     count = 0;
00435     while (IR.read() == HIGH && count++ < 80)   //4.5ms
00436       wait_us(60);
00437     for (i = 0; i < 32; i++)
00438     {
00439       count = 0;
00440       while (IR.read() == LOW && count++ < 15) //0.56ms
00441         wait_us(60);
00442       count = 0;
00443       while (IR.read() == HIGH && count++ < 40) //0: 0.56ms; 1: 1.69ms
00444         wait_us(60);
00445       if (count > 20)data[index] |= (1 << cnt);
00446       if (cnt == 7)
00447       {
00448         cnt = 0;
00449         index++;
00450       }
00451       else cnt++;
00452     }
00453     if (data[0] + data[1] == Repeat && data[2] + data[3] == Repeat) //check
00454     {
00455       code[0] = data[2];
00456       result1[0] = data[3];
00457       result2[0] = data[0];
00458       result3[0] = data[1];
00459       printflag=1;
00460       flag = 1;
00461       translateIR();
00462       return flag;
00463     }
00464     if (data[0] == Repeat && data[1] == Repeat && data[2] == Repeat && data[3] == Repeat)
00465     {
00466       code[0] = Repeat;
00467       flag = 1;
00468       return flag;
00469     }
00470   }
00471   return flag;
00472 }
00473 
00474 void forward(int speed)
00475 {
00476   PWMA.pulsewidth_us(speed);
00477   PWMB.pulsewidth_us(speed);
00478   AIN1.write(0);
00479   AIN2.write(1);
00480   BIN1.write(0);
00481   BIN2.write(1);
00482 }
00483 
00484 void backward(int s)
00485 {
00486   PWMA.pulsewidth_us(s);
00487   PWMB.pulsewidth_us(s);
00488   AIN1.write(1);
00489   AIN2.write(0);
00490   BIN1.write(1);
00491   BIN2.write(0);
00492 }
00493 
00494 void right(int s)
00495 {
00496 
00497   PWMA.pulsewidth_us(s);
00498   PWMB.pulsewidth_us(s);
00499   AIN1.write(0);
00500   AIN2.write(1);
00501   BIN1.write(1);
00502   BIN2.write(0);
00503 }
00504 
00505 void left(int s)
00506 {
00507   PWMA.pulsewidth_us(s);
00508   PWMB.pulsewidth_us(s);
00509   AIN1.write(1);
00510   AIN2.write(0);
00511   BIN1.write(0);
00512   BIN2.write(1);
00513 }
00514 
00515 
00516 void stop()
00517 {
00518   PWMA.pulsewidth_us(0);
00519   PWMB.pulsewidth_us(0);
00520   AIN1.write(0);
00521   AIN2.write(0);
00522   BIN1.write(0);
00523   BIN2.write(0);
00524 }
00525 
00526 void setting(){
00527   PWMA.period_ms(10);
00528   PWMB.period_ms(10);
00529 }
00530 
00531 void IR_interrupt()
00532 {
00533     IR_decode(&results, &results1,&results2, &results3);
00534 }
00535 
00536 void rx_ISR(void)
00537 {
00538     char ch;
00539     ch = pc.getc();
00540     pc.putc(ch);
00541     rx_buffer[index++]=ch;
00542     if(ch==0x0D)
00543     {
00544         pc.putc(0x0A);
00545         rx_buffer[--index]='\0';
00546         index=0;
00547         flag=1;
00548     }
00549 }