新人求助,,arduino uno的板子
arduino uno的板子,电机驱动板,还有一个舵机驱动板。小车由两个步进电机驱动,前置一个hcsr04超声波传感器。电机驱动板电源电压24v,uno和舵机驱动板由单独电源供电,5到6v。想实现的功能是,当前方障碍物距离大于40cm时,前行。小于或等于40cm时,停止,然后舵机转动,复位,再退后。目前只控制一个舵机,以后可能要同时控制6个,程序如下:发现启动后,小车前方障碍物距离大于40cm时小车长时间后退,
#include <Servo.h>
Servo myservo1;
Servo myservo;
int Left_motor_P=3;
int Left_motor_N=6;
int Right_motor_P=5;
int Right_motor_N=11;
int Ultrasonic_Echo = A0;
int Ultrasonic_Trig =A1;
int Front_Distance = 0;
void setup()
{
Serial.begin(9600);
pinMode(Left_motor_P,OUTPUT);
pinMode(Left_motor_N,OUTPUT);
pinMode(Right_motor_P,OUTPUT);
pinMode(Right_motor_N,OUTPUT);
pinMode(Ultrasonic_Echo, INPUT);
pinMode(Ultrasonic_Trig, OUTPUT);
myservo1.attach(2);
myservo.attach(12);
}
void go(int a)
{
digitalWrite(Right_motor_P,HIGH);
digitalWrite(Right_motor_N,LOW);
analogWrite(Right_motor_P,80);
analogWrite(Right_motor_N,0);
digitalWrite(Left_motor_P,LOW);
digitalWrite(Left_motor_N,HIGH);
analogWrite(Left_motor_P,0);
analogWrite(Left_motor_N,90);
delay(a * 100);
}
void Stop (int f)
{
digitalWrite(Right_motor_P,LOW);
digitalWrite(Right_motor_N,LOW);
digitalWrite(Left_motor_P,LOW);
digitalWrite(Left_motor_N,LOW);
delay(f * 100);
}
void Reverse(int g)
{
digitalWrite(Right_motor_P,LOW);
digitalWrite(Right_motor_N,HIGH);
analogWrite(Right_motor_P,0);
analogWrite(Right_motor_N,80);
digitalWrite(Left_motor_P,HIGH);
digitalWrite(Left_motor_N,LOW);
analogWrite(Left_motor_P,90);
analogWrite(Left_motor_N,0);
delay(g * 100);
}
void ask_pin_F()
{
myservo.write(90);
digitalWrite(Ultrasonic_Trig, LOW);
delayMicroseconds(2);
digitalWrite(Ultrasonic_Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Ultrasonic_Trig, LOW);
float Fdistance = pulseIn(Ultrasonic_Echo, HIGH);
Fdistance= Fdistance/59;
Front_Distance = Fdistance;
}
void loop()
{
ask_pin_F();
if(Front_Distance>=40)
{
go(1);
}
else
{
Stop(1);
myservo1.attach(45);
myservo1.attach(90);
Reverse(1);
}
}
digitalWrite(Right_motor_P,LOW);
digitalWrite(Right_motor_N,HIGH);
analogWrite(Right_motor_P,0);
analogWrite(Right_motor_N,80);
digitalWrite(Left_motor_P,HIGH);
digitalWrite(Left_motor_N,LOW);
analogWrite(Left_motor_P,90);
analogWrite(Left_motor_N,0);
这部分存在问题,如果不太会用Arduino的PWM的输出可以先不使用它,我知道你是想要改变车子的速度,analogWrite(Right_motor_P,0)本身就等价digitalWrite(Right_motor_P,LOW);所以有些地方可以删去,先不使用anglog,仅仅控制车子的前进和后退,看看是否还会出现这种状况。另外不排除你的车子处于反转的状态(应该是大于40向前,但现在是向后) 164335413 发表于 2016-3-7 22:30 static/image/common/back.gif
digitalWrite(Right_motor_P,LOW);
digitalWrite(Right_motor_N,HIGH);
analogWrite(Ri ...
谢谢指点,我再改改 164335413 发表于 2016-3-7 22:30 static/image/common/back.gif
digitalWrite(Right_motor_P,LOW);
digitalWrite(Right_motor_N,HIGH);
analogWrite(Ri ...
大神,我现在的问题是,接上电源开启后,距离大于40cm时车子往前走,同时舵机也转动,并未按照void loop()
{ ask_pin_F();
if(Front_Distance < 40){Stop(1); myservo6.write(145);}
else {go(10);}
}执行。 你现在ask_pin_F() 函数中是否有让舵机转动的代码?
164335413 发表于 2016-3-10 11:04 static/image/common/back.gif
你现在ask_pin_F() 函数中是否有让舵机转动的代码?
有,超声波传感器有一个9g舵机控制,我让他保持在90度,然后另外一个Mg996R舵机的动作总是不能满足我设定的距离条件,开启后就转动 问题不好找,你后来贴的代码不全,也没看到你修改后的代码。 164335413 发表于 2016-3-11 19:09 static/image/common/back.gif
问题不好找,你后来贴的代码不全,也没看到你修改后的代码。
不好意思今天才看到,前几天课还比较多,没弄这个。问题还是这样启动后,舵机立刻转,并不是小车先走,前方设定范围内有障碍物时停下来,舵机再转 。我买了个32路舵机控制板,用来控制三个mg996。超声波模块的sg90舵机用uno控制。步进电机的analog write我删掉后发现转速太快了,也没有解决问题。所以还是加上了
int Left_motor_P=6;
int Left_motor_N=3;
int Right_motor_P=5;
int Right_motor_N=11;
int Ultrasonic_Echo = A0;
int Ultrasonic_Trig =A1;
int Front_Distance = 0;
int pos = 0;
int servopin=9;
int myangle;
int pulsewidth;
int val;
void servopulse(int servopin,int myangle)
{
pulsewidth=(myangle*11)+500;
digitalWrite(servopin,HIGH);
delayMicroseconds(pulsewidth);
digitalWrite(servopin,LOW);
delay(20-pulsewidth/1000);
}
void setup()
{
Serial.begin(115200);
pinMode(Left_motor_P,OUTPUT);
pinMode(Left_motor_N,OUTPUT);
pinMode(Right_motor_P,OUTPUT);
pinMode(Right_motor_N,OUTPUT);
pinMode(Ultrasonic_Echo, INPUT);
pinMode(Ultrasonic_Trig, OUTPUT);
pinMode(servopin,OUTPUT);
}
void go(int a)
{
digitalWrite(Right_motor_P,HIGH);
digitalWrite(Right_motor_N,LOW);
analogWrite(Right_motor_P,80);
analogWrite(Right_motor_N,0);
digitalWrite(Left_motor_P,HIGH);
digitalWrite(Left_motor_N,LOW);
analogWrite(Left_motor_P,90);
analogWrite(Left_motor_N,0);
delay(a * 100);
}
void left(int c)
{
digitalWrite(Right_motor_P,LOW);
digitalWrite(Right_motor_N,LOW);
digitalWrite(Left_motor_P,LOW);
digitalWrite(Left_motor_N,HIGH);
analogWrite(Left_motor_P,0);
analogWrite(Left_motor_N,80);
delay(c * 100);
}
void Stop (int f)
{
digitalWrite(Right_motor_P,LOW);
digitalWrite(Right_motor_N,LOW);
digitalWrite(Left_motor_P,LOW);
digitalWrite(Left_motor_N,LOW);
delay(f * 100);
}
void ask_pin_F()
{
for(int i=0;i<=25;i++) {
servopulse(servopin,90);
}
digitalWrite(Ultrasonic_Trig, LOW); // 讓超聲波發射低電壓2μs
delayMicroseconds(2);
digitalWrite(Ultrasonic_Trig, HIGH);// 讓超聲波發射高電壓10μs,這裡至少是10μs
delayMicroseconds(10);
digitalWrite(Ultrasonic_Trig, LOW); // 維持超聲波發射低電壓
float Fdistance = pulseIn(Ultrasonic_Echo, HIGH);// 讀差相差時間
Fdistance= Fdistance/59; // 將時間轉為距離距离(單位:公分)
Front_Distance = Fdistance;
}
void loop()
{
while(1)
{
ask_pin_F();
if(Front_Distance<32)
{
Stop(1);
Serial.print("#9P2500T1000\r\n");
delay(1000);
Serial.print("#9P1500T1000\r\n");
delay(1000);
left(1);
}
else
{
go(8);
}
}
}
最好分步进行调试,将串口线连接到电脑,使用serial.print();打印出超声波的实际距离值,
另外,ask_pin_F();我不确定他起了什么作用,因为他一直保持在90度,如果你只打算让他保持90度,可以放在setup()函数中.
164335413 发表于 2016-3-17 19:59 static/image/common/back.gif
最好分步进行调试,将串口线连接到电脑,使用serial.print();打印出超声波的实际距离值,
另外,ask_pin_F ...
ask_pin_F就是测量正前方距离的,hcsr04好像真的有问题。。。我让它保持在同一个地方,结果距离忽大忽小,
49cm
5cm
#15P2000T1000
#15P1500T1000
0cm
#15P2000T1000
#15P1500T1000
32cm
0cm
#15P2000T1000
#15P1500T1000
26cm
#15P2000T1000
#15P1500T1000
54cm
25cm
#15P2000T1000
#15P1500T1000
19cm
#15P2000T1000
#15P1500T1000
46cm
27cm
#15P2000T1000
#15P1500T1000
23cm
两次测量的时间间隔要在60ms以上,另外要保持Trig大于10us,尽量到20us也许会好一些
页:
[1]