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
    +关注

    关注

    14

    文章

    2065

    浏览量

    123763
  • HarmonyOS
    +关注

    关注

    79

    文章

    1949

    浏览量

    29758
  • HiSpark
    +关注

    关注

    1

    文章

    156

    浏览量

    6872
收藏 人收藏

    评论

    相关推荐

    如何记住ESP8266中的Wi-Fi凭据?

    您好,我正在与ESP8266合作,在公司进行一个项目。在成功智能配置后,我无法记住 Wi-Fi 凭据。ESP8266软件版本如下: 在GMR AT版本:1.2.0.0(Jul 1, 2016 20
    发表于 07-15 07:07

    Nvidia Jetson Nano + CYW55573/AWXB327MA-PUR M.2无法使用操作系统内置的网络管理器管理Wi-Fi如何解决?

    %E2%84%A2%20CYW5557.... 我们可以使用命令行指令成功连接互联网。 但是,我们无法使用操作系统内置的网络管理器管理 Wi-Fi。 网络管理器中与 Wi-Fi 相关的选项都是灰色
    发表于 05-23 06:47

    华为获得全球首个国际Wi-Fi联盟WFA企业级Wi-Fi 7认证!

    Wi-Fi联盟已发布Wi-Fi 7认证标准,华为是第一批送测厂商,获得业界首个企业级Wi-Fi 7 的Wi-Fi联盟官方认证。
    的头像 发表于 04-28 10:17 472次阅读
    华为获得全球首个国际<b class='flag-5'>Wi-Fi</b>联盟WFA企业级<b class='flag-5'>Wi-Fi</b> 7认证!

    验证物联网Wi-Fi HaLow用例的MM6108-EKH08开发套件来啦

    验证物联网Wi-Fi HaLow用例的MM6108-EKH08开发套件来啦 MM6108-EKH08开发套件专为验证物联网Wi-Fi HaLow用例而设计。该
    的头像 发表于 04-11 12:01 1473次阅读
    验证物联网<b class='flag-5'>Wi-Fi</b> HaLow用例的MM6108-EKH08开发<b class='flag-5'>套件</b>来啦

    Wi-Fi 7与Wi-Fi 6的相关知识科普

    科普:Wi-Fi 7 vs. Wi-Fi 6,青出于蓝
    的头像 发表于 03-12 10:59 552次阅读
    <b class='flag-5'>Wi-Fi</b> 7与<b class='flag-5'>Wi-Fi</b> 6的相关知识科普

    Wi-Fi的诞生与发展

    短距离无线通信技术有Wi-Fi、ZigBee、蓝牙以及Z-Wave,今天我们先揭开Wi-Fi的神秘面纱。Chrent短距离无线通信技术——Wi-Fi过去的20多年,Wi-Fi靠着仅有的
    的头像 发表于 03-07 08:26 915次阅读
    <b class='flag-5'>Wi-Fi</b>的诞生与发展

    Wi-Fi HaLow和传统Wi-Fi的区别

    Wi-Fi HaLow和传统Wi-Fi的区别  Wi-Fi是一种无线网络技术,可以连接到互联网或局域网,为用户提供无线上网的便利。随着科技的发展和互联网的普及,Wi-Fi也在不断演进和
    的头像 发表于 02-02 15:28 823次阅读

    康普携手Wi-Fi联盟,RUCKUS Wi-Fi 7系列接入点成Wi-Fi

     康普高级副总裁兼网络、智能蜂窝和安全解决方案总裁Bart Giordano对此表示: “我们非常荣幸能与Wi-Fi Alliance形成长期合作伙伴关系,将我们的RUCKUS Wi-Fi 7 接入点平台作为Wi-Fi CERT
    的头像 发表于 01-23 14:10 595次阅读

    BT Wi-Fi模式是否可以通过ModustoolBox对套件进行编程来实现?

    想配置用于分析 CYW43439 的 CY8CPROTO-062S2-43439 原型开发套件。 浏览文档我无法弄清楚如何在不同的 Wi-Fi 和蓝牙模式(电源模式、连接模式等)下配置套件。 在
    发表于 01-22 06:19

    华为发布原生版鸿蒙操作系统:不再兼容安卓

    华为在1月18日的发布会上,正式推出了HarmonyOS NEXT鸿蒙星河版操作系统,并面向开发者开放申请。这一新版本鸿蒙
    的头像 发表于 01-19 15:28 1187次阅读

    华为发布HarmonyOS NEXT鸿蒙星河版操作系统

    华为今日下午正式发布了备受瞩目的HarmonyOS NEXT鸿蒙星河版操作系统,并宣布即日起面向全球开发者开放申请。这一全新操作系统的推出,标志着华为在自主研发的道路上又迈出了坚实的一
    的头像 发表于 01-18 18:22 2615次阅读

    Wi-Fi 6和Wi-Fi 5之间有哪些区别呢?

    Wi-Fi 6和Wi-Fi 5之间有哪些区别呢? Wi-Fi 6和Wi-Fi 5是无线局域网标准的两个版本,它们之间存在很多区别。
    的头像 发表于 12-09 16:09 1848次阅读

    什么是2.4 GHz Wi-Fi? 如何提升2.4 GHz Wi-Fi的性能?

    什么是2.4 GHz Wi-Fi?2.4 GHz Wi-Fi的优势 2.4 GHz Wi-Fi的劣势 如何提升2.4 GHz Wi-Fi的性能?2.4 GHz和5 GHz
    的头像 发表于 11-27 17:09 2105次阅读

    鸿蒙操作系统的前世今生

    01、 鸿蒙操作系统发展沿革 鸿蒙这个名字意为“万物起源”,同时也寓意国产操作系统的开端。鸿蒙操作系统
    发表于 10-08 19:55

    摩尔斯微电子与卓越电子合作推出 Wi-Fi HaLow 物联网解决方案

    晶圆厂半导体公司摩尔斯微电子(Morse Micro),宣布与卓越电子(AsiaRF Corp)合作推出最新的 Wi-Fi HaLow IoT 解决方案。产品阵容包括 Wi-Fi HaLow 物联网
    发表于 10-08 15:27 444次阅读
    摩尔斯微电子与卓越电子合作推出 <b class='flag-5'>Wi-Fi</b> HaLow 物联网解决方案