极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 29607|回复: 13

一个自制的arduino小车以及一些问题

[复制链接]
发表于 2012-10-18 13:27:01 | 显示全部楼层 |阅读模式
这两天没事,根据论坛里Randy同学发的一个帖子,自己也DIY了一个小车。小车很简单,就是希望能做到简单的避障。
这个小车的程序和创意都是Randy同学的帖子里的,我只是修改了一下他的程序。

这是我做的小车:


小车的材料有:
1.一个arduino uno的板子;
2.一个L298N电机模块的板子;
3.小车底盘直接在淘宝上买的;
4.超声波测距模块一个。

这是小车的程序。因为我是第一次做,所以小车功能简单,只是想要做一个能够简单避障和转向的小车。

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

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

  7. int currDist = 0;    // 距离

  8. void setup() {
  9.   pinMode(EchoPin, INPUT);
  10.   for (int pinindex = 3; pinindex < 8; pinindex++) {
  11.     pinMode(pinindex, OUTPUT); // set pins 3 to 10 as outputs
  12.   }
  13. }

  14. void loop() {
  15.   currDist = MeasuringDistance(); //读取前端距离

  16.   if(currDist > 20) {
  17.     nodanger();
  18.   }
  19.   else if(currDist < 15){
  20.     backup();
  21.     randTrun();
  22.   }
  23.   else {
  24.     //whichway();
  25.     randTrun();
  26.   }
  27. }

  28. //测量距离 单位厘米
  29. long MeasuringDistance() {
  30.   long duration;
  31.   //pinMode(TrigPin, OUTPUT);
  32.   digitalWrite(TrigPin, LOW);
  33.   delayMicroseconds(2);
  34.   digitalWrite(TrigPin, HIGH);
  35.   delayMicroseconds(10);
  36.   digitalWrite(TrigPin, LOW);

  37.   //pinMode(EchoPin, INPUT);
  38.   duration = pulseIn(EchoPin, HIGH);

  39.   return duration / 29 / 2;
  40. }

  41. // 前进
  42. void nodanger() {
  43.   digitalWrite(leftmotorpin1, HIGH);
  44.   digitalWrite(leftmotorpin2, LOW);
  45.   digitalWrite(rightmotorpin1, HIGH);
  46.   digitalWrite(rightmotorpin2, LOW);
  47.   return;
  48. }  

  49. //后退
  50. void backup() {
  51.   digitalWrite(leftmotorpin1, LOW);
  52.   digitalWrite(leftmotorpin2, HIGH);
  53.   digitalWrite(rightmotorpin1, LOW);
  54.   digitalWrite(rightmotorpin2, HIGH);
  55.   delay(1000);
  56. }

  57. void totalhalt() {
  58.   digitalWrite(leftmotorpin1, HIGH);
  59.   digitalWrite(leftmotorpin2, HIGH);
  60.   digitalWrite(rightmotorpin1, HIGH);
  61.   digitalWrite(rightmotorpin2, HIGH);
  62.   return;
  63.   delay(500);
  64. }  

  65. //左转
  66. void body_lturn() {
  67.   digitalWrite(leftmotorpin1, LOW);
  68.   digitalWrite(leftmotorpin2, HIGH);
  69.   digitalWrite(rightmotorpin1, HIGH);
  70.   digitalWrite(rightmotorpin2, LOW);
  71.   delay(500);
  72.   totalhalt();
  73. }  

  74. //右转
  75. void body_rturn() {
  76.   digitalWrite(leftmotorpin1, HIGH);
  77.   digitalWrite(leftmotorpin2, LOW);
  78.   digitalWrite(rightmotorpin1, LOW);
  79.   digitalWrite(rightmotorpin2, HIGH);
  80.   delay(500);
  81.   totalhalt();
  82. }  

  83. void randTrun(){
  84.   long randNumber;
  85.   randomSeed(analogRead(0));
  86.   randNumber = random(0, 10);
  87.   if(randNumber > 5) {
  88.     body_rturn();
  89.   }
  90.   else
  91.   {
  92.     body_lturn();
  93.   }
  94. }
复制代码


花了一天时间组装和调试了程序后出现一些问题。
1.我修改后的这个auduino(就是上面这个程序)原意是,小车超声波模块测距前方15厘米以内有障碍物,则后退1秒然后随机左转或者右转,若前方没有障碍物或者障碍物距离大于20厘米,则继续前进。不过我发现小车并没有按照我想的那样,经常会无故的后退或者转向。这个问题在室内尤为明显,在空旷的地方会好一点。不明白是什么原因,是测距模块不够准确还是我改的这个程序有问题呢?

2.超声波模块里有个测算前方距离的公式:US/58,不明白这个公式是什么意思。不知道有没有谁懂的能解释一下呢。

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2012-12-8 19:46:30 | 显示全部楼层
代码挺简单的,看起来,比我做网页轻松多了。哈哈~ 不过我是新手,准备入点材料,有什么推荐没??
回复 支持 反对

使用道具 举报

发表于 2013-2-25 09:05:03 | 显示全部楼层
我也想做个这样的小车哄闺女玩,你这种情况我猜测是测距不准造成的,你可以试一下找个大的盒子,把小车放到里面测试一下试试,复杂的环境对单个测距点影响会比较大。如果有倒车雷达的源代码可以看一下倒车雷达的测距算法怎么写的。
回复 支持 反对

使用道具 举报

发表于 2013-4-5 09:57:05 | 显示全部楼层
插上数据线可以拐弯,拔掉了就一直向前走,是什么情况啊?
回复 支持 反对

使用道具 举报

发表于 2013-5-25 01:23:21 | 显示全部楼层
us/58 是单位时间的距离,
然后乘以时间就是距离
回复 支持 反对

使用道具 举报

发表于 2013-7-15 19:42:21 | 显示全部楼层
麻烦问下,我刚刚接触arduino小车,就想知道你这个arduino板子的供电是由L298N的+5V引脚接给arduino的POWER+5V吗?
回复 支持 反对

使用道具 举报

发表于 2013-9-8 20:11:44 | 显示全部楼层
悲剧,买了才发现,没电子理论基础,装了个小车不动不知道咋调试...

楼主这个 arduino 板是怎么供电的?
我理解电机和板子是需要两套供电的吧?
回复 支持 反对

使用道具 举报

发表于 2013-10-21 16:34:54 | 显示全部楼层
楼主,我一直很郁闷超声波模块是怎么连接板子的?能不能告诉我啊?
回复 支持 反对

使用道具 举报

发表于 2013-11-30 22:46:07 | 显示全部楼层
怎么没看到控制速度的语句呢?楼主怎么控制转过的角度?求解~
回复 支持 反对

使用道具 举报

发表于 2014-4-8 20:16:01 | 显示全部楼层
情谊永恒1992 发表于 2013-7-15 19:42
麻烦问下,我刚刚接触arduino小车,就想知道你这个arduino板子的供电是由L298N的+5V引脚接给arduino的POWER ...

不是吧?板子和电机驱动要用不同的供电系统
回复 支持 反对

使用道具 举报

发表于 2014-4-8 20:18:00 | 显示全部楼层
WTF 发表于 2013-10-21 16:34
楼主,我一直很郁闷超声波模块是怎么连接板子的?能不能告诉我啊?

EchoPin = 2; //超声波信号输入
TrigPin = 3; //超声波控制信号输出
上面的超声波模块上的这两个引脚连接到arduino板子上的2,3引脚口就行,vcc,gnd接电源供电,接板子上的就行
回复 支持 反对

使用道具 举报

发表于 2014-4-13 11:32:26 | 显示全部楼层
新手求教。。。。为什么我的小车前进不了啊!代码应该没错啊。。。
#define DEBUG 0    // set to 1 to print to serial monitor, 0 to disable
#include <Servo.h>
const int leftmotorpin1 = 4; // 直流电机信号输出
const int leftmotorpin2 = 5;
const int rightmotorpin1 = 2;
const int rightmotorpin2 = 3;
void setup()
{
  Serial.begin(9600);
  pinMode(rightmotorpin1,OUTPUT);
  pinMode(rightmotorpin2,OUTPUT);
  pinMode(leftmotorpin1,OUTPUT);
  pinMode(leftmotorpin2,OUTPUT);
  //pinMode(in,INPUT);
// pinMode(out,OUTPUT);
}
void loop()
{
  
    nodanger() ;

}
// 前进
void nodanger() {
  //running = true;
  digitalWrite(leftmotorpin1, LOW);
  digitalWrite(leftmotorpin2, HIGH);
  digitalWrite(rightmotorpin1, LOW);
  digitalWrite(rightmotorpin2, HIGH);
  return;
}  

//后退
void backup() {
// running = true;
  digitalWrite(leftmotorpin1, HIGH);
  digitalWrite(leftmotorpin2, LOW);
  digitalWrite(rightmotorpin1, HIGH);
  digitalWrite(rightmotorpin2, LOW);
  delay(1000);
}
回复 支持 反对

使用道具 举报

发表于 2015-4-8 09:47:53 | 显示全部楼层
请问你用2套电源供电吗
回复 支持 反对

使用道具 举报

发表于 2015-4-8 10:46:00 | 显示全部楼层
   车座淘宝地址是多少?
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 06:39 , Processed in 0.056544 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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