极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9730|回复: 0

arduino小车遇到问题求教大神

[复制链接]
发表于 2015-12-5 22:48:38 | 显示全部楼层 |阅读模式
本人纯菜鸟一枚,前不久突发兴致,想做个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);
            }
  }
}
请大神们指出问题,本人不胜感激。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-19 17:49 , Processed in 0.045435 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表