血阳
发表于 2015-6-10 01:44:54
libinbin112233 发表于 2015-6-9 16:41 static/image/common/back.gif
小车能动是能动,如何设计超声波测距并转向的编程呢~ 头疼了! 本来设想的是超声波测距后小车原地转,当测距大 ...
这个不难呀,你首先要知道超声波的模块使用方法。然后接在板子的模拟串口,然后再在loop循环里加上if语句来判断。就OK了。
libinbin112233
发表于 2015-6-11 15:55:11
血阳 发表于 2015-6-10 01:44 static/image/common/back.gif
这个不难呀,你首先要知道超声波的模块使用方法。然后接在板子的模拟串口,然后再在loop循环里加上if语句 ...
是模拟接口?
我贴一段代码 RCW();
distance = pulseIn(EchoPin,HIGH)/58.00;
if(distance<10)
{
back();
}
else if(distance<20)
{
turnRightOrigin();
}
else if(distance<500)
{
forward();
}
else if(distance>=500)
{
_stop();
}
Serial.println(distance);
delay(1000);
}
void RCW()
{
digitalWrite(TrigPin,LOW);
delayMicroseconds(2);
digitalWrite(TrigPin,HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin,LOW);
}
串口输出的距离都是0~不知道为啥
libinbin112233
发表于 2015-6-11 15:55:37
血阳 发表于 2015-6-10 01:44 static/image/common/back.gif
这个不难呀,你首先要知道超声波的模块使用方法。然后接在板子的模拟串口,然后再在loop循环里加上if语句 ...
是模拟接口?
我贴一段代码
RCW();
distance = pulseIn(EchoPin,HIGH)/58.00;
if(distance<10)
{
back();
}
else if(distance<20)
{
turnRightOrigin();
}
else if(distance<500)
{
forward();
}
else if(distance>=500)
{
_stop();
}
Serial.println(distance);
delay(1000);
}
void RCW()
{
digitalWrite(TrigPin,LOW);
delayMicroseconds(2);
digitalWrite(TrigPin,HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin,LOW);
}
串口输出的距离都是0~不知道为啥
血阳
发表于 2015-6-12 21:28:19
libinbin112233 发表于 2015-6-11 15:55 static/image/common/back.gif
是模拟接口?
我贴一段代码
RCW();
说错了,接数字口。
血阳
发表于 2015-6-12 22:59:51
本帖最后由 血阳 于 2015-6-12 23:08 编辑
libinbin112233 发表于 2015-6-11 15:55 static/image/common/back.gif
是模拟接口?
我贴一段代码
RCW();
我用的是红外接近开关。
下面这个是没用遥控的代码,就是自己跑,然后遇到障碍就会转弯的。
void setup()
{
pinMode(11,INPUT);
pinMode(12,INPUT);
}
void loop()
{
forward();
if(LOW==digitalRead(11))
{
_stop();
turnRightOrigin();
delay(1000);
}
if(LOW==digitalRead(12))
{
_stop();
turnRightOrigin();
delay(1000);
}
}
血阳
发表于 2015-6-12 23:15:15
libinbin112233 发表于 2015-6-9 16:41 static/image/common/back.gif
小车能动是能动,如何设计超声波测距并转向的编程呢~ 头疼了! 本来设想的是超声波测距后小车原地转,当测距大 ...
如果你想实现的是遇到障碍自动转的话,建议你用我上面说的那个,就是红外接近开关,这个比较简单粗暴。红外接近开关,无障碍时候输出高电平,有障碍输出低电平。
如果你就是想用超声波测距的话,这个···我还没玩过,你可以去看看论坛里的大神们的相关教程,比如他们的超声波自平衡小车,从里面应该可以学习到超声波测距的应用吧。
祝你成功~
alai2015
发表于 2015-6-14 16:35:43
本帖最后由 alai2015 于 2015-6-14 16:47 编辑
谢谢!写的认真,详细, 帮助很大,我的第一台藍芽小車, 看著這篇完成的.
血阳
发表于 2015-6-15 01:25:37
alai2015 发表于 2015-6-14 16:35 static/image/common/back.gif
谢谢!写的认真,详细, 帮助很大,我的第一台藍芽小車, 看著這篇完成的.
恭喜恭喜:lol大家相互学习相互进步~~
pumpitup
发表于 2015-6-15 23:45:25
本帖最后由 pumpitup 于 2015-6-15 23:49 编辑
俺也准备做个这个哦。。。
话说,您供电这一块是怎么做的,难道是电池给arduino供电,arduino给298供电?
我一直在想用11.1V给298供电,298给arduino供电,不知道怎么接。
alai2015
发表于 2015-6-16 13:17:51
我是1.5x4電池供电給L298N, 再由L298N供給nano:D
血阳
发表于 2015-6-16 15:36:00
alai2015 发表于 2015-6-16 13:17 static/image/common/back.gif
我是1.5x4電池供电給L298N, 再由L298N供給nano
恩恩,这个也行。
只是我不太清楚这些个电压的输入输出,所以不敢乱给电,怕把元件给烧了。
血阳
发表于 2015-6-18 21:07:17
其实这个小车还可以加上很多模块,比如遥控模块不用手机,用专门的手柄遥控
血阳
发表于 2015-6-18 21:07:50
还有可以加上很多自动控制的传感器,比如温度传感器
血阳
发表于 2015-6-18 21:08:41
让小车既可以手动,当触发条件了又能自动控制。
libinbin112233
发表于 2015-6-19 10:16:25
/*程序的开头要描述你的设备
再来要说是脽写的日期版本
然后碰到问题一次一次都要写清楚
马达几个驱动电路都要描述
L = 左
R = 右
F = 前
B = 后
*/
#include <Servo.h>
int pinLB=6; // 定义8脚位 左后
int pinLF=9; // 定义9脚位 左前
int pinRB=10; // 定义10脚位 右后
int pinRF=11; // 定义11脚位 右前
int inputPin = A1;// 定义超音波信号接收脚位
int outputPin =A2;// 定义超音波信号发射脚位
int Fspeedd = 0; // 前速
int Rspeedd = 0; // 右速
int Lspeedd = 0; // 左速
int directionn = 0; // 前=8 后=2 左=4 右=6
Servo myservo; // 设 myservo
int delay_time = 250; // 伺服马达转向后的稳定时间
int Fgo = 8; // 前进
int Rgo = 6; // 右转
int Lgo = 4; // 左转
int Bgo = 2; // 倒车
void setup()
{
Serial.begin(9600); // 定义马达输出脚位
pinMode(pinLB,OUTPUT); // 脚位 8 (PWM)
pinMode(pinLF,OUTPUT); // 脚位 9 (PWM)
pinMode(pinRB,OUTPUT); // 脚位 10 (PWM)
pinMode(pinRF,OUTPUT); // 脚位 11 (PWM)
pinMode(inputPin, INPUT); // 定义超音波输入脚位
pinMode(outputPin, OUTPUT);// 定义超音波输出脚位
myservo.attach(5); // 定义伺服马达输出第5脚位(PWM)
}
void advance(int a) // 前进
{
digitalWrite(pinRB,LOW);// 使马达(右后)动作
digitalWrite(pinRF,HIGH);
digitalWrite(pinLB,LOW);// 使马达(左后)动作
digitalWrite(pinLF,HIGH);
delay(a * 50);
}
void right(int b) //右转(单轮)
{
digitalWrite(pinRB,LOW); //使马达(右后)动作
digitalWrite(pinRF,HIGH);
digitalWrite(pinLB,HIGH);
digitalWrite(pinLF,HIGH);
delay(b * 20);
}
void left(int c) //左转(单轮)
{
digitalWrite(pinRB,HIGH);
digitalWrite(pinRF,HIGH);
digitalWrite(pinLB,LOW); //使马达(左后)动作
digitalWrite(pinLF,HIGH);
delay(c * 20);
}
void turnR(int d) //右转(双轮)
{
digitalWrite(pinRB,LOW);//使马达(右后)动作
digitalWrite(pinRF,HIGH);
digitalWrite(pinLB,HIGH);
digitalWrite(pinLF,LOW);//使马达(左前)动作
delay(d * 30);
}
void turnL(int e) //左转(双轮)
{
digitalWrite(pinRB,HIGH);
digitalWrite(pinRF,LOW); //使马达(右前)动作
digitalWrite(pinLB,LOW); //使马达(左后)动作
digitalWrite(pinLF,HIGH);
delay(e * 30);
}
void stopp(int f) //停止
{
digitalWrite(pinRB,HIGH);
digitalWrite(pinRF,HIGH);
digitalWrite(pinLB,HIGH);
digitalWrite(pinLF,HIGH);
delay(f * 50);
}
void back(int g) //后退
{
digitalWrite(pinRB,HIGH);//使马达(右后)动作
digitalWrite(pinRF,LOW);
digitalWrite(pinLB,HIGH);//使马达(左后)动作
digitalWrite(pinLF,LOW);
delay(g * 50);
}
void detection() //测量3个角度(0.90.179)
{
int delay_time = 250; // 伺服马达转向后的稳定时间
ask_pin_F(); // 读取前方距离
if(Fspeedd < 5) // 假如前方距离小于10公分
{
stopp(1); // 清除输出数据
back(2); // 后退 0.2秒
}
if(Fspeedd < 10) // 假如前方距离小于25公分
{
stopp(1); // 清除输出数据
ask_pin_L(); // 读取左方距离
delay(delay_time); // 等待伺服马达稳定
ask_pin_R(); // 读取右方距离
delay(delay_time); // 等待伺服马达稳定
if(Lspeedd > Rspeedd) //假如 左边距离大于右边距离
{
directionn = Rgo; //向右走
}
if(Lspeedd <= Rspeedd) //假如 左边距离小于或等于右边距离
{
directionn = Lgo; //向左走
}
if (Lspeedd < 5 && Rspeedd < 5) //假如 左边距离和右边距离皆小于10公分
{
directionn = Bgo; //向后走
}
}
else //加如前方不小于(大于)25公分
{
directionn = Fgo; //向前走
}
}
void ask_pin_F() // 量出前方距离
{
myservo.write(90);
digitalWrite(outputPin, LOW); // 让超声波发射低电压2μs
delayMicroseconds(2);
digitalWrite(outputPin, HIGH);// 让超声波发射高电压10μs,这里至少是10μs
delayMicroseconds(10);
digitalWrite(outputPin, LOW); // 维持超声波发射低电压
float Fdistance = pulseIn(inputPin, HIGH);// 读差相差时间
Fdistance= Fdistance/5.8/10; // 将时间转为距离距离(单位:公分)
Serial.print("F distance:"); //输出距离(单位:公分)
Serial.println(Fdistance); //显示距离
Fspeedd = Fdistance; // 将距离 读入Fspeedd(前速)
}
void ask_pin_L() // 量出左边距离
{
myservo.write(5);
delay(delay_time);
digitalWrite(outputPin, LOW); // 让超声波发射低电压2μs
delayMicroseconds(2);
digitalWrite(outputPin, HIGH);// 让超声波发射高电压10μs,这里至少是10μs
delayMicroseconds(10);
digitalWrite(outputPin, LOW); // 维持超声波发射低电压
float Ldistance = pulseIn(inputPin, HIGH);// 读差相差时间
Ldistance= Ldistance/5.8/10; // 将时间转为距离距离(单位:公分)
Serial.print("L distance:"); //输出距离(单位:公分)
Serial.println(Ldistance); //显示距离
Lspeedd = Ldistance; // 将距离 读入Lspeedd(左速)
}
void ask_pin_R() // 量出右边距离
{
myservo.write(177);
delay(delay_time);
digitalWrite(outputPin, LOW); // 让超声波发射低电压2μs
delayMicroseconds(2);
digitalWrite(outputPin, HIGH);// 让超声波发射高电压10μs,这里至少是10μs
delayMicroseconds(10);
digitalWrite(outputPin, LOW); // 维持超声波发射低电压
float Rdistance = pulseIn(inputPin, HIGH);// 读差相差时间
Rdistance= Rdistance/5.8/10; // 将时间转为距离距离(单位:公分)
Serial.print("R distance:"); //输出距离(单位:公分)
Serial.println(Rdistance); //显示距离
Rspeedd = Rdistance; // 将距离 读入Rspeedd(右速)
}
void loop()
{
myservo.write(90);//让伺服马达回归 预备位置 准备下一次的测量
detection(); //测量角度 并且判断要往哪一方向移动
if(directionn == 2)//假如directionn(方向) = 2(倒车)
{
back(8); //倒退(车)
turnL(2); //些微向左方移动(防止卡在死巷里)
Serial.print(" Reverse "); //显示方向(倒退)
}
if(directionn == 6) //假如directionn(方向) = 6(右转)
{
back(1);
turnR(6); // 右转
Serial.print(" Right "); //显示方向(左转)
}
if(directionn == 4) //假如directionn(方向) = 4(左转)
{
back(1);
turnL(6); // 左转
Serial.print(" Left "); //显示方向(右转)
}
if(directionn == 8) //假如directionn(方向) = 8(前进)
{
advance(1); // 正常前进
Serial.print(" Advance "); //显示方向(前进)
Serial.print(" ");
}
}
用这个代码实现了,不过小车老纠结了 ,总卡到一个地方左右摇头
页:
1
2
[3]
4
5
6
7
8
9
10
11