zz

Dependencies:   WS2812 PixelArray final_project

Revision:
0:c96221a59771
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Jun 16 17:35:35 2019 +0000
@@ -0,0 +1,464 @@
+#include "mbed.h"
+#include "WS2812.h"
+#include "PixelArray.h"
+#include "Adafruit_SSD1306.h"
+
+#include "time.h"
+
+#define LOW 0
+#define HIGH 1
+#define KEY2 0x18                 //Key:2 
+#define KEY7 0x42                 //Key:2 
+#define KEY9 0x4A                 //Key:2 
+#define KEY8 0x52                 //Key:8 
+#define KEY4 0x08                 //Key:4 
+#define KEY6 0x5A                 //Key:6 
+#define KEY1 0x0C                 //Key:1 
+#define KEY3 0x5E                 //Key:3 
+#define KEY5 0x1C                 //Key:5
+#define Repeat 0xFF               //press and hold the key
+#define Minus 0x07;
+#define Plus 0x15;
+#define PIN 7
+
+
+#define WS2812_BUF 77   //number of LEDs in the array
+#define NUM_COLORS 6    //number of colors to store in the array
+#define NUM_STEPS 8    //number of steps between colors
+#define I2C_ADDR (0x20)
+
+//사용 중인 핀 : D4, D5, D6, D7, D9, D10, D11, D12, D13, D14, D15
+// A0, A1, A2, A3
+PixelArray px(WS2812_BUF);
+//WS2812 ws(D7, WS2812_BUF, 0, 5, 5, 0);
+WS2812 ws(D7, WS2812_BUF, 6,17,9,14);   //nucleo-f411re
+
+//HCSR04 sensor(D3, D2,pc,0.5);
+DigitalIn IR(D4);
+InterruptIn remote(D4);
+SPI spi(D11, D12, D13);
+DigitalOut spi_cs(D10,1);
+I2C i2c(I2C_SDA, I2C_SCL);
+Adafruit_SSD1306_I2c myOled(i2c, D9, 0x78, 64, 128);
+
+
+PwmOut PWMA(D6);    //left motor speed
+PwmOut PWMB(D5);    //right motor speed
+DigitalOut AIN1(A1);    //Mortor-L backward
+DigitalOut AIN2(A0);    //Motor-L forward
+DigitalOut BIN1(A2);    //Mortor-R forward
+DigitalOut BIN2(A3);    //Mortor-R backward
+
+
+int printflag = 0;
+int value=0;
+int index=0;
+int lspeed = 2000;
+int rspeed = 2000;
+int speed=2000;
+int leftcnt = 0;
+int oledflag=0;
+int values[] = {0,0,0,0,0};
+int whiteMin[]={1000,1000,1000,1000,1000};
+int blackMax[]={0,0,0,0,0};
+int distancecnt=0;
+int stopcnt = 0;
+int exitcnt =0;
+
+int driveflag=0;
+volatile int flag;
+volatile int TRflag=0;
+
+char IR_decode(unsigned char * code, unsigned char * result1,unsigned char * result2,unsigned char * result3);
+
+unsigned char results;
+unsigned char results1;
+unsigned char results2;
+unsigned char results3;
+
+void IR_interrupt();
+void translateIR();
+
+
+int s=1000;
+void forward(int s);
+void backward(int s);
+void right(int s);
+void left(int s);
+
+void stop();
+void setting();
+void rx_ISR(void);
+void whiteTR();
+void blackTR();
+
+
+unsigned long n = 0;
+
+int color_set(uint8_t red,uint8_t green, uint8_t blue)
+{
+  return ((red<<16) + (green<<8) + blue);   
+}
+
+// 0 <= stepNumber <= lastStepNumber
+int interpolate(int startValue, int endValue, int stepNumber, int lastStepNumber)//
+{
+    return (endValue - startValue) * stepNumber / lastStepNumber + startValue;
+}
+
+
+int main(void)
+{
+    
+    int colorIdx = 0;
+    int colorTo = 0;
+    int colorFrom = 0;
+    
+    uint8_t ir = 0;
+    uint8_t ig = 0;
+    uint8_t ib = 0;
+    
+    clock_t start, end;
+    //LED제어/////////////////////////////////////////////////////////////////////////////////////
+    ws.useII(WS2812::PER_PIXEL); // use per-pixel intensity scaling
+    int colorbuf[NUM_COLORS] = {0x2f0000,0x2f2f00,0x002f00,0x002f2f};
+ 
+
+
+    
+//    sensor.setMode(true);
+    remote.fall(&IR_interrupt);
+    setting(); 
+    spi.format(16,0);
+    spi.frequency(2000000);
+    while(driveflag<2)
+    {
+        if(results == KEY7 && TRflag ==1)       
+        {
+            whiteTR();
+            printf("=======================================================\r\n");
+            wait_us(21);
+            driveflag++;
+
+        }
+            
+        if(results == KEY9 && TRflag ==1) 
+        {
+            blackTR();
+            printf("=======================================================\r\n");
+            wait_us(21);
+            driveflag++;
+
+        }
+    }
+    while(driveflag<3){ wait(1);}                   
+    start=clock();
+    myOled.printf("\n\n\nRun!");
+    myOled.display();
+
+    while(1)
+    {
+        for(int i=0; i<6; i++)           
+        {
+            spi_cs=0;
+            wait_us(2);
+            value=spi.write(i<<12);
+            spi_cs=1;
+            wait_us(21);
+            value=value>>6;
+            if(i>0 && i<6)
+            {
+                values[5-i]=value;
+            }
+            
+        }
+        
+
+        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])       
+        {
+            backward(1800);          
+            forward(2300);       
+            stopcnt++;
+            if(stopcnt>20)                
+            {
+                stop();
+                wait(3);                 
+                end=clock();               
+                if(oledflag==0)              
+                {
+                    myOled.printf("\rDriving time: %.2f",((float)(end-start)/CLOCKS_PER_SEC));
+                    myOled.display();
+                    oledflag=1;
+                }
+                break;
+            }
+        }
+        else if(values[4]*0.7<blackMax[4] && values[0]*1.2>whiteMin[0])            
+        {
+            stopcnt=0;
+            forward(2300);
+            left(2300);
+        }
+        else if(values[0]*0.7<blackMax[0]&& values[4]*1.2>whiteMin[4])         
+        {
+            stopcnt=0;
+            forward(2300);
+            right(2300);
+
+        }
+
+        else{                                 
+            stopcnt=0;
+            forward(2300);
+        }
+            
+        
+    }
+    while(1)      
+    {
+    std::size_t c1 = colorbuf[colorFrom];
+    std::size_t r1 = (c1 & 0xff0000) >> 16;
+    std::size_t g1 = (c1 & 0x00ff00) >> 8;
+    std::size_t b1 = (c1 & 0x0000ff);
+        
+    //get ending RGB components for interpolation
+    std::size_t c2 = colorbuf[colorTo];
+    std::size_t r2 = (c2 & 0xff0000) >> 16;
+    std::size_t g2 = (c2 & 0x00ff00) >> 8;
+    std::size_t b2 = (c2 & 0x0000ff);
+    
+    for (int i = 0; i <= NUM_STEPS; i++)
+    {       
+        ir = interpolate(r1, r2, i, NUM_STEPS);
+        ig = interpolate(g1, g2, i, NUM_STEPS);
+        ib = interpolate(b1, b2, i, NUM_STEPS);
+            
+                    //write the color value for each pixel
+        px.SetAll(color_set(ir,ig,ib));
+            
+                    //write the II value for each pixel
+        px.SetAllI(32);
+            
+        for (int i = WS2812_BUF; i >= 0; i--) 
+        {
+            ws.write(px.getBuf());
+        }
+    }
+//        
+    colorFrom = colorIdx;
+    colorIdx++;
+        
+    if (colorIdx >= NUM_COLORS)
+    {
+        colorIdx = 0;
+    }
+            
+    colorTo = colorIdx;
+    wait(1);
+    }
+}
+
+void whiteTR()      
+{
+    whiteMin[0]=1000;
+    whiteMin[1]=1000;
+    whiteMin[2]=1000;
+    whiteMin[3]=1000;
+    whiteMin[4]=1000;
+    for(int j=0; j<100;j++)
+    {
+        for(int i=0; i<7; i++)
+        {
+            spi_cs=0;
+            wait_us(2);
+            value=spi.write(i<<12);
+            spi_cs=1;
+            wait_us(21);
+            value=value>>6;
+            if(i>0 && i<6)
+            {
+                if(value<whiteMin[5-i]) whiteMin[5-i]=value/1.4;
+                
+            }
+        }
+    }
+    TRflag=0;
+}
+
+void blackTR()
+{
+    blackMax[0]=0;
+    blackMax[1]=0;
+    blackMax[2]=0;
+    blackMax[3]=0;
+    blackMax[4]=0;
+    for(int j=0; j<100;j++)
+    {
+        for(int i=0; i<7; i++)
+        {
+            spi_cs=0;
+            wait_us(2);
+            value=spi.write(i<<12);
+            spi_cs=1;
+            wait_us(21);
+            value=value>>6;
+            if(i>0 && i<6)
+            {
+                if(value>blackMax[5-i]) blackMax[5-i]=value*1.7;
+                
+            }
+        }
+    }
+    TRflag=0;
+}
+
+void translateIR() 
+{  
+  switch(results)
+  {
+    case KEY1:
+      driveflag++;
+      return;
+    case KEY2: 
+      forward(1500);
+      return;
+    case KEY3: 
+      lspeed-=50;
+      rspeed-=50;
+      PWMA.pulsewidth_us(lspeed);
+      PWMB.pulsewidth_us(rspeed);
+      return;
+    case KEY4: 
+      left(1000);
+      return;
+    case KEY5: 
+      stop();
+      return;
+    case KEY6: 
+      right(1000);
+      return;
+    case KEY7: 
+      TRflag=1;
+      return;
+    case KEY8: 
+      backward(1500);
+      return;
+    case KEY9: 
+      TRflag = 1;
+      return;
+
+    }// End Case
+}
+
+char IR_decode(unsigned char * code, unsigned char * result1,unsigned char * result2,unsigned char * result3)
+{
+  char flag = 0;
+  unsigned int count = 0;
+  unsigned char i, index, cnt = 0, data[4] = {0, 0, 0, 0};
+  if (IR.read() == LOW)
+  {
+    count = 0;
+    while (IR.read() == LOW && count++ < 200)  //9ms
+      wait_us(60);
+    count = 0;
+    while (IR.read() == HIGH && count++ < 80)   //4.5ms
+      wait_us(60);
+    for (i = 0; i < 32; i++)
+    {
+      count = 0;
+      while (IR.read() == LOW && count++ < 15) //0.56ms
+        wait_us(60);
+      count = 0;
+      while (IR.read() == HIGH && count++ < 40) //0: 0.56ms; 1: 1.69ms
+        wait_us(60);
+      if (count > 20)data[index] |= (1 << cnt);
+      if (cnt == 7)
+      {
+        cnt = 0;
+        index++;
+      }
+      else cnt++;
+    }
+    if (data[0] + data[1] == Repeat && data[2] + data[3] == Repeat) //check
+    {
+      code[0] = data[2];
+      result1[0] = data[3];
+      result2[0] = data[0];
+      result3[0] = data[1];
+      printflag=1;
+      flag = 1;
+      translateIR();
+      return flag;
+    }
+    if (data[0] == Repeat && data[1] == Repeat && data[2] == Repeat && data[3] == Repeat)
+    {
+      code[0] = Repeat;
+      flag = 1;
+      return flag;
+    }
+  }
+  return flag;
+}
+
+void forward(int speed)
+{
+  PWMA.pulsewidth_us(speed);
+  PWMB.pulsewidth_us(speed);
+  AIN1.write(0);
+  AIN2.write(1);
+  BIN1.write(0);
+  BIN2.write(1);
+}
+
+void backward(int s)
+{
+  PWMA.pulsewidth_us(s);
+  PWMB.pulsewidth_us(s);
+  AIN1.write(1);
+  AIN2.write(0);
+  BIN1.write(1);
+  BIN2.write(0);
+}
+
+void right(int s)
+{
+
+  PWMA.pulsewidth_us(s);
+  PWMB.pulsewidth_us(s);
+  AIN1.write(0);
+  AIN2.write(1);
+  BIN1.write(1);
+  BIN2.write(0);
+}
+
+void left(int s)
+{
+  PWMA.pulsewidth_us(s);
+  PWMB.pulsewidth_us(s);
+  AIN1.write(1);
+  AIN2.write(0);
+  BIN1.write(0);
+  BIN2.write(1);
+}
+
+
+
+void stop()
+{
+  PWMA.pulsewidth_us(0);
+  PWMB.pulsewidth_us(0);
+  AIN1.write(0);
+  AIN2.write(0);
+  BIN1.write(0);
+  BIN2.write(0);
+}
+
+void setting(){
+  PWMA.period_ms(10);
+  PWMB.period_ms(10);
+}
+
+void IR_interrupt()
+{
+    IR_decode(&results, &results1,&results2, &results3);
+}
\ No newline at end of file