小狼要飞 发表于 2015-8-18 22:10:24

做个小车很想玩

在下为初级小白,好不容易做一个小车,(前置红外数字传感器,左右为超声波壁障);自己和好朋友一起检查程序耗时一晚,没发现什么地方错了,用串口打印标记发现红色字体部分直接跳过了,请求大神解答。感谢!!!
//电机转动
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();
}
}

Cain 发表于 2015-8-19 11:56:26

打印一下a与b,看下数值呢?

小狼要飞 发表于 2015-8-19 15:07:51

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
这是串口打印的部分数据,还是不行啊

Ricky 发表于 2015-8-19 15:53:13

你的 A 值远远小于b值,A>b 这个情况没有被触发啊。

小狼要飞 发表于 2015-8-19 16:05:53

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]
查看完整版本: 做个小车很想玩