# 有趣的项目--STM32单片机 **Repository Path**: daiver/funny_stm32 ## Basic Information - **Project Name**: 有趣的项目--STM32单片机 - **Description**: 本仓库用于存放我制作过的各种与【STM32单片机】有关的有趣项目。 是我大学期间主要用来做科研比赛的单片机,功能挺强大的。 欢迎大家来探讨交流,提出更多有趣的项目。 本仓库使用AGPL开源协议,请大家遵循。 - **Primary Language**: C++ - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 8 - **Created**: 2024-07-06 - **Last Updated**: 2024-07-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 有趣的项目--STM32单片机 ## 介绍 - 本仓库用于存放我制作过的各种与【STM32单片机】有关的有趣项目。(2018年至。。) - 是我大学期间主要用来做科研比赛的单片机,功能挺强大的。当时参加广大创客协会学习了avr单片机后,为了能在比赛中使用更强大,更多资源控制,所以师兄们推荐自学atm32单品机,也是当时参加比赛最常用的单片机。接触了库函数开发,掌握基本知识,后续也参加了很多比赛,有校内的创新比赛,上到全国电子设计竞赛、挑战杯比赛等,获得很多奖状。这里分享一些做过有趣的项目。[一些比赛的开源资料可能在其他仓库路径] - 欢迎大家来探讨交流,提出更多有趣的项目。 - 本仓库使用AGPL开源协议,请大家遵循协议。 ### 软件架构 - 使用FSL库函数开发。(也有个别使用新的HAL库开发) - 使用keil5或以上编程的(也有其他编程软件),大部分使用stm32f103系列的,少部分使用stm32f4等系列的单片机。 - 使用mcuisp及更新版本通过串口就可以烧录,或者通过st-link在keil5直接烧录(也有其他jtag、jlink等) - 有些项目是多年后整理的,可能需要自行在代码中找引脚连接等硬件信息。 ### 视频展示链接(B站) (后续会贴上大部分视频地址) 1. 机智云物联网控制9: 2. 甲烷温度检测器18、47: 3. 人流量检测器19: 4. 风扇控制系统 仿真41: 5. 自动量程测电阻 蓝牙传输42: 6. 麦克纳姆轮小车-操纵杆控制: ## 各项目简介 ### 1. 机智云物联网控制9: - 这个呢,应该是在我大二的时候做的吧。当时是物联网兴起不久,应该说是我对物联网刚好感兴趣,也开始接触esp8266一段时间,就去了解远程控制的平台,先是网上找到了机智云平台,说是可以自己生成固件,烧录到8266上,配合单片机即可实现控制。看起来好像比较轻松一些,就打算尝试一下。单片机为手上自学的stm32f103开发板(忘了具体型号),配合使用开发板上的资源来实现远程控制:手机机智云app上直接控制开发板的红绿led亮灭,蜂鸣器是否鸣叫,以及实时获取开发板的温湿度数值。信息显示在开发板的lcd屏幕上,可智能联网。 - 大致思路:在机智云上配置数据流等信息,然后生成固件烧录到esp8266上,然后根据机智云提供的开发指南文档,将提供的几个库文件移植到stm32工程代码中,根据接口图让stm32为8266提供一些接口,即可让8266正常工作起来,然后通过库函数调用接口的方式,将数据发送到云端,或者回调函数通知stm32收到的数据命令。stm32再根据来执行功能。 - 过程:现在看起来是不难的,但当时总有很多问题存在。。。首先是机智云平台,第一次接触,要学习了解一下,注册登录账号,选择最合适本项目的网络交互协议:MQTT,进行创建产品、创建设备可自动生成产品秘钥等信息(product key、product secert)这个很重要,在硬件中需哟啊绑定的。了解了里边的设置什么的,最后在数据点里边创建适合本项目的数据流,这里用了bool可写的方式,对应3个开关量的控制,设置2个只读数值类型,百分比的方式,来显示温湿度对应的数值。设置好后,使用虚拟设备进行测试数据交互是否正常,与通信日志做对比可验证。后来也用实际的手机上的机智云来测试(可生成手机apk进行安装,里边对应有配网的方式过程,以及在云端配置好的控制界面)。将生成的固件按照教程用ESP8266 DOWNLOAD TOOL软件烧录到esp8266后,插上串口模块连电脑(这里也老是运行不起来,搞了很久,最后了解到是因为8266上电瞬间耗电大,需要额外给个较大功率的3.3v才正常启动),烧录后连上电脑,通过 机智云串口调试助手,输入设备秘钥,设置好串口通信配置,即可观察到串口交互信息。先进入配置网络,在app中输入好wifi信息后,会自动配置完成并连上wifi。现在直接把电脑当做stm32来模拟运行情况,测试可发送模拟的温湿度值到机智云,手机端能跟着更新。同时也可以手机下发命令,在调试助手能看到接收到的数据并更新到数据点的值。说明8266到手机端都没有问题了,接下来搞8266与stm32的交互。 - ![输入图片说明](1%E3%80%81%E6%9C%BA%E6%99%BA%E4%BA%91%E7%89%A9%E8%81%94%E7%BD%91%E6%8E%A7%E5%88%B69/%E5%9B%BE%E7%89%87/%E9%80%9A%E4%BF%A1%E6%A1%86%E5%9B%BE.jpg) - 这个交互得根据提供的开发指南和接口图来精选的(后来发现机智云提供了独立mcu的方式生成固件,这种更方便,这样就不需要stm32来串口交互了,还能直接由esp8266控制传感器)。 在图上可以看到,8266端成为gizwits逻辑端,里边就当做黑匣子,不用深究,周边有提供的接口:发送串口和配置接收中断给gizPutData函数、提供ms的中断来执行gizTimerMs函数,提供复位函数来执行mcuRestart函数,对于事件处理的回调函数gizwitsEventProcess中需要自行判断执行动作(就是下发指令解析执行),还有stm32主动采集数据通过userHandle来推送到云端。最后还有个配置入网的函数,由自己来调用。 - ![输入图片说明](1%E3%80%81%E6%9C%BA%E6%99%BA%E4%BA%91%E7%89%A9%E8%81%94%E7%BD%91%E6%8E%A7%E5%88%B69/%E5%9B%BE%E7%89%87/%E4%B8%8Ewifi%E6%8E%A7%E5%88%B6%E6%8E%A5%E5%8F%A3.JPG) - 当时自学stm32的库是fsl库,而生成的机智云库是HAL的stm32库,查了是新出的库,(说是可统一很多种型号,通用性强的库),简单看里边的函数,跟fsl库还是有写差别,虽然初始化调用等的顺序基本差不多,但里边的函数名是跟fsl不一样的,并且有些还没有,这就麻烦了。。。当时试过直接移植进来,直接报错到爆炸,但重新学习HAL新库,感觉太花时间。两个库并存运行又很不现实。最后还是被迫学点HAL库,于是这个项目功能就简单些了。还好后续找到了stm32某个型号有提供HAL库,就直接把相关例程拿出来修改烧录测试,所幸正点原子的教程很多通用,能直接使用,就尝试先将机智云库移植进去显示屏的例程,初始化了定时器2的1ms调用指定函数,初始化串口2来与8266通信,串口1跟电脑通信调试,调用提供的各个初始化函数。就基本能运行了,lcd屏做好提示,通过配置多个按键来分别执行一键配网、热点配网、wifi重启功能并在lcd上做提示。然后使用userHandle函数模拟上传温湿度的值,多次测试后,可以实现一键配网及上传温湿度的值。意味着可以完成,于是将温湿度获取代码移植进来,解析转化格式,显示在lcd上并真正上传。然后在gizwitsEventProcess回调函数中,它里边已经有区分命令事件的逻辑了,就一一添加进去,写好变量函数对应执行:蜂鸣器命令响则写好变量,显示在lcd上;不响的命令也同样,主函数中通过变量执行,因为还要根据温湿度设置的范围来决定是否鸣叫。红绿led的控制也一样,串口提示、lcd提示,然后直接控制led。里边也串口提示了RSSI信号值、wifi信息、模式等。主函数还判断温度,超出则显示和蜂鸣器响。因为一开始lcd没怎么变化且有卡机情况,就在右下角放置了心跳,证明还在正常运行。整体项目就这样完成啦,过程困难多多,但成长也多多。 - 机智云网页 数据点配置: - ![输入图片说明](1%E3%80%81%E6%9C%BA%E6%99%BA%E4%BA%91%E7%89%A9%E8%81%94%E7%BD%91%E6%8E%A7%E5%88%B69/%E5%9B%BE%E7%89%87/1.JPG) - 使用模拟设备进行测试配置及通信是否正常 - ![输入图片说明](1%E3%80%81%E6%9C%BA%E6%99%BA%E4%BA%91%E7%89%A9%E8%81%94%E7%BD%91%E6%8E%A7%E5%88%B69/%E5%9B%BE%E7%89%87/2.JPG) - esp8266烧录固件 - ![输入图片说明](1%E3%80%81%E6%9C%BA%E6%99%BA%E4%BA%91%E7%89%A9%E8%81%94%E7%BD%91%E6%8E%A7%E5%88%B69/%E5%9B%BE%E7%89%87/ATKesp8266%E6%9C%BA%E6%99%BA%E4%BA%91%E5%9B%BA%E4%BB%B6%E7%83%A7%E5%86%99.JPG) - 机智云调试助手 调试测试8266 - ![输入图片说明](1%E3%80%81%E6%9C%BA%E6%99%BA%E4%BA%91%E7%89%A9%E8%81%94%E7%BD%91%E6%8E%A7%E5%88%B69/%E5%9B%BE%E7%89%87/%E6%9C%BA%E6%99%BA%E4%BA%91%E8%B0%83%E8%AF%95%E5%8A%A9%E6%89%8B.JPG) - 正常显示的时候: - ![输入图片说明](1%E3%80%81%E6%9C%BA%E6%99%BA%E4%BA%91%E7%89%A9%E8%81%94%E7%BD%91%E6%8E%A7%E5%88%B69/%E5%9B%BE%E7%89%87/%E6%AD%A3%E5%B8%B8%E6%98%BE%E7%A4%BA.jpg) - 手机控制开灯 - ![输入图片说明](1%E3%80%81%E6%9C%BA%E6%99%BA%E4%BA%91%E7%89%A9%E8%81%94%E7%BD%91%E6%8E%A7%E5%88%B69/%E5%9B%BE%E7%89%87/%E6%89%8B%E6%9C%BA%E6%8E%A7%E5%88%B6%E5%BC%80%E7%81%AF.jpg) - 高温警告 - ![输入图片说明](1%E3%80%81%E6%9C%BA%E6%99%BA%E4%BA%91%E7%89%A9%E8%81%94%E7%BD%91%E6%8E%A7%E5%88%B69/%E5%9B%BE%E7%89%87/%E8%B6%85%E6%B8%A9%E8%AD%A6%E5%91%8A.jpg) ### 2. 甲烷温度检测器18、47: -这个呢,是我大学玩耍练习的,先做了个洞洞板的,后来大三有小课设,找了相接近的题目,把这个项目重新整理,绘制pcb嘉立创打板焊接的,优化一下就去交作业了。 - 实现功能:使用stm32获取甲烷传感器、ds18b20温度传感器,将数据处理后显示到lcd1602上,同时通过esp8266的局域网建立服务器,发送到连接着的手机界面上,增加了led和蜂鸣器,当甲烷量超标或温度过高则声光提醒并wifi通知。恢复则关闭提醒。 - 具体过程:首先呢,是之前在自学esp8266模块的AT指令中就知道了如何联网,如何内部建立服务器等流程。于是就将对应的AT指令用stm32的串口进行交互,开机让它STA连wifi,设置多连接开启服务器,最后还要将wifi的IP地址显示出来,这样才能在手机的客户端连接上。如何显示呢,当时也尝试用stm32控制lcd1602,就拿来显示了,驱动写好,初始化过程都可显示出来。接着配置引脚控制led和蜂鸣器。了解到甲烷气体模块是使用模拟量的,就用stm32的ADC功能引脚连接,初始化后单独测试,可以得到对应的模拟量。而ds18b20也是学习中将代码拿来用,读取得到温度值,各个部分单独实现后,接下来是移植组装环节。 - 移植组装通常没啥难度,先各个初始化,显示过程,配置8266,显示出IP地址和端口号,这样手机的网络调试助手就可以使用tcp客户端按IP和端口进行连接,对了,这里手机需要跟8266连接同一个wifi。stm32读取温度值,显示到1602上,ADC读取甲烷气体数值,通过大致的曲线公式转化为ppm单位显示1602上(这里的1602使用了4线通信方式),然后数值依次拆解发送给客户端,也就是手机,因为在循环函数,所以手机能间隔不断收到这些量。stm32判断温度范围,大于则亮led灯,更高则加上鸣叫,并且显示在1602上,发送给手机警告。同样,甲烷气体值也是两阶段提醒及显示发送。判断情况进行不鸣叫及关闭led灯。 - 经过简单测试,发现它预热需要1分钟多,期间读取到的数值会慢慢降低,这中模块其实也只能大概测量,且不能在风大的地方,我拿去煤气罐测试,确实能稍微升高一些,毕竟我也不能直接放煤气吧?? - 简单仿真电路图 - ![输入图片说明](2%E3%80%81%E7%94%B2%E7%83%B7%E6%B8%A9%E5%BA%A6%E6%A3%80%E6%B5%8B%E5%99%A818%E3%80%8147/proteus8.6%E4%BB%BF%E7%9C%9F%E7%94%B5%E8%B7%AF%E5%9B%BE.jpg) - 第一代使用洞洞板焊接 - ![输入图片说明](2%E3%80%81%E7%94%B2%E7%83%B7%E6%B8%A9%E5%BA%A6%E6%A3%80%E6%B5%8B%E5%99%A818%E3%80%8147/%E5%9B%BE%E7%89%87/%E5%85%83%E4%BB%B6%E5%B8%83%E5%B1%80.jpg) - 整体运行实物图 - ![输入图片说明](2%E3%80%81%E7%94%B2%E7%83%B7%E6%B8%A9%E5%BA%A6%E6%A3%80%E6%B5%8B%E5%99%A818%E3%80%8147/%E5%9B%BE%E7%89%87/wifi%E8%8E%B7%E5%8F%96%E6%95%B0%E6%8D%AE.jpg) - 拿去煤气瓶旁测试 - ![输入图片说明](2%E3%80%81%E7%94%B2%E7%83%B7%E6%B8%A9%E5%BA%A6%E6%A3%80%E6%B5%8B%E5%99%A818%E3%80%8147/%E5%9B%BE%E7%89%87/%E7%85%A4%E6%B0%94%E7%93%B6%E6%B5%8B%E8%AF%95.jpg) - 后续绘制的pcb图 - ![输入图片说明](2%E3%80%81%E7%94%B2%E7%83%B7%E6%B8%A9%E5%BA%A6%E6%A3%80%E6%B5%8B%E5%99%A818%E3%80%8147/%E7%94%B5%E8%B7%AF%E6%9D%BFPCB%E5%9B%BE.JPG) - 升级打板后的实物图 - ![输入图片说明](2%E3%80%81%E7%94%B2%E7%83%B7%E6%B8%A9%E5%BA%A6%E6%A3%80%E6%B5%8B%E5%99%A818%E3%80%8147/%E5%9B%BE%E7%89%87/%E6%89%93%E6%9D%BF%E5%8D%87%E7%BA%A7.jpg) ### 3. 人流量检测器19: - 这个是使用两个红外光电传感器来检测出、入的人数,每天统计到stm32的eeprom中,通过IIC的OLED显示屏进行实时人数显示,使用一个按键来交互查询近一个星期的人流量数值。同时具备da1302实时时间模块,获取到的时间实时显示到OLED上,并依据该实时时间进行统计存储的。 - 当时也是自学OLED模块,编写显示的代码,就结合着来写个小项目,当时相当于实际操作锻炼吧。 - 先是在仿真软件中,尝试编写好ds1302的驱动以及测试是否能正常读取实时时间,没问题会就将其他电路构思设计好加上,完成这个仿真电路图。(因为proteus8.6的引脚读取是失效的[BUG],所以就没有仿真了) - 实物方面:在最小系统板用杜邦线连接各个模块进行调试,逐个编写代码测试没问题,就将代码组合起来。系统开机整个进行初始化:有io口、串口、OLED驱动、ds1302驱动、按键引脚等。先读取ds1302的实时时间,显示出来。串口接收数据,在主函数中解析出,当前仅设置了修改ds1302实时时间的命令。两个红外传感器就使用两个io口来读取,通过电平的变化来检测是否有人经过,统计数量得到出入的人数。间隔一定的循环次数就读取ds1302时间更新到oled上,显示了年月日时分秒及当天的出入人数。当day改变说明到了下一天,就将前一天统计的数据存储到数组,采用移动存储,队列一样。因此能记录最近7天的数据。当检测到按键按下时,即可将缓冲数组解析显示到oled,展示历史数据。3s后恢复正常显示。 - 仿真电路图 - ![输入图片说明](3%E3%80%81%E4%BA%BA%E6%B5%81%E9%87%8F%E6%A3%80%E6%B5%8B%E5%99%A819/%E4%BB%BF%E7%9C%9F%E7%94%B5%E8%B7%AF%E5%9B%BE.jpg) - 实物图 器件布局 - ![输入图片说明](3%E3%80%81%E4%BA%BA%E6%B5%81%E9%87%8F%E6%A3%80%E6%B5%8B%E5%99%A819/%E5%9B%BE%E7%89%87/%E5%99%A8%E4%BB%B6%E5%B8%83%E5%B1%80.jpg) - 实物图 正常工作 - ![输入图片说明](3%E3%80%81%E4%BA%BA%E6%B5%81%E9%87%8F%E6%A3%80%E6%B5%8B%E5%99%A819/%E5%9B%BE%E7%89%87/%E6%AD%A3%E5%B8%B8%E5%B7%A5%E4%BD%9C.jpg) ### 4. 风扇控制系统 仿真41: - 这个是大二学习stm32来进行仿真锻炼的,当时也发现了问题(仿真中io口读取电平失败),查找了很多,才发现是proteus8.6的毛病,存在BUG,据说8.9版本能正常使用,但太大了,就没去安装,后续直接实物测试了。 - 该小项目是个风扇控制系统,具备自然风、正常风、睡眠风、无风4个档位并用led指示出来,可选择是否摇头,可设置定时关闭,每按一次按键增加定时时间5s(为了方便看到效果)。当风扇电机在运作时,有温度传感器来检测电机温度,当温度超过设定时则自动关闭电机防止烧坏。这一切状态都会显示在lcd1602上。 - 制作过程:电机使用l298n来驱动,则需要使用定时器产生两路PWM信号,以及4个IO口控制方向,其中一个电机是主要的吹风电机,另一个是控制摇头的电机。指示灯led用io口控制,按键当时测读取电平不行,就想到了外部中断来检测,所幸可以使用。而温度高报警使用led和三极管驱动后的蜂鸣器来提醒,最后呢,温度一开始使用ds18b20来检测,移植了驱动代码,但发现读取失败,最后看代码也是发现了问题,里边还是会读取io电平,于是这个不能用。查找了资料后,最后发现可以用LM35通过stm32的ADC功能来读取,还好adc可以仿真。显示部分使用lcd1602模块,移植代码可以实现显示,于是剩下的就是组合了。 - 开机先io口、定时器的pwm、外部中断、lcd1602、adc等初始化,完成后在1602上做欢迎显示,配置好外部中断后,使用变量来标记哪个按键有按下,自然风则转速较快,对应led亮,1602显示状态1。其他3个档位和摇头同样逻辑。当检测是定时的按键时,则变量增加,这里每次增加5s并显示出来。在主函数大循环中,不断判断时间是否到,到则关闭风扇电机,并显示定时是瞬间到。通过adc来读取LM35的电压,通过公式转化为温度值,循环检测温度值超过设定时,显示温度高,然后关闭风扇电机,当温度降下来了就重新开启。 - 仿真图 - ![输入图片说明](4%E3%80%81%E9%A3%8E%E6%89%87%E6%8E%A7%E5%88%B6%E7%B3%BB%E7%BB%9F%20%E4%BB%BF%E7%9C%9F41/%E4%BB%BF%E7%9C%9F%E5%9B%BE.jpg) ### 5. 自动量程测电阻 蓝牙传输42: - 这个是我大三疫情在老家上网课,好用的万用表都在学校宿舍,家里的是老的指针的,测电阻很不方便,于是因为需求和感兴趣,就决定动手制作个自动量程的电阻表,将采集到的电压值通过蓝牙模块直接传给手机进行显示,很方便。(当时也要测某种纳米材料的按键检测阻值,波动很大要精确,然后电脑分析) - 项目组成很简单,但觉得比万用表的电阻档强,毕竟是会自动选量程测试电阻的,并且在判断测量的量程下精度算是很高的。硬件采用stm32最小系统以及电阻网络引出测量的两根线,串口接上蓝牙模块接口即可。纯接线测试没问题后,就绘制了pcb电路图,嘉立创打板回来焊接制作实物,打板好看多了。 - 先硬件测试蓝牙模块与手机的通信,设置好协议参数后,即可直接串口发送。就剩下如何自动选量程了,我的想法是先划分几个量程范围,这里最后确定为4个量程,覆盖了从几欧姆到几M欧姆的范围。档位通过4个引脚控制对应的电阻的,不使用的电阻引脚值为开漏模式,减小对该电阻对测量的影响,需使用的档位则用低电平下拉来接地,分别有680k、100k、10k、1k的电阻。先各自确定好阻值并分别测试到范围后,对4个范围的叠加覆盖。理论上越接近分压电阻,测量约准确,所以以此确定量程电压的分界点。 - 所以自动量程就是从最大量程开始测,当测量值小于量程边界,则选择最合适的量程再次测量得到准确值,这样自动测量最多2次adc即可显示电阻值,直接蓝牙发送。为了实用些,这里增加了指令控制,手机发送s则为停止采集,停止adc的测量;发送1则固定实用最大量程测量,因为只需测1次adc所以快;发送2是开启自动量程的模式。发送u则降低采集速度,增加了单次采集的次数,让数据发送慢一些,但数据更加精确,因为经过平均计算的。发送d则相反,提高采集速度,单次采集次数减少,反应快,但数据可能有些漂浮。当然,接收到了命令会回复接收的命令,证明有响应。 - 当然,它也可以通过蓝牙主机直接连电脑,在电脑的串口直接收到数据,或是发送命令控制,这样就不用拉着线,灵活性高。 - 电路板pcb图 - ![输入图片说明](5%E3%80%81%E8%87%AA%E5%8A%A8%E9%87%8F%E7%A8%8B%E6%B5%8B%E7%94%B5%E9%98%BB%20%E8%93%9D%E7%89%99%E4%BC%A0%E8%BE%9342/%E7%94%B5%E8%B7%AF%E6%9D%BFPCB%E5%9B%BE.JPG) - 实物图 - ![输入图片说明](5%E3%80%81%E8%87%AA%E5%8A%A8%E9%87%8F%E7%A8%8B%E6%B5%8B%E7%94%B5%E9%98%BB%20%E8%93%9D%E7%89%99%E4%BC%A0%E8%BE%9342/%E5%AE%9E%E7%89%A9%E5%9B%BE.jpg) ### 6. 麦克纳姆轮小车-操纵杆控制: - 这个是在我大二电子设计竞赛的准备工作中完成了最基本的驱动功能:能蓝牙手机控制上下左右及斜向总共8个方向的平移,还有原地正反转功能。当时想着使用操纵杆来遥控控制呢,只是学习比赛繁忙,就忘了去实现了。最后是工作后才完成的。 - 毕业工作后整理东西才发现当时有这个想法,而且也觉得很有趣,并且在想应该不止8个方向的平移,理论能任意方向移动,于是就尝试写代码实现,理论先实现任意平移,再结合操纵杆控制实现任意平移,结合自带按键可旋转(其实操作杆是先实现的,控制其8方向平移,再开发任意方向平移)。 - 先实现遥控器部分:操纵杆是有x、y运动轴组成可360°随意转动的,因为两个轴对应有滑动变阻器,所以单片机采用2个adc来读取对应的值,结合滑动范围0-4096(12bit)可以判断此时操纵杆的姿态,与2048对比得出其位于哪个象限。在操纵杆这边就直接读取adc,然后根据串口的自定义命令格式进行传输就可以了。我这里就用 #x轴adc值,y轴adc值* 来通知小车的平移姿态,但还要有自旋转,还好这个操纵杆也带了一个按键,藏在操作杆下面,于是可以用来切换控制旋转。这里的旋转就使用x轴来判断顺时针还是逆时针 发送命令格式 #x轴adc值* ,而且操纵杆越偏离,自旋转速度就会越快,跟平移是一样的。这些逻辑不难,很快完成了,后续为了方便就在操纵杆端加轴向纠正系数。 - 操纵杆后续也加上了开机直接发送绕圆形运动的小车命令,由三角函数来生成xy轴数据发送的,用来校正系数和展示任意平移的效果的。最后效果也挺不错的。 - 小车原理:这个嘛,先看看麦克纳姆轮的结构,是呈45°的,这样在一些组合下,可实现4轮小车的8个方向的平移,这个在网上都有很多图示教程帮你分析,这里就不罗嗦了。那8个方向是很好理解的力的组合,如何实现任意平移呢?这个就设计到物理的力学了,先明白8个方向的运动,其4个电机的速度都是一致的,那当其中有速度不一样的时候,会发生什么呢?于是就成为力学的力的合成。我当时的想法是如何从一个状态过渡到另一个状态,比如从上过渡到右上,分析一遍后,可以看到哪个离力需要增大,哪个力需要减小,然后分析两个力从哪些轮如何转向得到的,进而控制对应轮子的pwm占空比。在纸上换一遍图就分析出来了。我发现8个方向是作为典型的例子,过渡需要在8个状态过渡的,逐个力的分析结束后,就开始写代码了。操纵杆那边设计在中心点为坐标(2048,2048),左上为(0,0),横向为x轴,纵向为y轴。使用偏差量来控制小车平移方向和速度。采用蓝牙互联,构造数据格式,通过解析即可得到数据,于是逐个过渡逻辑代码慢慢实现后,进行测试,好像可以,但发现不对,速度上不是矢量等同的,导致某些方向速度大,想绕个圆形都偏离了。而且中心点不是很准确的2048,于是写了个判断排除中心小圆圈的逻辑为停止运动。 - 接着分析了力,发现确实是要矢量计算,最后计算化简发现是可根据x、y的偏移量来矢量计算控制各车轮pwm的。改好代码后测试,终于正常些了,但还是发现绕个圆不是很圆。分析后才觉得,是小车整体的4个轮子间距不是正方形导致的,通过代码上的偏差纠正系数,终于可以像样了。通过手机的快门时间1s多来拍摄小车圆形运动,可以看出车上led拼成的圆形还是挺圆的,依次来证明调整的系数是否合适。 - 小车旋转,就直接根据接收对应的命令进行解析。得到x轴与2048的偏差,根据偏差大小正比占空比从而改变速度,偏差为正则顺时针转,反之则逆时针转。即可对接好操纵杆那边的全部功能。最后呢,当然要让手机能够控制,于是就加上了原始的直接控制8个方向平移和自身旋转的简单命令,还有几个速度档位设置。 - 小车整体玩起来不错,单手可以控制小车各种姿态,能直接控制它去追我的小猫,猫咪一直又好奇又害怕地保持距离,哈哈哈。同样,关闭操纵杆后,可以在手机蓝牙软件直接控制小车,实现多个遥控的功能。因为小车有点大只,而且电压采用是12v的,测试过能驱动小车运行时的速度已经有些大了,而小一些则小车动不了,所以只适合在空地大一些的地方跑,不然有些难控制。 - 后续计划:用它来做物联网视频监控小车,让我能够在宿舍之外的地方,随时可以远程控制小车,结合“掌上看家”手机来查看视频画面,组合控制小车来找找小猫咪,看它在干啥,哈哈 - 麦克纳姆轮小车及操纵杆 - ![输入图片说明](6%E3%80%81%E9%BA%A6%E5%85%8B%E7%BA%B3%E5%A7%86%E8%BD%AE%E5%B0%8F%E8%BD%A6-%E6%93%8D%E7%BA%B5%E6%9D%86%E6%8E%A7%E5%88%B6/%E5%9B%BE%E7%89%87/%E4%BE%A7%E9%9D%A2.jpg) - 操纵杆控制 - ![输入图片说明](6%E3%80%81%E9%BA%A6%E5%85%8B%E7%BA%B3%E5%A7%86%E8%BD%AE%E5%B0%8F%E8%BD%A6-%E6%93%8D%E7%BA%B5%E6%9D%86%E6%8E%A7%E5%88%B6/%E5%9B%BE%E7%89%87/%E6%93%8D%E7%BA%B5%E6%9D%86%E6%8E%A7%E5%88%B6.jpg) - 手机蓝牙控制 - ![输入图片说明](6%E3%80%81%E9%BA%A6%E5%85%8B%E7%BA%B3%E5%A7%86%E8%BD%AE%E5%B0%8F%E8%BD%A6-%E6%93%8D%E7%BA%B5%E6%9D%86%E6%8E%A7%E5%88%B6/%E5%9B%BE%E7%89%87/%E6%89%8B%E6%9C%BAapp%E6%8E%A7%E5%88%B6.jpg) - 绕圆平移的效果图 - ![输入图片说明](6%E3%80%81%E9%BA%A6%E5%85%8B%E7%BA%B3%E5%A7%86%E8%BD%AE%E5%B0%8F%E8%BD%A6-%E6%93%8D%E7%BA%B5%E6%9D%86%E6%8E%A7%E5%88%B6/%E5%9B%BE%E7%89%87/%E5%9C%86%E5%BD%A2%E7%AE%97%E6%B3%95%E7%9A%84%E6%95%88%E6%9E%9C%E5%9B%BE.jpg) #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)