qianhuoxing123 发表于 2012-10-18 13:27:01

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

这两天没事,根据论坛里Randy同学发的一个帖子,自己也DIY了一个小车。小车很简单,就是希望能做到简单的避障。
这个小车的程序和创意都是Randy同学的帖子里的,我只是修改了一下他的程序。

这是我做的小车:


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

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

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

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

int currDist = 0;    // 距离

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

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

if(currDist > 20) {
    nodanger();
}
else if(currDist < 15){
    backup();
    randTrun();
}
else {
    //whichway();
    randTrun();
}
}

//测量距离 单位厘米
long MeasuringDistance() {
long duration;
//pinMode(TrigPin, OUTPUT);
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);

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

return duration / 29 / 2;
}

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

//后退
void backup() {
digitalWrite(leftmotorpin1, LOW);
digitalWrite(leftmotorpin2, HIGH);
digitalWrite(rightmotorpin1, LOW);
digitalWrite(rightmotorpin2, HIGH);
delay(1000);
}

void totalhalt() {
digitalWrite(leftmotorpin1, HIGH);
digitalWrite(leftmotorpin2, HIGH);
digitalWrite(rightmotorpin1, HIGH);
digitalWrite(rightmotorpin2, HIGH);
return;
delay(500);
}

//左转
void body_lturn() {
digitalWrite(leftmotorpin1, LOW);
digitalWrite(leftmotorpin2, HIGH);
digitalWrite(rightmotorpin1, HIGH);
digitalWrite(rightmotorpin2, LOW);
delay(500);
totalhalt();
}

//右转
void body_rturn() {
digitalWrite(leftmotorpin1, HIGH);
digitalWrite(leftmotorpin2, LOW);
digitalWrite(rightmotorpin1, LOW);
digitalWrite(rightmotorpin2, HIGH);
delay(500);
totalhalt();
}

void randTrun(){
long randNumber;
randomSeed(analogRead(0));
randNumber = random(0, 10);
if(randNumber > 5) {
    body_rturn();
}
else
{
    body_lturn();
}
}

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

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

GeekNapster 发表于 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 是单位时间的距离,
然后乘以时间就是距离

情谊永恒1992 发表于 2013-7-15 19:42:21

麻烦问下,我刚刚接触arduino小车,就想知道你这个arduino板子的供电是由L298N的+5V引脚接给arduino的POWER+5V吗?

hick 发表于 2013-9-8 20:11:44

悲剧,买了才发现,没电子理论基础,装了个小车不动不知道咋调试...

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

WTF 发表于 2013-10-21 16:34:54

楼主,我一直很郁闷超声波模块是怎么连接板子的?能不能告诉我啊?

西瓜 发表于 2013-11-30 22:46:07

怎么没看到控制速度的语句呢?楼主怎么控制转过的角度?求解~

申继鹏 发表于 2014-4-8 20:16:01

情谊永恒1992 发表于 2013-7-15 19:42 static/image/common/back.gif
麻烦问下,我刚刚接触arduino小车,就想知道你这个arduino板子的供电是由L298N的+5V引脚接给arduino的POWER ...

不是吧?板子和电机驱动要用不同的供电系统

申继鹏 发表于 2014-4-8 20:18:00

WTF 发表于 2013-10-21 16:34 static/image/common/back.gif
楼主,我一直很郁闷超声波模块是怎么连接板子的?能不能告诉我啊?

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);
}

Briancui 发表于 2015-4-8 09:47:53

请问你用2套电源供电吗

suoma 发表于 2015-4-8 10:46:00

   车座淘宝地址是多少?
页: [1]
查看完整版本: 一个自制的arduino小车以及一些问题