【项目】基于STM32F103C8T6的四足爬行机器人设计与实现(源码工程)

请添加图片描述


👉博__主👈:米码收割机
👉技__能👈:C++/Python语言
👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。


【项目】基于STM32F103C8T6的四足爬行机器人设计与实现(源码工程)


目录

  • 【项目】基于STM32F103C8T6的四足爬行机器人设计与实现(源码工程)
    • 一、项目介绍
    • 二、项目设计过程
      • 2.1 结构设计
      • 2.2 电源设计
      • 2.3 STM32F103C8T6的开发
      • 2.4 ESP32-CAM开发
      • 2.5 Flet应用开发
    • 三、机器人步态规划
    • 四、项目搭建及部署
      • 4.1 MQTT服务器的部署以及服务器图像接收的配置
      • 4.2 STM32开发环境
      • 4.3 ESP32-CAM开发环境
      • 4.4 Flet应用开发环境
      • 4.5 模块接线图
    • 五、项目总结


一、项目介绍

  本设计使用STM32F103C8T6作为主控,结合ESP32-CAM与MQTT,实现实时图像回传以及远程控制。

在这里插入图片描述

实物图

  在机器人的控制上使用了云端控制和本地控制两种方案。其中由Flet编写的移动端App能够通过MQTT协议与安装在服务器的EMQX进行通信,经云端传输的命令由ESP32-CAM接收后通过USART2传递给单片机,单片机就可以根据该命令控制模块,让机器人做出对应的动作。而ESP32-CAM拍摄的视频流则会实时上传至服务器,由服务器上部署的Nodejs Server接收后,通过网页呈现出来,至此实现了云端控制的全过程。

  而本地控制则由Microdot来实现,在连接上由ESP32-CAM发出的热点之后,通过访问指定IP来访问本地控制面板。点击网页上的按钮就能够控制ESP32-CAM, ESP32-CAM通过串口向单片机发送命令。而由ESP32-CAM回传的图像流则会通过WIFI,实时显示在本地控制面板的上方。

在这里插入图片描述

系统结构图

  仓库内包含了本项目所需的所有代码,其中还包括机器人的3D建模文件:

文件名说明
1、FreeCAD_Projects机器人3D建模工程文件
2、HAL_C8T6开发STM32的工程文件
3、Fletapp开发Flet应用的工程文件
4、ESP32-CAM开发ESP32-CAM的Python代码以及前端代码
5、CAM_Server服务器上负责ESP32-CAM图像接收的Nodejs代码
6、Other包含Gerber文件和BOM表等文件

在这里插入图片描述

二、项目设计过程

2.1 结构设计

  四足爬行机器人的结构设计则使用了开源软件FreeCAD进行设计。结合MG90S舵机的尺寸,在腿部设计了凹槽与螺丝安装孔。机体中间预留电池安装孔,在关键位置还设计了螺丝孔,使结构更加牢固,方便后期的安装。

3D模型图

  建模完成后使用切片软件对模型进行切片,并将切片结果导入至3D打印机当中进行打印。填充密度为0.1mm,层厚0.2mm,挤出头温度设定为210℃。打印材料则选择了直径为1.75mm的PLA材料。电源板上预留了螺丝孔以安装尼龙柱,各个功能模块由万用板电路连接后通过尼龙柱堆叠在机体上方,方便快速装卸和调试。
在这里插入图片描述

2.2 电源设计

  四足爬行机器人的电源模块选用了TI的TPS5430,在设计参考了【电赛模块】TPS5430正负电源输出模块。电源模块上分别设计了三路电源,分别为舵机以及主控与功能模块进行供电。

原理图

在这里插入图片描述

电源板3D渲染图

2.3 STM32F103C8T6的开发

  在机器人上电后,首先初始化功能模块以及相关外设,同时初始化FreeRTOS,之后的任务就转交给FreeRTOS进行调度。在收到来自USART2的命令之前,单片机执行默认任务。在默认任务里,机器人始终保持停止状态,等待用户发送的命令。在USART2接收到命令后,单片机会进入串口中断程序,并在中断程序内判断该指令的具体含义,通过指令内容来执行对应的任务。

程序流程图

  当USART2收到来自ESP32-CAM发送的信息时,单片机会执行USART2的中断函数,在中断函数内,对接收到的信息进行判断。首先在代码中创建一个数组以设置缓冲区,结合HAL库函数将接收到的数据存在缓冲区当中,之后匹配缓冲区内的内容来判断是否是对应的命令。

  在代码中先判断当前机器人所执行的任务是否是当前已经被激活的任务,如果是则直接跳过,避免了任务被重复激活而导致单片机死机。在判断任务没有被重复激活之后,通过事件位来触发机器人的动作任务。在动作任务被触发后,根据任务标志执行对应的任务内容。

  匹配到对应的任务内容后,开始执行对应的代码。先在OLED上显示当前的任务状态,之后执行对应的动作函数,至此完成了任务流程。任务在被激活后会反复执行,直到被新的指令打断。

  ⚠注意:项目中还包括了STM32对OLED12864、HC-SR04超声波模块、PCA9685舵机驱动模块的驱动实现。关于驱动原理可以根据项目代码可看出,这里不再过多赘述,可自行下载项目代码查看。

2.4 ESP32-CAM开发

  ESP32-CAM在烧录MicoroPython固件后使用Arduino Lab for MicroPython开发,相关的MicroPython固件也可在本仓库中获取。

  Microdot是一个极小的Python Web框架,专为资源受限的系统设计,例如微控制器以及嵌入式系统,适合运行在MicroPython之上。在本文的设计中,利用Microdot与ESP32-CAM支持WIFI的特性,在ESP32-CAM上搭建一个小型的Web服务器,实现用户与机器人之间的交互。

ESP32-CAM程序流程图

  ESP32-CAM在上电之后,会自行执行内部的程序。程序会在一开始初始化摄像头设备,并启动AP热点以等待用户连接。待用户连接到由ESP32-CAM发出的AP热点后,在浏览器中访问192.168.4.1,即可进入模式选择网页。这里的前端网页也是以文件的形式保存在ESP32-CAM当中的,因此整个连接过程完全在本地执行。
在这里插入图片描述

“模式选择”界面

  以本地控制为例,用户选择“本地控制”后,向ESP32-CAM发送Get请求。ESP32-CAM在接收到指令后,返回本地控制面板的网页。在本地控制网页当中就可以直接看到由ESP32-CAM拍摄的图像流画面。画面下方则为机器人的控制按钮,即前进、后退、左转、右转。当用户按下按钮后,按钮中间会出现信息提示,告诉用户当前按钮按下的功能以及按钮的状态。

“本地控制面板”界面

  在用户按下按钮后,同样会以Get请求的形式向ESP32-CAM发送命令,ESP32-CAM在接收到指令后,直接在串口输出命令,同时串口连接在STM32的USART2上。至此实现了用户对机器人的控制。

  若用户选择的是AP配网,同样是以get请求的方式向ESP32-CAM发送数据,ESP32-CAM则向用户返回配网页面。在配网页面内,用户则需要输入WIFI名称和密码。由于ESP32-CAM只支持2.4G,因此用户在连接时需要注意连接的WIFI频段是否是2.4GHz的。

“WIFI设置”界面

  在用户提交信息之后,跳转至确认界面,这一设计为用户提供了一个修改的机会,如果之前填写的信息有误,用户可返回修改,若信息确认无误,则点击确认按钮提交至ESP32-CAM。

“提交成功”界面

  在ESP32-CAM接收到来自用户侧发送的WIFI信息后,则执行连接WIFI热点的代码,在连接WIFI的同时断开与用户的连接,同时连接至在代码中已经设置好的MQTT服务器,至此完成本地AP配网以及云端连接的流程。

  在机器人上电后,首先初始化功能模块以及相关外设,同时初始化FreeRTOS,之后的任务就转交给FreeRTOS进行调度。在收到来自USART2的命令之前,单片机执行默认任务。在默认任务里,机器人始终保持停止状态,等待用户发送的命令。在USART2接收到命令后,单片机会进入串口中断程序,并在中断程序内判断该指令的具体含义,通过指令内容来执行对应的任务。

在这里插入图片描述

2.5 Flet应用开发

  Flet是一种基于Python的应用框架,允许开发者使用Python语言构建Web、桌面以及移动端应用程序,其灵感源于Google的Flutter。Flet的设计非常轻量,并且支持多种平台,具有一套代码多端使用的跨平台特性。基于Python语言构建使得应用程序更容易维护,同时社区提供了丰富的控件,可以轻松构建用户界面。

Flet应用界面

  App主要分为“说明”页面与“控制”页面两个部分。“说明”页面的作用是向用户简要介绍App的使用方法,包括机器人的控制方法以及配网流程。“控制”页面则为用户提供控制界面,同时将云端获取到的视频流在界面中显示。

  当用户选择“控制”按钮后,App会按照程序中的设置,连接到设置好的IP地址、端口以及订阅的Topic,连接至EMQX服务器。页面中的视频则以WebView控件的形式,将网页上的图像流显示在页面当中。

  当用户按下按钮后,App则通过网络,向EMQX平台发送命令,由于ESP32-CAM和App都连接到了服务器并且订阅了相同的Topic,因此在App发送信息的同时,ESP32-CAM也能从云服务器收到消息。在ESP32-CAM收到命令后,则通过串口,将命令转发至STM32,触发串口中断并执行对应的任务。至此完成由用户端经云服务到机器人的控制流程。

三、机器人步态规划

  机器人行进动作可拆分为三个状态,这里以前进动作为例:

  • 动作①:机器人将左右前肢与身体平行,后肢与身体呈135°夹角,四只脚垂直于地面,为接下来迈步做准备。
  • 动作②:机器人的左前脚与右后脚同时抬高45°,之后左前肢与右后肢同时向前45°,最后左前脚与右后脚同时落下。
  • 动作③:机器人的左后脚与右前脚同时抬高45°,之后左后肢与右前肢同时向前迈出45°,左前肢与右后肢同时向后45°最后左后脚与右前脚同时落下。

  通过不断重复动作组,机器人能够实现四肢往返交替前进,而后退动作则是前进动作的镜像。

前进、后退步态示意图

  机器人的转体动作同样可分为三个部分,以左转动作为例:

  • 动作①:机器人将左右前肢与身体平行,后肢与身体呈135°夹角,四只脚垂直于地面,为接下来迈步做准备。
  • 动作②:左后脚与右前脚向上抬起45°,之后左后肢与右前肢先向逆时针移动45°后左后脚与右前脚落下。左前脚与右后脚抬起45°,右后肢逆时针移动45°后左前脚和右后脚落下。
  • 动作③:机器人将左后肢、右前肢和右后肢同时顺时针转45°,完成一次转体动作。

  右转动作与左转相同,仅需将关节的旋转角度修改为逆时针即可。

左转、右转步态示意图

四、项目搭建及部署

4.1 MQTT服务器的部署以及服务器图像接收的配置

  本项目使用EMQX作为MQTT服务器,其功能非常强大,可参考EMQX官网进行部署。依托阿里云的轻量应用服务器,利用1panel linux运维面板快速安装应用。在1panel面板中找到应用市场,搜索EMQX并点击安装。服务器就会自动给执行命令,从Docker镜像仓库拉取镜像并自动部署。之后在阿里云的服务器管理界面开放对应的端口,可自行选择使用域名解析后访问。待安装完成后,直接在浏览器中访问域名即可进入EMQX的控制面板。

EMQX面板

在这里插入图片描述

  同样是使用1panel linux运维面板,先将本仓库当中“CAM_Server”文件夹中的代码上传至服务器的文件目录当中。在运维面板的菜单中找到网站->运行环境,选择“node.js”,之后点击“创建运行环境”。

创建运行环境

  记得到云服务器/运维面板的防火墙开启对应的端口哦!😊

4.2 STM32开发环境

  STM32使用HAL库进行开发,用STMCubeMX建立基础工程,与CLion配合开发。关于环境的搭建教程网上已经有很多教程指导了,这里就不再赘述。clone本仓库代码后,直接使用Clion打开“HAL_C8T6”文件夹即可使用。

4.3 ESP32-CAM开发环境

  下载完前文提到的Arduino Lab for MicroPython IDE之后,打开IDE并将ESP32-CAM连接电脑。在IDE内连接对应的串口,将本仓库代码中“ESP32-CAM”文件夹内的文件烧录到ESP-CAM当中。

  在“main.py”当中,如下地方需要自行修改为自己的服务器信息:

接收图像的服务器信息

MQTT服务器信息

在这里插入图片描述

4.4 Flet应用开发环境

  Flet应用由于使用Python语言,所以使用PyCharm IDE进行开发。Flet具体的环境搭建可以参考Flet官方文档。同样的,在clone本仓库的代码后,直接使用PyCharm IDE打开项目中的“Fletapp”文件夹即可使用。

  在“mqtt.py”当中,如下地方需要自行修改为自己的服务器信息:

MQTT服务器信息

  在应用的开发过程中,由于编译出的APK文件一直不能够正常工作,因此就就尝试使用了Dev分支的SDK版本,以下是版本信息:

Flet应用版本信息

4.5 模块接线图

  在搞定软件后,将各个模块与STM32连接,以下是模块连接图:

模块连接图

  至此,应该能够将这个小机器人造出来啦~😎

五、项目总结

  • 电源模块的设计仍然存在缺陷:虽然电源模块能够正常工作且输出电压,但是在设计过程当中仅仅考虑到了功能性,没有充分考虑到安全性。PCB电路的裸露容易导致线路因误触发生短路,会对电源模块乃至整个系统都造成安全威胁。可以考虑添加保险丝,可防止电源短路时产生的大电流导致的电路烧毁。同时还需要添加防反接/防倒灌二极管,以此来避免电源芯片的烧毁。
  • 舵机的选取以及机器人的结构与姿态问题:由于在设计之初没有考虑到电池的重量,导致在实际运行时MG90S无法轻松支撑起机器人的重量。在行进过程中,由于机器人的重心不稳定导致前进与后退的任务都不是按照正常的直线轨迹行进。也有可能是因为3D打印机的误差较大,导致实际打印出来的结构体都存在一定偏移,最终导致了机器人的重心不稳与受力不均。
  • App的优化:虽然App能够实现基础功能,但是仍然存在一系列的问题,例如App在使用完成后,必须清除缓存数据才能再次使用,否则打开之后屏幕会一直处于白屏状态,无法正常使用。同时App的控制界面没有实现自适应设备,一旦使用平板打开就会导致画面留有大量留白。在按下按钮后,按钮上方的画面也会随着页面同步刷新,影响使用。

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/972183.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IIS asp.net权限不足

检查应用程序池的权限 IIS 应用程序池默认使用一个低权限账户(如 IIS_IUSRS),这可能导致无法删除某些文件或目录。可以通过以下方式提升权限: 方法 1:修改应用程序池的标识 打开 IIS 管理器。 在左侧导航树中&#x…

【数据结构】队列(Queue)

Queue 定义 Java中的队列(Queue)是一种先进先出(FIFO)的数据结构。队列只允许在一段进行插入数据操作,称为入队,在另一端进行删除数据操作,称为出队。我们可以把队列形象看作为排队。在最前面的进行出队,从最后面进行入队。 队列…

从零搭建微服务项目Base(第5章——SpringBoot项目LogBack日志配置+Feign使用)

前言: 本章主要在原有项目上添加了日志配置,对SpringBoot默认的logback的配置进行了自定义修改,并详细阐述了xml文件配置要点(只对日志配置感兴趣的小伙伴可选择直接跳到第三节),并使用Feign代替原有RestT…

Linux 网络安全技巧

网络安全是一个非常重要的课题,基本上你运行的服务后台越多,你就可能打开更多的安全漏洞.如果配置的恰当的话,Linux本身是非常安全可靠的,假使在Linux系统中有某个安全缺陷,由于Linux的源码是开放的,有成千上万的志愿者会立刻发现并修补它。本文旨在介绍用来增强你的…

Next.js【详解】获取数据(访问接口)

Next.js 中分为 服务端组件 和 客户端组件&#xff0c;内置的获取数据各不相同 服务端组件 方式1 – 使用 fetch export default async function Page() {const data await fetch(https://api.vercel.app/blog)const posts await data.json()return (<ul>{posts.map((…

个人shell脚本分享

在周一到周五做增量备份&#xff0c;在周六周日做完全备份 #!/bin/bash定义变量 SRC“/path/to/source” # 源目录 BKUP“/backup” # 备份主目录 FUL“KaTeX parse error: Expected EOF, got # at position 22: …ull" #̲ 完全备份目录 INC"BKUP/inc” # 增量备份…

小胡说技书博客分类(部分目录):服务治理、数据治理与安全治理对比表格

文章目录 一、对比表格二、目录2.1 服务2.2 数据2.3 安全 一、对比表格 下表从多个维度对服务治理、数据治理和安全治理进行详细对比&#xff0c;为读者提供一个直观而全面的参考框架。 维度服务治理数据治理安全治理定义对软件开发全流程、应用交付及API和接口管理进行规范化…

冒险岛079 V8 整合版源码搭建教程+IDEA启动

今天教大家来部署下一款超级怀旧游戏冒险岛&#xff0c;冒险岛源码是开源的&#xff0c;但是开源的代码会有各种&#xff0c;本人进行了加工整合&#xff0c;并且用idea进行了启动测试&#xff0c;经过修改后没有任何问题。 启动截图 后端控制台 前端游戏界面 声明 冒险岛源码…

Ubuntu 24.04.1 LTS 本地部署 DeepSeek 私有化知识库

文章目录 前言工具介绍与作用工具的关联与协同工作必要性分析 1、DeepSeek 简介1.1、DeepSeek-R1 硬件要求 2、Linux 环境说明2.1、最小部署&#xff08;Ollama DeepSeek&#xff09;2.1.1、扩展&#xff08;非必须&#xff09; - Ollama 后台运行、开机自启&#xff1a; 2.2、…

进阶数据结构——树状数组

前言 看这篇文章前我建议你们先看这个视频还有这个视频&#xff0c;不然你们可能看不懂。 一、树状数组的核心思想与本质 核心思想&#xff1a;树状数组&#xff08;Fenwick Tree&#xff09;是一种用于高效处理前缀和查询和单点更新的数据结构。 本质&#xff1a;通过二进…

vue3 + thinkphp 接入 七牛云 DeepSeek-R1/V3 流式调用和非流式调用

示例 如何获取七牛云 Token API 密钥 https://eastern-squash-d44.notion.site/Token-API-1932c3f43aee80fa8bfafeb25f1163d8 后端 // 七牛云 DeepSeek API 地址private $deepseekUrl https://api.qnaigc.com/v1/chat/completions;private $deepseekKey 秘钥;// 流式调用pub…

「软件设计模式」桥接模式(Bridge Pattern)

深入解析桥接模式&#xff1a;解耦抽象与实现的艺术 一、模式思想&#xff1a;正交维度的优雅解耦 桥接模式&#xff08;Bridge Pattern&#xff09;通过分离抽象&#xff08;Abstraction&#xff09;与实现&#xff08;Implementation&#xff09;&#xff0c;使二者可以独立…

Vue2项目,商城系统

Vue2商城系统项目 商城系统 包含功能: 下单平台&#xff0c;登录&#xff0c;购物车 纯前端无后台、无数据库 &#xff01;&#xff01; 纯前端无后台、无数据库 &#xff01;&#xff01; vue2 setup语法糖写法 本项目主要使用技术&#xff1a; - 基于vue2的项目框…

百度千帆平台对接DeepSeek官方文档

目录 第一步&#xff1a;注册账号&#xff0c;开通千帆服务 第二步&#xff1a;创建应用&#xff0c;获取调用秘钥 第三步&#xff1a;调用模型&#xff0c;开启AI对话 方式一&#xff1a;通过API直接调用 方式二&#xff1a;使用SDK快速调用 方式三&#xff1a;在千帆大模…

Breakout Tool

思科 CML 使用起来还是很麻烦的&#xff0c;很多操作对于习惯了 secure crt 或者 putty 等工具的网络工程师都不友好。 Breakout Tool 提供对远程实验室中虚拟机控制台与图形界面的本地化接入能力&#xff0c;其核心特性如下&#xff1a; Console 访问&#xff1a;基于 Telnet…

若依Flowable工作流版本监听器使用方法

1.前言 本文详细介绍如何在若依Flowable工作流版本&#xff08;RuoYi-Vue-Flowable&#xff09;中配置执行监听器和任务监听器。是以我二次开发的代码为基础&#xff0c;介绍如何配置监听器&#xff0c;已解决源码在新增或删除监听器出现的问题&#xff0c;如果需要二次开发的…

深度集成DeepSeek大模型:WebSocket流式聊天实现

目录 5分钟快速接入DeepSeek大模型&#xff1a;WebSocket实时聊天指南创建应用开发后端代码 (Python/Node.js)结语 5分钟快速接入DeepSeek大模型&#xff1a;WebSocket实时聊天指南 创建应用 访问DeepSeek官网 前往 DeepSeek官网。如果还没有账号&#xff0c;需要先注册一个。…

python进阶篇-面向对象

1.对象的定义 1.1 什么是对象 面向过程&#xff1a;将程序流程化 对象&#xff1a;就是“容器“&#xff0c;是用来存储数据和功能的&#xff0c;是数据和功能的集合体。 面向对象和面向过程没有优劣之分&#xff0c;它们只是使用的场景不同罢了。 1.2 为什么要有对象 有…

Spring Boot(8)深入理解 @Autowired 注解:使用场景与实战示例

搞个引言 在 Spring 框架的开发中&#xff0c;依赖注入&#xff08;Dependency Injection&#xff0c;简称 DI&#xff09;是它的一个核心特性&#xff0c;它能够让代码更加模块化、可测试&#xff0c;并且易于维护。而 Autowired 注解作为 Spring 实现依赖注入的关键工具&…

用deepseek学大模型04-机器学习建模过程

https://metaso.cn/s/7tEmBHr 目前已经学完深度学习的数学基础&#xff0c;给出机器学习建模的基本过程 好的&#xff0c;我现在需要回答用户的问题&#xff1a;已经学完深度学习的数学基础&#xff0c;现在要给出机器学习建模的基本过程。我需要结合我搜索到的资料来构建一个详…