Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.24 KB | None | 0 0
  1. #if 1
  2. //AUTHOR:       Metrobotit
  3. //DESCRIPTION:  Zumo yrittää pysyä ringin (sumo radan) sisällä.
  4. //              Ohjelma koostuu kahdesta loopista: alkuloopista jolla viedään zumo viivalle odottamaan IR-signaalia
  5. //              ja päälooppi johon on ohjelmoitu painin liittyvä logiikka.
  6. //              Strategia: Zumo yrittää välttää fyysisiä yhteenottoja.
  7. //              Zumo väistää ultra sensoreilla edestä, tekee väistöliikkeitä
  8. //              ja tulostaa ne koneelle kun saa osumia (neljästä eri suunnasta).
  9. //              Zumo ajaa oletuksena radan poikki ja peruutta sit kääntyy kun saavuttaa viivan.
  10. //NOTES:        Accelometer: default x 0, default y 0, default z 16000, pienikin kallistus vaikuttaa arvoihin +-500.
  11. //              Oletusarvoinen nopeus: 150, seuraavassa versiossa nopeutta voisi lisätä.
  12. void zmain(void)
  13. {    
  14.     //Kutsutaan & alustetaan sensorit
  15.     IR_Start();
  16.     IR_flush();
  17.     Ultra_Start();
  18.     motor_start();
  19.     motor_forward(0,0);
  20.     reflectance_start();
  21.     reflectance_set_threshold(9000, 9000, 11000, 11000, 9000, 9000);
  22.     LSM303D_Start();
  23.     send_mqtt("Zumo038/Debug", "Boot");
  24.    
  25.     //Luodaan & alustetaan muuttujat
  26.     struct accData_ data;
  27.     struct sensors_ dig;
  28.  
  29.     int summaX = 0;
  30.     int summaY = 0;
  31.     int summaSensori = 0;
  32.    
  33.     //Looppi ajaa zumon ekalle viivalle käynnistäessä
  34.     for(;;){
  35.         if(SW1_Read() == 0){
  36.             vTaskDelay(500); //Wait 500 ms after launch
  37.            
  38.             while(true){
  39.                 reflectance_digital(&dig); //Tallennetaan sensorin arvot taulukkoon
  40.                 summaSensori = dig.l1 + dig.l2 + dig.l3 + dig.r1 + dig.r2 + dig.r3; //Sensoreiden arvot yht.
  41.                
  42.                 motor_forward(100,0);//Liikkuu eteenpäin kunnes näkee viivan, sit odottaa IR-signaalia
  43.                
  44.                 if(summaSensori > 2){
  45.                     motor_forward(0,0);
  46.                     IR_wait();
  47.                     break;//breakkaa while loopista kun saa IR-signaalin
  48.                 }
  49.             }
  50.             break;//breakkaa for loopista kun saa IR-signaalin
  51.         }
  52.     }
  53.    
  54.     //Siirtyy radan keskelle ja aloittaa main lööpsin
  55.     motor_forward(255, 666);
  56.    
  57.    
  58.     for(;;)
  59.     {
  60.         motor_forward(150,0);//Default speed
  61.        
  62.         //Laskee 5 peräkkäisen accelometerin x- ja y-arvojen summan
  63.         for(int i = 0; i < 5; i++){
  64.             LSM303D_Read_Acc(&data);
  65.             summaX += data.accX;
  66.             summaY += data.accY;
  67.         }
  68.        
  69.         //Laskee keskiarvon
  70.         summaX /= 5; //Levossa: ka = 0
  71.         summaY /= 5; // Levossa: ka = 0
  72.        
  73.         //Väistö liikkeet kun robotti törmää (toteuttaa aina yhden neljästä)
  74.         if(abs(summaX) > abs(summaY)) { //Väistöliikkeet x-akselin suhteen
  75.             if(summaX>12000){
  76.                 print_mqtt("Zumo038/hit","osuma edesta");
  77.             }
  78.             if(summaX<-12000){
  79.                 print_mqtt("Zumo038/hit","osuma takaa");
  80.                 motor_turn(200,5,500);
  81.                 motor_forward(0,0);
  82.             }
  83.         }
  84.        
  85.         if(abs(summaY) > abs(summaX)) {//Väistöliikkeet y-akselin suhteen
  86.             if(summaY>12000){
  87.                 print_mqtt("Zumo038/hit","osuma vasemmalta");
  88.                 motor_tankturn_right(200,750);
  89.                 motor_forward(0,0);
  90.             }
  91.             if(summaY<-12000){
  92.                 print_mqtt("Zumo038/hit","osuma oikealta");
  93.                 motor_tankturn_left(200,750);
  94.                 motor_forward(0,0);
  95.             }
  96.         }
  97.    
  98.         reflectance_digital(&dig); //Tallennetaan sensorin arvot taulukkoon
  99.         summaSensori = dig.l1 + dig.l2 + dig.l3 + dig.r1 + dig.r2 + dig.r3; //Sensoreiden arvot yht.
  100.        
  101.        
  102.         if(summaSensori >=2) {//Peruuttaa ja kääntyy kun ultra sensorit havaitsevat esteen
  103.             motor_forward(0,0);
  104.             motor_backward(200,500);
  105.             motor_tankturn_left(200,700);
  106.             motor_forward(0,0);
  107.         }
  108.        
  109.         //Välttää osuman edestä ultraäänisensorilla
  110.         if(Ultra_GetDistance() < 15){
  111.             reverse_turn(0,255,350);
  112.             motor_forward(0,0);
  113.         }
  114.     }
  115.  }  
  116.  
  117. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement