智能车其实没有那么智能,只是自身携带的传感器多一些,能够脱离人的控制在特定的环境下行走而已。你给小车装一个循迹模块,它就可以在跟着特定的轨迹行走,也就是大家在社团科技展出,科普宣传周等活动中最常见的一种小车。此外,你也可以给小车加上超声波模块,让它可以避障;给小车安装摄像头,让它可以识别环境;给它安装声学或者电磁类传感器,让它可以依据声源/磁场行走。不管你安装哪种传感器,首先你需要有一个可以行走的小车,接下来我们将制作一个最简单的“半智能车”,即一个可以根据遥控指令正确行使的小车。
目标:
制作一个双轮驱动小车,可以通过手机APP控制小车前进、后退、原地转弯、行进间转弯。
硬件模块:
(1) STM32F103C8T6核心板(1个)
小车主控可以选择树莓派,Arduino,STM32开发板等硬件平台,秉承资源够用的原则,这里选用STM32核心板。板子内核是ARM 32位 Cortex-M3。64K闪存,属于中等容量微控制器。
功能接口:
PA9 --- USART1_TX---
PA10---USART1_RX---
PA2 --- USART2_TX---
PA3 --- USART2_RX
PB12---LED(共一个)
PA6 ---TIM2(通用定时器)CH1
PA7 ---TIM2(通用定时器)CH2
PB6 ---电机1引脚1
PB7 ---电机1引脚2
PB8 ---电机2引脚1
PB9 ---电机2引脚2
MCU供电电压: 3.3V
本文中,串口1用作下载程序,串口2用作蓝牙与MCU通信,通用定时器2用于产生PWM波输出,两个通道分别控制两个电机使能状态,LED灯用于显示小车是否收到了控制指令。
---备注:微控制下载程序和启动程序时需要切换跳线帽
boot0:1, boot1:0 用于下载。
Boot0: 0, boot1:0用于启动。
(2) 直流电机(2个)
直流电机是买小车底盘带的,工作电压可以是3v/5v/6v,对应的转速分别为100r/min|190r/min|240r/min。为了防止电机损坏MCU,可以在电机两个引脚上焊接一个104瓷片电容。买底盘带的电机引脚特别脆弱,开始我想把导线拧在电机接线端上,后来发现接线端的铜片太薄了,很容易断,所以选焊接的时候也需要注意。
(3) 电池(1个)
小时候玩四驱车时,最烦恼的事莫过于没有钱买电池了,正好我手头有一个充电宝,所以我选择让所有模块都从这个充电宝取电,既方便,又省心。
(4) JDY-31蓝牙模块(1个)
蓝牙模块用接收手机APP指令,供电电压3.6-6v,我给该模块接的3.3v电压,也能够正常工作,最远通讯距离没有测试,可能会受到电压的影响吧。
(5) 电机驱动模块L298N(1个)
输入电压:12V (根据电机需求,建议输入电压范围7-24V)
(6) DC-DC电压转换模块
充电宝输出一路5V电压,而MCU需要1路3.3v电压,L298N需要1路12v电压,蓝牙模块需要1路3.3电压,因此需要一个电压转换模块,将充电宝一路电压分成多路,多电压。
该模块一路输入6-12v,三路3.3输出,3路5V输出,3路等值输出(输入多高输出多高)
(7) USB升压线
USB升压线用于将充电宝5V输出电压升压到12v,用于电压转换模块的电压输入。
软件实现:
小车控制用到的STM32相关知识包括:
1. IO口的操作(GPIO)
点亮LED指示灯,通过IO控制电机转动等
2. 串口通信技术(USART_X)
串口用于接收蓝牙模块发出的指令,根据接收到的指令对小车进行控制,同时将收到的指令返回给终端,便于指令可视化。
3. 利用通用定时器产生PWM波的方法(TIMX)
通过IO口配置对电机进行控制时,可以实现小车定速运动和原地转向功能,但不能够控制电机的转速从而实现小车的运动中转向功能,因此需要使用PWM波对电机进行调速。
4. 嵌套向量中断控制器(NVIC)的使用
MCU的串口收到控制信号后,可以立即根据信号指令去执行是通过串口中断来实现的,设置串口中断模式为收数据中断,在中断服务函数中,对收到的数据进行Switch-Case确认,然后控制电机。
实验
通过面包板对小车基本功能进行测试,确保功能可以实现后再组装成车。开始调试时会存在不受控、动作与理论不符、无动作等情况,为了便于分析和故障排查,额外做一些小的功能还是有必要的,1. 通过串口将MCU从手机蓝牙软件端收到的数据返回给蓝牙。2. 利用一个LED(我买的板子就一个用户LED)灯指示小车是否收到了数据,收到LED就闪烁。