极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 126027|回复: 70

Arduino一个简单的小车(实现测距和避障功能—可以自行DIY)

  [复制链接]
发表于 2012-4-18 08:54:55 | 显示全部楼层 |阅读模式
本帖最后由 Randy 于 2012-4-18 08:57 编辑

       首先申明,这个帖子是转别人的,仅供大家一起学习用。这个小车很简单,超声波测量前方距离,Arduino 根据超声波模块接受的距离控制小车前进、后退或者左转右转。也就是说它有自己的“思维”方式,只要打开电源在没有人干预的情况下可以独自在房间里闲逛而不会碰到任何东西。


先上一些整体图片:








如果你也对这个有兴趣那么可以和我一起来制作这样一个ROBOT。

材料准备:



1、arduino 板子一个,我使用的是 arduino duemilanove 2009 - ATMega328P,因为我觉得这个性价比最高。Arduino UNO 也可以。




2、 超声波测距模块一个


3、 直流电机 + 轮胎




4、 L298N电机驱动模块 一个 电机驱动最好带光耦的,否则可能会对超声波信号产生干扰





5、万向轮 + 小车底盘 + 杜邦线 + 螺丝、螺母 + 烙铁 + 螺丝刀 + 剪刀等

      万向轮可以去淘宝购买

      小车底盘是用来固定电机和电路板的,可以选用PVC板自己动手制作也可以买现成的



      材料都有了就可以将它们链接起来。接线方式可以从程序的注释中看出来,本来准备用舵机控制超声波模块转向的,后来觉得舵机固定比较麻烦就没用,android程序如下:
  1. #define DEBUG 0    // set to 1 to print to serial monitor, 0 to disable
  2. #include <Servo.h>

  3. Servo headservo;  // 头部舵机对象

  4. // Constants
  5. const int EchoPin = 2; //超声波信号输入
  6. const int TrigPin = 3; //超声波控制信号输出

  7. const int leftmotorpin1 = 4; // 直流电机信号输出
  8. const int leftmotorpin2 = 5;
  9. const int rightmotorpin1 = 6;
  10. const int rightmotorpin2 = 7;

  11. const int HeadServopin = 9; // 舵机信号输出 只有9或10接口可利用
  12. const int Sharppin = 11; // 红外输入

  13. const int maxStart = 800;  //run dec time

  14. // Variables
  15. int isStart = maxStart;    //启动
  16. int currDist = 0;    // 距离
  17. boolean running = false;

  18. void setup() {

  19.   Serial.begin(9600); // 开始串行监测

  20.   //信号输入接口
  21.   pinMode(EchoPin, INPUT);
  22.   pinMode(Sharppin, INPUT);

  23.   //信号输出接口
  24.   for (int pinindex = 3; pinindex < 11; pinindex++) {
  25.     pinMode(pinindex, OUTPUT); // set pins 3 to 10 as outputs
  26.   }

  27.   //舵机接口
  28.   headservo.attach(HeadServopin);

  29.   //启动缓冲活动头部
  30.   headservo.write(70);
  31.   delay(2000);
  32.   headservo.write(20);
  33.   delay(2000);
  34. }

  35. void loop() {

  36.   if(DEBUG){
  37.     Serial.print("running:");
  38.     if(running){
  39.       Serial.println("true");
  40.     }
  41.     else{
  42.       Serial.println("false");
  43.     }
  44.   }

  45.   if (isStart <= 0) {
  46.     if(running){
  47.       totalhalt();    // stop!
  48.     }
  49.     int findsomebody = digitalRead(Sharppin);
  50.     if(DEBUG){
  51.       Serial.print("findsomebody:");   
  52.       Serial.println(findsomebody);   
  53.     }   
  54.     if(findsomebody > 0) {
  55.       isStart = maxStart;
  56.     }
  57.     delay(4000);
  58.     return;
  59.   }
  60.   isStart--;
  61.   delay(100);

  62.   if(DEBUG){
  63.     Serial.print("isStart: ");
  64.     Serial.println(isStart);  
  65.   }

  66.   currDist = MeasuringDistance(); //读取前端距离

  67.   if(DEBUG){
  68.     Serial.print("Current Distance: ");
  69.     Serial.println(currDist);  
  70.   }  

  71.   if(currDist > 30) {
  72.     nodanger();
  73.   }
  74.   else if(currDist < 15){
  75.     backup();
  76.     randTrun();
  77.   }
  78.   else {
  79.     //whichway();
  80.     randTrun();
  81.   }
  82. }

  83. //测量距离 单位厘米
  84. long MeasuringDistance() {
  85.   long duration;
  86.   //pinMode(TrigPin, OUTPUT);
  87.   digitalWrite(TrigPin, LOW);
  88.   delayMicroseconds(2);
  89.   digitalWrite(TrigPin, HIGH);
  90.   delayMicroseconds(5);
  91.   digitalWrite(TrigPin, LOW);

  92.   //pinMode(EchoPin, INPUT);
  93.   duration = pulseIn(EchoPin, HIGH);

  94.   return duration / 29 / 2;
  95. }

  96. // 前进
  97. void nodanger() {
  98.   running = true;
  99.   digitalWrite(leftmotorpin1, LOW);
  100.   digitalWrite(leftmotorpin2, HIGH);
  101.   digitalWrite(rightmotorpin1, LOW);
  102.   digitalWrite(rightmotorpin2, HIGH);
  103.   return;
  104. }  

  105. //后退
  106. void backup() {
  107.   running = true;
  108.   digitalWrite(leftmotorpin1, HIGH);
  109.   digitalWrite(leftmotorpin2, LOW);
  110.   digitalWrite(rightmotorpin1, HIGH);
  111.   digitalWrite(rightmotorpin2, LOW);
  112.   delay(1000);
  113. }

  114. //选择路线
  115. void whichway() {
  116.   running = true;
  117.   totalhalt();    // first stop!

  118.   headservo.write(20);
  119.   delay(1000);
  120.   int lDist = MeasuringDistance();   // check left distance
  121.   totalhalt();      // 恢复探测头

  122.   headservo.write(120);  // turn the servo right
  123.   delay(1000);
  124.   int rDist = MeasuringDistance();   // check right distance
  125.   totalhalt();      // 恢复探测头

  126.   if(lDist < rDist) {
  127.     body_lturn();
  128.   }
  129.   else{
  130.     body_rturn();
  131.   }
  132.   return;
  133. }

  134. //重新机械调整到初始状态
  135. void totalhalt() {
  136.   digitalWrite(leftmotorpin1, HIGH);
  137.   digitalWrite(leftmotorpin2, HIGH);
  138.   digitalWrite(rightmotorpin1, HIGH);
  139.   digitalWrite(rightmotorpin2, HIGH);
  140.   headservo.write(70);  //  set servo to face forward
  141.   running = false;
  142.   return;
  143.   delay(1000);
  144. }  

  145. //左转
  146. void body_lturn() {
  147.   running = true;
  148.   digitalWrite(leftmotorpin1, LOW);
  149.   digitalWrite(leftmotorpin2, HIGH);
  150.   digitalWrite(rightmotorpin1, HIGH);
  151.   digitalWrite(rightmotorpin2, LOW);
  152.   delay(1500);
  153.   totalhalt();
  154. }  

  155. //右转
  156. void body_rturn() {
  157.   running = true;
  158.   digitalWrite(leftmotorpin1, HIGH);
  159.   digitalWrite(leftmotorpin2, LOW);
  160.   digitalWrite(rightmotorpin1, LOW);
  161.   digitalWrite(rightmotorpin2, HIGH);
  162.   delay(1500);
  163.   totalhalt();
  164. }  

  165. void randTrun(){
  166.   long randNumber;
  167.   randomSeed(analogRead(0));
  168.   randNumber = random(0, 10);
  169.   if(randNumber > 5) {
  170.     body_rturn();
  171.   }
  172.   else
  173.   {
  174.     body_lturn();
  175.   }
  176. }
复制代码
我一直想拥有自己的一辆小车,也正准备动手去组装,调试了,我们论坛的三水、奈何他们已经早玩了,我还是第一次去接触,有时间去向三水妹纸学习学习!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2012-4-18 23:42:24 | 显示全部楼层
小车很可爱啊
回复 支持 反对

使用道具 举报

发表于 2012-7-6 17:04:41 | 显示全部楼层
电机是扎带固定?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-6 17:48:30 | 显示全部楼层
幻生幻灭 发表于 2012-7-6 17:04
电机是扎带固定?

是的,工程用的那种扎带!蛮好用的!
回复 支持 反对

使用道具 举报

发表于 2012-7-6 19:09:02 | 显示全部楼层
Randy 发表于 2012-7-6 17:48
是的,工程用的那种扎带!蛮好用的!

个人认为 扎带不靠谱,呵呵
受外力作用会导致电机移位
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-6 23:03:31 | 显示全部楼层
幻生幻灭 发表于 2012-7-6 19:09
个人认为 扎带不靠谱,呵呵
受外力作用会导致电机移位

是的,那你用啥呢?推荐一下,我现在玩的小车就两辆,到时候我弄个酷一点的。哈哈!
回复 支持 反对

使用道具 举报

发表于 2012-7-7 08:39:22 | 显示全部楼层
不错真吊
回复 支持 反对

使用道具 举报

发表于 2012-7-7 08:41:21 | 显示全部楼层
最好还是L型的铝合金支架,当然如果纯娱乐,可以采用我们盒仔的结构,都比扎带简单
图纸在Github上免费下载
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-7 09:12:52 | 显示全部楼层
风轻云淡 发表于 2012-7-7 08:39
不错真吊

呵呵,看起来还算是比较清秀的哪一种,没有很复杂!可以试试!
回复 支持 反对

使用道具 举报

发表于 2012-7-8 18:13:41 | 显示全部楼层
Randy 发表于 2012-7-7 09:12
呵呵,看起来还算是比较清秀的哪一种,没有很复杂!可以试试!

是啊你有电路不我也试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-9 09:02:03 | 显示全部楼层
风轻云淡 发表于 2012-7-8 18:13
是啊你有电路不我也试试

我都是有现成的模块了,搭建一下就好了!
回复 支持 反对

使用道具 举报

发表于 2012-7-14 19:59:45 | 显示全部楼层
我也打算做一个蔽障小车,只不过才刚接触Arduino,不懂的地方还希望楼主多多指教。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-14 23:57:10 | 显示全部楼层
夏异 发表于 2012-7-14 19:59
我也打算做一个蔽障小车,只不过才刚接触Arduino,不懂的地方还希望楼主多多指教。

呵呵,一起学习,我也不是很厉害,一起参与交流会懂得越多!
回复 支持 反对

使用道具 举报

发表于 2012-7-15 02:39:29 | 显示全部楼层
朋友,厉害,没有录制一个视频啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-15 07:47:50 | 显示全部楼层
piaozhiling 发表于 2012-7-15 02:39
朋友,厉害,没有录制一个视频啊

不好意思,没有视频哦!只要有现有的模块,拼在一起就不难了!
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-24 11:55 , Processed in 0.050232 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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