找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8983|回复: 3
打印 上一主题 下一主题
收起左侧

智能小车循迹加避障电路图 源程序

[复制链接]
跳转到指定楼层
楼主
这个简单的避障小车使用超声波进行距离测量,根据测量距离决定小车行驶方向。对于避障做了简化处理,只要有障碍物就右转。为了节省成本,只用了一个超声波模块,因此只能对正前方物体进行避障。小车采用三轮结构,速度差进行方向控制。
超声波模块使用的成品模块,单片机使用一个最小系统板,底板上有L293D电机驱动模块。总体组装如下图:


避障小车原理图.rar (35.42 KB, 下载次数: 95)
避障小车源代码.rar (4.46 KB, 下载次数: 44)


部分源码预览:
  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;             //停止定时器
  26.         TCNT0 = 0x38;             //设置初始值
  27.         TIMSK |= 0x01;
  28.         TCCR0 = 0x02;             //开动定时器

  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) //定时器溢出中断程序
  105. {
  106.         TCNT0 = 0x38; //从新调入初始值
  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. }


复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶1 踩
回复

使用道具 举报

地板
ID:382244 发表于 2018-8-2 17:23 | 只看该作者
这用的是51单片机吗
回复

使用道具 举报

板凳
ID:375149 发表于 2018-7-24 14:08 | 只看该作者
群主你好!在51黑内在示教控制器方面资料吗?谢谢!若有那个髙手知道,加我QQ:550220127聊!谢谢!!
回复

使用道具 举报

沙发
ID:280166 发表于 2018-4-9 18:31 | 只看该作者
很好,对我很有帮助
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表