基于Arduino的麦克纳姆轮小车程序控制设计

麦克纳姆轮小车设计
基于arduino控制设计,使用开放的app接口
由于购买回来的材料是散装的,就当是练练手了,不过安装起来挺快,一点也不复杂,还是有那么一点成就感。装起来挺好看的,安装好的底盘给大家爆一张图吧!(光线暗了影响拍摄效果)
在这里插入图片描述

电机驱动选择是以前做实验使用过的两个大功率驱动模块+ARDUINO UNO R3+蓝牙模块,
硬件组合搭建好,接下来开始编程。
由于不能一一讲解附上一下代码:仅供大家参考


/材料:UNO+MOEBIUS电机驱动板+蓝牙模块

/****************************IO引脚定义*****************************/
//电机引脚
#define PWMA 3 //A电机转速
#define DIRA 2 //A电机转向
#define PWMB 5 //B电机转速
#define DIRB 4 //B电机转向
#define PWMC 6 //A电机转速
#define DIRC 7 //A电机转向
#define PWMD 9 //B电机转速
#define DIRD 8 //B电机转向
//控制电机运动    宏定义
#define MOTOR_GO_FORWARD  {digitalWrite(DIRA,HIGH);analogWrite(PWMA,150);digitalWrite(DIRB,HIGH);analogWrite(PWMB,150);\
digitalWrite(DIRC,HIGH);analogWrite(PWMC,150);digitalWrite(DIRD,HIGH);analogWrite(PWMD,150);} //车体前进	                            
#define MOTOR_GO_BACK	  {digitalWrite(DIRA,LOW);analogWrite(PWMA,150);digitalWrite(DIRB,LOW);analogWrite(PWMB,150);\
digitalWrite(DIRC,LOW);analogWrite(PWMC,150);digitalWrite(DIRD,LOW);analogWrite(PWMD,150);}   //车体后退
#define MOTOR_GO_LEFT_1	  {digitalWrite(DIRA,HIGH);analogWrite(PWMA,150);digitalWrite(DIRD,HIGH);analogWrite(PWMB,150);}  //车体左前转
#define MOTOR_GO_LEFT_2	  {digitalWrite(DIRA,HIGH);analogWrite(PWMA,150);digitalWrite(DIRB,LOW);analogWrite(PWMB,150);\
digitalWrite(DIRC,LOW);analogWrite(PWMC,150);digitalWrite(DIRD,HIGH);analogWrite(PWMD,150);}  //车体左转
#define MOTOR_GO_LEFT_3	  {digitalWrite(DIRB,LOW);analogWrite(PWMB,150);digitalWrite(DIRC,LOW);analogWrite(PWMB,150);}  //车体左后转
#define MOTOR_GO_RIGHT_1  {digitalWrite(DIRB,HIGH);analogWrite(PWMB,150);digitalWrite(DIRC,HIGH);analogWrite(PWMC,150);}  //车体右前转
#define MOTOR_GO_RIGHT_2  {digitalWrite(DIRA,LOW);analogWrite(PWMA,150);digitalWrite(DIRB,HIGH);analogWrite(PWMB,150);\
digitalWrite(DIRC,HIGH);analogWrite(PWMC,150);digitalWrite(DIRD,LOW);analogWrite(PWMD,150);}  //车体右转
#define MOTOR_GO_RIGHT_3  {digitalWrite(DIRA,LOW);analogWrite(PWMB,150);digitalWrite(DIRD,LOW);analogWrite(PWMC,150);}  //车体右后转
#define MOTOR_GO_STOP	  {digitalWrite(DIRA,LOW);analogWrite(PWMA,0);digitalWrite(DIRB,LOW);analogWrite(PWMB,0);\
digitalWrite(DIRC,LOW);analogWrite(PWMC,0);digitalWrite(DIRD,LOW);analogWrite(PWMD,0);}       //车体静止
//串口接收处理
#define MAX_PACKETSIZE 32  //串口接收缓冲区
char buffUART[MAX_PACKETSIZE];
unsigned int buffUARTIndex = 0;
unsigned long preUARTTick = 0;
//小车转向
enum DN
{ 
	GO_ADVANCE, 
	GO_LEFT_1,
        GO_LEFT_2,
        GO_LEFT_3,
	GO_RIGHT_1,
        GO_RIGHT_2,
        GO_RIGHT_3,
	GO_BACK,
	STOP_STOP,
	DEF
}Drive_Num=DEF;

//电机控制标志量
bool flag1=false;
bool stopFlag = true;
bool JogFlag = false;
uint16_t JogTimeCnt = 0;
uint32_t JogTime=0;


//小车电机控制
void CAR_Control()
{
	switch (Drive_Num) 
    {
      case GO_ADVANCE:MOTOR_GO_FORWARD;JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;
      case GO_LEFT_1: MOTOR_GO_LEFT_1;JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;
      case GO_LEFT_2: MOTOR_GO_LEFT_2;JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;
      case GO_LEFT_3: MOTOR_GO_LEFT_3;JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;
      case GO_RIGHT_1:MOTOR_GO_RIGHT_1;JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;
      case GO_RIGHT_2:MOTOR_GO_RIGHT_2;JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;
      case GO_RIGHT_3:MOTOR_GO_RIGHT_3;JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;
      case GO_BACK:MOTOR_GO_BACK;JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;
      case STOP_STOP: MOTOR_GO_STOP;JogTime = 0;JogFlag=false;stopFlag=true;break;
      default:break;
    }
    Drive_Num=DEF;
    //小车保持姿态210ms
    if(millis()-JogTime>=210)
    {
      JogTime=millis();
      if(JogFlag == true) 
      {
        stopFlag = false;
        if(JogTime <= 0) 
        {
          JogFlag = false; stopFlag = true;
        }
        JogTime--;
      }
      if(stopFlag == true) 
      {
        JogTimeCnt=0;
        MOTOR_GO_STOP;
      }
    }
}
//串口数据接收处理
void UART_Control()
{
	char Uart_Date=0;
	if(Serial.available()) //串口收到数据
	{
          Uart_Date = Serial.read();
	}
	if(buffUARTIndex > 0 && (millis() - preUARTTick >= 100))//超过100ms没接到数据,则认为已经接收到完整指令
	{ //data ready
		buffUART[buffUARTIndex] = 0x00;
		if((buffUART[0]=='C') && (buffUART[1]=='M') && (buffUART[2]=='D')) //若发送指令非法,则忽略
	    {
	    	;
	    }
		else Uart_Date=buffUART[0];
    	buffUARTIndex = 0;
       }
       switch (Uart_Date)    //串口控制指令
	{
		case 'A': Drive_Num=GO_ADVANCE;break;
		case 'B': Drive_Num=GO_LEFT_1; break;
                case 'C': Drive_Num=GO_LEFT_2; break;
                case 'D': Drive_Num=GO_LEFT_3; break;
		case 'F': Drive_Num=GO_RIGHT_3; break;
                case 'G': Drive_Num=GO_RIGHT_2; break;
                case 'H': Drive_Num=GO_RIGHT_1; break;
		case 'E': Drive_Num=GO_BACK; break;
		case 'Z': Drive_Num=STOP_STOP;break;
		default:break;
	}
      
}
//IO初始化
void IO_init()
{
	pinMode(PWMA, OUTPUT);
	pinMode(DIRA, OUTPUT);
	pinMode(PWMB, OUTPUT);
	pinMode(DIRB, OUTPUT);
        pinMode(PWMC, OUTPUT);
	pinMode(DIRC, OUTPUT);
	pinMode(PWMD, OUTPUT);
	pinMode(DIRD, OUTPUT);
	MOTOR_GO_STOP;
}
/初始化
void setup()
{
	Serial.begin(9600);
	IO_init();
}

void loop()
{
	UART_Control();//串口接收处理
	CAR_Control();//小车控制
}

```/


  • 23
    点赞
  • 205
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值