用ASR PRO离线语音芯片和月饼盒做一个会跑会跳会说话的机器狗

news2024/11/13 12:13:07

中秋节刚过,大家月饼盒应该还有,不要扔,可以做点小玩意。

机器狗的创意来自B站石桥北的视频,他使用了一块ESP32芯片和打印件加四个舵机实现,应该说是比较复杂的,需要有3D打印机打印外壳,还得会手机编程,有一定的专业度。

我这个简略版核心部件一块ASR芯片+4个舵机,四个舵机就是四条腿,ASR芯片本身带离线对话功能,自己设计一下对话控制舵机就好了。如果要增加趣问性,可以加一块OLED屏幕显示一些操作指令和绘制一些表情,

如上图,asrpro芯片包含六个舵机引脚pwm0到pwm5,我们只使用了四个,剩下两个有兴趣的还可以加上个尾巴和头,或者加上红外,温湿度传感器之类,oled屏将会占去两个,其他引脚就看大家发挥了。

最好是方形的盒子,这样好定位,贴着盒子底部,在盒子两侧一边挖两个方形的洞,如上图,正好可以把舵露出来舵机头为好,口的大小以能卡住固定镙丝的地方为宜。可以先使用纸片沿着舵机屁股裁一块相同大小的纸片,然后用这个纸片在盒子上比划出大小,然后使用美工刀挖出来。易拉罐应该也可以的,不过要使用胶带包一下,防止划破手,如下:

最终如下,:

接线:

PA2,PA3,PA5,PA6初始化为四个舵机,

PA0和PA1初始化为OLED屏。

完整的代码和图:

#define ASC2_12

#include "asr.h"
extern "C"{ void * __dso_handle = 0 ;}
#include "setup.h"
#include "myLib/asr_event.h"
#include "myLib/asr_ssd1306.h"
#include "myLib/asr_servo.h"

uint32_t snid;
Servo servo_3;
Servo servo_2;
Servo servo_5;
Servo servo_6;
void ASR_CODE();

//{speak:程程-标准男童,vol:10,speed:10,platform:haohaodada}
//{playid:10001,voice:汪汪汪,用旺旺唤醒我。}
//{playid:10002,voice:我去玩了,用旺旺唤醒我}

SSD1306 ssd1306(128,64,0,1);
/*描述该功能...
*/
void ASR_CODE(){
  switch (snid) {
   case 0:
    ssd1306.clear((0));
    ssd1306.set_cursor(0,0);
    ssd1306.draw_hanzi_12("有什么事请吩咐");
    ssd1306.fill_circle(86,44,10,(1));
    ssd1306.fill_circle(40,44,10,(1));
    ssd1306.display();
    break;
   case 1:
    ssd1306.clear((0));
    ssd1306.set_cursor(0,0);
    ssd1306.draw_hanzi_12("打开灯光");
    ssd1306.display();
    break;
   case 2:
    ssd1306.clear((0));
    ssd1306.set_cursor(0,0);
    ssd1306.draw_hanzi_12("关闭灯光");
    ssd1306.display();
    break;
   case 3:
    ssd1306.clear((0));
    ssd1306.draw_rectangle(44,22,84,42,(1));
    ssd1306.display();
    break;
   case 4:
    ssd1306.clear((0));
    ssd1306.draw_circle(64,32,20,(1));
    ssd1306.display();
    break;
   case 5:
    ssd1306.clear((0));
    ssd1306.fill_circle(86,44,10,(1));
    ssd1306.fill_circle(40,44,10,(1));
    ssd1306.fill_round_rect(76,29,96,59,10,(1));
    ssd1306.fill_round_rect(30,29,50,59,10,(1));
    ssd1306.display();
    servo_3.write(0);
    servo_2.write(0);
    servo_5.write(180);
    servo_6.write(180);
    break;
   case 6:
    ssd1306.clear((0));
    ssd1306.fill_round_rect(76,39,96,49,5,(1));
    ssd1306.fill_round_rect(30,39,50,49,5,(1));
    ssd1306.display();
    servo_3.write(90);
    servo_2.write(90);
    servo_5.write(90);
    servo_6.write(90);
    break;
   case 7:
    ssd1306.clear((0));
    ssd1306.draw_line(30,39,45,44,(1));
    ssd1306.draw_line(30,49,45,44,(1));
    ssd1306.draw_line(96,39,81,44,(1));
    ssd1306.draw_line(96,49,81,44,(1));
    ssd1306.display();
    servo_3.write(180);
    servo_2.write(180);
    servo_5.write(0);
    servo_6.write(0);
    break;
   case 8:
    vol_set(7);
    break;
   case 9:
    vol_set(3);
    break;
   case 10:
    vol_set(1);
    break;
   case 11:
    servo_2.write(0);
    servo_3.write(90);
    servo_5.write(180);
    servo_6.write(90);
    ssd1306.clear((0));
    ssd1306.fill_round_rect(76,29,96,59,10,(1));
    ssd1306.fill_round_rect(30,29,50,59,10,(1));
    ssd1306.display();
    break;
   case 12:
    servo_2.write(180);
    servo_3.write(180);
    servo_5.write(0);
    servo_6.write(0);
    ssd1306.clear((0));
    ssd1306.fill_round_rect(76,39,96,49,5,(1));
    ssd1306.fill_round_rect(30,39,50,49,5,(1));
    ssd1306.display();
    break;
   case 13:
    servo_2.write(90);
    servo_3.write(90);
    servo_5.write(90);
    servo_6.write(90);
    ssd1306.clear((0));
    ssd1306.draw_line(30,39,45,44,(1));
    ssd1306.draw_line(30,49,45,44,(1));
    ssd1306.draw_line(96,39,81,44,(1));
    ssd1306.draw_line(96,49,81,44,(1));
    ssd1306.display();
    break;
   case 14:
    servo_2.write(90);
    servo_3.write(0);
    servo_5.write(90);
    servo_6.write(180);
    ssd1306.clear((0));
    ssd1306.draw_line(30,39,50,49,(1));
    ssd1306.draw_line(30,49,50,39,(1));
    ssd1306.draw_line(76,39,96,49,(1));
    ssd1306.draw_line(76,49,96,39,(1));
    ssd1306.display();
    break;
   case 15:
    servo_2.write(90);
    servo_3.write(90);
    servo_5.write(90);
    servo_6.write(90);
    break;
   case 16:
    servo_2.write(90);
    servo_3.write(90);
    servo_5.write(90);
    servo_6.write(90);
    break;
  }

}

void hardware_init(){
  vol_set(3);
  set_wakeup_forever();
  taskENTER_CRITICAL();
    ssd1306.begin(0x3c);
    ssd1306.clear((0));
    ssd1306.set_cursor(0,0);
    ssd1306.draw_hanzi_12("欢迎使用旺旺");
    ssd1306.display();
  taskEXIT_CRITICAL();
  vTaskDelete(NULL);
}

void setup()
{
  //{ID:0,keyword:"唤醒词",ASR:"旺旺",ASRTO:"我在"}
  //{ID:1,keyword:"命令词",ASR:"打开灯光",ASRTO:"好的,马上打开灯光"}
  //{ID:2,keyword:"命令词",ASR:"关闭灯光",ASRTO:"好的,马上关闭灯光"}
  //{ID:3,keyword:"命令词",ASR:"正方形",ASRTO:"马上执行"}
  //{ID:4,keyword:"命令词",ASR:"圆形",ASRTO:"马上执行"}
  //{ID:5,keyword:"命令词",ASR:"最大角度",ASRTO:"好的"}
  //{ID:6,keyword:"命令词",ASR:"中等角度",ASRTO:"好的"}
  //{ID:7,keyword:"命令词",ASR:"最小角度",ASRTO:"好的"}
  //{ID:8,keyword:"命令词",ASR:"大声一点",ASRTO:"好的"}
  //{ID:9,keyword:"命令词",ASR:"小声一点",ASRTO:"好的"}
  //{ID:10,keyword:"命令词",ASR:"最小音量",ASRTO:"好的"}
  //{ID:11,keyword:"命令词",ASR:"坐下",ASRTO:"我已经坐下了,主人"}
  //{ID:12,keyword:"命令词",ASR:"卧倒",ASRTO:"我已经 卧倒了,主人"}
  //{ID:13,keyword:"命令词",ASR:"起立",ASRTO:"我已经站立了,主人"}
  //{ID:14,keyword:"命令词",ASR:"趴下",ASRTO:"我已经趴下了,主人"}
  //{ID:15,keyword:"命令词",ASR:"打招呼",ASRTO:"你好"}
  //{ID:16,keyword:"命令词",ASR:"走路",ASRTO:"好的"}
  //{ID:17,keyword:"命令词",ASR:"生气",ASRTO:"好的"}
  setPinFun(3,SECOND_FUNCTION);
  setPinFun(2,SECOND_FUNCTION);
  setPinFun(5,SECOND_FUNCTION);
  setPinFun(6,SECOND_FUNCTION);
  servo_3.attach(3);
  servo_2.attach(2);
  servo_5.attach(5);
  servo_6.attach(6);
}

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

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

相关文章

Hadoop的一些高频面试题 --- hdfs、mapreduce以及yarn的面试题

文章目录 一、HDFS1、Hadoop的三大组成部分2、本地模式和伪分布模式的区别是什么3、什么是HDFS4、如何单独启动namenode5、hdfs的写入流程6、hdfs的读取流程7、hdfs为什么不能存储小文件8、secondaryNameNode的运行原理9、hadoop集群启动后离开安全模式的条件10、hdfs集群的开机…

TortoiseSVN图标不显示的解决

解决办法一:修改svn软件的图标设置 1、选中一个文件夹或在桌面空白处,右击进入svn的setting 2、进入setting->Icon Overlays,Status cache选择Default或shell,然后点击应用 3、查看文件,图标可以正常显示 解决办法…

ubuntu下载安装部署docker,ubuntu下载最新的docker

1.#如果Ubuntu自带的Docker版本太低,我们需要卸载旧版本并安装新的 sudo apt-get remove docker docker-engine docker.io containerd runc2.# 备份原有软件源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak3.选择合适的镜像源 # 或者使用清华大学sudo…

利用WPF绘制轮廓并保存为图片

1.前言 WPF作为显示工具也挺好用,用C#开发应用软件会比较省力,当然也有其缺点,如在对效率要求较高的情况下有性能问题,本文记录用WPF绘制轮廓并保存为图片相关内容。 显示效果也还不错,满足调试使用了&#xf…

变电站缺陷数据集8307张,带xml标注和txt标注,可以直接用于yolo训练

变电站缺陷数据集8307张, 带xml标注和txt标注,可以直接用于yolo训练,赠附五个脚本 变电站缺陷数据集 数据集概述 变电站缺陷数据集是一个专门针对变电站设备和环境缺陷检测的图像数据集。该数据集包含了8307张经过标注的图像,旨…

Maven和Springboot初识

(一)Maven Maven是一个项目管理工具,通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具 (可以通过pom.xml文件的配置来获取jar包,而不用手动添加) Maven可以提高我们的开发效率减少…

Mistral AI 又又又开源了闭源企业级模型——Mistral-Small-Instruct-2409

就在不久前,Mistral 公司在开源了 Pixtral 12B 视觉多模态大模型之后,又开源了自家的企业级小型模型 Mistral-Small-Instruct-2409 (22B),这是 Mistral AI 最新的企业级小型模型,是 Mistral Small v24.02 的…

C++源代码封装成dll动态链接库,并在WPF项目中使用的步骤说明

文章目录 1. 创建并生成C的DLL(C动态链接库)(1)新建项目-->开发语言选定C,在搜索栏搜索“动态链接库”-->配置项目名称和路径-->添加类,此处命名为My_C_Class(2)实现类的功能&#xff…

Elasticsearch 下载安装及使用总结

官网文档地址:Elasticsearch Guide [8.13] 官网下载地址:Download Elasticsearch 1. 下载安装 1、下载对应系统的版本 这里下载的 Elasticsearch 版本为 8.13.2,Elasticsearch 依赖 Java,因此要先在服务器上安装 JDK&#xff…

SOLIDWORKS® 2025 新增功能 - SIMULATION

SOLIDWORKS Simulation 1常规弹簧连接 • 通过定义仅轴向、各向同性或正交各向异性弹簧, 在曲面之间轻松创建自定义弹簧连接。 • 通过添加自定义合规性提高仿真性能和精度。 优点 利用新的弹簧连接功能, 实现更简单、更逼真的仿真 设置。 2增强了…

Unity 百度AI实现无绿幕拍照抠像功能(详解版)

目录 一、前言 1.抠像效果 2.去哪找百度ai抠图 3.基础流程跳过 二、获取AccessToken 1.什么是Token 2.为什么要获取Token 3.如何获取token 4.解析json 5.完整代码 三、抠像 1.准备地址 2.建立链接,和基本配置 3.图片格式转换 4.开始上传 5.获取回复…

SpringBoot 整合docker,执行容器服务

我使用以下文章的镜像作为演示镜像,读者有自己的镜像可以使用自己的 TencentARC/GFPGAN人脸恢复Ubuntu-22.04搭建(附带Docker镜像)_tencentarc gfpgan-CSDN博客 1. 封装springboot 启动docker容器的方法 public String runDockerCommand(String[] command) {StringBuilder res…

代码随想录Day 49|leetcode题目:42.接雨水、84.柱状图中最大矩形

提示:DDU,供自己复习使用。欢迎大家前来讨论~ 文章目录 题目题目一:42. 接雨水解题思路:暴力解法双指针优化思路:单调栈解法单调栈处理逻辑 题目二: 84.柱状图中最大的矩形解题思路:暴力解法双…

闯关leetcode——35. Search Insert Position

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/search-insert-position/description/ 内容 Given a sorted array of distinct integers and a target value, return the index if the target is found. If not, return the index where it wou…

【数据结构】排序算法---冒泡排序

文章目录 1. 定义2. 算法步骤3. 动图演示4. 性质5. 算法分析6. 代码实现C语言PythonJavaCGo 结语 1. 定义 冒泡排序(英语:Bubble sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的…

svn回退到以前历史版本修改并上传

svn回退到以前版本,并在以前版本上修改代码后,上传到svn库当中,如下步骤: 3、 以回退到版本号4为例:选中版本号4,右键->Revert to this version,在出现的对话框中 点击yes! 4、 5、

【ARM】Trustzone和安全架构

Trustzone的基本概念&背景和历史 什么是Trustzone? 什么是TEE? Trustzone是一个技术,是一个技术的设计,一个安全架构,既不是软件也不是硬件。 TEE (Trusted Execution Environment) 可信执行环境。就是依托Trust…

Java项目——苍穹外卖(二)

Redis 简介 Redis是一个基于内存的key-value结构数据库 基于内存存储,读写性能高适合存储热点数据(热点商品、资讯、新闻)企业应用广泛 基础操作 启动 在redis安装目录中打开cmd,输入如上图指令即可启动,按下crtl…

linux入门到实操-6 Linux服务管理、系统运行级别、配置服务开机启动和关闭防火墙、关机重启

教程来源:B站视频BV1WY4y1H7d3 3天搞定Linux,1天搞定Shell,清华学神带你通关_哔哩哔哩_bilibili 整理汇总的课程内容笔记和课程资料(包含课程同版本linux系统文件等内容),供大家学习交流下载:…

html详细知识

1-标题标签、水平线、字体标签 <!--1.标题标签1&#xff09;格式&#xff1a;<hn></hn> n的范围是1-6&#xff0c;依次递减2&#xff09;标题标签特点&#xff1a;a:单独占一行b:自动加粗2.水平线1&#xff09;格式&#xff1a;<hr/>2)属性&#xff1a;…