当前位置: 首页 > article >正文

STM32单片机的桌面宠物机器人(基于HAL库)

 效果

基于STM32单片机的桌面宠物机器人

概要

语音模块:ASR PRO,通过天问block软件烧录语音指令

主控芯片:STM32F103C8T6 使用HAL库

屏幕:0.96寸OLED屏,用来显示表情

4个舵机,用来当作四只腿

底部一个面包板

 分析

初始化代码,使用TIM3定时器的四个通道输出PWM驱动舵机,控制腿部的运动

    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4);OLED_Init();OLED_Clear();OLED_ShowImage(0, 0, 128, 64, BMP1);mode_stand();

ASR PRO获取到语音后通过串口通信把数据发送到STM32,在单片机内使用中断的方式获取语音数据,,然后根据语音指令判断当前的动作

    while (1) {HAL_UART_Receive_IT(&huart1, &command, 1);if (command == 0x32) {  // 前进mode_forward();} else if (command == 0x31) {mode_slowstand();} else if (command == 0x33) {  // 后退mode_behind();} else if (command == 0x34) {  // 左转mode_left();} else if (command == 0x35) {  // 右转mode_right();} else if (command == 0x36) {  // 前后摇摆mode_swing_qianhou();} else if (command == 0x37) {  // 左右摇摆mode_swing_zuoyou();} else if (command == 0x38) {  // 跳舞mode_dance();} else if (command == 0x39) {  // 立正mode_stand();} else if (command == 0x41) {  // 起身mode_slowstand();} else if (command == 0x61) {  // 坐下mode_strech();} else if (command == 0x63) {  // 伸懒腰mode_lanyao();} else if (command == 0x64) {  // 抬头mode_headup();} else if (command == 0x65) {  // 趴下睡觉mode_sleeppa();} else if (command == 0x66) {  // 卧下睡觉mode_sleepwo();} else if (command == 0x68) {  // 睡觉mode_sleepwo();}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}

分别展示对应的表情和动作,OLED直接用的现成的库

#include "Mode.h"
#include <stdlib.h>
#include "Movement.h"
#include "OLED.h"
#include "gpio.h"
#include "main.h"extern uint8_t command;
uint8_t previousCommand = 0;void mode_forward(void)  // 前进
{OLED_ShowImage(0, 0, 128, 64, BMP2);  // 前进脸move_forward();HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;
}
void mode_behind(void)  // 后退
{OLED_ShowImage(0, 0, 128, 64, BMP2);  // 前进脸move_behind();HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;
}
void mode_left(void)  // 左转
{OLED_ShowImage(0, 0, 128, 64, BMP3);  // 左转脸move_left();HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;
}
void mode_right(void)  // 右转
{OLED_ShowImage(0, 0, 128, 64, BMP4);  // 右转脸move_right();HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;
}void mode_swing_qianhou(void)  // 前后摇摆
{OLED_ShowImage(0, 0, 128, 64, BMP11);  // 迷糊脸move_shake_qianhou();HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;
}
void mode_swing_zuoyou(void)  // 左右摇摆
{OLED_ShowImage(0, 0, 128, 64, BMP11);  // 迷糊脸move_shake_zuoyou();HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;
}void mode_dance(void)  // 跳舞
{OLED_ShowImage(0, 0, 128, 64, BMP5);  // 特殊脸move_dance();HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;
}
void mode_stand(void)  // 立正
{OLED_ShowImage(0, 0, 128, 64, BMP1);  // 立正脸move_stand();HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;command = 0;HAL_Delay(1000);
}
void mode_slowstand(void)  // 起身
{OLED_ShowImage(0, 0, 128, 64, BMP1);  // 立正脸move_slow_stand(previousCommand);HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;command = 0;
}
void mode_strech(void)  // 坐下
{OLED_ShowImage(0, 0, 128, 64, BMP1);  // 立正脸move_slow_stand(previousCommand);OLED_ShowImage(0, 0, 128, 64, BMP2);  // 前进脸,move_stretch();OLED_ShowImage(0, 0, 128, 64, BMP12);  // 猫猫脸HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;command = 0;
}
void mode_twohands(void)  // 交替抬手
{OLED_ShowImage(0, 0, 128, 64, BMP1);  // 立正脸move_stand();move_two_hands();HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;command = 0;
}
void mode_lanyao(void)  // 懒腰
{OLED_ShowImage(0, 0, 128, 64, BMP1);  // 立正脸move_slow_stand(previousCommand);OLED_ShowImage(0, 0, 128, 64, BMP9);  // 开心脸lan_yao();OLED_ShowImage(0, 0, 128, 64, BMP1);  // 立正脸HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;command = 0;
}
void mode_headup(void)  // 抬头
{OLED_ShowImage(0, 0, 128, 64, BMP1);  // 立正脸move_slow_stand(previousCommand);OLED_ShowImage(0, 0, 128, 64, BMP10);  // 调皮脸move_head_up();HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;command = 0;
}
void mode_sleeppa(void)  // 趴下睡觉
{OLED_ShowImage(0, 0, 128, 64, BMP1);  // 立正脸move_slow_stand(previousCommand);if (rand() % 2) {                         // 随机产生两种表情中的一种OLED_ShowImage(0, 0, 128, 64, BMP6);  // 普通睡觉脸} else {OLED_ShowImage(0, 0, 128, 64, BMP8);  // 酣睡脸}move_sleep_p();previousCommand = command;command = 0;
}
void mode_sleepwo(void)  // 卧下睡觉
{OLED_ShowImage(0, 0, 128, 64, BMP1);  // 立正脸move_slow_stand(previousCommand);if (rand() % 2) {                         // 随机产生两种表情中的一种OLED_ShowImage(0, 0, 128, 64, BMP6);  // 普通睡觉脸} else {OLED_ShowImage(0, 0, 128, 64, BMP8);  // 酣睡脸}move_sleep_w();previousCommand = command;command = 0;
}
void mode_nanshou(void)  // 难受
{OLED_ShowImage(0, 0, 128, 64, BMP2);  // 前进脸move_sleep_w();previousCommand = command;command = 0;
}

部分动作实现,分别设置对应腿的角度,通过延时达到效果

void move_stand(void) {  // 站立Servo_SetAngle1(90);Servo_SetAngle2(90);Servo_SetAngle3(90);Servo_SetAngle4(90);HAL_Delay(500);
}void move_forward(void) {  // 前进Servo_SetAngle1(135);Servo_SetAngle4(45);HAL_Delay(movedelay);Servo_SetAngle2(45);Servo_SetAngle3(135);HAL_Delay(movedelay);Servo_SetAngle1(90);Servo_SetAngle4(90);HAL_Delay(movedelay);Servo_SetAngle2(90);Servo_SetAngle3(90);HAL_Delay(movedelay);Servo_SetAngle2(135);Servo_SetAngle3(45);HAL_Delay(movedelay);Servo_SetAngle1(45);Servo_SetAngle4(135);HAL_Delay(movedelay);Servo_SetAngle2(90);Servo_SetAngle3(90);HAL_Delay(movedelay);Servo_SetAngle1(90);Servo_SetAngle4(90);HAL_Delay(movedelay);
}void move_behind(void) {  // 后退Servo_SetAngle1(45);Servo_SetAngle4(135);HAL_Delay(movedelay);Servo_SetAngle2(135);Servo_SetAngle3(45);HAL_Delay(movedelay);Servo_SetAngle1(90);Servo_SetAngle4(90);HAL_Delay(movedelay);Servo_SetAngle2(90);Servo_SetAngle3(90);HAL_Delay(movedelay);Servo_SetAngle2(45);Servo_SetAngle3(135);HAL_Delay(movedelay);Servo_SetAngle1(135);Servo_SetAngle4(45);HAL_Delay(movedelay);Servo_SetAngle2(90);Servo_SetAngle3(90);HAL_Delay(movedelay);Servo_SetAngle1(90);Servo_SetAngle4(90);HAL_Delay(movedelay);
}

相关文章:

STM32单片机的桌面宠物机器人(基于HAL库)

效果 基于STM32单片机的桌面宠物机器人 概要 语音模块&#xff1a;ASR PRO&#xff0c;通过天问block软件烧录语音指令 主控芯片&#xff1a;STM32F103C8T6 使用HAL库 屏幕&#xff1a;0.96寸OLED屏&#xff0c;用来显示表情 4个舵机&#xff0c;用来当作四只腿 底部一个面…...

python 语法篇(一)

目录 1 正则匹配注意点11.1 正则匹配字符串写法1.2 创建re函数&#xff08;1&#xff09;re.search()--搜索第一个匹配项&#xff08;2&#xff09;re.match() - 从字符串开头匹配&#xff08;3&#xff09;re.findall() - 返回所有匹配项的列表&#xff08;4&#xff09;re.fi…...

【记录自己第一个github 100星项目】采用flask框架构建一个前端页面,进行OpenManus的调用,对OpenManus生成的文件进行预览。

OpenManus-WebUI...

flutter android端抓包工具

flutter做的android app&#xff0c;使用fiddler抓不了包&#xff0c;现介绍一款能支持flutter的抓包工具Reqable&#xff0c;使用方法如下&#xff1a; 1、下载电脑端安装包 下载地址为【https://reqable.com/zh-CN/download/】 2、还是在上述地址下载 android 端apk&#xf…...

求矩阵某列的和

设计函数sum_column( int A[E1(n)][E2(n)], int j )&#xff0c;E1(n)和E2(n)分别为用宏定义的行数和列数&#xff0c;j为列号。在该函数中&#xff0c;设计指针ptr&A[0][j]&#xff0c;通过*ptr及ptrptrE2(n)访问第j列元素&#xff0c;从而求得第j列元素的和。在主函数中定…...

Ubuntu 22 Linux上部署DeepSeek R1保姆式操作详解(ollama方式)

操作系统&#xff1a;Ubuntu Linux 22.04 一、安装模型运行环境 打开链接https://ollama.com/download/linux 1.安装ollama &#xff08;1&#xff09;一条指令即可实现的简易版安装方法&#xff08;也可称为在线安装&#xff09; curl -fsSL https://ollama.com/install.s…...

软件工程面试题(十五)

1、servlet 创建过程以及ruquest,response,session的生命周期? Servlet的创建过程: 第一步 public class AAA extends HttpServlet{ 实现对应的doxxx方法 } 第二步: 在web.xml中配置 <servlet> <servlet-name></servlet-name> <servlet-c…...

深度学习处理时间序列(6)

RNN的高级用法 循环dropout&#xff08;recurrent dropout&#xff09;​&#xff1a;这是dropout的一种变体&#xff0c;用于在循环层中降低过拟合。 循环层堆叠&#xff08;stacking recurrent layers&#xff09;​&#xff1a;这会提高模型的表示能力&#xff08;代价是更…...

【鸿蒙5.0】向用户申请麦克风授权

#效果图 步骤 在 config.json 里声明权限&#xff1a;在项目的 config.json 文件中添加麦克风权限的声明&#xff0c;告知系统应用需要使用该权限。检查权限状态&#xff1a;在代码里检查应用是否已经获得了麦克风权限。请求权限&#xff1a;若应用未获得麦克风权限&#xff0…...

用 Python 实现机器学习小项目:从入门到实战

用 Python 实现机器学习小项目&#xff1a;从入门到实战 在人工智能蓬勃发展的今天&#xff0c;机器学习早已成为技术人绕不开的关键词。无论你是初学者还是转行者&#xff0c;学习一门编程语言并通过小项目实战&#xff0c;都是掌握机器学习的最佳方式。本文将以 Python 为编程…...

从“制造”到“智造”:生产线自动检测的技术变革与实践

从“制造”到“智造”:生产线自动检测的技术变革与实践 在工业4.0的浪潮下,生产线自动检测技术正成为制造业转型升级的关键驱动力。传统的人工检测方式因效率低、误差高、成本高等问题,逐渐被更智能、更高效的自动检测技术所取代。本文将从技术背景、核心技术、应用场景以及…...

【解决】导入PNG图片,转 Sprite 格式成功但资产未生效问题

开发平台&#xff1a;Unity 6.0 图片格式&#xff1a;.png   问题描述 当 PNG 成功转换为 Sprite&#xff08;精灵&#xff09;时&#xff0c;资产状态将显示扩展箭头&#xff0c;即表明该资产可 Sprite 使用。 解决方法&#xff1a;设置正确的 Sprite Mode Single 关于 Spr…...

Maven:Java项目构建与依赖管理工具

Maven 是什么 Maven 将项目开发过程和管理过程抽象成一个项目对象模型&#xff08;POM&#xff09;&#xff0c;本质上是一个项目管理工具。Maven 主要用于Java项目的依赖管理、编译、测试、打包和部署等操作。 Maven的核心设计围绕标准化和自动化&#xff0c;通过一系列约定和…...

Oracle数据库数据编程SQL<3.4 PL/SQL 自定义函数>

自定义函数是Oracle数据库中可重用的PL/SQL代码块&#xff0c;它接受参数、执行操作并返回一个值。函数可以在SQL语句中直接调用&#xff0c;极大增强了SQL的处理能力。 分类调用没有参数没有输入输出写SQL不加参数有参数有输入无输出写SQL加参数无输入有输出输出变量写PL/SQL…...

【Ubuntu常用命令】

1.将本地服务器文件或文件夹传输到远程服务器 文件 scp /data/a.txt administrator10.60.51.20:/home/administrator/ 文件夹 scp -r /data/ administrator10.60.51.20:/home/administrator/ 2.从远程服务器传输文件到本地服务器 scp administrator10.60.51.20:/data/a.txt /h…...

PyTorch图像预处理--Compose

torchvision.transforms.Compose 是 PyTorch 中用于图像预处理的核心工具&#xff0c;可将多个图像变换操作组合成一个顺序执行的流水线。 ‌1. 定义与作用‌ ‌功能‌&#xff1a;将多个图像处理步骤&#xff08;如缩放、裁剪、归一化等&#xff09;串联为一个整体&#xff…...

从DeepSeek到Qwen,AI大模型的移植与交互实战指南

在不久前发布的《技术实战 | OK3588-C开发板上部署DeepSeek-R1大模型的完整指南》一文中&#xff0c;小编为大家介绍了DeepSeek-R1在飞凌嵌入式OK3588-C开发板上的移植部署、效果展示以及性能评测&#xff0c;本篇文章不仅将继续为大家带来关于DeepSeek-R1的干货知识&#xff0…...

SkyWalking+Springboot实战

1、下载SkyWalking APM 1.手动下载 Downloads | Apache SkyWalkinghttps://skywalking.apache.org/downloads/ 2.链接下载 https://dlcdn.apache.org/skywalking/10.2.0/apache-skywalking-apm-10.2.0.tar.gzhttps://dlcdn.apache.org/skywalking/10.2.0/apache-skywalking-…...

算法 | 河马优化算法原理,公式,应用,算法改进及研究综述,matlab代码

以下是关于河马优化算法(Hippopotamus Optimization Algorithm, HO)的完整综述,包含原理、公式、应用场景、改进方向及可直接运行的 Matlab 完整代码。一、算法原理 河马优化算法(HO)由Amiri等人于2024年提出,是受河马群体行为启发的元启发式算法,其核心基于以下三阶段行…...

org.apache.maven.surefire:surefire-junit-platform:jar:2.22.2 Maven打包失败

org.apache.maven.surefire:surefire-junit-platform:jar:2.22.2 解决办法 勾上这个&#xff0c;打包时跳过测试代码...

nginx-rtmp-module之ngx_rtmp_live_module.c代码详解

ngx_rtmp_live_module.h 头文件分析 这个头文件定义了直播模块相关的结构体、函数声明和一些常量&#xff0c;主要用于支持 RTMP 协议中的直播流。 1. 核心数据结构&#xff1a; ngx_rtmp_live_chunk_stream_t&#xff1a; 该结构体用于表示一个数据流中的“块”&#xff0c;…...

【MVCC快照如何实现】

MVCC(多版本并发控制)快照的实现原理 MVCC(Multi-Version Concurrency Control)是现代数据库实现事务隔离级别的核心技术&#xff0c;它通过数据多版本和快照机制来实现高效的并发控制。下面我将详细解析MVCC快照的实现机制。 一、MVCC核心组件 1. 版本链结构 MVCC通过以下…...

在机器人和无人机时代,测绘人的出路在哪里?

一、技术革命&#xff1a;当测绘行业按下“加速键” 无人机与机器人技术正在重塑测绘行业的底层逻辑。传统测绘依赖人工作业&#xff0c;效率低、成本高且风险大&#xff0c;而无人机凭借其灵活性和高效性&#xff0c;已能快速完成大范围地形测绘&#xff0c;精度可达厘米级&a…...

linux》》docker 、containerd 保存镜像、打包tar、加载tar镜像

Linux》》docker: 默认情况下&#xff0c;Docker镜像保存在/var/lib/docker/目录下。 当您使用docker pull命令从Docker Hub或私有镜像仓库中拉取镜像时&#xff0c;Docker会自动将镜像文件保存在/var/lib/docker/image/目录下。 每个镜像都由一个或多个层组成&#xff0c;这些…...

DeepSeek+Kimi:PPT制作的效率革命

摘要&#xff1a;传统PPT制作面临模板选择困难、内容逻辑混乱、设计排版能力有限以及反复修改等问题。DeepSeek和Kimi两款AI工具的组合为PPT制作提供了全新的解决方案。DeepSeek擅长内容生成与逻辑推理&#xff0c;能够快速生成高质量的PPT大纲和内容&#xff1b;Kimi则专注于长…...

电影交流|基于Java+vue的电影交流平台小程序系统(源码+数据库+文档)

电影交流平台 目录 基于SprinBootvue的电影交流平台小程序系统 一、前言 二、系统设计 三、系统功能设计 1用户信息管理 2 电影信息管理 3公告信息管理 4论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&…...

深度学习入门(二):从感知机到神经网络

文章目录 前言一个神经网络的例子激活函数登场3层神经网络的实现矩阵运算3层神经网络示意图符号定义第一层信号传递第二层信号传递第三层信号传递 代码实现实践&#xff1a;手写数字识别参考资料 前言 上一篇文章我们学习了感知机&#xff0c;因为它和神经网络有很多共同点&am…...

Sentinel 相关知识点

Sentinel 实现原理&#xff1f; Sentinel 是面向分布式服务架构的流量控制组件&#xff0c;主要以流量为切入点&#xff0c;从限流、流量整形、熔断降级、系统负载保护等多个维度来帮助开发者保障微服务的稳定性。以下是 Sentinel 的实现原理&#xff1a; 核心概念 资源&…...

AI三大主义 和 深度学习三大主义

在人工智能&#xff08;AI&#xff09;研究领域&#xff0c;"三大主义"通常指三种核心方法论或思想流派&#xff0c;它们代表了不同的技术路径和哲学观点。以下是主流的划分方式&#xff1a; 1. 符号主义&#xff08;Symbolicism&#xff09; 核心思想&#xff1a;智…...

探索 Vue 中的多语言切换:<lang-radio /> 组件详解!!!

探索 Vue 中的多语言切换&#xff1a;<lang-radio /> 组件详解 &#x1f30d; 嗨&#xff0c;大家好&#xff01;&#x1f44b; 今天我们来聊聊如何在 Vue 项目中实现一个优雅的多语言切换功能——<lang-radio /> 组件。这是一个小而美的组件&#xff0c;出现在登…...