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]