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);
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机视觉初步(环境搭建)

1.anaconda 建议安装在D盘&#xff0c;官网正常安装即可&#xff0c;一般可以安装windows版本 安装成功后&#xff0c;可以在电脑应用里找到&#xff1a; 2.创建虚拟环境 打开anaconda prompt&#xff0c; 可以用conda env list 查看现有的环境&#xff0c;一般打开默认bas…

SQL Server数据库引擎服务启动失败:端口冲突

问题现象&#xff1a; SQL Server 2022 安装完成后&#xff0c;数据库引擎服务无法启动&#xff0c;日志报错 “TCP 端口 1433 已被占用”&#xff08;ERROR_LOG_SYS_TCP_PORT&#xff09;。 快速诊断 检测端口占用&#xff1a; # 查看 1433 端口占用情况&#xff08;需管理员权…

全局思维与系统思考

最近接到一些需求&#xff0c;1号位希望每个层级的领导者有眼界&#xff0c;胸怀&#xff0c;格局&#xff0c;全局观&#xff0c;这些听起来似乎很抽象&#xff0c;然而它们是每个人、每个团队成长与成功的核心竞争力。那么&#xff0c;如何才能提升这些能力&#xff1f;就像我…

区间有关的贪心解题记录435无重叠区间452用最少数量的箭引爆气球

无重叠区间我的想法是开一个数组a&#xff0c;遍历给出的区间&#xff0c;在数组a里将对应落在的区间index标记。如果有重复区间就只选择最小的那个区间标记。但是这道题的区间好像很长-5 * 104 < starti < endi < 5 * 104没法用数组a表示总的区间范围。 核心思路是当…

天锐蓝盾终端安全防护——企业终端设备安全管控

从办公室的台式电脑到员工手中的移动终端&#xff0c;这些设备不仅是工作的得力助手&#xff0c;更是企业数据的重要载体。然而&#xff0c;随着终端设备的广泛使用&#xff0c;安全风险也如影随形。硬件设备使用不当、数据随意传输等问题频发&#xff0c;使得企业数据面临着泄…

k8s网络策略

k8s网络策略 k8s网络测试概述查看防火墙策略 k8s网络策略网络访问控制案例&#xff1a;配置k8s网络策略结果验证 k8s网络策略配置示例 k8s网络测试概述 网络策略就是设置防火墙 查看防火墙策略 # 获取当前命名空间下的所有 NetworkPolicy 资源&#xff08;网络策略&#xff0…

leetcode刷题日记——跳跃游戏 II

[ 题目描述 ]&#xff1a; [ 思路 ]&#xff1a; 题目要求在一个一定能达到数组末尾的跳跃数组中(见55题 跳跃游戏)&#xff0c;找出能够跳到末尾的最小次数要求次数最少&#xff0c;那肯定是选取能选步数中最大的数。也就是在当前能够达到的距离中&#xff0c;选择能够达到的…

【Java SE】Java比较器:Comparable、Comparator

目录 1.前言 2.Comaprable接口 2.1 使用细节 2.2 案例演示 3.Comparator接口 3.1 为什么需要Comparator接口 3.2 使用细节 3.3 案例演示 4.Comparable、Comparator对比 1.前言 Java 中的对象&#xff0c;正常情况下&#xff0c;只能进行比较&#xff1a; 或 ! 。不…

(二)创建实例

在这节中&#xff0c; 创建一个实例初始化Vulkan库,指定驱动程序需要使用的应用程序信息 1&#xff0c;要有个实例句柄 VkInstance instance; 2&#xff0c;设置创建Vulkan驱动程序需要的信息&#xff0c; VkInstanceCreateInfo createInfo {}; createInfo.sType VK_STRUCTUR…

HCIP之VRRP

1. VRRP是什么 VRRP&#xff08;Virtual Router Redundancy Protocol&#xff0c;虚拟路由冗余协议&#xff09;是一种用于提高网络可靠性的容错协议。它通过将多台路由器虚拟成一台虚拟路由器&#xff0c;实现网关的冗余备份。当主路由器&#xff08;Master&#xff09;出现故…

高效内存管理:x86-64架构中的分页机制

在 x86-64 架构的世界里&#xff0c;内存分页机制扮演着举足轻重的角色&#xff0c;它就像是一座桥梁&#xff0c;连接着虚拟地址与物理地址。简单来说&#xff0c;内存分页机制就是将线性地址&#xff08;也就是虚拟地址&#xff09;切分成一个个固定大小的页&#xff0c;并把…

【软件工程】填空题

真题 2024-10 16.数据字典是用来定义_____中各个成分的具体含义的。 17.模块设计的基本原则是_____。 18.接口是操作的一个集合,其中每个操作描述了类、构件或子系统的一个_____。 19.耦合是指不同模块之间_____的度量。 20.RUP的突出特点是,它是一种以用况为驱动的、…

第二卷:海盐城血战(37-72回)正反人物群像

第二卷&#xff1a;海盐城血战&#xff08;37-72回&#xff09;正反人物群像 核心矛盾&#xff1a;寒门军事崛起 → 内部倾轧 → 制度性腐败 主题&#xff1a;通过人物群像展现寒门胜利的虚幻性与权力异化的必然性 一、正派阵营&#xff08;寒门抗争势力&#xff09; 1. 刘裕…

23_js面向对象

上次我们讲运动函数&#xff0c;实际开发不会写运动函数。只是讲一下思想。 现在讲一下用原生js去实现轮播图&#xff0c;引入到对象 首先&#xff0c;要明确 面向对象不是语法&#xff0c;是一个思想&#xff0c;是一种编程模式 面向&#xff1a;朝向 面向对象&#xff1a…

torch不能使用cuda的解决方案

遇到了这样的报错&#xff0c;说明 torch不能使用cuda 反思 我频繁地尝试安装不同的 nvdia 驱动&#xff0c;浪费了很多时间。因为我的错误地认为nvidia会自带cuda&#xff0c;其实cuda需要单独安装。 还有我的torch是cpu版本的&#xff0c;即使nvidia cuda安装了&#xff0…

kettle从入门到精通 第九十三课 ETL之kettle kettle 调用web service接口5种方法,一文彻底搞懂

场景&#xff1a;群里有小伙伴向我求助如何调用web service接口&#xff0c;趁着周末时间&#xff0c;给兄弟们搞demo。 1、本次使用的web service服务接口地址是http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?opgetSupportCityDataset&#xff0c; 此接口根据用户输入…

蓝桥杯 14 天 十五届蓝桥杯 数字诗意

static boolean kkk(long x) {if(x1)return true;else {// 初始化xx为1&#xff0c;用于计算2的幂long xx 1;// 循环60次&#xff0c;检查2的幂是否等于xfor (int i 1; i < 60; i) {xx * 2; // 每次将xx乘以2if (xx x) { // 如果xx等于x&#xff0c;说明x是2的幂&#xf…

异常与捕获

1.C 异常概念 异常是一种处理错误的方式&#xff0c;当一个函数发现自己无法处理的错误时就可以抛出异常&#xff0c;让函数的直接或间接的调用者处理这个错误。 throw&#xff1a;当问题出现时&#xff0c;程序会抛出一个异常。这是通过使用 throw 关键字来完成的。catch&am…

2025年最新自动化/控制保研夏令营预推免面试真题分享(东南大学苏州校区/华东理工/南航/天大)

笔者来2021级本科自动化专业&#xff0c;以下部分将介绍我在夏令营以及预推免期间发生经历和问题 东南大学苏州校区蒙纳士大学联培 东南大学苏州校区的项目算是一个比较小众的项目&#xff0c;是第一年在苏州校区&#xff0c;二三年到南京校区找导师&#xff08;不提供住宿自…

【SQL】MySQL基础2——视图,存储过程,游标,约束,触发器

文章目录 1. 视图2. 存储过程2.1 创建存储过程2.2 执行存储过程 3. 游标4. 约束4.1 主键约束4.2 外键约束4.3 唯一约束4.4 检查约束 5. 触发器 1. 视图 视图是虚拟的表&#xff0c;它是动态检索的部分。使用视图的原因&#xff1a;避免重复的SQL语句&#xff1b;使用表的部分而…