Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.87 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. dist = robo_distSensor(); /* Read distance sensor */
  112.  
  113. if (myrobot.collided == 1) /* If collided then stop */
  114. {
  115. myrobot.rspeed = STOP_SPEED; /* STOP */
  116. myrobot.lspeed = STOP_SPEED;
  117. OSTimeDlyHMSM(0, 0, 0, 100); /* Wait 1 sec for stop to complete */
  118.  
  119. myrobot.rspeed = -MEDIUM_SPEED; /* REVERSE */
  120. myrobot.lspeed = MEDIUM_SPEED;
  121. OSTimeDlyHMSM(0, 0, 2, 0); /* Wait 2 sec for turning right to complete */
  122. }
  123.  
  124. else if(dist < 35)
  125. {
  126. robo_Honk();
  127. if(myrobot.light_side == 0 ){
  128. myrobot.rspeed = LOW_SPEED; /* turn right */
  129. myrobot.lspeed = -LOW_SPEED;
  130. OSTimeDlyHMSM(0, 0, 0, 200); /* Wait 200 ms for right turn to complete */
  131. }
  132.  
  133. else if(myrobot.light_side == 1 ){
  134. myrobot.rspeed = -LOW_SPEED; /* turn right */
  135. myrobot.lspeed = LOW_SPEED;
  136. OSTimeDlyHMSM(0, 0, 0, 200); /* Wait 200 ms for right turn to complete */
  137. }
  138.  
  139. else if(myrobot.light_side == 2 ){
  140. myrobot.rspeed = LOW_SPEED; /* turn left */
  141. myrobot.lspeed = -LOW_SPEED;
  142. OSTimeDlyHMSM(0, 0, 0, 200); /* Wait 200 ms for right turn to complete */
  143. }
  144. }
  145. else
  146. {
  147. myrobot.rspeed = HIGH_SPEED; /* move forward at straight */
  148. myrobot.lspeed = HIGH_SPEED;
  149. }
  150.  
  151. OSTimeDlyHMSM(0, 0, 0, 100); /* Task period ~ 100 ms */
  152. }
  153. }
  154.  
  155.  
  156. /*------Highest pririority task----------*/
  157. /* Create all other tasks here */
  158. void TaskStart( void *data )
  159. {
  160. OS_ticks_init(); /*-enable RTOS timer tick */
  161.  
  162. OSTaskCreate(LightPhobia, /*-Task function */
  163. (void *)0, /*-nothing passed to task */
  164. (void *)&LightPhobiaStk[TASK_STK_SZ - 1], /*-stack allocated to task */
  165. TASK_LIGHT_PHOBIA); /*-priority of task */
  166.  
  167. OSTaskCreate(CheckCollision, /*-Task function */
  168. (void *)0, /*-nothing passed to task */
  169. (void *)&ChkCollideStk[TASK_STK_SZ - 1], /*-stack allocated to task */
  170. TASK_CHKCOLLIDE_PRIO); /*-priority of task */
  171.  
  172. OSTaskCreate(CntrlMotors, /*-Task function */
  173. (void *)0, /*-nothing passed to task */
  174. (void *)&CtrlmotorStk[TASK_STK_SZ - 1], /*-stack allocated to task */
  175. TASK_CTRLMOTOR_PRIO); /*-priority of task */
  176.  
  177. OSTaskCreate(Cruise, /*-Task function */
  178. (void *)0, /*-nothing passed to task */
  179. (void *)&CruiseStk[TASK_STK_SZ - 1], /*-stack allocated to task */
  180. TASK_CRUISE_PRIO); /*-priority of task */
  181.  
  182. while(1)
  183. {
  184. OSTimeDlyHMSM(0, 0, 5, 0); /* Task period ~ 5 secs */
  185. robo_LED_toggle(); /* Show that we are alive */
  186. }
  187.  
  188. }
  189.  
  190. int main( void )
  191. {
  192. robo_Setup(); /* initialize HAL for robot */
  193. OSInit(); /* initialize UCOS-II kernel */
  194. robo_wait4goPress();
  195.  
  196. robo_motorSpeed(STOP_SPEED, STOP_SPEED); /* Stop the robot */
  197. myrobot.rspeed = STOP_SPEED; /* Initialize myrobot states */
  198. myrobot.lspeed = STOP_SPEED;
  199. myrobot.collided = 0; /* No collisioin */
  200. myrobot.light_side = 0;
  201.  
  202. OSTaskCreate(TaskStart, /* create TaskStart Task */
  203. (void *)0,
  204. (void *)&TaskStartStk[TASK_STK_SZ - 1],
  205. TASK_START_PRIO);
  206. OSStart(); /* Start multitasking */
  207. while (1); /* die here */
  208. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement