前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。
人工智能编程入门博客

前言

经过一段时间的分享,基于Hi3861开发板的鸿蒙开发已经完成了下面核心板和OLED板两个子板的分享了。

我们今天分享红绿黄灯板上的资源,对应原理图在下面文件中:

HiSpark_WiFi_IoT_SSL_VER.A.pdf

这个红绿灯板子上有三个LED,分别是红黄绿三种颜色;

此外还有一个按键和一个无源蜂鸣器;

对应资源如下表所示:

板载资源 系统资源
红灯_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() \r\n"); 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 \r\n", ret);return;
}
hi_pwm_init(HI_PWM_PORT_PWM0);//初始化PWM

BUILD.gn文件

改写工程中的两个BUILD.gn文件。

编译

添加完上面代码,如果直接编译的话,会报如下错误:

出错的原因是未开启PWM功能,开启PWM功能:

在 \vendor\hisi\hi3861\hi3861\build\config\usr_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

资料获取

写文不易,请三连鼓励一下,谢谢各位!

文中对应工程文件及《爱若琉璃》的简谱:

链接:https://pan.baidu.com/s/1hiNs7EYxHOYHx8HelB1UdQ
提取码:0101

若觉得本次分享的文章对您有帮助,随手点赞、[在看]或转发分享,也是对我的支持。谢谢啦。

ps: 文章首发于电子发烧友。

欢迎关注

程序员小哈带你玩转嵌入式,微信搜索:嵌入式从0到1,更多干货等着你。

基于鸿蒙操作系统的爱若琉璃(蜂鸣器版本)相关推荐

  1. 基于鸿蒙操作系统的鸿蒙信息搜索引擎

    基于鸿蒙操作系统的鸿蒙信息搜索引擎 [中原工] 创建项目 登录华为账号 选择p40虚拟机 Ui设计 广告页面 页面代码 <?xml version="1.0" encodin ...

  2. 基于鸿蒙操作系统的单个按键长按、短按的实现

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 人工智能编程入门博客 长按.短按的应用 我们之前在下面网文中介绍过了ESP8266模块的配网: Wi ...

  3. 没有基于鸿蒙系统的app吗,华为鸿蒙操作系统为什么没有应用到手机?

    原标题:华为鸿蒙操作系统为什么没有应用到手机? 华为鸿蒙操作系统自20198月9日在东莞发布以来,已经经过了大半年的沉淀,这大半年间华为也是 发布了很多新款手机,为什么就没有一款基于鸿蒙操作系统的手机 ...

  4. 32蜂鸣器天空之城代码_stm32版蜂鸣器播放爱若琉璃

    在小哈公众号上,公众号:嵌入式从0到1,小哈用鸿蒙平台做了个播放爱若琉璃歌曲的文章,写的非常详细,视频做的也非常好,伙伴们可以去看看,哈哈,说了这么多,就是为了抄点素材...鉴于stm32f103c8 ...

  5. 借华为鸿蒙系统发布,谈谈操作系统的爱恨情仇发展史

    2019.08.09,华为在其全球开发者大会上,正式向全球发布了全新的自有系统 HarmonyOS 鸿蒙--基于微内核的面向全场景的分布式操作系统.余承东在现场表示, HarmonyOS 鸿蒙拥有分布 ...

  6. 起航---开发基于国产华为鸿蒙操作系统的APP

    起航---开发基于国产华为鸿蒙操作系统的APP 从今儿个起,要准备学习开发三驾马车(苹果.安卓.华为)中的华为移动应用啦.很期待

  7. 基于Tiny-51操作系统的51单片机温度测控系统设计

    文章目录 基于Tiny-51操作系统的51单片机温度测控系统设计 一.设计题目 二.设计要求 三.设计作用及目的 四.硬件设计 五.软件流程 六.调试界面 七.心得体会 八.程序源码 基于Tiny-5 ...

  8. 鸿蒙开发实例 | 鸿蒙操作系统的前世今生

    已经写了有几篇关于鸿蒙系统的开发实例文章了,那到底什么是鸿蒙系统呢,又为什么万物互联必须得是鸿蒙呢,今天的文章带你了解鸿蒙系统的前世今生! 2021年6月2号,华为的鸿蒙操作系统及全场景新品发布会如期 ...

  9. 基于RT-Thread操作系统的 基础四轮组智能车设计与实践

    学 校: 同济大学 队伍名称: 智行·龙卷风 参赛队员: 杨怡,韦炳宇,许泽华 带队教师: 张志明,余有灵 §01 引言 1.1全国大学生智能车竞赛介绍 全国大学生智能汽车竞赛是以智能汽车为研究对象的 ...

最新文章

  1. AliOS Things lorawanapp应用介绍
  2. 在 Windows 10 中开启移动 WLAN 热点
  3. 如何用css实现等高布局。
  4. android logcat里面AndroidRuntime FATAL EXCEPTION: main这个是什么问题啊。
  5. protobuf版本冲突
  6. akka和rabbitmq_Akka Notes –演员记录和测试
  7. python tab补全
  8. Javascript 操作二进制数据
  9. 浅谈JSONP 的本质工作原理
  10. Excel中的VLOOKUP函数之数据匹配
  11. 基于91助手实现80/54坐标转换到2000大地坐标的七参数计算
  12. Cortex-M4和Cortex-M7中的SIMD指令
  13. correl函数_WPS表格办公— CORREL 函数的用法
  14. 转载:Eb/No和SNR的区别
  15. 计算机R5,IT教程:电脑r5和r7是什么意思
  16. 【16人抢答器程序】
  17. 信息学奥赛一本通 1256:献给阿尔吉侬的花束 | OpenJudge NOI 2.5 7218:献给阿尔吉侬的花束
  18. 以太坊 智能合约(六)
  19. 使用RandomAccessFile实现多线程下载
  20. 上证50指数和沪深300指数

热门文章

  1. MathType 转Latex过程中 No translation available for 黑粗体大写字母R(0x211D) 的问题
  2. 如何把mac照片导入u盘_苹果电脑怎么拷贝文件到u盘_苹果电脑拷贝文件到u盘的方法-系统城...
  3. mysql navicat 组合索引_mysql组合索引与字段顺序
  4. 环境变量的作用和设置方法
  5. 基于MATLAB/Simulink的电力电子电路仿真技术——Simulink与MATLAB的接口设计
  6. Windows10+VS2017下安装和 编译openssl库
  7. ubuntu 18.04 安装nvidia cuda10 还想玩steam。。。
  8. 转:辐射度算法(radiosity)原理
  9. 管理类联考——英语二——技巧篇——写作——图表作文——经典方法论
  10. python怎么下载-在网上看到一个视频!怎么下载下来啊?