holiday117 发表于 2015-12-5 22:48:38

arduino小车遇到问题求教大神

本人纯菜鸟一枚,前不久突发兴致,想做个arduino uno智能车,折腾了一个多星期,终于完成超声波避障了,后来又将其改装成蓝牙小车,方法都是参考了极客网上的教程,这之前难度不是很大,该实现的功能都实现了,不过现在遇到个难题,现在小车是蓝牙遥控和自动避障同时进行,也就是说 通过手机输入命令可以切换遥控和自动避障这两种模式,问题在于输入命令后右轮不能动,电机驱动用的是L298n我用万用表检查了in1 in2 in3 in4 都正常,我把L298n 右轮的pwm用跳线帽插上就能动了,arduino uno板子换了一个也是一样,说明硬件方面没有问题,问题我认为还是在软件方面,小车控制代码如下#include<Servo.h>
Servo myservo;
int IR = 4;
const int TrigPin=2;
const int EchoPin=3;
int ledq = 13;
int ledh = 12;
int ledz = 5;
int ledy = 8;
const int L298nIn1 = A0;//L298N模块信号输入
const int L298nIn2 = A1;
const int L298nIn3 = A2;
const int L298nIn4 = A3;
const int pwma=11;
const int pwmb=9;
float distance=0;
int s1;
int s2;
void setup()
{
myservo.attach(10);
Serial.begin(9600);

pinMode(ledq,OUTPUT);
pinMode(ledh,OUTPUT);
pinMode(ledz,OUTPUT);
pinMode(ledy,OUTPUT);
pinMode(L298nIn1, OUTPUT);
pinMode(L298nIn2, OUTPUT);
pinMode(L298nIn3, OUTPUT);
pinMode(L298nIn4, OUTPUT);
pinMode(pwma,OUTPUT);
pinMode(pwmb,OUTPUT);
pinMode(TrigPin,OUTPUT);
pinMode(EchoPin,INPUT);
pinMode(IR,INPUT);

}
void forward(int a) //小车前进
{digitalWrite(L298nIn1, HIGH);
digitalWrite(L298nIn2, LOW);
analogWrite(pwma,a);
digitalWrite(L298nIn3, HIGH);
digitalWrite(L298nIn4, LOW);
analogWrite(pwmb,a);
}
void back(int b) {//小车后退
digitalWrite(L298nIn1, LOW);
digitalWrite(L298nIn2, HIGH);
analogWrite(pwma,b);
digitalWrite(L298nIn3, LOW);
digitalWrite(L298nIn4, HIGH);
analogWrite(pwmb,b);
}
void stopp() //小车停止
{

analogWrite(pwma,0);
analogWrite(pwmb,0);
}

void turnrightx(int e)    //原地右转
{

digitalWrite(L298nIn1,HIGH);
digitalWrite(L298nIn2, LOW);
analogWrite(pwma,e);
analogWrite(pwmb,0);
digitalWrite(ledy,HIGH);
delay(300);
digitalWrite(ledy,LOW);
delay(200);

}
void turnrightd(int c) {//小车前右转
digitalWrite(L298nIn1, HIGH);
digitalWrite(L298nIn2, LOW);
analogWrite(pwma,c);
analogWrite(pwmb,100);
digitalWrite(ledy,HIGH);
delay(300);
digitalWrite(ledy,LOW);
delay(200);
}
void turnleftx(int f)//原地左转
{

digitalWrite(L298nIn3, HIGH);
digitalWrite(L298nIn4, LOW);
analogWrite(pwma,0);
analogWrite(pwmb,f);
digitalWrite(ledz,HIGH);
delay(300);
digitalWrite(ledz,LOW);
delay(200);

}
void turnleftd(int d) //小车前左转
{
digitalWrite(L298nIn3, HIGH);
digitalWrite(L298nIn4, LOW);
analogWrite(pwma,100);
analogWrite(pwmb,d);
digitalWrite(ledz,HIGH);
delay(300);
digitalWrite(ledz,LOW);
delay(200);
}
void turnlefts(int g)//小车原地后左转
{
digitalWrite(L298nIn3,LOW);
digitalWrite(L298nIn4,HIGH);
analogWrite(pwma,0);
analogWrite(pwmb,g);
digitalWrite(ledz,HIGH);
delay(300);
digitalWrite(ledz,LOW);
delay(200);
}
void turnrights(int h)
{
digitalWrite(L298nIn1,LOW);
digitalWrite(L298nIn2,HIGH);
analogWrite(pwma,h);
analogWrite(pwmb,0);
digitalWrite(ledz,HIGH);
delay(300);
digitalWrite(ledz,LOW);
delay(200);
}
void cj()
{
    digitalWrite(TrigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(TrigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(TrigPin, LOW);
    // 检测脉冲宽度,并计算出距离
    distance = pulseIn(EchoPin, HIGH) / 58.00;
      
}
void pd()
{
myservo.write(175);
delay(1000);
cj();
s1=distance;

delay(500);
myservo.write(90);
delay(1000);
myservo.write(5);
delay(1000);
cj();
s2=distance;

delay(500);
myservo.write(90);
delay(1000);

if(s1>s2)
{
    turnleftx(250);
    delay(200);
}
else
   if(s1<s2)
   {
    turnrightx(250);
    delay(200);
   }
else
    if((s1<=20)||(s2<=20))
    {
      back(250);
      delay(150);
    }

    stopp();
    delay(100);
    myservo.write(90);   //舵机归位
    delay(100);
}
char val;
void loop()
{
    cj();
      
while(Serial.available())
{
    val=Serial.read();
}

   
if(val=='q')
{
    digitalWrite(ledq,HIGH);
    digitalWrite(ledh,HIGH);
   
}
else if(val=='g')
{
    digitalWrite(ledq,LOW);
    digitalWrite(ledh,LOW);
}

switch(val)
{
   case'w':
            
         if(distance<25)
      {
          stopp();
          digitalWrite(ledz,HIGH);
          digitalWrite(ledy,HIGH);
         
      }
      else
      {
         forward(150);
          digitalWrite(ledz,HIGH);
          digitalWrite(ledy,HIGH);
          delay(200);
          digitalWrite(ledz,LOW);
          digitalWrite(ledy,LOW);
          delay(200);
      }
            break;
   case's':
            int m;
            m=digitalRead(IR);
            
            if(m==LOW)
            {
            digitalWrite(ledz,HIGH);
            digitalWrite(ledy,HIGH);
            stopp();
            }
            else
            {
            back(150);
            digitalWrite(ledz,HIGH);
            digitalWrite(ledy,HIGH);
            delay(100);
            digitalWrite(ledz,LOW);
            digitalWrite(ledy,LOW);
            delay(100);
            }
            break;
   case'p':
            stopp();
            break;
   case'l':
            turnleftx(90);
            break;
   case'r':
         
            turnrightx(90);
            break;
   case'a':
            turnleftd(180);
            break;
   case'd':
            turnrightd(180);
            break;
   case'z':
            turnlefts(100);
            break;
   case'y':
            turnrights(100);
            break;
   case'b':
             myservo.write(90);
             delay(1000);
            cj();
            if(distance<=25)
            {
            stopp();
            delay(300);
            pd();
            }
            else
            {
            forward(250);
            }
}
}
请大神们指出问题,本人不胜感激。
页: [1]
查看完整版本: arduino小车遇到问题求教大神