2.小车前进

您当前位置: 首页 > Omniduino智能小车 > 5.全向小车基础课程

2.小车前进.zip  点击下载

学习目标:检测按键,控制小车前进、停止功能

实验现象:开机后小车不会动,按一下功能按键,小车向前开,再按一次按键小车停止。

一、课前小知识

1.根据麦克纳姆轮的特性,我们的omniduino全向小车要前进时,四个轮子都必须正转,如以下受力分析图:

image.png

根据物理运动学知识可知,大小相等,方向相反的力可以互相抵消,假设A轮和B轮正转的速度一样快,那么A轮分解出向右的力和B轮分解出向左的力刚好互相抵消,合力方向向前,根据牛顿第二运动定律(F=ma)可知,加速度方向向前,则最终合速度方向也向前。

2.知道了运动原理,那么我们怎么使用代码的方式来控制小车前进呢?

经过查看硬件速查表可以知道,PCA9685每两个引脚控制一个轮子,一个引脚控制正转,一个引脚控制反转。如左前方电机M1,由PCA9685芯片的12号引脚控制反转和13号引脚控制正转,如果12号输出为0,13号正常输出PWM脉冲,则M1电机正转;如果12号输出PWM脉冲,13号输出为0,则M1电机反转。

image.png

3.什么是PWM,PWM是怎么控制电机运转的呢?

PWM指的是脉冲宽度调制,在PWM驱动控制的调整系统中,按一个固定的频率输出高低电平,并根据需要改变一个周期内“高电平1”和“低电平0”时间的长短。通过这种方式改变“占空比”,来改变平均电压(有效电压)的大小,再经过电机驱动放大信号,从而控制电机的转速。

image.png

二、新建工程

1.点击File->New

image.png

2.按Ctrl+S保存到本地,重命名为CarRun。

可以看到只有两个空的方法,setup()和loop()

image.png

setup()函数只在omniduino全向小车开机或者按下复位键时运行一次,可以写入初始化等内容;

loop()函数是omniduino全向小车的主循环函数,大部分数据处理和逻辑处理都是在这个函数里完成。

 

三、编写代码

1.从前面的课程可以知道小车的电机是受PCA9685控制的,所以我们要先导入PCA9685和I2C的库文件

image.png

2.从硬件速查表可以知道功能按键的引脚为8号,PCA9685的I2C地址为0x40

image.png

Adafruit_PWMServoDriver库对外的函数主要有以下这几个,begin函数是打开I2C通讯和重置PCA9685;reset函数是重置PCA9685;setPWMFreq函数是设置频率,一般设置50或者60;setPWM函数设置PWM输出,是最主要的函数;setPin函数也是设置PWM输出,只是加了翻转功能。如果有兴趣可以查看源码加深理解。

image.png

3.setPWM函数,第一个参数num取值范围0~15,分别对应下图的LED0~LED15,参数on和off设置PWM输出,取值范围0~4095。

image.png

4.定义全局变量保存小车速度和按键状态

image.png

5.新建run函数,驱动小车向前运行,小车速度速度范围最好在40~160之间,否则可能带不动小车或出现其他问题。引脚可以在硬件速查表中得到相关信息。

image.pngimage.png

6.新建brake函数,让小车停止

image.png

7.按键扫描函数

image.png

8.在setup()函数里初始化引脚模式,打开I2C通讯功能,初始化电机为停止状态。

image.png

9.在loop()主循环函数检测按键,第一次按下时小车运行,再次按下按键时小车停止。因为每一次按下功能按键,button_press都会取反一次。

image.png

三、编译上传运行

1.代码编写完成后,按Ctrl+S保存,然后再点击编译按钮,没有出现问题就点击上传(omniduino全向小车要先和电脑通过USB数据线连接,并且配置好串口)。

2.如果编译正常通过,但是上传时出现类似以下错误,原因可能是选错串口或者串口被占用。

image.png

解决方法:打开设备管理器看看有没有CH340标记的串口,如果没有请先重启一下omniduino全向小车,再重新插拔USB线或者更换一根USB数据线;如果有串口号则先关闭其他串口助手软件,避免串口占用,然后到arduinoIDE的Tools->Port重新选择串口。

3.如果出现类似以下这种错误,说明是缺少库文件,请把omniduino全向小车提供的库文件复制到arduinoIDE编译的库文件目录下。

具体方法请查看开发环境搭建中的添加第三方库教程。

image.png