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

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

3天内不再提示

【HarmonyOS HiSpark Wi-Fi IoT 套件试用连载】基于鸿蒙操作系统的《爱若琉璃》(蜂鸣器版本)

开发板试用精选 来源:开发板试用 作者:电子发烧友论坛 2022-11-04 16:41 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文来源电子发烧友社区,作者:juby, 帖子地址:https://bbs.elecfans.com/jishu_2009947_1_1.html


先上效果:《爱若琉璃》(蜂鸣器版本)

前言
经过一段时间的分享,基于Hi3861开发板鸿蒙开发已经完成了下面核心板和OLED板两个子板的分享了。
我们今天分享红绿黄灯板上的资源,对应原理图在下面文件中:
HiSpark_WiFi_IoT_SSL_VER.A.pdf
这个红绿灯板子上有三个LED,分别是红黄绿三种颜色;
此外还有一个按键和一个无源蜂鸣器;
对应资源如下表所示:
[td]
板载资源 系统资源
红灯_RED D10(GPIO10)/UART2_CTS/SPI0_CLK/PWM1_OUT/I2C0_SDA
黄灯_YELLOW A12(GPIO12)/UART2_RXD/SPI0_CS1/ADC0/PWM3_OUT
绿灯_GREEN A11(GPIO11)/UART2_TXD/SPI0_RXD/ADC5/PWM2_OUT
蜂鸣器_BEEP(MLT-8530) A9(GPIO09)/UART2_RTS/SPI0_TXD/ADC4/PWM0_OUT/I2C0_SC
按键_SWITCH MOSI(SPI0_TXD)/GPIO08/PWM1_OUT
LED和按键的驱动我们之前已经分享过了,请参见下文:HarmonyOS实现点亮LED
基于鸿蒙OS的按键驱动
一个ADC实现多个按键检测
今天我们介绍一下鸿蒙系统下PWM的使用方法。
实现目标1. 蜂鸣器演奏歌曲《爱若琉璃》2. 解决上次《你笑起来真好看》遗留问题,实现点击蜂鸣器板子上的按键,控制音乐播放或停止蜂鸣器原理图
当BEEP为高电平的时候,三极管MMBT3904导通,蜂鸣器B1有电流流过;当BEEP为低电平的时候,三极管截止,蜂鸣器B1没有电流流过。
按键中断按键初始化
设置按键对应GPIO08为输入、上拉模式的GPIO,并设置上升沿的中断函数为:OnButtonPressed_isr
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_IO_FUNC_GPIO_8_GPIO);
GpioSetDir(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_GPIO_DIR_IN);
IoSetPull(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_IO_PULL_UP);
GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_INT_TYPE_EDGE, WIFI_IOT_GPIO_EDGE_RISE_LEVEL_HIGH, OnButtonPressed_isr, NULL);
按键中断函数
中断函数中主要改变控制音乐播放的一个布尔变量,在真和假之间来回切换。
static void OnButtonPressed_isr(char* arg) {
(void)arg;

printf("[beep_demo.c] OnButtonPressed() rn");

bSongPlaying = !bSongPlaying;
}
PWM脉冲产生PWM初始化hi_pwm_set_clock(PWM_CLK_XTAL); //设置时钟源为晶体时钟;
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_PWM0_OUT);//IO复用为PWM功能
ret = GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_OUT);//设置为输出
if (ret != WIFI_IOT_SUCCESS) {
printf("===== ERROR ======gpio -> GpioSetDir ret:%d rn", ret);
return;
}
hi_pwm_init(HI_PWM_PORT_PWM0);//初始化PWM
BUILD.gn文件
改写工程中的两个BUILD.gn文件。
编译
添加完上面代码,如果直接编译的话,会报如下错误:
出错的原因是未开启PWM功能,开启PWM功能:
在 vendorhisihi3861hi3861buildconfigusr_config.mk 文件中下图位置,添加一行代码:CONFIG_PWM_SUPPORT=y
再编译就没有问题了。
测试PWM功能
改变PWM输出使用如下两个函数:
hi_u32 hi_pwm_stop(hi_pwm_port port)
hi_u32 hi_pwm_start(hi_pwm_port port, hi_u16 duty, hi_u16 freq)
修改参数freq可以修改输出脉冲的频率,修改参数 duty可以改变占空比。
执行hi_pwm_start()函数开始PWM输出,执行hi_pwm_stop()函数PWM输出停止。
测试一hi_pwm_stop(HI_PWM_PORT_PWM0);
hi_pwm_start(HI_PWM_PORT_PWM0, 1, 2); //25ns/25ns
测试一测试二hi_pwm_stop(HI_PWM_PORT_PWM0);
hi_pwm_start(HI_PWM_PORT_PWM0, 3, 10); //75ns/250ns
测试二测试三hi_pwm_stop(HI_PWM_PORT_PWM0);
hi_pwm_start(HI_PWM_PORT_PWM0, 30, 100); //0.75us/2.5us
测试三
由上面的测试,我们可以得出,参数 duty 和 freq 的值,1单位代表25 ns。
实现《爱若琉璃》乐谱
现在我们实现了PWM输出的控制,接下来就是实现本文的目标了,实现蜂鸣器演奏《爱若琉璃》,蜂鸣器演奏音乐的原理详见之前网文:
蜂鸣器演奏音乐“你笑起来真好看”
由上面的网文我们知道,要想完成一个乐谱,我们只要确定“音符(音调)”和“节拍”即可。
音调表示一个音符响的频率,节拍表示一个音符该唱多长的时间。
音符(音调)的确定
一般钢琴键盘有88个按键:
钢琴上88按键的频率如下表所示:
比如中央C音的标准频率就是261,在上面表格中就是:音名为C4的按键。
程序中定义一个音频的数组:
因为上面初始化PWM的时候,使用的是外部晶振作为时钟源hi_pwm_set_clock(PWM_CLK_XTAL);
根据上面示波器中实测的结果可以推算出,这个时钟源为40M。
而输出的脉冲频率由这个函数决定的:hi_u32 hi_pwm_start(hi_pwm_port port, hi_u16 duty, hi_u16 freq)
参数freq决定了脉冲的频率,这个参数是hi_u16类型,那么这个参数的有效范围为:2~65535。
所以输出的脉冲的最低频率为:40M / 65535 (下面有计算方法) ,即40 * 1000 * 1000 / 65535 = 610.3608758678569‬
所以这个Hi3861芯片只能产生频率610以上的音,即D#5及以上的按键音,所以我们选择C6那组按键的音作为主音。所以我们预定义正常音的C6对应数组的索引为63。#define N_B 63
我们要想让蜂鸣器发出某个音只需要让PWM输出对应频率的脉冲即可:
网上找个《爱若琉璃》的简谱,然后按照对应关系创建如下乐谱数组:
在这里插入图片描述节拍的确定
节拍就是一个音持续的时间,这里就是PWM脉冲持续的时间,那么持续的时间如何确定呢?
播放一个音
音符(音调)和节拍的计算方法我们上面介绍完了,那么如果我们利用蜂鸣器播放第一个音,应该怎么确定呢?
要想播放一个音,就要使用hi_pwm_start()函数来产生一定频率的脉冲信号
那频率是怎么计算出来的呢?也就是下面代码中delay_time这个变量是怎么计算出来的呢?
delay_time = 40 * 1000 * 1000/((hi_u32)pitch_names_frequency[ai_ruo_liu_li[0]]);
hi_pwm_start(HI_PWM_PORT_PWM0, delay_time / 2, delay_time);
由上面示波器我们得出,hi_pwm_start()函数的最后一个参数,一个单位长度为25ns(即:1/(40*1000*1000)),所以我们发送一定频率的脉冲,其实传进去的参数即为单位长度(25ns)的个数,具体推导过程如下:
参数换算原理
一个音确定完之后,只要将这个音按照节拍播放即可,然后遍历完咱们自己转换的乐谱数组即可完成整首歌曲的播放。
因为在按键的中断函数中,每按一次,改变一次布尔变量bSongPlaying的真假。
通过布尔变量bSongPlaying的真假,我们可以实现控制音乐播放的开启或停止。


结果展示视频展示请移步B站观看:
https://www.bilibili.com/video/BV1sa411w7rh#reply3721065146
资料获取
公众号留言区置顶留言获取本文对应工程文件及《爱若琉璃》的简谱。
ps: 文章首发于电子发烧友。
欢迎关注
程序员小哈带你玩转嵌入式,微信搜索:嵌入式从0到1,更多干货等着你。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • wi-fi
    +关注

    关注

    15

    文章

    2460

    浏览量

    129996
  • HarmonyOS
    +关注

    关注

    80

    文章

    2157

    浏览量

    36280
  • HiSpark
    +关注

    关注

    1

    文章

    156

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    技术资讯 I Wi-Fi 模块设计

    本文要点Wi-Fi模块设计旨在打造一套紧凑且高效的硬件和软件解决方案,使设备能够通过Wi-Fi网络实现通信。Wi-Fi模块设计是一个复杂的过程,要求研发人员兼具硬件与软件工程方面的专业知识
    的头像 发表于 02-27 17:12 850次阅读
    技术资讯 I <b class='flag-5'>Wi-Fi</b> 模块设计

    Wi-Fi:无线连接的全球通用语

    与数据链路层的规范。 l Wi-Fi联盟:成立于1999年的国际组织,负责Wi-Fi商标认证、技术推广与互操作性测试。 l 频段:主要使用2.4GHz与5GHz频段,部分支持6GHz,不同频段在覆盖、穿透
    发表于 01-07 09:49

    Nordic发布nRF7002 EBII 开发板, 支持Wi-Fi 6, 解锁nRF54L新玩法

    Wi-Fi 6 功能,帮助开发人员创建高性能、高能效的Wi-Fi 6 物联网解决方案。 基于 Nordic 的 nRF7002 Wi-Fi 协同 IC,nRF7002 EBII帮助 采用
    发表于 12-10 11:58

    Wi-Fi模块选型指南 | 低功耗蓝牙/Wi-Fi 6模块推荐 | 物联网设备集成攻略

    物联网的快速发展,Wi-Fi技术的成熟的情况下,越来越多的场景需要用到Wi-Fi来无线传输数据,尤其是移动设备中,怎么再设备中选择合适的Wi-Fi模块呢?下面我们来介绍下Wi-Fi模块
    的头像 发表于 12-09 11:27 1307次阅读
    <b class='flag-5'>Wi-Fi</b>模块选型指南 | 低功耗蓝牙/<b class='flag-5'>Wi-Fi</b> 6模块推荐 | 物联网设备集成攻略

    浅谈Wi-Fi 6E与Wi-Fi 7的关键器件——BAW滤波器新技术

    作者: Qorvo 亚太区无线连接事业部高级行销经理林健富   2020年1月,Wi-Fi联盟正式宣布开放6GHz频段(5925MHz-7125MHz),并将其命名为Wi-Fi 6E。2020年4月
    发表于 09-19 18:29 2444次阅读
    浅谈<b class='flag-5'>Wi-Fi</b> 6E与<b class='flag-5'>Wi-Fi</b> 7的关键器件——BAW滤波器新技术

    解读Nordic基于SSID的Wi-Fi定位解决方案

    ,与 nRF91 系列蜂窝物联网模组配合使用,可实现基于 SSID 的 Wi-Fi 定位。Nordic基于SSID的Wi-Fi定位可以在室内和室外、城市和郊区以极其省电的方式获取精确的位置信息。这是对全球导航卫星系统(GNSS)
    的头像 发表于 09-09 17:11 3977次阅读
    解读Nordic基于SSID的<b class='flag-5'>Wi-Fi</b>定位解决方案

    如何更新 NuMaker IoT 板上的 Wi-Fi 模块固件?

    更新 NuMaker IoT 板上的 Wi-Fi 模块固件
    发表于 09-04 08:28

    基于 SSID 的 Wi-Fi 定位:与其他定位服务的性能比较

    导航卫星系统(GNSS)的重要补充,尤其是在建筑物和密集城区,GNSS 可能会因信号衰减和中断而失效。 本博文将介绍我们基于 SSID 的 Wi-Fi 定位解决方案的工作原理以及如何开始测试。然后
    发表于 08-31 21:01

    LitePoint Wi-Fi测试软件减轻客户设计负担

    Wi-Fi 7于一年多前获得Wi-Fi联盟认证以来,作为最新一代通信技术,Wi-Fi正逐步成为用户实现无所不在无线连接的新选择。随着每一代Wi-Fi信号复杂性的提升,建议将硬件测试纳
    的头像 发表于 08-06 15:34 1368次阅读
    LitePoint <b class='flag-5'>Wi-Fi</b>测试软件减轻客户设计负担

    有没有什么修复方法可以确保 AP 模式下的 Wi-Fi 和 BLE 连接同时正常工作?

    我正在使用 CYBSYSKIT DEV 01 套件。我尝试在 AP 模式下打开 Wi-Fi 并宣传 BLE。我可以宣传 SoftAP 和 BLE。但是,我无法从中央设备连接到 BLE。它可以立即连接并断开连接。有没有什么修复方法可以确保 AP 模式下的
    发表于 07-17 06:13

    HarmonyOS 5】金融应用开发鸿蒙组件实践

    原生鸿蒙操作系统星河版,面向开发者开放申请,余承东宣布鸿蒙生态设备数达 8 亿台;建设银行、邮储银行等完成鸿蒙原生应用 Beta 版本开发
    的头像 发表于 07-11 18:20 1120次阅读
    【<b class='flag-5'>HarmonyOS</b> 5】金融应用开发<b class='flag-5'>鸿蒙</b>组件实践

    科普|公司的Wi-Fi,为什么这么慢?

    大家在公司上班,经常会使用到Wi-Fi。最近这几年,随着时代的发展,高清视频会议等大带宽网络应用越来越普遍。而公司的网络,却非常不给力,频繁卡顿,严重影响使用体验。哪怕IT的同事已经把网络优化得很
    的头像 发表于 06-20 06:06 1790次阅读
    科普|公司的<b class='flag-5'>Wi-Fi</b>,为什么这么慢?

    Wi-Fi 8:开启极高可靠性 (UHR) 连接的新纪元——1

    英国作家狄更斯在《双城记》的开头写道:“这是最好的时代,也是最坏的时代。” 这句话套用在现今Wi-Fi 的市场现状,何尝不是惊人的相似? 怎么说呢?Wi-Fi 从被发明至今已经经过了20多年的迭代
    发表于 06-13 11:09

    连接到 WPA3_WPA2_PSK 或 WPA3_SAE Wi-Fi 网络时系统挂起,为什么?

    问题:连接到 WPA3_WPA2_PSK 或 WPA3_SAE Wi-Fi 网络时系统挂起 我遇到一个问题,当我尝试连接启用了CY_WCM_SECURITY_WPA3_WPA2_PSK安全性
    发表于 06-05 07:23

    Wi-Fi HaLow如何突破传统Wi-Fi性能瓶颈?

    视频推荐在万物互联的时代,传统Wi-Fi在覆盖范围、功耗、连接数上渐显不足。而Wi-FiHaLow的诞生,正在用黑科技打破传统Wi-Fi的性能瓶颈!今天,我们一起来探究Wi-FiHaL
    的头像 发表于 04-22 11:38 1401次阅读
    <b class='flag-5'>Wi-Fi</b> HaLow如何突破传统<b class='flag-5'>Wi-Fi</b>性能瓶颈?