这是个毕业设计,题目是自动泊车的设计与实现,实验目的是小车前进,找到车库并检测车库大小,然后按固定轨迹进行倒车。之前编写程序,两个电机、舵机、超声波都没有问题,现在放到总程序里,电机就不会动了,万用表测了引脚电压,也没有电压,不知道是哪里出了问题。[kenrobot_code]#include <IRremote.h>//红外控制头文件
#include<Servo.h>//舵机头文件
Servo servol;
int angle=90;//设置舵机角度,初始化为90度
int sudu=8;
int location;
int RECV_PIN = 7;//红外接收脚位
const int leftledPin =4; //左LED灯输出脚位
const int rightledPin =11; //右LED灯输出脚位
const int TrigPin = 8;
const int EchoPin = 9;
int MotorLeft1=14; //A0 IN1
int MotorLeft2=15; //A1 IN2
int MotorRight1=16; //A2 IN3
int MotorRight2=17; //A3 IN4
int MotorLPWM=5; //PWM 5
int MotorRPWM=3; //PWM 3
float distance,val=0;
float depth,width;
unsigned long time1,time2;
//******红外控制部分********
long left = 0x00FF22DD;//左转红外编码
long right =0x00FF02FD;//右转红外编码
long stop = 0x00FFC23D;//暂定红外编码
//红外接收部分程序代码
IRrecv irrecv(RECV_PIN);// 设置RECV_PIN(也就是11引脚)为红外接收端
decode_results results;//定义results变量为红外结果存放位置
void setup()
{servol.attach(10);
pinMode(RECV_PIN, INPUT);
pinMode(leftledPin, OUTPUT);
pinMode(rightledPin, OUTPUT);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
pinMode(MotorRight1, OUTPUT); // 腳位 14 (PWM)
pinMode(MotorRight2, OUTPUT); // 腳位 15 (PWM)
pinMode(MotorLeft1, OUTPUT); // 腳位 16 (PWM)
pinMode(MotorLeft2, OUTPUT); // 腳位 17 (PWM)
pinMode(MotorLPWM, OUTPUT); // 腳位 5 (PWM)
pinMode(MotorRPWM, OUTPUT); // 腳位 3 (PWM)
Serial.begin(9600);
irrecv.enableIRIn(); //启动红外解码
}
void Advance(int a) // 前進
{
digitalWrite(MotorRight1,HIGH);//IN3 右电机 高电平正转
digitalWrite(MotorRight2,LOW);//IN4 右电机 高电平反转
analogWrite(MotorRPWM,60);
digitalWrite(MotorLeft1,LOW);//IN1 左电机 高电平反转
digitalWrite(MotorLeft2,HIGH);//IN2 左电机 高电平正转
analogWrite(MotorLPWM,75);
delay(a * 100);
}
void ADVANCE() // 前進
{ digitalWrite(MotorRight1,HIGH);//IN3 右电机 高电平正转
digitalWrite(MotorRight2,LOW);//IN4 右电机 高电平反转
analogWrite(MotorRPWM,200);
digitalWrite(MotorLeft1,LOW);//IN1 左电机 高电平反转
digitalWrite(MotorLeft2,HIGH);//IN2 左电机 高电平正转
analogWrite(MotorLPWM,200);
delay(50);
}
void Right(int b) //右轉(雙輪)
{
digitalWrite(MotorRight1,LOW);//IN3 右电机 高电平正转
digitalWrite(MotorRight2,HIGH);//IN4 右电机 高电平反转
analogWrite(MotorRPWM,70);
digitalWrite(MotorLeft1,LOW);//IN1 左电机 高电平反转
digitalWrite(MotorLeft2,HIGH);//IN2 左电机 高电平正转
analogWrite(MotorLPWM,90);
delay(b * 100);
}
void RIGHT()
{ digitalWrite(MotorRight1,LOW);//IN3 右电机 高电平正转
digitalWrite(MotorRight2,HIGH);//IN4 右电机 高电平反转
analogWrite(MotorRPWM,200);
digitalWrite(MotorLeft1,LOW);//IN1 左电机 高电平反转
digitalWrite(MotorLeft2,HIGH);//IN2 左电机 高电平正转
analogWrite(MotorLPWM,200);
delay(50);
}
void Left(int c) //左轉(雙輪)
{
digitalWrite(MotorRight1,HIGH);//IN3 右电机 高电平正转
digitalWrite(MotorRight2,LOW);//IN4 右电机 高电平反转
analogWrite(MotorRPWM,90);
digitalWrite(MotorLeft1,HIGH);//IN1 左电机 高电平反转
digitalWrite(MotorLeft2,LOW);//IN2 左电机 高电平正转
analogWrite(MotorLPWM,100);
delay(c * 100);
}
void LEFT()
{ digitalWrite(MotorRight1,HIGH);//IN3 右电机 高电平正转
digitalWrite(MotorRight2,LOW);//IN4 右电机 高电平反转
analogWrite(MotorRPWM,200);
digitalWrite(MotorLeft1,HIGH);//IN1 左电机 高电平反转
digitalWrite(MotorLeft2,LOW);//IN2 左电机 高电平正转
analogWrite(MotorLPWM,200);
delay(50);
}
void Back(int d) //後退 后退
{
digitalWrite(MotorRight1,LOW);//IN3 右电机 高电平正转
digitalWrite(MotorRight2,HIGH);//IN4 右电机 高电平反转
analogWrite(MotorRPWM,60);
digitalWrite(MotorLeft1,HIGH);//IN1 左电机 高电平反转
digitalWrite(MotorLeft2,LOW);//IN2 左电机 高电平正转
analogWrite(MotorLPWM,75);
delay(d * 100);
}
void BACK()
{ digitalWrite(MotorRight1,LOW);//IN3 右电机 高电平正转
digitalWrite(MotorRight2,HIGH);//IN4 右电机 高电平反转
analogWrite(MotorRPWM,200);
digitalWrite(MotorLeft1,HIGH);//IN1 左电机 高电平反转
digitalWrite(MotorLeft2,LOW);//IN2 左电机 高电平正转
analogWrite(MotorLPWM,200);
delay(50);
}
void stopp(int e) //停止
{
digitalWrite(MotorRight1,LOW);//IN3 右电机 高电平反转
digitalWrite(MotorRight2,LOW);//IN4 右电机 高电平正转
analogWrite(MotorRPWM,0);
digitalWrite(MotorLeft1,LOW);//IN1 左电机 高电平正转
digitalWrite(MotorLeft2,LOW);//IN2 左电机 高电平反转
analogWrite(MotorLPWM,0);
delay(e * 100);
}
void Lparking()
{
BACK();
Back(1);
delay(100);
stopp(1);
delay(1000);
RIGHT();
Right(1);
delay(500);
stopp(1);
delay(1000);
BACK();
Back(1);
delay(800);
stopp(1);
delay(1000);
RIGHT();
Right(1);
delay(500);
stopp(1);
delay(1000);
BACK();
Back(1);
delay(1000);
stopp(1);
}
void Rparking()
{
BACK();
Back(1);
delay(100);
stopp(1);
delay(1000);
LEFT();
Left(1);
delay(300);
stopp(1);
delay(1000);
BACK();
Back(1);
delay(700);
stopp(1);
delay(1000);
LEFT();
Left(1);
delay(300);
stopp(1);
delay(1000);
BACK();
Back(1);
delay(1500);
stopp(1);
}
void loop()
{//先等待遥控器选择方向再启动车辆
while(!irrecv.decode(&results))//等待接收到信号,把接收到的数据存储在变量results中
{
}
if (results.value == left )
{
digitalWrite(leftledPin, HIGH);
digitalWrite(rightledPin, LOW);
angle=180;//舵机角度
location=0;
}
if (results.value == right )
{
digitalWrite(leftledPin, LOW);
digitalWrite(rightledPin, HIGH);
angle=12; //舵机角度
location=1;
}
servol.write(angle);//舵机转到相应的方向
ADVANCE();
Advance(1);//启动车辆前进
// 产生一个10us的高脉冲去触发TrigPin
do{
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
// 检测脉冲宽度,并计算出距离
distance = pulseIn(EchoPin, HIGH) / 58.00;
delay(50);
depth=distance-val;
val=distance;
}while(depth>25);
time1=millis();
do{
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
// 检测脉冲宽度,并计算出距离
distance = pulseIn(EchoPin, HIGH) / 58.00;
delay(50);
depth=distance-val;
val=distance;
}while(depth<-25);
time2=millis();
width=(time2-time1)*sudu;//计算出车位宽度
if(width>20)
{ stopp(1);
delay(1000);
//两个LED双闪两下
digitalWrite(leftledPin, HIGH);
digitalWrite(rightledPin, HIGH);
delay(500);
digitalWrite(leftledPin, LOW);
digitalWrite(rightledPin, LOW);
delay(500);
digitalWrite(leftledPin, HIGH);
digitalWrite(rightledPin, HIGH);
delay(500);
digitalWrite(leftledPin, LOW);
digitalWrite(rightledPin, LOW);
delay(500);
if(location=0)
Lparking();//左侧泊车
else
Rparking();//右侧泊车
}
else
{//两个LED一直亮
digitalWrite(leftledPin, HIGH);
digitalWrite(rightledPin, HIGH);
stopp(1);
delay(1000);
ADVANCE();
Advance(1);//车辆继续前进
}
}
[/kenrobot_code] |