做个小车很想玩
在下为初级小白,好不容易做一个小车,(前置红外数字传感器,左右为超声波壁障);自己和好朋友一起检查程序耗时一晚,没发现什么地方错了,用串口打印标记发现红色字体部分直接跳过了,请求大神解答。感谢!!!//电机转动
int IN1 =4;
int IN2 =5;
int IN3 =6;
int IN4 =7;
int pwmA =10;
int pwmB =9;
//超声波
const int trigA=8; //触发信号
const int echoA=11; //反馈新高
const int trigB=12; //触发信号
const int echoB=13; //反馈新高
float S1;
float S2;
//红外数字
const int InfraredSensorPin = 3;
void setup()
{
//电机
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
pinMode(pwmA,OUTPUT);
pinMode(pwmB,OUTPUT);
// 超声波
pinMode(echoA, INPUT);
pinMode(trigA, OUTPUT);
pinMode(echoB, INPUT);
pinMode(trigB, OUTPUT);
//红外数字
Serial.println("Start!");
pinMode(InfraredSensorPin,INPUT);
Serial.begin(9600);
}
//超声波函数
void chaoshengyouA(){
// float S1=0;
long IntervalTime1=0; //定义一个时间变量
digitalWrite(trigA, 1);//置高电平
delayMicroseconds(15);//延时15us
digitalWrite(trigA, 0);//设为低电平
IntervalTime1=pulseIn(echoA, HIGH);//用自带的函数采样反馈的高电平的宽度,单位us
float S1=IntervalTime1/58.00; //使用浮点计算出距离,单位cm
Serial.println(S1);//通过串口输出距离数值
}
void chaoshengzuoB(){
//float S2=0;
long IntervalTime2=0; //定义一个时间变量
digitalWrite(trigB, 1);//置高电平
delayMicroseconds(15);//延时15us
digitalWrite(trigB, 0);//设为低电平
IntervalTime2=pulseIn(echoB, HIGH);//用自带的函数采样反馈的高电平的宽度,单位us
float S2=IntervalTime2/58.00; //使用浮点计算出距离,单位cm
Serial.println(S2);//通过串口输出距离数值
}
//电机函数
void Forward(){
digitalWrite(IN1,HIGH); //右轮前进
digitalWrite(IN2,LOW);
digitalWrite(IN3,HIGH); //左轮前进
digitalWrite(IN4,LOW);
}
void TurnLeft(){
digitalWrite(IN1,HIGH); //右轮前进
digitalWrite(IN2,LOW);
digitalWrite(IN3,LOW); //左轮前进
digitalWrite(IN4,LOW);
}
void TurnRight(){
digitalWrite(IN1,LOW); //右轮前进
digitalWrite(IN2,LOW);
digitalWrite(IN3,HIGH); //左轮前进
digitalWrite(IN4,LOW);
}
void Stop(){
digitalWrite(IN1,LOW); //右轮前进
digitalWrite(IN2,LOW);
digitalWrite(IN3,LOW); //左轮前进
digitalWrite(IN4,LOW);
}
void loop(){
analogWrite(10,255);
analogWrite(9,120);
Serial.print("Infrared Switch Status:");
Serial.println(digitalRead(InfraredSensorPin),BIN);
delay(50);
if(digitalRead(InfraredSensorPin) == LOW)
{
Stop(); // 停车判断
chaoshengyouA(); //S1
chaoshengzuoB(); //S2
delay(100);
float a=S1;
float b =S2;
Serial.print("www");
if(a>b){ //此处的if语句始终跳过,直接执行紧接着的else;
TurnRight();
delay(800); }
else{
TurnLeft ();
delay(800);Serial.print("jjj");
}
}
else
{
Forward();
}
}
打印一下a与b,看下数值呢? Infrared Switch Status:1
Infrared Switch Status:1
Infrared Switch Status:1
Infrared Switch Status:1
5.33
404.21
wwwjjjInfrared Switch Status:0
2.14
403.38
wwwjjjInfrared Switch Status:0
3.31
83.22
wwwjjjInfrared Switch Status:0
3.43
404.17
wwwjjjInfrared Switch Status:0
2.79
404.21
wwwjjjInfrared Switch Status:0
2.95
406.29
这是串口打印的部分数据,还是不行啊 你的 A 值远远小于b值,A>b 这个情况没有被触发啊。 Ricky 发表于 2015-8-19 15:53
你的 A 值远远小于b值,A>b 这个情况没有被触发啊。
不管ab哪个数值大,小车都是左轮在转。我用另外一个程序检查了一下,不是轮子的问题。
void loop()
{ analogWrite(10,255);
analogWrite(9,120);
TurnLeft ();
delay(1000);
TurnRight();
delay(1000);
Stop();
delay(1000);
}这是主函数,看着左右轮运行正常。
你看我的程序没问题吧?
页:
[1]