Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2019
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.56 KB | None | 0 0
  1. /*
  2. * ROBOTAR.C -- A simple RoboTar program with uCOS-II
  3. * Written by: Rosbi Mamat 6/5/2014
  4. */
  5.  
  6. #include "..\ucosobj\kernel.h" /* Always include these to use uCOS-II */
  7. #include "..\hal\hal_robo.h" /* and RoboTar HAL */
  8.  
  9. #define TASK_STK_SZ 128 /* Size of each task's stacks (# of bytes) */
  10. #define TASK_START_PRIO 1 /* Highest priority */
  11. #define TASK_CHKCOLLIDE_PRIO 3
  12. #define TASK_CTRLMOTOR_PRIO 4
  13. #define TASK_CRUISE_PRIO 5 /* Lowest priority */
  14. #define TASK_LIGHT_PHOBIA 2
  15.  
  16. OS_STK CtrlmotorStk[TASK_STK_SZ]; /* Task CtrlMotors stack */
  17. OS_STK CruiseStk[TASK_STK_SZ]; /* Task NavigRobot stack */
  18. OS_STK TaskStartStk[TASK_STK_SZ]; /* TaskStartTask stack */
  19. OS_STK ChkCollideStk[TASK_STK_SZ]; /* Task StopOnCollide stack */
  20. OS_STK LightPhobiaStk[TASK_STK_SZ];
  21.  
  22. /* ------ Global shared variable -------*/
  23. /* Ideally, this should be protected by a semaphore etc */
  24. struct robostate
  25. {
  26. int rspeed; /* right motor speed (-100 -- +100) */
  27. int lspeed; /* leftt motor speed (-100 -- +100) */
  28. char collided; /* collision? 1 = yes, 0 = no */
  29. char light_side;
  30. } myrobot;
  31.  
  32. /*------High pririority task----------*/
  33. void CheckCollision (void *data)
  34. {
  35. for(;;)
  36. {
  37. if ( (robo_bumpSensorR() == HIT) || /* collide ? */
  38. (robo_bumpSensorL() == HIT) )
  39. {
  40. myrobot.collided = 1; /* signal that collisioin */
  41. }
  42. else
  43. {
  44. myrobot.collided = 0; /* signal no collisioin */
  45. }
  46. OSTimeDlyHMSM(0, 0, 0, 100); /* Task period ~ 100 ms */
  47. }
  48. }
  49.  
  50. /* Lowest Priority Task - Light Chase Task*/
  51. void LightPhobia (void *data)
  52. {
  53. int r_light;
  54. int l_light;
  55. int light_diff;
  56.  
  57. for(;;)
  58. {
  59. r_light = robo_lightSensorR();
  60. l_light = robo_lightSensorL();
  61. light_diff = r_light - l_light;
  62.  
  63. //TURN RIGHT
  64. if (r_light > 400 && l_light > 400 && light_diff > 30)
  65. {
  66. myrobot.light_side = 2;
  67. }
  68.  
  69. //TURN LEFT
  70. else if (r_light > 400 && l_light > 400 && light_diff < -30)
  71. {
  72. myrobot.light_side = 1;
  73. }
  74.  
  75. else //if (light_diff >= -30 && light_diff <= 30)
  76. {
  77. myrobot.light_side = 0;
  78. }
  79.  
  80. OSTimeDlyHMSM(0, 0, 0, 200); /* Task period ~ 200 ms */
  81. }
  82. }
  83.  
  84.  
  85.  
  86. /* Control robot Motors TASK */
  87. void CntrlMotors (void *data)
  88. {
  89. int speed_r, speed_l;
  90.  
  91. for(;;)
  92. {
  93. speed_r = myrobot.rspeed;
  94. speed_l = myrobot.lspeed;
  95. robo_motorSpeed(speed_l, speed_r);
  96. OSTimeDlyHMSM(0, 0, 0, 200); /* Task period ~ 200 ms */
  97. }
  98. }
  99.  
  100. /* -----------------------------------------------
  101. * Task for navigating robot
  102. * Write you own navigation task here
  103. */
  104.  
  105. //void Cruise (void *data)
  106. //{
  107. // int dist;
  108. //
  109. // for (;;)
  110. // {
  111. // if (myrobot.collided == 1) /* If collided then reverse */
  112. // {
  113. // myrobot.rspeed = -LOW_SPEED; /* REVERSE */
  114. // myrobot.lspeed = -LOW_SPEED;
  115. // }
  116. // else /* obstacle is far away & no collision */
  117. // {
  118. // myrobot.rspeed = LOW_SPEED; /* move forward at straight */
  119. // myrobot.lspeed = LOW_SPEED - 8;
  120. // }
  121. // OSTimeDlyHMSM(0, 0, 0, 500); /* Task period ~ 500 ms */
  122. // }
  123. //}
  124.  
  125. void Cruise (void *data)
  126. {
  127. int dist;
  128.  
  129. for (;;)
  130. {
  131. dist = robo_distSensor(); /* Read distance sensor */
  132.  
  133. if (myrobot.collided == 1) /* If collided then stop */
  134. {
  135. myrobot.rspeed = STOP_SPEED; /* STOP */
  136. myrobot.lspeed = STOP_SPEED;
  137. OSTimeDlyHMSM(0, 0, 0, 100); /* Wait 1 sec for stop to complete */
  138.  
  139. myrobot.rspeed = MEDIUM_SPEED; /* REVERSE */
  140. myrobot.lspeed = -MEDIUM_SPEED;
  141. OSTimeDlyHMSM(0, 0, 2, 0); /* Wait 2 sec for turning right to complete */
  142. }
  143.  
  144. else if(dist < 35)
  145. {
  146. robo_Honk();
  147. if(myrobot.light_side == 0 ){
  148. myrobot.rspeed = LOW_SPEED; /* turn right */
  149. myrobot.lspeed = -LOW_SPEED;
  150. OSTimeDlyHMSM(0, 0, 0, 200); /* Wait 200 ms for right turn to complete */
  151. }
  152.  
  153. else if(myrobot.light_side == 1 ){
  154. myrobot.rspeed = -LOW_SPEED; /* turn right */
  155. myrobot.lspeed = LOW_SPEED;
  156. OSTimeDlyHMSM(0, 0, 0, 200); /* Wait 200 ms for right turn to complete */
  157. }
  158.  
  159. else if(myrobot.light_side == 2 ){
  160. myrobot.rspeed = LOW_SPEED; /* turn left */
  161. myrobot.lspeed = -LOW_SPEED;
  162. OSTimeDlyHMSM(0, 0, 0, 200); /* Wait 200 ms for right turn to complete */
  163. }
  164. }
  165. else
  166. {
  167. myrobot.rspeed = LOW_SPEED; /* move forward at straight */
  168. myrobot.lspeed = LOW_SPEED;
  169. }
  170.  
  171. OSTimeDlyHMSM(0, 0, 0, 100); /* Task period ~ 100 ms */
  172. }
  173. }
  174.  
  175.  
  176. /*------Highest pririority task----------*/
  177. /* Create all other tasks here */
  178. void TaskStart( void *data )
  179. {
  180. OS_ticks_init(); /*-enable RTOS timer tick */
  181.  
  182. OSTaskCreate(LightPhobia, /*-Task function */
  183. (void *)0, /*-nothing passed to task */
  184. (void *)&LightPhobiaStk[TASK_STK_SZ - 1], /*-stack allocated to task */
  185. TASK_LIGHT_PHOBIA); /*-priority of task */
  186.  
  187. OSTaskCreate(CheckCollision, /*-Task function */
  188. (void *)0, /*-nothing passed to task */
  189. (void *)&ChkCollideStk[TASK_STK_SZ - 1], /*-stack allocated to task */
  190. TASK_CHKCOLLIDE_PRIO); /*-priority of task */
  191.  
  192. OSTaskCreate(CntrlMotors, /*-Task function */
  193. (void *)0, /*-nothing passed to task */
  194. (void *)&CtrlmotorStk[TASK_STK_SZ - 1], /*-stack allocated to task */
  195. TASK_CTRLMOTOR_PRIO); /*-priority of task */
  196.  
  197. OSTaskCreate(Cruise, /*-Task function */
  198. (void *)0, /*-nothing passed to task */
  199. (void *)&CruiseStk[TASK_STK_SZ - 1], /*-stack allocated to task */
  200. TASK_CRUISE_PRIO); /*-priority of task */
  201.  
  202. while(1)
  203. {
  204. OSTimeDlyHMSM(0, 0, 5, 0); /* Task period ~ 5 secs */
  205. robo_LED_toggle(); /* Show that we are alive */
  206. }
  207.  
  208. }
  209.  
  210. int main( void )
  211. {
  212. robo_Setup(); /* initialize HAL for robot */
  213. OSInit(); /* initialize UCOS-II kernel */
  214. robo_wait4goPress();
  215.  
  216. robo_motorSpeed(STOP_SPEED, STOP_SPEED); /* Stop the robot */
  217. myrobot.rspeed = STOP_SPEED; /* Initialize myrobot states */
  218. myrobot.lspeed = STOP_SPEED;
  219. myrobot.collided = 0; /* No collisioin */
  220. myrobot.light_side = 0;
  221.  
  222. OSTaskCreate(TaskStart, /* create TaskStart Task */
  223. (void *)0,
  224. (void *)&TaskStartStk[TASK_STK_SZ - 1],
  225. TASK_START_PRIO);
  226. OSStart(); /* Start multitasking */
  227. while (1); /* die here */
  228. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement