Advertisement
magic-sudo

Untitled

Mar 30th, 2015
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.11 KB | None | 0 0
  1. #include <motor.h>
  2. #include <Wire.h>
  3.  
  4. #define MAX 9999999
  5.  
  6. Motor motor;
  7.  
  8. byte ir_sensors;
  9. byte address[4];
  10. int value[4];
  11. float average = 0;
  12. int idz;
  13. int averages[4] = {0,0,0,0};
  14. int index = 0, num = 0;
  15. int deg[] = {720,30,0,30,60,90,60,30,0,30,60,90,60};
  16. float max_speed = 120;
  17. int kom;
  18.  
  19. void setup() {
  20.     Serial.begin(9600);
  21.     pinMode(20, INPUT);
  22.     pinMode(21, INPUT);
  23.     digitalWrite(20, HIGH);
  24.     digitalWrite(21, HIGH);
  25.     Wire.begin();
  26.    
  27.     Serial3.begin(38400);
  28.     kom = compass();
  29. }
  30.  
  31. void configure_compass() {
  32.     Wire.beginTransmission(0x21);                              
  33.     Wire.write(0x77);
  34.     Wire.write(0x08);
  35.     Wire.write(64 + 32 + 2);
  36.     Wire.endTransmission();
  37. }
  38.  
  39. int compass() {
  40.     byte lsb = 0, msb = 0;
  41.     int value;
  42.     Wire.beginTransmission(0x21);                              
  43.     Wire.requestFrom(0x21, 2);
  44.     int wait = 100;
  45.     while ((!Wire.available()) && (wait--)) delay(1);
  46.    
  47.     if (Wire.available())    
  48.     {
  49.       msb = Wire.read();
  50.       if (Wire.available())
  51.           lsb = Wire.read();
  52.     }  
  53.     else msb = lsb = 0;
  54.     Wire.endTransmission();
  55.     value = (msb << 8) | lsb;
  56.     return value;
  57. }
  58.  
  59. int counter = 0;
  60.  
  61. int yo_mama() {
  62.     int ret;
  63.     while (true) {
  64.       for (int i = 1; i < 5; i++) {
  65.           Serial3.write(i);
  66.           delay(1);
  67.           if (Serial3.available()) {
  68.               ir_sensors = Serial3.read();
  69.               value[i - 1] = ir_sensors & 0b00111111;
  70.               address[i - 1] = ir_sensors >> 6;
  71.               address[i - 1] &= 0b00000011;
  72.           }
  73.           Serial3.write(i);
  74.           delay(1);
  75.           if (Serial3.available()) {
  76.               ir_sensors = Serial3.read();
  77.               value[i - 1] += ir_sensors << 6;
  78.           }
  79.       }
  80.      
  81.       int mix = 999999;
  82.       index = 0;
  83.       for (int j = 0; j < 4; j++) {
  84.           if (value[j] < mix) {
  85.                mix = value[j];
  86.                index = j;
  87.           }
  88.       }
  89.       average += mix;
  90.       if((index + 1) == 1) averages[0]++;
  91.       else if((index + 1) == 2) averages[1]++;
  92.       else if((index + 1) == 3) averages[2]++;
  93.       else if((index + 1) == 4) averages[3]++;
  94.       counter ++;
  95.       if (counter == 10) {
  96.           num = average / 10;
  97.           average = 0;
  98.           counter = 0;
  99.           mix = 0;
  100.           int result;
  101.           for(int j = 0; j < 4;j++) {
  102.               if(averages[j] > mix) {
  103.                   mix = averages[j];
  104.                   result = j + 1;
  105.               }
  106.           }
  107.           mix = 9999999;
  108.           if(value[result - 1] > 800) {
  109.               for(int j = 0; j < 4;j++) {
  110.                 if(averages[j] < mix) {
  111.                     mix = averages[j];
  112.                     result = j + 1;
  113.                 }
  114.               }
  115.           }
  116.          
  117.           if (result == 1) ret = address[0] + 1;
  118.           else if (result == 2) ret = address[1] + 4;
  119.           else if (result == 3) ret = address[2] + 7;
  120.           else if (result == 4) ret = address[3] + 10;
  121.           for(int j = 0; j < 4;j++) {
  122.               averages[j] = 0;
  123.           }
  124.           break;
  125.       }  
  126.    }
  127.    return ret;  
  128. }
  129.  
  130. inline void movement(int direction_nw, int speed_nw,int direction_ne,int speed_ne) {
  131.  
  132.   motor.go_pair(1,4,direction_nw,speed_nw);
  133.  
  134.   motor.go_pair(2,3,direction_ne,speed_ne);
  135. }
  136.      
  137.  
  138. void loop() {
  139.     Serial.println(compass());    
  140.     while (!(compass() - 200 < kom && compass() + 200 > kom)) {
  141.         if (compass() > kom)
  142.             motor.rotate(1,50);
  143.         else
  144.             motor.rotate(0,50);    
  145.     }
  146.    
  147.     int sensor_number = yo_mama();
  148.     int distance = num;
  149.     /*if (distance > 2500) {
  150.         if (sensor_number == 2) movement(1, max_speed, 0, max_speed);
  151.         else if (sensor_number == 5)movement(0, max_speed, 0, max_speed);
  152.         else if (sensor_number == 8)movement(0, max_speed, 1, max_speed);
  153.         else if (sensor_number == 11)movement(1, max_speed, 1, max_speed);
  154.     } else {
  155.         switch(sensor_number)
  156.         {
  157.             case 1:
  158.                     if (distance <= 700) {
  159.                       movement(1, max_speed, 1, max_speed * 2 / 3);
  160.                     } else {
  161.                       movement(1, max_speed * 2 / 3, 1, max_speed);
  162.                     }
  163.                     break;
  164.             case 2:
  165.                     if (distance <= 700) {
  166.                       movement(1, max_speed, 1, max_speed);
  167.                     } else {
  168.                       movement(1, max_speed, 0, max_speed/3);
  169.                     }
  170.                     break;
  171.             case 3:
  172.                     if (distance <= 700) {
  173.                       movement(1, 0, 1, max_speed);
  174.                     } else {
  175.                       movement(1, max_speed * 2 / 3, 0, max_speed);
  176.                     }
  177.                     break;
  178.             case 4:
  179.                     if (distance <= 700) {
  180.                       movement(0, max_speed, 1, max_speed);
  181.                     } else {
  182.                       movement(0, max_speed, 0, max_speed / 3);
  183.                     }
  184.                     break;
  185.             case 5:
  186.                     movement(0, max_speed, 0, max_speed);
  187.                     break;
  188.             case 6:
  189.                     if (distance <= 700) {
  190.                       movement(1, max_speed, 0, max_speed);
  191.                     } else {
  192.                       movement(0, max_speed / 3, 0, max_speed);
  193.                     }
  194.                     break;
  195.             case 7:
  196.                     if (distance <= 700) {
  197.                       movement(1, max_speed, 1, 0);
  198.                     } else {
  199.                       movement(0, max_speed, 1 , max_speed * 2 / 3);
  200.                     }
  201.                     break;
  202.             case 8:
  203.                     if (distance <= 700) {
  204.                       movement(1, max_speed, 1, max_speed);
  205.                     } else {
  206.                       movement(0, max_speed / 3, 1, max_speed);
  207.                     }
  208.                     break;
  209.             case 9:
  210.                     if (distance <= 700) {
  211.                       movement(1, max_speed * 2 / 3, 1, max_speed);
  212.                     } else {
  213.                       movement(1, max_speed, 1, max_speed * 2 / 3);
  214.                     }
  215.                     break;
  216.             case 10:
  217.                     if (distance <= 700) {
  218.                       movement(0, max_speed / 3, 1, max_speed);
  219.                     } else {
  220.                       movement(1, max_speed * 2/3, 1, max_speed);
  221.                     }
  222.                     break;
  223.             case 11:
  224.                    if(distance <= 700){
  225.                      movement(1, max_speed, 0, max_speed);
  226.                      }
  227.                    else{
  228.                      movement(1, max_speed, 0, 0);
  229.                      }  
  230.                     break;
  231.             case 12:
  232.                     if (distance <= 700) {
  233.                       movement(1, max_speed, 0, max_speed / 3);
  234.                     } else {
  235.                       movement(1, max_speed, 1, max_speed * 2/3);
  236.                     }
  237.                     break;  
  238.           }
  239.       }*/
  240. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement