Právě prohlížíš: drive_straight.ino
Zpět do složkyStáhnout
  1. #include <TB6612FNG.h>
  2. #include <PS2Mouse.h>
  3.  
  4. Motor *left_track;
  5. Motor *right_track;
  6. PS2Mouse *mouse;
  7.  
  8. void get_mouse_data(int& mstat, int& left_encoder, int& right_encoder);
  9. void smooth_move(int l_tr, int r_tr);
  10.  
  11. int freeRAM()
  12. {
  13. extern int __heap_start, *__brkval;
  14. int v;
  15. return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
  16. }
  17.  
  18. void setup()
  19. {
  20. Serial.begin(9600);
  21. left_track = new Motor(6, 5, 7);
  22. right_track = new Motor(3, 4, 2);
  23. //delay(1000); //wait for the mouse to self-check
  24. Serial.println("Start-----------------------------");
  25. mouse = new PS2Mouse(9, 8, REMOTE);
  26. pinMode(13, OUTPUT);
  27. digitalWrite(13, HIGH);
  28. mouse->initialize();
  29.  
  30. if (mouse->is_error())
  31. {
  32. while (true);
  33. }
  34. Serial.println("Initialized");
  35. digitalWrite(13, LOW);
  36. }
  37.  
  38. void loop()
  39. {
  40. const int IRsensitivity = 360;
  41. const byte IR_pin = A3;
  42.  
  43. boolean goon = true;
  44. int total_dist_travelled_l = 0;
  45. int total_dist_travelled_r = 0;
  46. int spd_reg_factor = 1;
  47.  
  48. left_track->ChangeDirection(FORWARD);
  49. right_track->ChangeDirection(FORWARD);
  50. left_track->ChangeSpeed(255);
  51. right_track->ChangeSpeed(255);
  52.  
  53. left_track->Rotate();
  54. right_track->Rotate();
  55.  
  56. /*Serial.print("Speed regulations: ");
  57.  Serial.print(left_track->GetSpeedRegulation());
  58.  Serial.print(",");
  59.  Serial.println(right_track->GetSpeedRegulation());*/
  60.  
  61. while (goon)
  62. {
  63. Serial.println("Start of loop");
  64. int m_stat = 0;
  65. int l_enc = 0;
  66. int r_enc = 0;
  67.  
  68. get_mouse_data(m_stat, l_enc, r_enc);
  69.  
  70. Serial.print("LENC: ");
  71. Serial.print(l_enc);
  72. Serial.print(",RENC: ");
  73. Serial.println(r_enc);
  74.  
  75.  
  76. total_dist_travelled_l += l_enc;
  77. total_dist_travelled_r += r_enc;
  78.  
  79. if (r_enc != l_enc)
  80. {
  81. byte difference = 0;
  82. Motor *faster_track;
  83. Motor *slower_track;
  84. if (r_enc > l_enc)
  85. {
  86. Serial.println("Zpomaluji PRAVY pas");
  87. difference = r_enc - l_enc;
  88. faster_track = right_track;
  89. slower_track = left_track;
  90. } else if (l_enc > r_enc)
  91. {
  92. Serial.println("Zpomaluji LEVY pas");
  93. difference = l_enc - r_enc;
  94. faster_track = left_track;
  95. slower_track = right_track;
  96. }
  97. if (slower_track->GetSpeedRegulation() < 255)
  98. {
  99. slower_track->ChangeSpeedRegulation(slower_track->GetSpeedRegulation() + spd_reg_factor);
  100. } else
  101. {
  102. faster_track->ChangeSpeedRegulation(faster_track->GetSpeedRegulation() - spd_reg_factor);
  103. }
  104. }
  105.  
  106. if (analogRead(IR_pin) < IRsensitivity) goon = false; //obstacle detected
  107. Serial.print("End of loop.\n Free RAM: ");Serial.println(freeRAM());
  108. }
  109.  
  110. left_track->Stop();
  111. right_track->Stop();
  112.  
  113. delay(5000);
  114. /*
  115.  left_track->ChangeDirection(REVERSE);
  116.  right_track->ChangeDirection(REVERSE);
  117.  
  118.  goon = true;
  119.  while (goon)
  120.  {
  121.   int m_stat = 0;
  122.   int l_enc = 0;
  123.   int r_enc = 0;
  124.  
  125.   get_mouse_data(m_stat, l_enc, r_enc);
  126.   //Serial.println("Za gmd");
  127.   total_dist_travelled_l += l_enc;
  128.   total_dist_travelled_r += r_enc;
  129.  
  130.  
  131.   if (r_enc != l_enc)
  132.   {
  133.   Motor *faster_track;
  134.   Motor *slower_track;
  135.   if (r_enc < l_enc)
  136.   {
  137.   faster_track = right_track;
  138.   slower_track = left_track;
  139.   } else if (l_enc < r_enc)
  140.   {
  141.   faster_track = left_track;
  142.   slower_track = right_track;
  143.   }
  144.   if (slower_track->GetSpeedRegulation() < 255)
  145.   {
  146.   slower_track->ChangeSpeedRegulation(slower_track->GetSpeedRegulation() + spd_reg_factor);
  147.   } else
  148.   {
  149.   faster_track->ChangeSpeedRegulation(faster_track->GetSpeedRegulation() - spd_reg_factor);
  150.   }
  151.   }
  152.  
  153.   if (abs(total_dist_travelled_l) < 255 && abs(total_dist_travelled_r) < 255)
  154.   {
  155.   if (abs(total_dist_travelled_l) < 5 && abs(total_dist_travelled_r) < 5)
  156.   {
  157.   goon = false;
  158.   } else
  159.   {
  160.   smooth_move(total_dist_travelled_l, total_dist_travelled_r);
  161.   }
  162.   }
  163.  }*/
  164. }
  165.  
  166. void get_mouse_data(int& mstat, int& left_encoder, int& right_encoder)
  167. {
  168. int data[2] = {0};
  169. mouse->report(data);
  170. mstat = data[0];
  171. right_encoder = -data[1];
  172. left_encoder = -data[2];
  173. }
  174.  
  175.  
  176. void smooth_move(int l_tr, int r_tr)
  177. {
  178. const int min_spd = 50;
  179. const int tolerance = 5;
  180. if (abs(l_tr) < tolerance) l_tr = 0;
  181. if (abs(r_tr) < tolerance) r_tr = 0;
  182.  
  183. if (abs(l_tr) > 0)
  184. {
  185. if (l_tr > 0)
  186. {
  187. left_track->ChangeDirection(FORWARD);
  188. } else
  189. {
  190. left_track->ChangeDirection(REVERSE);
  191. }
  192. if (abs(l_tr) < 255)
  193. {
  194. int spd = abs(l_tr);
  195. if (spd < min_spd) spd = min_spd;
  196. left_track->ChangeSpeed(spd);
  197. } else
  198. {
  199. left_track->ChangeSpeed(255);
  200. }
  201. left_track->Rotate();
  202. } else
  203. {
  204. left_track->Stop();
  205. }
  206.  
  207. if (abs(r_tr) > 0)
  208. {
  209. if (r_tr > 0)
  210. {
  211. right_track->ChangeDirection(FORWARD);
  212. } else
  213. {
  214. right_track->ChangeDirection(REVERSE);
  215. }
  216. if (abs(r_tr) < 255)
  217. {
  218. int spd = abs(r_tr);
  219. if (spd < min_spd) spd = min_spd;
  220. right_track->ChangeSpeed(spd);
  221. } else
  222. {
  223. right_track->ChangeSpeed(255);
  224. }
  225. right_track->Rotate();
  226. } else
  227. {
  228. right_track->Stop();
  229. }
  230.  
  231. }
  232.  
Parsed using GeSHi 1.0.8.11 at 0.019