极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14376|回复: 1

求助智能小车,各个模块单独使用正常,合成总程序后小车电机不会动

[复制链接]
发表于 2017-4-24 14:42:02 | 显示全部楼层 |阅读模式
这是个毕业设计,题目是自动泊车的设计与实现,实验目的是小车前进,找到车库并检测车库大小,然后按固定轨迹进行倒车。之前编写程序,两个电机、舵机、超声波都没有问题,现在放到总程序里,电机就不会动了,万用表测了引脚电压,也没有电压,不知道是哪里出了问题。[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]
回复

使用道具 举报

发表于 2017-4-25 11:44:46 | 显示全部楼层
可能是信号没收到,主程序里面每一步都检查过去,
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-18 17:21 , Processed in 0.043246 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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