arduino智能蓝牙小车

        大家好!这是小编第二次做小项目~

        小编目前专业是电气自动化的,不搞点硬件方面的东西,不学点控制技术,有点对不起自己所学的专业。

        小编这次打算做arduino多功能智能小车~

        首先,为啥选择arduino电路板?

        这个是由于小编还没学过单片机啊~还没有弄过其他的,比如stm32单片机。因为这些学习起来,对于初学者来说,比较困难,需要花时间。而arduino入门确实简单,特别适合初学者,而且arduino源码开源的,特别的人性化。其实,arduino也是单片机,但是它是经过二次开发的,有很多的库函数。


1.所需材料

底盘2个    电机4个    轮胎4个    arduino uno板1个

电机驱动板1个    杜邦线若干    电池盒1个    5号电池4节

USB数据线1根    蓝牙模块    USB 转TTL数据线

        如果这是读者第一次做,没有什么DIY经验的话,可以自己在网上买套装元件,网上关于这些东西很多,可以满足我们的制作材料的要求。当然,对于有一定基础的读者,会设计原理图,完全可以用AltiumDesigner软件,绘制一个属于自己的PCB板,这样对于自己有很大的提高。我在网上看的意大利进口PCB板,感觉挺精致的,奈何出于经济原因,就买了套件。

2.编程软件

本人使用官方的免费IDE编程环境,下载地址与安装教程见官网

这个软件的详细教程参考地址arduino IDE教程


3.制作过程

首先,小编先介绍一下小车的结构:

1.电机驱动模块:这是控制小车电机转动的模块,在模块的电源部分,有VMS、VCC(5v)、GND3个接口。电源正极接VMS,电源负极接GND,这样就给电机驱动模块上电了。MotorA和MotorB的四个接口,分别接电机的线。ENA和ENB分别是使能端,接Arduino的PWM接口,用于电机的调速。IN1、IN2、IN3和IN4分别接Arduino的数字接口。

LN298电机驱动模块

2.Arduino单片机:可以说是智能小车的“大脑”,也就是说这是小车的核心。在后面,我们要将我们编好的程序导入到arduino中,就可以控制小车了~

arduino单片机

        在我制作小车的时候,我在网上了解到arduino单片机供电方式,这里就不在阐述了 ,具体见网址:

3.蓝牙模块:这是通信模块,控制着手机与arduino单片机之间的通信。蓝牙模块上共有6个引脚,我们在这里要用到4个引脚,分别是RX、TX、VCC和GND,蓝牙模块的RX接arduino的TX,蓝牙模块的TX接arduino的RX,VCC接VCC,GND接GND。当然,蓝牙模块在使用之前,需要进行调试,我们需要下载串口调试助手,进行以下操作:(蓝牙模块的初始密码为1234)

HC-05蓝牙控制模块

给蓝牙模块命名,将串口波特率改成115200

然后根据指令,测试一下蓝牙的通信状况。

4.电源模块:其实就是四节电池,主要是给arduino单片机和电机驱动模块供电。

详见图片:

图片发自简书App

图片发自简书App

图片发自简书App

4.代码展示

首先,说一下编程思路:

setup()函数里主要配置一些小车的参数。

loop()函数里,先接收手机通过蓝牙发出的指令,并通过传参调用小车电机驱动函数,实现蓝牙控制功能。

#define STOP 0x03

#define FORWARD 0x02

#define BACKWARD 0x08

#define TURN_LEFT 0x06

#define TURN_RIGHT 0x07

int PWMLeft = 3;//左轮速度

int PWMRight = 5;//右轮速度

int MotorLeft1 = 7;//左前轮方向

int MotorLeft2 = 8;//左后轮方向

int MotorRight1 = 12;//右前轮方向

int MotorRight2 = 13;//右后轮方向

void setup()

{

  Serial.begin(115200);

  pinMode(PWMLeft, OUTPUT);

  pinMode(PWMRight, OUTPUT);

  pinMode(MotorLeft1, OUTPUT);

  pinMode(MotorLeft2, OUTPUT);

  pinMode(MotorRight1, OUTPUT);

  pinMode(MotorRight2, OUTPUT);

  delay(10);

}

void loop(){

if(Serial.available()>0)

  {

    char cmd=Serial.read();

    Serial.print(cmd);

    motorRun(cmd);

    delay(10);

  }

}

void motorRun(int cmd)

{

    switch(cmd){

      case FORWARD:

      Serial.println("FORWARD");

      analogWrite(PWMLeft, 180);  //PWM调速

      analogWrite(PWMRight, 200);  //PWM调速

      digitalWrite(MotorLeft1,HIGH);

      digitalWrite(MotorLeft2,LOW);

      digitalWrite(MotorRight1,LOW);

      digitalWrite(MotorRight2,HIGH);

      break;

      case BACKWARD:

      Serial.println("BACKWARD");

      analogWrite(PWMLeft, 180);  //PWM调速

      analogWrite(PWMRight, 200);  //PWM调速

      digitalWrite(MotorLeft1,LOW);

      digitalWrite(MotorLeft2,HIGH);

      digitalWrite(MotorRight1,HIGH);

      digitalWrite(MotorRight2,LOW);

      break;

      case TURN_LEFT:

      Serial.println("TURN_LEFT");

      analogWrite(PWMLeft, 0);  //PWM调速

      analogWrite(PWMRight, 240);  //PWM调速

      digitalWrite(MotorRight1,LOW);

      digitalWrite(MotorRight2,HIGH);

      delay(500);

      analogWrite(PWMLeft, 0);  //PWM调速

      analogWrite(PWMRight, 0);  //PWM调速

      break;

      case TURN_RIGHT:

      Serial.println("TURN_RIGHT");

      analogWrite(PWMLeft, 200);  //PWM调速

      analogWrite(PWMRight, 0);  //PWM调速

      digitalWrite(MotorLeft1,HIGH);

      digitalWrite(MotorLeft2,LOW);

      delay(500);

      analogWrite(PWMLeft, 0);  //PWM调速

      analogWrite(PWMRight, 0);  //PWM调速

      break;

      case STOP:

      Serial.println("STOP");

      analogWrite(PWMLeft, 0);  //PWM调速

      analogWrite(PWMRight, 0);  //PWM调速

  }

}

5.功能演示

功能:通过蓝牙控制(手机APP)小车的前进、后退、左转、右转等相关指令的执行。


小车直行


蓝牙小车控制

这里,有点不好意思,我也不知道为啥格式工厂不好弄分辨率更大的视频转GIF功能,总是出错~

在这里,小编再推荐蓝牙控制手机APP软件,在应用市场里搜索蓝牙智能小车

蓝牙手机APP控制界面:

图片发自简书App


图片发自简书App

图片发自简书App

软件说明:

图片发自简书App



6.代码分析

电机驱动函数:

void motorRun(int cmd)

{

    switch(cmd){

      case FORWARD:

      Serial.println("FORWARD");

      analogWrite(PWMLeft, 180);  //PWM调速

      analogWrite(PWMRight, 200);  //PWM调速

      digitalWrite(MotorLeft1,HIGH);

      digitalWrite(MotorLeft2,LOW);

      digitalWrite(MotorRight1,LOW);

      digitalWrite(MotorRight2,HIGH);

      break;

      case BACKWARD:

      Serial.println("BACKWARD");

      analogWrite(PWMLeft, 180);  //PWM调速

      analogWrite(PWMRight, 200);  //PWM调速

      digitalWrite(MotorLeft1,LOW);

      digitalWrite(MotorLeft2,HIGH);

      digitalWrite(MotorRight1,HIGH);

      digitalWrite(MotorRight2,LOW);

      break;

      case TURN_LEFT:

      Serial.println("TURN_LEFT");

      analogWrite(PWMLeft, 0);  //PWM调速

      analogWrite(PWMRight, 240);  //PWM调速

      digitalWrite(MotorRight1,LOW);

      digitalWrite(MotorRight2,HIGH);

      delay(500);

      analogWrite(PWMLeft, 0);  //PWM调速

      analogWrite(PWMRight, 0);  //PWM调速

      break;

      case TURN_RIGHT:

      Serial.println("TURN_RIGHT");

      analogWrite(PWMLeft, 200);  //PWM调速

      analogWrite(PWMRight, 0);  //PWM调速

      digitalWrite(MotorLeft1,HIGH);

      digitalWrite(MotorLeft2,LOW);

      delay(500);

      analogWrite(PWMLeft, 0);  //PWM调速

      analogWrite(PWMRight, 0);  //PWM调速

      break;

      case STOP:

      Serial.println("STOP");

      analogWrite(PWMLeft, 0);  //PWM调速

      analogWrite(PWMRight, 0);  //PWM调速

  }

}

这里,小车前进、后退、左转、右转和停止分别用FORWARD、BACKWARD、TURN_LEFT、TURN_RIGHT和STOP来定义。用switch条件选择语句来表示小车的五种状态,这里小编以小车前进为例,加以分析。

Serial.println("FORWARD");这一句是将FORWARD打印在串口监视器上。我们在前期测试手机与蓝牙的通信时,如果测试结果正确地出现在串口监视器上,表明通信成功。

如何调节电机转速?

analogWrite(PWMLeft, 180);

analogWrite(PWMRight, 200);

这两句时PWM调速语句。何为PWM(脉冲宽度调制)?简单来说,就是改变脉冲方波的占空比,比如一个5V的电源,怎么获得3v的电压,传统的观点是我们串联1个可调电阻进行分压。但,我们现在可以在单位时间内,3/5的时间里输出高电平,2/5的时间里输出低电平,这样就可以得到3v的电压了~这里PWM数值取0~255之间。

有读者会问了,怎么左轮和右轮的PWM的数值不一样。这是因为,每个电机的性能有些差异,虽然都是一起买来的。大家可以根据实际情况调节小车的PWM的数值。

      如何调节电机的转向?

      digitalWrite(MotorLeft1,HIGH);

      digitalWrite(MotorLeft2,LOW);

      digitalWrite(MotorRight1,LOW);

      digitalWrite(MotorRight2,HIGH);

这里,我还是要强调一下电机的接线,电机驱动模块有4个电机接口,每一个接口接其中一个电机的上面接口和另外一个电机的下面一个接口。这样只要通过1个电机驱动模块就可以控制四个电机了~如果你觉得这样不好,那你可以用两个电机驱动模块,来控制四个电机。

蓝牙部分:

  if(Serial.available()>0)

  {

    char cmd=Serial.read();

    Serial.print(cmd);

    motorRun(cmd);

    delay(10);

  }

Serial.available() 的意思是:返回串口缓冲区中当前剩余的字符个数。一般用这个函数来判断串口的缓冲区有无数据,当Serial.available()>0时,说明串口接收到了数据,可以读取;

Serial.read()指从串口的缓冲区取出并读取一个Byte的数据,比如有设备通过串口向Arduino发送数据了,我们就可以用Serial.read()来读取发送的数据。

定义与初始化部分:

#define STOP 0x03

#define FORWARD 0x02

#define BACKWARD 0x08

#define TURN_LEFT 0x06

#define TURN_RIGHT 0x07

这个宏定义是为了蓝牙通信的,具体见手机APP说明,通过蓝牙发送1个字符,arduino就可以接收到相应的数据。

int PWMLeft = 3;//左轮速度

int PWMRight = 5;//右轮速度

int MotorLeft1 = 7;//左前轮方向

int MotorLeft2 = 8;//左后轮方向

int MotorRight1 = 12;//右前轮方向

int MotorRight2 = 13;//右后轮方向

这个是定义小车PWM调速端接口和电机接口的。arduino单片机上有"~"字样的接口是PWM信号接口,其他的是数字接口。

void setup()

{

  Serial.begin(115200);

  pinMode(PWMLeft, OUTPUT);

  pinMode(PWMRight, OUTPUT);

  pinMode(MotorLeft1, OUTPUT);

  pinMode(MotorLeft2, OUTPUT);

  pinMode(MotorRight1, OUTPUT);

  pinMode(MotorRight2, OUTPUT);

  delay(10);

}

蓝牙的串口波特率从初始值9600调整为115200,然后定义小车PWM调速端接口和电机接口为输出端。  delay(10);起缓冲作用。


7.制作小车过程中遇到的问题

在小车制作前,自己没有DIY经验,只知道一些电子元件方面的基础知识,在编程方面,自己在大学学过C语言的课程,仅此而已。以下小编将从组装,接线,编程3个方面来阐述制作过程中的问题:

在小车组装方面,我们要有安装的次序,首先应该先将电机的接线接线接好,然后再将电机固定在底盘上,这样电机上的线容易接。还有,我要提醒的是如果你想做其他功能的小车,例如避障小车,应该先将舵机固定在底盘上一层上,然后再安装,这样容易拧螺丝。arduino单片机和电机驱动模块都放在上面一层。自己当时没有经验,拆拆装装,挺耗时间的。

接线时,尽量排布整齐一些,这样既让接线变得清晰明了,又使得小车美观大方。而小编自己在排线方面也没有做到很好。

编程方面,其实arduino开源代码很多,可以借鉴性学习。当时,我的问题出在蓝牙接收数据方面,原因是蓝牙串口调试时,没有设置好波特率,总是接收不到数据。当然,后来找了实验室的学长,才弄好的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容