小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 7538|回复: 5

Wifi小车 --Arduino UNO 程序初始化问题

[复制链接]
发表于 2015-8-22 15:52:26 | 显示全部楼层 |阅读模式
各位大侠,我的wifi小车,Arduino UNO 启动时电机控制不能用,需要手动Reset一下才可以。而且第一次启动时蜂鸣器有固定频率的微小电流音。 以下是我的控制程序,是不是初始化有问题??
#include<ServoTimer2.h>    //舵机驱动库文件
ServoTimer2 servoLev;      //水平位置舵机控制
ServoTimer2 servoVcl;      //竖直位置舵机控制

//电机驱动数字引脚
int AIN1 = 6;   //AIN1
int AIN2 = 5;   //AIN2
int BIN1 = 10;  //BIN1            
int BIN2 = 9;   //BIN2
int  cmdData[4];     //定义一个数组用来存储串口接收到的数据,长度为5
int tmpData;         //存放数据的临时变量
int UARTDataCount = 0;  
int n = 0;

#define MIDPULSE 1500    //500表示舵机0度位置,1500表示90度位置,2500表示180度位置
/****************************************************************
   舵机初使化函数,定义舵机连接引脚,上电归位等!
   舵机1(水平面):FF 01 01 舵机角度 FF     数字引脚:3
   舵机2(竖直面):FF 01 04 舵机角度 FF     数字引脚:11
****************************************************************/
void initServo()         
{  
   servoVcl.attach(11);        //  数字引脚:11
   servoLev.attach(3);         //  数字引脚:3
   servoLev.write(MIDPULSE);
   servoVcl.write(MIDPULSE);
   delay(200);   
}
void setup() {
  pinMode(13,OUTPUT);      //PIN模式
  pinMode(AIN1,OUTPUT);
  pinMode(AIN2,OUTPUT);
  pinMode(BIN1,OUTPUT);
  pinMode(BIN2,OUTPUT);
  Serial.begin(9600);     //串口初使化
  initServo();             //舵机初使化
}
/********************************************************
   向前指令:FF 00 01 00 FF
   向后指令:FF 00 02 00 FF
   向左指令:FF 00 05 00 FF
   向右指令:FF 00 04 00 FF
   停止指令:FF 00 00 00 FF
*********************************************************/
void loop() {
  // put your main code here, to run repeatedly:
  if(Serial.available())
  {
    tmpData=Serial.read();   //读取来自串口的数据
    if(tmpData == 0xFF && UARTDataCount <2)  //检测包头是否为0XFF
    {
      cmdData[0] = tmpData;   
      UARTDataCount++;
      n = 1;
    }
    else
    {
      cmdData[n]=tmpData;
      n++;
    }
    if(UARTDataCount == 2)
    {
      cmdData[0] = 0xFF;
      cmdData[4] = 0xFF;
      n = 1;
      UARTDataCount = 0;
      Serial.flush();      //清缓冲区
    }
  }
  if(cmdData[0]==0xFF && cmdData[4]==0xFF)   //收到完整的数据包
  {
    switch(cmdData[1])  //判断数据类型
    {
      case 0x00:      //指令数据控制
        switch(cmdData[2])
        {
          case 0x01:
            setMotor(100,100);
            break;
          case 0x00:
            setMotor(0,0);
            break;
          case 0x02:
            setMotor(-100,-100);
            break;
          case 0x03:
            setMotor(-150,150);
            break;
          case 0x04:
            setMotor(150,-150);
            break;
        }
      break;
      case 0x01:  //舵机数据控制
        switch(cmdData[2])
        {
          case 0x01:
            servoLev.write(cmdData[3]*13+500);
            break;
          case 0x04:
            servoVcl.write(cmdData[3]*13+500);
            break;
        }
      break;
    }
  }
}

void setMotor(int MOTORA,int MOTORB) //电机驱动函数
{
  if(MOTORA>=0)
  {
    digitalWrite(AIN2,HIGH);
    analogWrite(AIN1,255-MOTORA);
  }
  else
  {
    digitalWrite(AIN1,HIGH);
    analogWrite(AIN2,MOTORA+255);
  }
  if(MOTORB>=0)
  {
    digitalWrite(BIN2,HIGH);
    analogWrite(BIN1,255-MOTORB);
  }
  else
  {
    digitalWrite(BIN1,HIGH);
    analogWrite(BIN2,255+MOTORB);
  }
  
}
回复

使用道具 举报

 楼主| 发表于 2015-8-22 15:53:39 | 显示全部楼层
注:我修改过初始化之后delay的时间,好像没什么用
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-22 16:37:38 | 显示全部楼层

wifi小车,Arduino UNO 启动 初始化问题

各位大侠,我的wifi小车,Arduino UNO 启动后电机控制不能用,需要手动Reset一下才可以。而且第一次启动时蜂鸣器有固定频率的微小电流音。 以下是我的控制程序,是不是初始化有问题??请帮忙,谢谢!


#include<ServoTimer2.h>    //舵机驱动库文件
ServoTimer2 servoLev;      //水平位置舵机控制
ServoTimer2 servoVcl;      //竖直位置舵机控制

//电机驱动数字引脚
int AIN1 = 6;   //AIN1
int AIN2 = 5;   //AIN2
int BIN1 = 10;  //BIN1            
int BIN2 = 9;   //BIN2
int  cmdData[4];     //定义一个数组用来存储串口接收到的数据,长度为5
int tmpData;         //存放数据的临时变量
int UARTDataCount = 0;  
int n = 0;

#define MIDPULSE 1500    //500表示舵机0度位置,1500表示90度位置,2500表示180度位置
/****************************************************************
   舵机初使化函数,定义舵机连接引脚,上电归位等!
   舵机1(水平面):FF 01 01 舵机角度 FF     数字引脚:3
   舵机2(竖直面):FF 01 04 舵机角度 FF     数字引脚:11
****************************************************************/
void initServo()         
{  
   servoVcl.attach(11);        //  数字引脚:11
   servoLev.attach(3);         //  数字引脚:3
   servoLev.write(MIDPULSE);
   servoVcl.write(MIDPULSE);
   delay(200);   
}
void setup() {
  pinMode(13,OUTPUT);      //PIN模式
  pinMode(AIN1,OUTPUT);
  pinMode(AIN2,OUTPUT);
  pinMode(BIN1,OUTPUT);
  pinMode(BIN2,OUTPUT);
  Serial.begin(9600);     //串口初使化
  initServo();             //舵机初使化
}
/********************************************************
   向前指令:FF 00 01 00 FF
   向后指令:FF 00 02 00 FF
   向左指令:FF 00 05 00 FF
   向右指令:FF 00 04 00 FF
   停止指令:FF 00 00 00 FF
*********************************************************/
void loop() {
  // put your main code here, to run repeatedly:
  if(Serial.available())
  {
    tmpData=Serial.read();   //读取来自串口的数据
    if(tmpData == 0xFF && UARTDataCount <2)  //检测包头是否为0XFF
    {
      cmdData[0] = tmpData;   
      UARTDataCount++;
      n = 1;
    }
    else
    {
      cmdData[n]=tmpData;
      n++;
    }
    if(UARTDataCount == 2)
    {
      cmdData[0] = 0xFF;
      cmdData[4] = 0xFF;
      n = 1;
      UARTDataCount = 0;
      Serial.flush();      //清缓冲区
    }
  }
  if(cmdData[0]==0xFF && cmdData[4]==0xFF)   //收到完整的数据包
  {
    switch(cmdData[1])  //判断数据类型
    {
      case 0x00:      //指令数据控制
        switch(cmdData[2])
        {
          case 0x01:
            setMotor(100,100);
            break;
          case 0x00:
            setMotor(0,0);
            break;
          case 0x02:
            setMotor(-100,-100);
            break;
          case 0x03:
            setMotor(-150,150);
            break;
          case 0x04:
            setMotor(150,-150);
            break;
        }
      break;
      case 0x01:  //舵机数据控制
        switch(cmdData[2])
        {
          case 0x01:
            servoLev.write(cmdData[3]*13+500);
            break;
          case 0x04:
            servoVcl.write(cmdData[3]*13+500);
            break;
        }
      break;
    }
  }
}

void setMotor(int MOTORA,int MOTORB) //电机驱动函数
{
  if(MOTORA>=0)
  {
    digitalWrite(AIN2,HIGH);
    analogWrite(AIN1,255-MOTORA);
  }
  else
  {
    digitalWrite(AIN1,HIGH);
    analogWrite(AIN2,MOTORA+255);
  }
  if(MOTORB>=0)
  {
    digitalWrite(BIN2,HIGH);
    analogWrite(BIN1,255-MOTORB);
  }
  else
  {
    digitalWrite(BIN1,HIGH);
    analogWrite(BIN2,255+MOTORB);
  }
  
}

回复 支持 反对

使用道具 举报

发表于 2015-8-23 18:14:27 | 显示全部楼层
应该是串口解析的代码有BUG,这种解析算法有很大问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-23 23:55:11 来自手机 | 显示全部楼层
liuviking 发表于 2015-8-23 18:14
应该是串口解析的代码有BUG,这种解析算法有很大问题。

大侠,有没有什么好的方法推荐?
回复 支持 反对

使用道具 举报

发表于 2015-9-13 07:30:07 | 显示全部楼层
光盘上有部分源码的,你可以参考一下
/*
* Copyright (c) 2015,小二极客科技有限公司
* All rights reserved.
*
* 文件名称:wifi-robots
* 文件标识:
* 摘    要:wifi机器人智能小车控制
*
* 当前版本:1.0
* 作    者:tianyalu
* 完成日期:2015年4月1日
*/
//#include <AFMotor.h>
#include <Servo.h>
#include <MsTimer2.h>
#include <EEPROM.h>

int ledpin = 13;//设置系统启动指示灯
int ENA = 5;//
int ENB = 6;//
int INPUT2 = 7;//
int INPUT1 = 8;//
int INPUT3 = 12;//
int INPUT4 = 13;//

#define MOTOR_GO_FORWARD  {digitalWrite(INPUT1,LOW);digitalWrite(INPUT2,HIGH);digitalWrite(INPUT3,LOW);digitalWrite(INPUT4,HIGH);}    //车体前进                                    
#define MOTOR_GO_BACK          {digitalWrite(INPUT1,HIGH);digitalWrite(INPUT2,LOW);digitalWrite(INPUT3,HIGH);digitalWrite(INPUT4,LOW);}    //车体前进
#define MOTOR_GO_RIGHT          {digitalWrite(INPUT1,HIGH);digitalWrite(INPUT2,LOW);digitalWrite(INPUT3,LOW);digitalWrite(INPUT4,HIGH);}    //车体前进
#define MOTOR_GO_LEFT          {digitalWrite(INPUT1,LOW);digitalWrite(INPUT2,HIGH);digitalWrite(INPUT3,HIGH);digitalWrite(INPUT4,LOW);}    //车体前进
#define MOTOR_GO_STOP          {digitalWrite(INPUT1,LOW);digitalWrite(INPUT2,LOW);digitalWrite(INPUT3,LOW);digitalWrite(INPUT4,LOW);}    //车体前进

//AF_DCMotor motor1(1, MOTOR12_64KHZ);// 创建电机#1号,速度是64KHz pwm
//AF_DCMotor motor2(2, MOTOR12_64KHZ);// 创建电机#2号,速度是64KHz pwm

Servo servo1;// 创建舵机#1号
Servo servo2;// 创建舵机#2号

byte angle1;
byte angle2;

int buffer[3];  //串口接收数据缓存
int rec_flag;
int serial_data;
int Uartcount;
unsigned long Pretime;
unsigned long Nowtime;
unsigned long Costtime;
/*
*********************************************************************************************************
** 函数名称 :setup()
** 函数功能 :系统初始化(串口、电机、舵机、指示灯初始化)。
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void setup()
{
    int i;
   
    pinMode(ledpin,OUTPUT);
    pinMode(ENA,OUTPUT);
    pinMode(ENB,OUTPUT);
    pinMode(INPUT1,OUTPUT);
    pinMode(INPUT2,OUTPUT);
    pinMode(INPUT3,OUTPUT);
    pinMode(INPUT4,OUTPUT);
    for(i=0;i<20;i++)
    {
        digitalWrite(ledpin,LOW);
        delay(1000);
        digitalWrite(ledpin,HIGH);
        delay(1000);
    }
    digitalWrite(ledpin,LOW);
   
    Serial.begin(9600);//串口波特率设置为9600 bps
    digitalWrite(ENA,HIGH);
    digitalWrite(ENB,HIGH);
   
    //motor1.setSpeed(255);// 设置电机速度,从00/255之间任意
   // motor2.setSpeed(255);// 设置电机速度,从00/255之间任意
    servo1.attach(9);//定义舵机7控制口
    servo2.attach(10);//定义舵机8控制口
   
    angle1 = EEPROM.read(0x01);
    angle2 = EEPROM.read(0x02);
    servo1.write(angle1);
    servo2.write(angle2);
   
    //MsTimer2::set(10, UartTimeoutCheck);//串口超时检测
   // MsTimer2::start();
}
/*
*********************************************************************************************************
** 函数名称 :loop()
** 函数功能 :主函数
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void loop()
{  
    while(1)
    {
        Get_uartdata();
        UartTimeoutCheck();
    }
}
/*
*********************************************************************************************************
** 函数名称 :Communication_Decode()
** 函数功能 :串口命令解码
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void Communication_Decode()
{   
    if(buffer[0]==0x00)
    {
        switch(buffer[1])   //电机命令
        {
            case 0x01:MOTOR_GO_FORWARD; return;
            case 0x02:MOTOR_GO_BACK;    return;
            case 0x03:MOTOR_GO_LEFT;    return;
            case 0x04:MOTOR_GO_RIGHT;   return;
            case 0x00:MOTOR_GO_STOP;    return;
           default: return;
        }       
    }
    else if(buffer[0]==0x01)//舵机命令
    {
        if(buffer[2]>180)return;
        switch(buffer[1])
        {
            case 0x07:angle1 = buffer[2];servo1.write(angle1);return;
            case 0x08:angle2 = buffer[2];servo2.write(angle2);return;
            default:return;
        }
    }
    else if(buffer[0]==0x32)//保存命令
    {
        EEPROM.write(0x01,angle1);
        EEPROM.write(0x02,angle2);
        return;
    }
   
}
/*
*********************************************************************************************************
** 函数名称 :Get_uartdata()
** 函数功能 :读取串口命令
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void Get_uartdata(void)
{
    static int i;
   
    if (Serial.available() > 0) //判断串口缓冲器是否有数据装入
    {
        serial_data = Serial.read();//读取串口
        if(rec_flag==0)
        {
            if(serial_data==0xff)
            {
                rec_flag = 1;
                i = 0;
                //Uartcount = 0;
                //Pretime = millis();
               Costtime = 0;
            }
        }
        else
        {
            if(serial_data==0xff)
            {
                rec_flag = 0;
                if(i==3)
                {
                    Communication_Decode();
                }
                i = 0;
            }
            else
            {
                buffer[i]=serial_data;
                i++;
            }
        }
    }
}
/*
*********************************************************************************************************
** 函数名称 :UartTimeoutCheck()
** 函数功能 :串口超时检测
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void UartTimeoutCheck(void)
{
    if(rec_flag == 1)
    {
       //Nowtime = millis();
       Costtime++;  
      if(Costtime == 100000)
      {
           rec_flag = 0;
      }
    }
   // Uartcount++;
}
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-5-5 05:59 , Processed in 1.079406 second(s), 18 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

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