上一篇《要不,咱们简单设计个车?(整车及软件框架)》介绍了”车力巨人“的外观及软件架构,这篇看一下软件的具体实现。
1 数据解码
参考小车控制器的模型,遥控数据包含4个属性,封装到vector中并通过Bt Radio发送出来。小车端接收到数据后,通过Bluetooth Data子系统解码。解码的模型如下图所示:
Vector的长度为32 Byte,通过Index Vector Block分别获取前4个字节的内容并做对应的数据转换。传输过程中的数据采用的是uint8型,读取的加速度转换为int8读取控制器的方向(向前或向后),转换为double是因为Simulink默认数据类型为double,不采用默认数据类型要改动的东西比较多。
2 舵机控制
舵机控制子系统如下:
说明如下:
- 舵机控制追加死区,避免控制器微小的晃动导致舵机角度变化
- 加上常量90,重新定位舵机的中心角度为90度
- 舵机的控制信号用的是micro:bit的Pin15
- 输出舵机角度到实时显示
3 前车灯控制
前车灯控制子系统模型如下:
这是一个外部触发系统,控制器micro:bit的A 按钮按下时,会触发这个子系统执行。内部定义了当前灯光的状态,输出灯光控制信号。每次系统触发时,会对状态进行取反操作。
4 灯光控制
灯光控制子系统如下:
用到了2个Pin,分别是13(前)和16(后),每个信号控制2个LED灯。
5 马达控制
马达控制子系统模型如下:
由2个子系统构成:
- 障碍物检测,及
- 马达驱动状态机
障碍物检测时,小于50cm的距离判断为检测到障碍物,需要处理。由于HC-SR 04偶尔会出现无法检测到脉冲信号的情况,这时驱动返回-1,因此这里增加了2次读取到的返回会值为-1时,按检测到障碍物处理。检测的模型如下:
马达控制的状态机如下:
检测到障碍物,或者控制器micro:bit的B按钮被按下,则执行刹车逻辑;否则根据控制器的倾斜角度,进行向前或向后的加速。
刹车的处理如下,采用PID算法,根据马达的转动方向,给出相反的电压及PWM信号,目标是将车速降为0:
马达控制的模型如下,用到6个Pin,Pin4和Pin7对应2个马达的PWM输出。其中,PWM的频率要设置为50Hz,因为micro:bit的PWM默认使用通道0,连接到这个通道上的还有舵机,舵机要求使用50Hz的频率。
6 车速计算
车速计算采用100ms的计算周期。车轮直径65mm,编码器轮子每转一圈产生260个脉冲,车速计算采用2个轮子编码器的平均值:
7 行驶距离计算
行驶距离采用计算后的车速每100ms累加一次,模型如下:
8 实时显示
最后是实时显示系统,模型中采集到的数据,通过OLED显示。模型如下: