0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

安信可VC-01/02二次开发篇: 事件和GPIO控制

AIoT行业洞察 ? 来源:AIoT行业洞察 ? 作者:AIoT行业洞察 ? 2025-08-19 14:02 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

安信可离线语音VC01/02:硬件规格书、开发资料、烧录工具、应用开发

安信可离线语音模组 VC-01、VC-02 系列教程 【基础认知篇】

安信可离线语音模组 VC-01、VC-02 系列教程 【快速上手篇】

安信可离线语音模组 VC-01、VC-02 系列教程 【中级入门篇】

安信可离线语音模组 VC-01、VC-02 系列教程 【高级进阶篇】

安信可离线语音模组 VC-01、VC-02 系列教程 【二次开发篇】虚拟开发环境搭建和分享

安信可离线语音模组 VC-01、VC-02 系列教程 【二次开发篇】事件和GPIO控制

安信可离线语音模组 VC-01、VC-02 系列教程 【二次开发篇】PWM输出

安信可离线语音模组 VC-01、VC-02 系列教程 【二次开发篇】串口输出

安信可离线语音模组 VC-01、VC-02 系列教程 【二次开发篇】SDK音频替换失败记录过程

安信可离线语音模组 VC-01、VC-02 系列教程 【二次开发篇】自定义音频播放控制

简介

在上一篇文章中,我们已经成功搭建好了VC系列的Linux开发环境,使用VScode进行了远程连接,成功进入到了下载后的SDK固件源码中,并且进行了编译等操作。

在本章我将对SDK中常见的模块进行解析,并且带着大家编译一个通过安信可语音平台生成固件中的语音唤醒或者控制事件在源码中进行自定义的操作(即在安信可语音平台生成语音唤醒词和控制命令的时候,并不指定控制行为而是通过在SDK里指定控制行为)。

准备工作

首先给大家看一下默认生成的固件配置信息(来自安信可语音平台

wKgZPGikE22ATAteAACUopVyWlw40.jpeg

下图为配置的控制行为。

wKgZO2ikE26ACvhxAABCMluUU8E91.jpeg

可以从以上两个图中看到, 我们仅仅是配置了默认的唤醒和1个控制行为。 但是这个控制行为并没有对应的命令(无法点亮LED灯或者关闭LED灯)。

之后我们生成对应的SDK,并把它下载到虚拟机中(替换上一个帖子中下载的SDK,在文末会附上本次生成的SDK文件)。

wKgZPGikE26AP6EwAAAsqNGADyk50.jpeg

SDK重要组件介绍

1、首先看

~/Downloads/uni_hb_m_solution/unione_lite_app_hb_m/tools/scripts下的tones 目录和 wav_tones 目录。

wKgZO2ikE26AUBVWAACLwg_d84U89.jpeg

这两个目录主要保存安信可语音平台生成的音频文件。

即所有的音频输出(唤醒词回复词等),在程序编译后,其音频文件会被编译成PCM文件,然后由VC-01/ 02进行播放。

2、开发板PIN初始化配置信息

/home/vc02/Downloads/uni_hb_m_solution/unione_lite_app_hb_m/tools/scripts/custom_config.json

wKgZO2ikE2-AV3UkAADdzD0PLRE88.jpeg

当前的文件主要记录了在安信可语音平台中配置的PIN的初始化信息。

如下图所示(不建议在代码中配置, 推荐使用安信可语音平台进行)。

wKgZPGikE2-ARusAAABgltdNbc465.jpeg

3、cmd_reply_data.json 文件,

位于/home/vc02/Downloads/uni_hb_m_solution/unione_lite

_app_hb_m/tools/scripts/ 下

wKgZO2ikE2-AQyl2AADSCpgeT0Y55.jpeg

拿唤醒词“你好小美”举例子, 这里主要的JSON key 有PCM, CMD

PCM决定当前的命令词触发的时候将会播放哪些音乐

CMD则是做为对应唤醒事件的KEY(稍后会解释这个是什么意思)

4、二次开发集成的example配置文件user_config.h 文件,

位于 ~/Downloads/uni_hb_m_solution/unione_lite_app_hb_m/user/inc

wKgZPGikE3CAVVudAADzzR7Gxq440.jpeg

在默认的SDK中,其开启的Macro 为 USER_DEMO_AUTO_GPIO 。 所以用户的自定义功能将会使用example下的hb_auto_gpio.c 文件作为额外自定义功能。

以此类推,如果开启的是USER_DEMO_BUZZER 宏, 那么开启的Demo则为

/home/vc02/Downloads/uni_hb_m_solution/unione_lite_app_hb_m/user/src/examples

下的hb_timer_buzzer.c

wKgZO2ikE3CAPv_BAAC6viDrB5M41.jpeg

而当前开发板所有支持的二次开发的库函数的定义则都

/home/vc02/Downloads/uni_hb_m_solution/unione_lite_app_hb_m/user/inc 目录下。

wKgZPGikE3GARqjlAAEKFkyEjGg10.jpeg

这里所有库函数对应的例程都可以从example下找到。

5、user_event.h 位于inc 目录下, 此文件记录了所有开发板中可以触发的事件。 比如说识别到“”你好小美“或者是识别到对应的命令。

wKgZO2ikE3GARuOgAADQ0Mx6F4U83.jpeg

typedef enum {

USER_INVALID_EVENT = 0, ///< 错误的事件类型

USER_AUDIO_PLAY_START, ///< 音频开始播放时发送

USER_AUDIO_PLAY_END, ///< 音频播放完毕或被停止时发送

USER_CUSTOM_SETTING, ///< 识别到客户自定义的识别词时发送

USER_VOLUME_SETTING, ///< 识别到音量调节指令时发送

USER_GOTO_SLEEPING, ///< 进入待唤醒状态时发送

USER_GOTO_AWAKENED, ///< 进入识别状态(已唤醒)时发送

USER_EVENT_MAX

}USER_EVENT_TYPE;

上述列举了所有可以被用户订阅的事件,当对应的事件触发的时候,也会触发事件的callback function。

/** @brief 事件内容,共用体,根据事件类型具体处理*/

typedef union {

event_audio_play_t audio_play; ///< 对应USER_AUDIO_PLAY_START事件

event_audio_end_t audio_end; ///< 对应USER_AUDIO_PLAY_END事件

event_custom_setting_t custom_setting; ///< 对应USER_CUSTOM_SETTING事件

event_volume_setting_t voluem_setting; ///< 对应USER_VOLUME_SETTING事件

event_goto_sleeping_t goto_sleeping; ///< 对应USER_GOTO_SLEEPING事件

event_goto_awakend_t goto_awakend; ///< 对应USER_GOTO_AWAKENED事件

}user_event_context_t;

针对于上述事件的每一个事件, 其具备对应的事件内容。 比如说用户订阅了USER_GOTO_AWAKENED 事件。

那么便可以从user_event_context_tgoto_awakend 捕获到对应的事件内容,而对应事件的内容信息则被下述结构体定义,只举例唤醒事件(其他事件同理)。

typedef struct {

EVENT_TRIGGER trigger; ///< 触发来源

char *cmd; ///< 命令词意图,对应UDP平台上用户定义脚本中的action

char *word_str; ///< 识别到的命令词

char *reply_files; ///< 回复语列表[1, 2, 3],对应UDP平台上用户定义脚本中的回复语列表,在pcm_map.txt中可以找到对应关系

}event_goto_awakend_t;

这样就可以通过CMD来获取到对应的命令!

这里可以解释在 3- cmd_reply_data.json 文件中所说明的JSON KEY对应Value的作用。即用户可以根据对应的事件,判断对应的CMD来自定义行为,其支持的行为为所有Inc文件夹下包含的库函数。

GPIO控制

(通过使用唤醒词“你好小美”并关闭LED,使用命令词“打开台灯”打开LED)

明白原理之后, 我们便可以开始着手来开发GPIO功能, 即通过使用唤醒词:你好小美。关闭LED,使用命令词:打开台灯。打开LED。

需要注意的是: "你好小美" 是属于唤醒事件, 而打开台灯是属于命令事件。 打开台灯必须在你好小美之后触发。明白原理之后就可以很轻松的在example下的hb_auto_gpio.c 进行修改 (默认启用,上文有介绍)

首先在原本的_register_event_callback 方法中额外注册一个用户唤醒事件的回调:

user_event_subscribe_event(USER_GOTO_AWAKENED, _custom_setting_cb2);

如下图所示

wKgZPGikE3KAbnVtAABA66dYjs032.jpeg

之后拷贝原本的 _custom_setting_cb 方法

改名为 _custom_setting_cb2 (我这里不规范, 不要学习我这样的随意命名, 可以改成_custom_setting_wakeup_cb)。

static void _custom_setting_cb2(USER_EVENT_TYPE event,

代码解析:由于订阅的是USER_GOTO_AWAKENED 事件, 所以其联合体中goto_awakend 才会具有数据,因此需要根据上下文中的context 来获取到对应的goto_awakend从而来获取到对应的CMD命令 "wakeup_uni" (被cmd_reply_data.json 定义, 上文有介绍)。

这样就可以实现, 当识别到“你好小美” 的时候关闭LED灯。

同理可以实现通过命令词打开LED灯,代码如下所示:

static void _custom_setting_cb(USER_EVENT_TYPE event,

最终当识别到 “你好小美”的时候便会关闭LED, 当识别到 “打开台灯”等命令词的时候便会打开LED,实现用户的自定义控制~

编译烧录和测试

接下来可以在SDK的根目录来编译自己的固件了,执行命令:

./build.sh update

wKgZO2ikE3KAUIsRAAFGohPk6jk11.jpeg

此时可以打开output 文件夹,然后把uni_app_release_update.bin下载到本地电脑,使用 UniOneUpdateTool.exe 进行烧录。

wKgZPGikE3KASDUpAAAt8o-7Zr853.jpeg

下图为烧录成功界面:

wKgZO2ikE3OAP7M3AACVN1Swz8850.jpeg

实验

使用 “你好小美” 唤醒VC-02, 通过命令词“打开台灯”, LED 灯被点亮。

wKgZPGikE3OAKsgBAACniEoPKXA24.jpeg

使用 “你好小美” 唤醒VC-02, LED灯被熄灭。

wKgZO2ikE3OAA-BsAADtZVi3b3o53.jpeg

附件

固件和SDK

https://www.123865.com/s/UNArVv-k4UKd

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • VC
    VC
    +关注

    关注

    1

    文章

    115

    浏览量

    89499
  • GPIO
    +关注

    关注

    16

    文章

    1291

    浏览量

    54457
  • 安信可
    +关注

    关注

    0

    文章

    199

    浏览量

    4592
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CAXA2011二次开发,CRX; CAX2007二次开发

    CAXA2011二次开发,CRX; CAX2007二次开发,EBA QQ:46841341 电话:*** 何生 标题、明细、自动参数化产生图纸,PDM、PLM集成系统,面积、重量、各种个性化程序
    发表于 01-05 23:05

    仅1M flash 的 ESP-01S 模块,如何二次开发

    仅1M flash 的 ESP-01S 模块,如何二次开发,本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做
    发表于 07-22 09:28

    ESP-01S如何进行二次开发

    OTA的升级原理是什么?ESP-01和ESP-01S有哪些区别?ESP-01S如何进行二次开发?支持二次开发吗?仅仅1M的flash支持OT
    发表于 08-05 07:04

    ESP8266二次开发

    一开始做环境监测项目时是以STM32做控制板,外接传感器,Wifi模块的方案来做的。在收集Wifi模块资料的过程中发现ESP8266本身就是一个MCU并且可对其进行二次开发,也就是直接可以取消上一个
    发表于 11-03 07:22

    AutoCAD的二次开发

    AutoCAD的二次开发 AutoCAD的二次开发主要涉及以下内容:(1) 编写各种用户自定义函数并形成若干LISP、ARX、VLX或ADS文件,以及一些DCL
    发表于 02-14 16:59 ?1949次阅读

    ANSYS的二次开发技术

    ANSYS的二次开发技术 ANSYS提供的二次开发工具有三个:参数化设计语言(ANSYS Parametric Design Language,APDL),用户界面设计语言(User Interface
    发表于 10-02 10:42 ?2184次阅读

    基于VC的Cadence二次开发

    文中研究了用VC对Cadence做二次开发,使用VC编写操作界面,通过VC与SKILL语言通信,实现了VC界面对Cadence软件的
    发表于 10-19 14:38 ?41次下载
    基于<b class='flag-5'>VC</b>的Cadence<b class='flag-5'>二次开发</b>

    AutoCAD VBA二次开发教程

    AutoCAD VBA二次开发教程,学习二次开发的顶起
    发表于 11-02 16:16 ?0次下载

    二次开发串口通信协议

    lobot机器人二次开发
    发表于 05-09 08:55 ?7次下载

    支持快速二次开发的zigbee核心板

    关于zigbee组网协议,我们是否发现,只要涉及到二次开发,总会遇到各种无法预料的问题。zigbee二次开发大家都在抱怨什么?
    发表于 05-17 17:57 ?2321次阅读

    对功率计进行二次开发

    功率计做二次开发首先要确认的就是通讯的接口,ZLG致远电子PA300系列功率计提供USB、GPIB、以太网以及串口接口,4种接口免费标配,都可以用于二次开发
    的头像 发表于 04-29 15:12 ?3444次阅读

    空间光调制器的简便控制方法:灵活应用二次开发

    01.什么是二次开发模式? 二次开发模式实际上就是一组指令集,不同于一个有窗口的软件,这组指令集更像一根管道,管道的一端可以和任意编程软件对接,管道的另外一头就可以将结果展现在特定设备上,管道完成
    的头像 发表于 05-11 13:37 ?1044次阅读
    空间光调制器的简便<b class='flag-5'>控制</b>方法:灵活应用<b class='flag-5'>二次开发</b>

    新品发布 | 离线语音VC-01/02:卸掉APP,秒控你的家电!

    科技的VC-01/VC-02离线语音方案具有免联网、迅速响应、隐私安全保护、接入门槛较低等特点。
    的头像 发表于 06-13 16:15 ?1779次阅读
    新品发布 | 离线语音<b class='flag-5'>VC-01</b>/<b class='flag-5'>02</b>:卸掉APP,秒控你的家电!

    深居浅出AutoCAD二次开发

    深居浅出AutoCAD二次开发,net版
    发表于 01-06 14:12 ?9次下载

    【离线语音】VC-01/02教程:中级入门

    系列教程 【二次开发】虚拟开发环境搭建和分享 离线语音模组
    的头像 发表于 07-31 09:33 ?281次阅读
    【离线语音】<b class='flag-5'>安</b><b class='flag-5'>信</b><b class='flag-5'>可</b><b class='flag-5'>VC-01</b>/<b class='flag-5'>02</b>教程:中级入门<b class='flag-5'>篇</b>