Advertisement
Guest User

Untitled

a guest
Apr 24th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.82 KB | None | 0 0
  1. /*
  2. * turning.ino
  3. *
  4. * Implementing turns in SIXT33N
  5. *
  6. * EE16B Fall 2016
  7. * Emily Naviasky & Nathaniel Mailoa
  8. *
  9. * EE 16B Fall 2017
  10. * Andrew Blatner
  11. *
  12. */
  13.  
  14. #define LEFT_MOTOR P2_0
  15. #define LEFT_ENCODER P6_1
  16. #define RIGHT_MOTOR P1_5
  17. #define RIGHT_ENCODER P6_2
  18.  
  19. #define SAMPLING_INTERVAL 100
  20. int sample_lens[4] = {0};
  21.  
  22. // Operation modes
  23. #define MODE_LISTEN 0
  24. #define MODE_DRIVE 1
  25.  
  26. #define DRIVE_FAR 0
  27. #define DRIVE_LEFT 1
  28. #define DRIVE_CLOSE 2
  29. #define DRIVE_RIGHT 3
  30.  
  31. #define JOLT_STEPS 2
  32.  
  33. boolean loop_mode = MODE_DRIVE;
  34. int drive_mode = 0;
  35.  
  36. int step_num = 0;
  37. volatile boolean do_loop = 0; // timer signal to increment timestep
  38.  
  39. typedef struct encoder {
  40. int pin;
  41. int pos;
  42. bool level;
  43. int avg;
  44. } encoder_t;
  45.  
  46. encoder_t left_encoder = {LEFT_ENCODER, 0, LOW, 0};
  47. encoder_t right_encoder = {RIGHT_ENCODER, 0, LOW, 0};
  48.  
  49. /*---------------------------*/
  50. /* CODE BLOCK CON1 */
  51. /* From closed_loop.ino */
  52. /*---------------------------*/
  53.  
  54. float theta_left = 0.2261;
  55. float theta_right = 0.3047;
  56. float beta_left = -8.382;
  57. float beta_right = 3.595;
  58. float v_star = 41.2;
  59.  
  60. int left_jolt = 190;
  61. int right_jolt = 195;
  62.  
  63. // Control gains
  64. float k_left = 0.6;
  65. float k_right = 0.4;
  66.  
  67. /*---------------------------*/
  68. /* CODE BLOCK CON2 */
  69. /* From closed_loop.ino */
  70. /*---------------------------*/
  71.  
  72. float driveStraight_left(float delta) {
  73. return ;
  74. }
  75.  
  76. float driveStraight_right(float delta) {
  77. return ;
  78. }
  79.  
  80. /*---------------------------*/
  81. /* CODE BLOCK CON3 */
  82. /* From closed_loop.ino */
  83. /*---------------------------*/
  84.  
  85. float delta_ss = ;
  86.  
  87. /*---------------------------*/
  88. /* CODE BLOCK CON4 */
  89. /*---------------------------*/
  90.  
  91. #define CAR_WIDTH 15.0 // in cm
  92. #define TURN_RADIUS 91 // in cm - 6 feet diameter = 3 tiles in 125 Cory
  93. // #define TURN_RADIUS 60 // in cm - 4 feet diameter = 2 tiles in 125 Cory
  94.  
  95. int run_times[4] = {7000, 5000, 2500, 5000};
  96.  
  97. float delta_reference(int k) {
  98. // YOUR CODE HERE
  99. if (drive_mode == DRIVE_RIGHT) {
  100. return ;
  101. }
  102. else if (drive_mode == DRIVE_LEFT) {
  103. return ;
  104. }
  105. else { // DRIVE_FAR, DRIVE_CLOSE
  106. return ;
  107. }
  108. }
  109.  
  110. /*---------------------------*/
  111. /* CODE BLOCK CON5 */
  112. /*---------------------------*/
  113. #define INFINITY (3.4e+38)
  114. #define STRAIGHT_RADIUS INFINITY
  115.  
  116. float straight_correction(int k) {
  117. // YOUR CODE HERE
  118. return 0;
  119. }
  120.  
  121. /*---------------------------*/
  122. /*---------------------------*/
  123. /*---------------------------*/
  124.  
  125. void setup(void) {
  126. Serial.begin(38400);
  127.  
  128. pinMode(LEFT_MOTOR, OUTPUT);
  129. pinMode(LEFT_ENCODER, INPUT);
  130. pinMode(RIGHT_MOTOR, OUTPUT);
  131. pinMode(RIGHT_ENCODER, INPUT);
  132. pinMode(RED_LED, OUTPUT);
  133. pinMode(GREEN_LED, OUTPUT);
  134.  
  135. for (int i = 0; i <= 4; i++) {
  136. sample_lens[i] = run_times[i]/SAMPLING_INTERVAL;
  137. }
  138.  
  139. write_pwm(0, 0);
  140. delay(2000); // Wait 2 seconds to put down car
  141. reset_blinker();
  142. setTimer(); // Set timer for timestep
  143. start_drive_mode();
  144. }
  145.  
  146. void loop(void) {
  147. check_encoders();
  148. if (loop_mode == MODE_LISTEN) {
  149. // In the integration phase of the project, this section will listen
  150. // to the microphone and switch to the specified mode.
  151. // For now, we simply cycle through them.
  152. drive_mode = (drive_mode + 1) % 4;
  153.  
  154. start_drive_mode();
  155. }
  156.  
  157. else if (loop_mode == MODE_DRIVE && do_loop) {
  158. if (step_num < JOLT_STEPS) {
  159. write_pwm(left_jolt, right_jolt);
  160. }
  161. else {
  162.  
  163. // Save positions because _left_position and _right_position
  164. // can change in the middle of one loop.
  165. int left_position = left_encoder.pos;
  166. int right_position = right_encoder.pos;
  167.  
  168. /*---------------------------*/
  169. /* CODE BLOCK CON0 */
  170. /*---------------------------*/
  171.  
  172. float delta = left_position - right_position + delta_ss;
  173. delta = delta - delta_reference(step_num) - straight_correction(step_num);
  174.  
  175. // Drive straight using feedback
  176. // Compute the needed pwm values for each wheel using delta and v_star
  177. int left_cur_pwm = driveStraight_left(delta);
  178. int right_cur_pwm = driveStraight_right(delta);
  179. write_pwm(left_cur_pwm, right_cur_pwm);
  180.  
  181. /*---------------------------*/
  182. /*---------------------------*/
  183. /*---------------------------*/
  184. }
  185.  
  186. // Counter for how many times loop is executed since entering DRIVE MODE
  187. step_num++;
  188.  
  189. if (step_num == sample_lens[drive_mode]) {
  190. // Completely stop and go back to listen MODE after 3 seconds
  191. start_listen_mode();
  192. }
  193.  
  194. do_loop = 0;
  195. }
  196. }
  197.  
  198. /*---------------------------*/
  199. /* Helper functions */
  200. /*---------------------------*/
  201.  
  202. void start_drive_mode(void) {
  203. loop_mode = MODE_DRIVE;
  204. step_num = 0;
  205. left_encoder.pos = 0;
  206. right_encoder.pos = 0;
  207. }
  208.  
  209. void start_listen_mode(void) {
  210. write_pwm(0, 0);
  211. delay(3000);
  212. loop_mode = MODE_LISTEN;
  213. }
  214.  
  215. void write_pwm(int pwm_left, int pwm_right) {
  216. analogWrite(LEFT_MOTOR, (int) min(max(0, pwm_left), 255));
  217. analogWrite(RIGHT_MOTOR, (int) min(max(0, pwm_right), 255));
  218. }
  219.  
  220. void reset_blinker(void) {
  221. digitalWrite(RED_LED, HIGH);
  222. delay(100);
  223. digitalWrite(RED_LED, LOW);
  224. digitalWrite(GREEN_LED, HIGH);
  225. delay(100);
  226. digitalWrite(RED_LED, HIGH);
  227. digitalWrite(GREEN_LED, LOW);
  228. delay(100);
  229. digitalWrite(RED_LED, LOW);
  230. digitalWrite(GREEN_LED, HIGH);
  231. delay(100);
  232. digitalWrite(GREEN_LED, LOW);
  233. }
  234.  
  235. /*---------------------------*/
  236. /* Interrupt functions */
  237. /*---------------------------*/
  238.  
  239. #define AVG_DECAY_RATE 0.3
  240. #define LOW_THRESH ((int) (0.2*4096))
  241. #define HIGH_THRESH ((int) (0.8*4096))
  242.  
  243. void check_encoder(encoder_t* enc) {
  244. int new_val = analogRead(enc->pin);
  245. enc->avg = (int) (AVG_DECAY_RATE*enc->avg + (1 - AVG_DECAY_RATE)*new_val);
  246. if ((enc->level == LOW && HIGH_THRESH < enc->avg) ||
  247. (enc->level == HIGH && enc->avg < LOW_THRESH)) {
  248. enc->pos++;
  249. enc->level = !enc->level;
  250. }
  251. }
  252.  
  253. void check_encoders(void) {
  254. check_encoder(&left_encoder);
  255. check_encoder(&right_encoder);
  256. }
  257.  
  258. // Set timer for timestep; use A2 since A0 & A1 are used by PWM
  259. void setTimer(void) {
  260. TA2CCR0 = (unsigned int) (32.768*SAMPLING_INTERVAL); // set the timer based on 32kHz clock
  261. TA2CCTL0 = CCIE; // enable interrupts for Timer A
  262. __bis_SR_register(GIE);
  263. TA2CTL = TASSEL_1 + MC_1 + TACLR + ID_0;
  264. }
  265.  
  266. // ISR for timestep
  267. #pragma vector=TIMER2_A0_VECTOR // Timer A ISR
  268. __interrupt void Timer2_A0_ISR(void) {
  269. if (loop_mode == MODE_DRIVE) {
  270. do_loop = 1;
  271. }
  272. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement