麦克纳姆轮小车设计
基于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();//小车控制
}
```/