Advertisement
Guest User

Untitled

a guest
May 24th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.63 KB | None | 0 0
  1. /*
  2.  Name:    ArduinoProject.ino
  3.  Created: 10-May-18 6:11:07 PM
  4.  Author:  Kula
  5. */
  6. #include <ArduinoRobot.h>
  7. #include <Wire.h>
  8. #include <SPI.h>
  9.  
  10. #define DESNO 0
  11. #define LIVO 1
  12. #define NAZAD 2
  13. #define NAPRID 3
  14. #define TOLERANCE 10.0 //Prag tolerancije udaljenosti prepreke
  15. #define TURN_DEG 40
  16. #define SPEED 100
  17.  
  18. float tkValues[4]; //Sve vrijednosti u nizu
  19. int FindMinValue(float *);
  20. float convertSignalToCm(float);
  21. void GoForward(int val);
  22. void Turn(int d);
  23. long microsecondsToCentimeters(long);
  24. long Read();
  25.  
  26. const int pingPin = TKD1;
  27.  
  28. void setup()
  29. {
  30.   Robot.begin();
  31. }
  32.  
  33. void loop()
  34. {
  35.   int dir = Obstacle(); //Vraca najblizu prepreku, tj njen index
  36.   if (!(tkValues[dir] <= TOLERANCE)) //Ako je iznad tolerancije idi naprijed
  37.      GoForward(SPEED);
  38.   else
  39.       Turn(dir); //Ako ne okreni se
  40.   delay(100);
  41. }
  42.  
  43. float convertSignalToCm(float s)
  44. {
  45.   return pow(3027.4 / s, 1.2134);
  46. }
  47.  
  48. //vraća udaljenost prednjeg senzora
  49. long Read()
  50. {
  51.   long duration, cm;
  52.   pinMode(pingPin, OUTPUT);
  53.   digitalWrite(pingPin, LOW);
  54.   delayMicroseconds(2);
  55.   digitalWrite(pingPin, HIGH);
  56.   delayMicroseconds(5);
  57.   digitalWrite(pingPin, LOW);
  58.  
  59.   pinMode(pingPin, INPUT);
  60.   duration = pulseIn(pingPin, HIGH);
  61.   return microsecondsToCentimeters(duration);
  62. }
  63.  
  64. int Obstacle()
  65. { //Sve vrijednosti u cm; popunjava sve vrijednosti senozora i stavlja ih u niz
  66.   tkValues[DESNO] = convertSignalToCm(Robot.analogRead(TK0));
  67.   tkValues[LIVO] = convertSignalToCm(Robot.analogRead(TK4));
  68.   tkValues[NAZAD] = convertSignalToCm(Robot.analogRead(TK6));
  69.   tkValues[NAPRID] = (float)Read();
  70.   return FindMinValue(tkValues); //Vraca najblizu prepreku u cm
  71. }
  72.  
  73. void GoForward(int val)
  74. {
  75.   Robot.motorsWrite(val, val);
  76. }
  77.  
  78. void Turn(int d)
  79. {
  80.   Robot.motorsStop();
  81.   switch(d) //Okreni se u smijeru suprotno smijru najblize prepreke
  82.   {
  83.     case NAPRID: //Prepreka je naprijed
  84.         if (tkValues[LIVO] > tkValues[DESNO]) //Je li lijevo dalje od desno?
  85.           Robot.turn(-TURN_DEG); //idi lijevo
  86.         else
  87.           Robot.turn(TURN_DEG);// idi desno
  88.         break;
  89.     case LIVO:
  90.         Robot.turn(TURN_DEG/2);
  91.         break;
  92.     case DESNO:
  93.         Robot.turn(-TURN_DEG/2);
  94.         break;
  95.     case NAZAD: //nebitno, idi naprijed
  96.         GoForward(SPEED);
  97.         break;
  98.     default:
  99.         break;
  100.   }
  101. }
  102.  
  103. int FindMinValue(float* tkValues)
  104. {
  105.   int i;
  106.   int ind = 0;
  107.   float min = tkValues[0];
  108.   for (i=1;i<4;i++)
  109.   {
  110.     if (min > tkValues[i])
  111.     {
  112.       min = tkValues[i];
  113.       ind = i;
  114.     }
  115.   }
  116.   return ind;
  117. }
  118.  
  119. long microsecondsToCentimeters(long microseconds)
  120. {
  121.   return microseconds / 29 / 2;
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement