小车制作【基于mega2560的蓝牙小车】

      采用 Arduino Mega2560单片机作为主控单元,采用四轮式移动(麦克纳姆轮),四轮均可驱动,可以通过蓝牙控制小车前进、后退、原地转向等操作。

一 ,总体结构

 二 ,硬件选取

 1,编码电机(高精度编码器12v大扭矩的520电机)

 2 ,蓝牙模块选择(HC-05或HC-06)

 3 ,麦克纳姆轮(推荐和小车底盘一块购买)

 4 ,电机驱动选择(可以选择TB6612四驱驱动器)

 5 ,mega2560扩展板

6 ,最后选择一个供电设备,可以用充电宝或者锂电池 

三 ,代码部分

/************************************************************/
/********硬件:Arduino mega2560 + TB6612电机驱动一个********/
/************************************************************/
#include<SoftwareSerial.h>  //蓝牙
int L1_IN1 = 29;int L1_IN2 = 53;int L1_ENA = 8;//左前轮
int R1_IN1 = 26;int R1_IN2 = 50;int R1_ENA = 11;//右前轮
int L2_IN1 = 28;int L2_IN2 = 52;int L2_ENA = 9;//左后轮
int R2_IN1 = 27;int R2_IN2 = 51;int R2_ENA = 10;//右后轮
// Pin14为RX,接HC05的TXD
// Pin15为TX,接HC05的RXD
char val;
void setup() {
  // put your setup code here, to run once:
  pinMode(L1_IN1, OUTPUT);pinMode(L1_IN2, OUTPUT);pinMode(L1_ENA, OUTPUT);
  pinMode(R1_IN1, OUTPUT);pinMode(R1_IN2, OUTPUT);pinMode(R1_ENA, OUTPUT);
  pinMode(L2_IN1, OUTPUT);pinMode(L2_IN2, OUTPUT);pinMode(L2_ENA, OUTPUT);
  pinMode(R2_IN1, OUTPUT);pinMode(R2_IN2, OUTPUT);pinMode(R2_ENA, OUTPUT);
  Serial.begin(9600); 
  Serial.println("bluetooth is ready!");
  Serial3.begin(9600);//蓝牙传输速率

}

void L1_forward(int sp)//左前轮前进
{
  digitalWrite(L1_IN1,LOW);
  digitalWrite(L1_IN2,HIGH);
  analogWrite(L1_ENA,sp);
}
void R1_forward(int sp)//右前轮前进
{
  digitalWrite(R1_IN1,HIGH);
  digitalWrite(R1_IN2,LOW);
  analogWrite(R1_ENA,sp);
}
void L2_forward(int sp)//左后轮前进
{
  digitalWrite(L2_IN1,HIGH);
  digitalWrite(L2_IN2,LOW);
  analogWrite(L2_ENA,sp);
}
void R2_forward(int sp)//右后轮前进
{
  digitalWrite(R2_IN1,HIGH);
  digitalWrite(R2_IN2,LOW);
  analogWrite(R2_ENA,sp);
}
void allstop()
{
  digitalWrite(L1_IN1,LOW);
  digitalWrite(L1_IN2,LOW);  
  digitalWrite(R1_IN1,LOW);
  digitalWrite(R1_IN2,LOW);
  digitalWrite(L2_IN1,LOW);
  digitalWrite(L2_IN2,LOW);
  digitalWrite(R2_IN1,LOW);
  digitalWrite(R2_IN2,LOW);
}
void L1_backward(int sp)//左前轮后退
{
  digitalWrite(L1_IN1,HIGH);
  digitalWrite(L1_IN2,LOW);
  analogWrite(L1_ENA,sp);
}
void R1_backward(int sp)//右前轮后退
{
  digitalWrite(R1_IN1,LOW);
  digitalWrite(R1_IN2,HIGH);
  analogWrite(R1_ENA,sp);
}
void L2_backward(int sp)//左后轮后退
{
  digitalWrite(L2_IN1,LOW);
  digitalWrite(L2_IN2,HIGH);
  analogWrite(L2_ENA,sp);
}
void R2_backward(int sp)//右后轮后退
{
  digitalWrite(R2_IN1,LOW);
  digitalWrite(R2_IN2,HIGH);
  analogWrite(R2_ENA,sp);
}
/*
void loop() {//使用串口收发指令
  while(Serial.available()>0)
  {
    
    val = Serial.read();//读取串口缓冲区的数据
    Serial.print(val);
   switch(val)
   {
   case 'w':
      /*前进
      L1_forward(100);
      R1_forward(100);
      L2_forward(100);
      R2_forward(100);
      delay(1500);
      allstop();
      delay(1500);
      break;
   case's':
       /*后退
      L1_backward(100);
      R1_backward(100);
      L2_backward(100);
      R2_backward(100);
      delay(1500);
      allstop();
      delay(1500);
      break;
   case'd':
      /*右边平移
      L1_forward(150);
      R1_backward(150);
      L2_backward(150);
      R2_forward(150);
      delay(1500);
      allstop();
      delay(1500);
      break;
    case'a':
      /*左边平移
      L1_backward(150);
      R1_forward(150);
      L2_forward(150);
      R2_backward(150);
      delay(1500);
      allstop();
      delay(1500);
      break;
    case'c_w':
      /*顺时针原地旋转
      L1_forward(200);
      R1_backward(200);
      L2_forward(200);
      R2_backward(200);
      delay(1500);
      allstop();
      delay(1500);
      break;
    case'ccw':
      /*逆时针原地旋转
      L1_backward(200);
      R1_forward(200);
      L2_backward(200);
      R2_forward(200);
      delay(1500);
      allstop();
      delay(1500);
      break;
    case'a_w':
      /*斜向左上方
      R1_forward(150);
      L2_forward(150);
      delay(1500);
      allstop();
      delay(1500);
      break;
    case'd_w':
      /*斜向右上方
      L1_forward(150);
      R2_forward(150);
      delay(1500);
      allstop();
      delay(1500);
      break;
    case'd_s':
      /*斜向右下方
      R1_backward(150);
      L2_backward(150);
      delay(1500);
      allstop();
      delay(1500);
      break;
    case'a_s':
      /*斜向左下方
      L1_backward(150);
      R2_backward(150);
      delay(1500);
      allstop();
      delay(1500);
      break;
    default:
    /*停止
    digitalWrite(L1_IN1,LOW);
    digitalWrite(L1_IN2,LOW);  
    digitalWrite(R1_IN1,LOW);
    digitalWrite(R1_IN2,LOW);
    digitalWrite(L2_IN1,LOW);
    digitalWrite(L2_IN2,LOW);
    digitalWrite(R2_IN1,LOW);
    digitalWrite(R2_IN2,LOW);
    break; 
   }      
  }
}
*/




/*使用蓝牙收发指令*/
void loop() {
  while(Serial3.available()>0)
  {
    
    val = Serial3.read();//读取串口缓冲区的数据
    Serial3.println(val);
   switch(val)
   {
   case 'w':
      /*前进*/
      L1_forward(100);
      R1_forward(100);
      L2_forward(100);
      R2_forward(100);
      delay(1500);
      allstop();
      delay(1500);
      break;
   case's':
       /*后退*/
      L1_backward(100);
      R1_backward(100);
      L2_backward(100);
      R2_backward(100);
      delay(1500);
      allstop();
      delay(1500);
      break;
   case'd':
      /*右边平移*/
      L1_forward(150);
      R1_backward(150);
      L2_backward(150);
      R2_forward(150);
      delay(1500);
      allstop();
      delay(1500);
      break;
    case'a':
      /*左边平移*/
      L1_backward(150);
      R1_forward(150);
      L2_forward(150);
      R2_backward(150);
      delay(1500);
      allstop();
      delay(1500);
      break;
    case'c_w':
      /*顺时针原地旋转*/
      L1_forward(200);
      R1_backward(200);
      L2_forward(200);
      R2_backward(200);
      delay(1500);
      allstop();
      delay(1500);
      break;
    case'ccw':
      /*逆时针原地旋转*/
      L1_backward(200);
      R1_forward(200);
      L2_backward(200);
      R2_forward(200);
      delay(1500);
      allstop();
      delay(1500);
      break;
    case'a_w':
      /*斜向左上方*/
      R1_forward(150);
      L2_forward(150);
      delay(1500);
      allstop();
      delay(1500);
      break;
    case'd_w':
      /*斜向右上方*/
      L1_forward(150);
      R2_forward(150);
      delay(1500);
      allstop();
      delay(1500);
      break;
    case'd_s':
      /*斜向右下方*/
      R1_backward(150);
      L2_backward(150);
      delay(1500);
      allstop();
      delay(1500);
      break;
    case'a_s':
      /*斜向左下方*/
      L1_backward(150);
      R2_backward(150);
      delay(1500);
      allstop();
      delay(1500);
      break;
    default:
    /*停止*/
    digitalWrite(L1_IN1,LOW);
    digitalWrite(L1_IN2,LOW);  
    digitalWrite(R1_IN1,LOW);
    digitalWrite(R1_IN2,LOW);
    digitalWrite(L2_IN1,LOW);
    digitalWrite(L2_IN2,LOW);
    digitalWrite(R2_IN1,LOW);
    digitalWrite(R2_IN2,LOW);
    break; 
   }      
  }
}





 

可以通过电脑串口发送指令控制小车的运动,或者是通过蓝牙串口。

四 ,蓝牙串口

安卓手机直接在应用商城搜索蓝牙串口进行下载

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dt ^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值