Advertisement
TungstenVn

Do line 5/july

Jul 5th, 2019
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.71 KB | None | 0 0
  1. //File lấy dữ liệu
  2. //Số đc lấy từ trái sang phảiic
  3. #define motor1 10
  4. #define motor2 11
  5. const int trig = 2;     // chân trig của HC-SR04
  6. const int echo = 3;     // chân echo của HC-SR04
  7.  
  8.  
  9. const int qtro[7] = {A0,A1,A2,A3,A4,A5,A6};
  10. int ktraqtro[7] = {0,0,0,0,0,0,0};
  11. int locqtro[7] = {0,0,0,0,0,0,0};
  12.  
  13. int maxspeed = 120;
  14. bool isRun = false;
  15. int timer = 0;
  16. //---------------------------------------------------------------------
  17.  
  18. void setup() {
  19.    pinMode(trig,OUTPUT);   // chân trig sẽ phát tín hiệu
  20.    pinMode(echo,INPUT);    // chân echo sẽ nhận tín hiệu
  21.  
  22.   Serial.begin(9600);
  23.   for(int i = 0; i<=6;i++){
  24.    pinMode(qtro[i], INPUT);
  25.   }
  26. }
  27. //--------------------------------------------------------------------
  28.  
  29. void loop() {
  30.  // ktravatcan();
  31.   //if(analogRead(qtro[1]) > 500 && analogRead(qtro[2]) > 500 && analogRead(qtro[3]) > 500&& analogRead(qtro[4]) > 500){
  32.     //analogWrite(motor1,255);
  33.     //analogWrite(motor2,255);
  34.     //    isRun = false;
  35.   // }else{
  36.   //laydulieu();
  37.     //    }
  38.     //Serial.println("alo");
  39.     //ktravatcan();
  40.     laydulieu();
  41. }
  42. //--------------------------------------------------------------
  43. void ktravatcan(){
  44.   unsigned long duration; // biến đo thời gian
  45.   int distance;           // biến lưu khoảng cách
  46.  
  47.   digitalWrite(trig,0);   // tắt chân trig
  48.   delayMicroseconds(2);
  49.   digitalWrite(trig,1);   // phát xung từ chân trig
  50.   delayMicroseconds(5);   // xung có độ dài 5 microSeconds
  51.   digitalWrite(trig,0);   // tắt chân trig
  52.   duration = pulseIn(echo,HIGH);
  53.   distance = int(duration/2/29.412);
  54.   if(distance < 50){
  55.      analogWrite(motor1,0);
  56.      analogWrite(motor2,0);
  57.      isRun = false;
  58.   }else{
  59.     laydulieu();
  60.   }
  61. }
  62.  
  63. //-------------------------------------------------------------------
  64.  
  65. int s = 60;
  66. int a = 0;
  67. int b = 0;
  68. int pid;
  69. void LinePIDFilter() { //PID control in line tracking mode
  70.   static double kP = 36, kI = 0, kD = 0;
  71.   static double gain = 100;
  72.   static double prev_error = 0, prev_I = 0;
  73.   double p = 0, i = 0, d = 0, pid_value;
  74.  
  75.   p = xulyloi();
  76.   i = p + prev_I;
  77.   d = p - prev_error;
  78.  
  79.   pid_value = kP * p + kI * i + kD * d;
  80.   pid = pid_value;
  81.   prev_I = i;
  82.   prev_error = p;
  83.   pid_value *= gain/100;
  84.  
  85.   float ratio=0;
  86.   float x = 255+pid;
  87.   float y = 255-pid;
  88.  
  89.   if(x > 255 || y > 255){
  90.       if(x<y){
  91.         ratio = 255/y;
  92.       }else{
  93.         ratio = 255/x;
  94.       }
  95.       x *= ratio;
  96.       y *= ratio;
  97.   }
  98.  /*
  99.   if(!isRun){
  100.     isRun = true;
  101.     timer = millis();
  102.   }  
  103.  
  104.     if(millis() - timer <= 1100){
  105.     maxspeed = map(millis() - timer,0,1000,255,0);
  106.   }
  107.    
  108.   constrain(maxspeed,0,255);
  109.     */
  110.   //Serial.println(maxspeed);
  111.   //digital();
  112.   if(!isRun){
  113.   if(s <= 10){
  114.         s = 0;
  115.         isRun = true;
  116.    }else{
  117.   s = map(millis(),3000,6000,100,0);
  118.   }
  119.         }
  120.    
  121.   //GetSensorAnalog();
  122.   //digital();
  123.   a = (int)y;
  124.   b = (int)x;
  125.   constrain(a,0,255);
  126.   constrain(b,0,255);
  127.   //pidinfo(a,b,pid);
  128.   analogWrite(motor1,a);
  129.   analogWrite(motor2,b);
  130. }
  131.  
  132. //----------Ktra cac kieu-------------------------------------------------------
  133. void GetSensorAnalog() {
  134.   for (int i = 0; i < 7; i++) {
  135.     Serial.print(locqtro[i]);
  136.     Serial.print("  ");
  137.   }
  138.  
  139.   Serial.println();
  140. }
  141. void digital(){
  142.   for(int i = 0; i<7;i++){
  143.    Serial.print(ktraqtro[i]);
  144.    Serial.print("   ");
  145.   }
  146.    Serial.println();
  147. }
  148.  
  149. void analog(){
  150.   for(int i = 0; i<7;i++){
  151.    Serial.println(analogRead(qtro[i]));
  152.   }
  153.    Serial.println("=======");
  154. }
  155. void pidinfo(int x,int y,int pid){
  156.   Serial.print("X: ");
  157.   Serial.print(x);
  158.   Serial.print("   ");
  159.   Serial.print("Y: ");
  160.   Serial.print(y);
  161.   Serial.print("   ");
  162.   Serial.print("Pid: ");
  163.   Serial.print(pid);
  164.   Serial.println();
  165. }
  166. //-------------------------------------------------------------------
  167.  
  168.  
  169. void laydulieu(){
  170.  
  171.   //clear ktraqtro
  172.   for(int i = 0; i<7;i++){
  173.    ktraqtro[i] = 0;
  174.   }
  175.  
  176.    
  177.   //Lấy max,min
  178.   int max = 0;
  179.   int min = 0;
  180.  
  181.  
  182.  locqtro[0] = analogRead(qtro[0])+110;
  183.  locqtro[1] =analogRead(qtro[1])+44;
  184.  locqtro[2] =analogRead(qtro[2])+20;
  185.  locqtro[3] =analogRead(qtro[3])+41;
  186.  locqtro[4] =analogRead(qtro[4])+44;
  187.  locqtro[5] =analogRead(qtro[5])+135;
  188.  locqtro[6] =analogRead(qtro[6])-320;
  189.    
  190.  
  191.   for(int i = 0; i<=6;i++){
  192.    if(locqtro[i] > max){
  193.     max = locqtro[i];
  194.    }
  195.    else if(locqtro[i] < min){
  196.     min = locqtro[i];
  197.    }
  198.   }
  199.  
  200.   //Lấy trb rồi gán digital từng cái
  201.   int trungbinh = (min + max) /2;
  202.  
  203.   for(int i = 0; i<=6;i++){
  204.    if(locqtro[i] < trungbinh){
  205.     ktraqtro[i] = 1;
  206.    }else{
  207.     ktraqtro[i] = 0;
  208.    };
  209.   }
  210.  
  211.   //ktraqtro[6]=0;
  212.   //Chuyển động
  213.   LinePIDFilter();
  214.  
  215. }
  216.  
  217.  
  218. //---------------------------------------------------------------------------------
  219.  
  220.  
  221. bool Line[7] = {false};
  222. int soluongqtrophiatrenline;
  223. int xulyloi(){
  224.  //Kiểm tra số quang trở phía trên line
  225.     for(int i = 0; i<7;i++){
  226.    Line[i] = false;
  227.   }
  228.     soluongqtrophiatrenline  =0;
  229.  for(int i = 0; i<7;i++){
  230.   if(ktraqtro[i] == 1){
  231.    soluongqtrophiatrenline += 1;
  232.   }
  233.  }
  234.  //Chuyển từ 0001000 sang false,true
  235.  for(int i = 0; i<7;i++){
  236.   if(ktraqtro[i] == 1){
  237.     Line[i] = true;
  238.   }
  239.  }
  240.  
  241.  //Xác định lỗi
  242.  static int prev_error = 0;
  243.  switch(soluongqtrophiatrenline){
  244.     case 0: {      
  245.         if (prev_error == 0) {
  246.           return 0;
  247.         } else if (prev_error == 6 || prev_error == 7) {
  248.           prev_error = 7;
  249.           return 7;
  250.         } else if (prev_error == -6 || prev_error == -7) {
  251.           prev_error = -7;
  252.           return -7;
  253.         }
  254.         else return prev_error;
  255.         break;
  256.       }
  257.     case 1: {
  258.         for (int i = 0; i < 7; i++){
  259.           if (Line[i]) {
  260.             switch (i) {
  261.               case 0: {
  262.                   prev_error = -6;
  263.                   return -6;
  264.                   break;
  265.                 }
  266.               case 1: {
  267.                   prev_error = -4;
  268.                   return -4;
  269.                   break;
  270.                 }
  271.               case 2: {
  272.                   prev_error = -2;
  273.                   return -2;
  274.                   break;
  275.                 }
  276.               case 3: {
  277.                   prev_error = 0;
  278.                   return 0;
  279.                   break;
  280.                 }
  281.               case 4: {
  282.                   prev_error = 2;
  283.                   return 2;
  284.                   break;
  285.                 }
  286.               case 5: {
  287.                   prev_error = 4;
  288.                   return 4;
  289.                   break;
  290.                 }
  291.               case 6: {
  292.                   prev_error = 6;
  293.                   return 6;
  294.                   break;
  295.                 }
  296.               default: {
  297.                   return prev_error;
  298.                   break;
  299.                 }
  300.             }
  301.             break;
  302.           }
  303.         }
  304.         break;
  305.       }
  306.     case 2: {
  307.         if (Line[0] && Line[1]) {
  308.           prev_error = -5;
  309.           return -5;
  310.         } else if (Line[1] && Line[3]) {
  311.           prev_error = -7;
  312.           return -7;
  313.         } else if (Line[1] && Line[2]) {
  314.           prev_error = -3;
  315.           return -3;
  316.         } else if (Line[2] && Line[3]) {
  317.           prev_error = -1;
  318.           return -1;
  319.         } else if (Line[3] && Line[4]) {
  320.           prev_error = 1;
  321.           return 1;
  322.         } else if (Line[4] && Line[5]) {
  323.           prev_error = 3;
  324.           return 3;
  325.         } else if (Line[5] && Line[3]) {
  326.           prev_error = 7;
  327.           return 7;
  328.         } else if (Line[5] && Line[6]) {
  329.           prev_error = 5;
  330.           return 5;
  331.         } else return prev_error;
  332.         break;
  333.       }
  334.     case 3: {
  335.         if (Line[1] && Line[2] && Line[3]) {
  336.           switch (-1) {
  337.             case 0: {
  338.                 prev_error = 0;
  339.                 return 0;
  340.               }
  341.             case -1: case 1: {
  342.                 prev_error = -4;
  343.                 return -4;
  344.               }
  345.           }
  346.         } else if (Line[0] && Line[1] && Line[2]) {
  347.           prev_error = -6;
  348.           return -6;
  349.         } else if (Line[3] && Line[4] && Line[5]) {
  350.           switch (1) {
  351.             case 0: {
  352.                 prev_error = 0;
  353.                 return 0;
  354.               }
  355.             case 1: case -1: {
  356.                 prev_error = 4;
  357.                 return 4;
  358.               }
  359.           }
  360.         } else if (Line[4] && Line[5] && Line[6]) {
  361.           prev_error = 6;
  362.           return 6;
  363.         } else if (Line[2] && Line[3] && Line[4]) {
  364.           prev_error = 0;
  365.           return 0;
  366.         } else return prev_error;
  367.         break;
  368.       }
  369.     case 4: {
  370.         if (Line[0] && Line[1] && Line[2] && Line[3]) {    
  371.                 prev_error = -8;
  372.                 return -8;        
  373.         }    
  374.         else if (Line[6] && Line[5] && Line[4] && Line[3]) {        
  375.                 prev_error = 8;
  376.                 return 8;          
  377.         }
  378.         else {
  379.           return prev_error;
  380.         }
  381.         break;
  382.       }
  383.     case 5: {
  384.         if (Line[0] && Line[1] && Line[2] && Line[3] && Line[4]) {
  385.           prev_error = -2;
  386.           return -2;
  387.         } else if (Line[1] && Line[2] && Line[3] && Line[4] && Line[5]) {
  388.           prev_error = 0;
  389.           return 0;
  390.         } else if (Line[2] && Line[3] && Line[4] && Line[5] && Line[6]) {
  391.           prev_error = 2;
  392.           return 2;
  393.         }
  394.       }
  395.     case 6: {
  396.       if (Line[0] && Line[1] && Line[2] && Line[3] && Line[4] && Line[5]) {
  397.         prev_error = -1;
  398.         return -1;
  399.       } else if (Line[1] && Line[2] && Line[3] && Line[4] && Line[5] && Line[6]) {
  400.         prev_error = 1;
  401.         return 1;
  402.       }
  403.     }
  404.     case 7: {
  405.       prev_error = 0;
  406.     }
  407.  }
  408. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement