標(biāo)題: 智能小車循跡加避障電路圖 源程序 [打印本頁]

作者: 780102636    時(shí)間: 2016-12-10 17:56
標(biāo)題: 智能小車循跡加避障電路圖 源程序
這個(gè)簡(jiǎn)單的避障小車使用超聲波進(jìn)行距離測(cè)量,根據(jù)測(cè)量距離決定小車行駛方向。對(duì)于避障做了簡(jiǎn)化處理,只要有障礙物就右轉(zhuǎn)。為了節(jié)省成本,只用了一個(gè)超聲波模塊,因此只能對(duì)正前方物體進(jìn)行避障。小車采用三輪結(jié)構(gòu),速度差進(jìn)行方向控制。
超聲波模塊使用的成品模塊,單片機(jī)使用一個(gè)最小系統(tǒng)板,底板上有L293D電機(jī)驅(qū)動(dòng)模塊?傮w組裝如下圖:


避障小車原理圖.rar (35.42 KB, 下載次數(shù): 95)
避障小車源代碼.rar (4.46 KB, 下載次數(shù): 44)


部分源碼預(yù)覽:
  1. /*
  2. * motor.c
  3. *
  4. *  Created on: 2011-3-3
  5. *      Author: Jason Jiang
  6. *         Home Page: www.ruixuedz.com.cn
  7. *                  Email: ruixuedz@gmail.com
  8. */
  9. #include "motor.h"
  10. #include "uart.h"

  11. MOTOR_STATE g_motor_state = MOTOR_STOP;
  12. uchar g_count = 0;
  13. uchar g_left_pwm = 0;
  14. uchar g_right_pwm = 0;

  15. void motor_init()
  16. {
  17.         cli();
  18.         INPUT_DDR |= _BV(LEFT_INPUT1) | _BV(LEFT_INPUT2) | _BV(RIGHT_INPUT1) | _BV(
  19.                         RIGHT_INPUT2);
  20.         ENABLE_DDR |= _BV(LEFT_ENABLE) | _BV(RIGHT_ENABLE);
  21.         INPUT_PORT &= ~(_BV(LEFT_INPUT1) | _BV(LEFT_INPUT2) | _BV(RIGHT_INPUT1)
  22.                         | _BV(RIGHT_INPUT2));
  23.         ENABLE_PORT &= ~(_BV(LEFT_ENABLE) | _BV(RIGHT_ENABLE));

  24.         setSpeed(200, 200);

  25.         TCCR0 = 0x00;             //停止定時(shí)器
  26.         TCNT0 = 0x38;             //設(shè)置初始值
  27.         TIMSK |= 0x01;
  28.         TCCR0 = 0x02;             //開動(dòng)定時(shí)器

  29.         sei();
  30. }

  31. void motor_rotate()
  32. {
  33.         if (MOTOR_ROTATE == g_motor_state)
  34.         {
  35.                 return;
  36.         }

  37.         steerMotor(ROTATE_RIGHT);

  38.         g_motor_state = MOTOR_ROTATE;
  39. }

  40. void motor_forward()
  41. {
  42.         if (MOTOR_FORWARD == g_motor_state)
  43.         {
  44.                 return;
  45.         }

  46.         steerMotor(MOVE_FORWARD);

  47.         g_motor_state = MOTOR_FORWARD;
  48. }

  49. void steerMotor(MOTOR_STEER_ENUM steer)
  50. {
  51.         switch (steer)
  52.         {
  53.         case MOVE_FORWARD:
  54.                 INPUT_PORT &= ~(1 << LEFT_INPUT1);
  55.                 INPUT_PORT |= (1 << LEFT_INPUT2); //Left Motor On Forward
  56.                 INPUT_PORT &= ~(1 << RIGHT_INPUT1);
  57.                 INPUT_PORT |= (1 << RIGHT_INPUT2); //Right Motor On Forward
  58.                 break;

  59.         case TURN_LEFT:
  60.                 INPUT_PORT &= ~(1 << LEFT_INPUT1);
  61.                 INPUT_PORT &= ~(1 << LEFT_INPUT2); //Left Motor off
  62.                 INPUT_PORT &= ~(1 << RIGHT_INPUT1);
  63.                 INPUT_PORT |= (1 << RIGHT_INPUT2); //Right Motor On Forward
  64.                 break;

  65.         case TURN_RIGHT:
  66.                 INPUT_PORT &= ~(1 << LEFT_INPUT1);
  67.                 INPUT_PORT |= (1 << LEFT_INPUT2); //Left Motor On Forward
  68.                 INPUT_PORT &= ~(1 << RIGHT_INPUT1);
  69.                 INPUT_PORT &= ~(1 << RIGHT_INPUT2); //Right Motor off
  70.                 break;

  71.         case ROTATE_LEFT:
  72.                 INPUT_PORT |= (1 << LEFT_INPUT1);
  73.                 INPUT_PORT &= ~(1 << LEFT_INPUT2); //Left Motor On Reverse
  74.                 INPUT_PORT &= ~(1 << RIGHT_INPUT1);
  75.                 INPUT_PORT |= (1 << RIGHT_INPUT2); //Right Motor On Forward
  76.                 break;

  77.         case ROTATE_RIGHT:
  78.                 INPUT_PORT &= ~(1 << LEFT_INPUT1);
  79.                 INPUT_PORT |= (1 << LEFT_INPUT2); //Left Motor On Forward
  80.                 INPUT_PORT |= (1 << RIGHT_INPUT1);
  81.                 INPUT_PORT &= ~(1 << RIGHT_INPUT2); //Right Motor On Reverse
  82.                 break;

  83.         case MOVE_BACKWARD:
  84.                 INPUT_PORT |= (1 << LEFT_INPUT1);
  85.                 INPUT_PORT &= ~(1 << LEFT_INPUT2); //Left Motor On Reverse
  86.                 INPUT_PORT |= (1 << RIGHT_INPUT1);
  87.                 INPUT_PORT &= ~(1 << RIGHT_INPUT2); //Right Motor On Reverse
  88.                 break;

  89.         case FULL_STOP:
  90.                 INPUT_PORT &= ~(1 << LEFT_INPUT1);
  91.                 INPUT_PORT &= ~(1 << LEFT_INPUT2); //Left Motor off
  92.                 INPUT_PORT &= ~(1 << RIGHT_INPUT1);
  93.                 INPUT_PORT &= ~(1 << RIGHT_INPUT2); //Right Motor off
  94.                 break;

  95.         default:
  96.                 break;
  97.         }
  98. }

  99. void setSpeed(uchar left_pwm, uchar right_pwm)
  100. {
  101.         g_left_pwm = left_pwm;
  102.         g_right_pwm = right_pwm;
  103. }

  104. ISR(TIMER0_OVF_vect) //定時(shí)器溢出中斷程序
  105. {
  106.         TCNT0 = 0x38; //從新調(diào)入初始值
  107.         g_count++; //每中斷一次加1
  108.         //printStr("int\n");
  109.         if (g_count < g_left_pwm) //判斷pwm1是不是改輸出高電平
  110.         {
  111.                 ENABLE_PORT |= (1 << LEFT_ENABLE);
  112.                 //printStr("l1\n");
  113.         }
  114.         else
  115.         { //不是則輸出0
  116.                 ENABLE_PORT &= ~(1 << LEFT_ENABLE);
  117.                 //printStr("l0\n");
  118.         }

  119.         if (g_count < g_right_pwm)
  120.         {
  121.                 ENABLE_PORT |= (1 << RIGHT_ENABLE);
  122.                 //printStr("r1\n");
  123.         }
  124.         else
  125.         {
  126.                 ENABLE_PORT &= ~(1 << RIGHT_ENABLE);
  127.                 //printStr("r0\n");
  128.         }
  129. }


復(fù)制代碼



作者: 瘋和尚    時(shí)間: 2018-4-9 18:31
很好,對(duì)我很有幫助
作者: WKG_123456    時(shí)間: 2018-7-24 14:08
群主你好!在51黑內(nèi)在示教控制器方面資料嗎?謝謝!若有那個(gè)髙手知道,加我QQ:550220127聊!謝謝!!

作者: 飛飛....    時(shí)間: 2018-8-2 17:23
這用的是51單片機(jī)嗎




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1