造车日记 milestone 1
第一阶段达成
- 基础机械完工
- 基础电子完工
- 基础软件完工
达到使用遥控器控制的目标。
开源
关于PCB
目前github中的版本与实际稍微有些差异:
- 去掉了SWD接口,并增加了Boot和nRST按键,以方便使用内建的USB Bootloader
- 增加了 D15,可以在没有外部供电情况下使用USB供电,方便调试
不足和今后可能改进
- F303系列没有内建USB上拉电阻,需要外部上拉,目前是飞线。如果有机会改进会增加上拉电阻相关电路或者更换高等级器件
- 电池接插件公母对调一下似乎更加合理
一些好玩儿的点
- 总电流监控
在电池输出端有一颗0.01欧姆电阻,配合INA138进行高位电流采样,然后通过STM32F3内部的OPA继续放大后获取总电流信息
- 充电电路
使用LM5050和一颗mosfet,配置成理想二极管。这样即使充电触点被恶意短接,也不会有任何意外。
至于未来充电是触点,还是无线……让我看看口袋里还剩多少钱……
- WS2813 驱动电路
WS2813的IO无法兼容3.3v操作电平,因此在其供电端串联二极管,以降低其Vcc。
此外WS2813的数据口接在STM32的SPI TX管脚,并在软件中启动DMA传输数据,不额外占用cpu时间。
在软件中同时维护了GRB显存和BIN原始码流。缺点是费点儿内存,但是架不住RAM大呀,小车上最多就100来个嘛,毫无压力。
- 关于CubeMX
其实在早些年我是鄙视CubeMX的,总觉得这样不够hardcore,不过如今依然逃不过真香定律。。。
站在高处设计的感觉还是棒棒的,而且需要直接操作寄存器时,也有办法。
整套stm32的开发体验在Linux环境下还算令人满意。
- PID 速度控制
本来PID并不复杂也手写过几次,不过看到ARM CMSIS里有DSP版本的PID就索性试了试。
教科书般经典的实现,似乎比我写的要好用?!关键是代码因此看起来非常简单。
需要注意的是,Cortex M4核心的DSP毕竟比较简单,完整的32bit浮点是不支持的,我现在代码里用的f32类型其实并没有真的调用到DSP指令,最多是有硬件乘法器、除法器加成.
要使用真的DSP加速(MAC),只能使用q15这种数据类型。使用这个数据类型需要一波归一化操作。我也是后来才学到,所以github中的代码还没有更新。
- stm32死机事件
之前的调试都在我的笔记本上完成,最后上机时,第一次将控制板和小车主控电脑(目前是rk3399)用usb连接起来的时候,stm32居然死机了……
最终我在自行车上想到了解决方法,在主控电脑上删除了 modem manager的包……
原因是stm32的usb cdc实现在linux看来是一个ACM设备,不过并没有实现modem类的其它调用,如果存在modem manger, linux系统会发起设备类查询,就把stm32被逼死了……所以如果只是用串口的话,最偷懒的方法就是删掉这个包。。。
- 手柄功能
左手摇杆控制前、后、左、右方向,右手油门如果完全松开是蠕动模式。
右手摇杆目前是旋转功能。
其它按键暂时还没有用上,以后可能也不会用上了。
下一步
决定最终的车载电脑
目前的候选依旧是
- RK3399
- nVidia Jetson Nano
RK3399的CPU要快过 jetson, 毕竟第二代双大核心加四个小核心 pk 第一代四个大核心。毛估估大部分的直线计算可能要快15%以上,有些则要更快。
用jetson的理由无外就是cuda啦,虽然只是从tx1腰斩而来的阉割版本,全速计算还是有可观的算力。
另外一个考量点,是各自对双目的支持水平,到时候可能要做一个简单的对比。
测试基于movidius双目模块
嗯
测试基于毫米波雷达的定位方式
啊
to be continued..