从零开始速通一台多方式控制的STM32自平衡小车【1平衡小车篇】

前言  

      这个学期有个嵌入式课程设计的任务,要求用战舰V3开发板整点活出来。毫无嵌入式底子但是想搞点花头的我思来想去,最终决定搞一台多方式控制的STM32自平衡小车。

        整个设计可以简单的分为遥控器部分和小车部分。遥控器用的是正点原子STM32F1战舰V3开发板;小车底盘、主控板用的是大鱼电子家的。目前已经实现:

        用战舰V3的按键控制;

        游戏手柄连接战舰V3控制;

        MPU6050连接战舰V3实现体感控制;

        键盘控制(电脑蓝牙连接小车然后键盘控制小车运动)。

        演示视频链接:https://www.bilibili.com/video/BV1az4y1v75h/?vd_source=7f074cf6eda38a8fc0759768cf347005


平衡小车篇 

        前排提醒:本篇只提供实现平衡小车的部分思路,并没有详细的实现过程!

        首先是关于平衡小车如何实现的内容。网上有很多种方法可以实现平衡小车,比如自己画PCB板,去嘉立创制作PCB板,然后买排针排母焊枪,一步一步焊到PCB板上,然后买零部件跟排针排母连接,这种适合有时间有精力的新手做,b站也有up出教程的;或者有3d打印机的佬也可以用3d打印机打印出板子;或者直接买成品,从成品开始研究,比较适合像我这种没时间但是想速通的玩家。

        买成品的时候需要注意的是每家的平衡小车构造、各个接口或多或少都有点差异,尤其是主板,因此最好在同一家买。我就是一开始东拼西凑不同厂家的便宜货,结果却花了不少冤枉钱/(ㄒoㄒ)/~~

        平衡小车主要包括车身、马达和车轮、主控板三个部分。

车身

        平衡小车车身架构就是几块板子和几个立柱。最下面的板子会与马达固定,中间板子间的夹层放电池、主控板。很简单的架构,放张图大家应该都能看懂。

(这是亚博智能STM32平衡小车示意图,这家店资料挺全的,就是有点小贵) 

马达和车轮

        马达可以分为带编码器的和不带编码器的。编码器下面还可以再分。现在主流电机都是带霍尔编码器的GM25-370、GM37-520和TT130塑胶电机。塑胶电机最便宜,一般的四轮车上用的都是塑胶电机。二轮车方面GM25-370、GM37-520用的比较多。GM25-370、GM37-520主要是参数不一样,外观上的差异就在大小,GM37-520更大。

        马达与主控板之间的连接线一般是ph2.0或者xh2.54.

主控板

        一块光秃秃的主控板只有电路,加入排针和排母后可以将元器件相互连接。平衡小车主控板必需的有:

        最小系统板:STM32F103C8T6

        陀螺仪模块:MPU6050

        电机驱动模块:TB6612

        稳压模块:78M05三端正线性稳压器/LM2596S

        蓝牙模块:BT05/HC06

        当然还可以加OLED显示屏,可以用来调试和显示信息;或者加超声波传感器,给平衡小车扩展功能。电源接口用接线端子连接。没有直接对应的引脚的用杜邦线连接。

烧录代码

        代码一般是先在CubeMX里生成STM32的基础代码,然后在keil里完善;当然如果已经有基础代码了就可以直接在keil里手撕代码。代码写完便是烧录工作。STM32F103C8T6烧录的方式有很多,比如用ST-link、USB转TTL串口等。

        但是我在用白色的ST-LinkV2连接STM32F103C8T6烧录代码时总是出现连接闪烁的问题,就是刷新一下显示连接上了,再刷新一下却显示没连接上,再刷新一下又显示连接不上,导致烧代码的时候一直烧不进去。好像是频率的问题,但是我改了频率好像还是不行,有清楚的佬可以帮我解答一下/(ㄒoㄒ)/~~我最后是用USB转TTL串口通过串口工具(如FlyMcu)烧录hex文件才成功的。

        战舰V3的代码烧录用ST-LinkV2正常烧录。

        大鱼电子的STM32F103C8T6将PA9、10引脚复用成TypeC串口,用TypeC转USB的线连接电脑,通过mcuisp烧录hex文件。

制作过程

        平衡小车制作过程有点繁琐,一篇博客讲不完,涉及到平衡小车的姿态运动学,知道陀螺仪参数来调节PID。这个过程可以参考B站up天下行走的视频(我就是看了天下行走的视频才去买的大鱼电子的小车(●'◡'●))。平衡车一定留出连接蓝牙的串口,所有的遥控方式都是通过蓝牙传输信息的。下面是平衡小车实现效果。

【疯狂试验】超越想象!我用STM32打造的自平衡小车竟然能飞!?

PS:后面计划写一篇如何实现战舰V3上主蓝牙和小车上的从蓝牙连接以及传输数据的实现过程。

### STM32 C语言快入门教程 #### 了解STM32平台特性 STM32系列微控制器具有良好的兼容性和丰富的资源,掌握了任意一款MCU后可以轻松过渡到其他型号的学习和应用。特别是对于初学者而言,推荐从STM32F103开始学习,因为该款MCU在市场上拥有最广泛的使用基础以及最多样的参考资料和支持社区[^1]。 #### 设置开发环境 为了编写针对STM32的C程序,需安装合适的集成开发环境(IDE),如Keil MDK、IAR Embedded Workbench 或者免费开源的选择如SW4STM32 (System Workbench for STM32) 和 VSCode配合PlatformIO插件等工具链来编译链接代码并下载至目标板卡上运行测试。 #### 基础编程概念 - **初始化外设**: 使用寄存器配置硬件功能前常要开启对应的时钟供应。例如启用GPIOA端口的操作如下所示: ```c RCC->APB2ENR |= 1 << 2; ``` 若要激活GPIOB,则应修改上述语句中的偏移量为`3`: ```c RCC->APB2ENR |= 1 << 3; ``` - **位操作技巧**: 掌握基本的位运算符有助于更高效地控制单片机内部结构。比如按位异或(`^`)可用于切换状态而不影响其它位置的数据;当两个二进制位相同时结果为零反之则得一[^3]。 #### 实践项目建议 尝试构建简单的LED闪烁实验作为第一个实践案例,这不仅能让开发者熟悉如何设置引脚模式、读写电平信号,还能加深理解关于延时函数实现原理等方面的知识点。 ```c #include "stm32f1xx_hal.h" int main(void){ HAL_Init(); __HAL_RCC_GPIOA_CLK_ENABLE(); // Enable GPIOA clock GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); while (1){ HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // Toggle LED connected to PA5 HAL_Delay(500); // Delay for half a second } } ``` 过以上几个方面的指导,希望可以帮助读者建立起对STM32及其嵌入式系统的初步认识,并为进一步深入研究打下坚实的基础。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值