文章简介
音乐教育有着悠久的发展历史。近年来,随着我国经济水平的不断提高,其发展势头极为迅猛。以钢琴——乐器之王为例,2019年音乐教育投入达54.22亿元,较2018年同比增长10.71%。节拍器作为钢琴学习中不可或缺的辅助工具,在培养速度感、演奏流畅性以及提升钢琴练习效率方面发挥着重要作用。
本文基于Stone-STVC070WT屏幕开发了一款音乐节拍器。该方案采用Stone-STVC070WT人机界面(HMI)屏幕作为显示控制平台,Arduino开发板作为节拍音频输出终端,打造了一款简单易用的音乐节拍器。
功能实现
- 节拍器UI功能界面,支持触摸操作;
- 频率设置功能,可通过触摸按钮在40至120次/分钟范围内以10为间隔进行调节;
- 节拍设置功能。通过触摸按钮,可悬挂选择1/4、2/4、3/4或4/4节拍;
- 播放控制功能,可启动或停止节拍执行;
- Arduino板驱动蜂鸣器实现节拍的音频输出;
- 串行通信实现屏幕与Arduino之间的信息交换。
系统原理与组成
系统主要由前端显示控制平台和后端执行终端两部分组成,具体实现原理如下。
作为显示控制平台,STONE HMI屏幕负责显示UI界面并提供触摸按钮。另一方面,用户的设置和播放暂停指令通过串口发送至执行终端。
后端执行终端采用Arduino板外接蜂鸣器的方案。首先,通过串口接收STONE HMI屏幕发送的设置参数,根据参数调整节拍功能,随后根据播放和暂停指令控制蜂鸣器的驱动。
电声节奏原理相对简单,通过PWM引脚驱动蜂鸣器发出两种音调(本质上是两种频率)的声音作为强弱信号,定时器控制节奏的频率。
系统硬件设计
- 显示控制前端硬件设计
1.1 Stone HMI模块
本文采用北京STONE科技有限公司的HMI屏幕,型号为STVC70WT-01,集成了TFT显示屏和触摸控制器。它包含处理器、控制程序、驱动器、闪存、RS232/RS485/TTL端口、触摸屏、电源等,是一款功能强大、易于操作的整体显示系统操作系统,可由任何单片微控制器控制。具备文本显示、图像显示、曲面显示、触摸、视频及音频播放等功能,丰富用户界面。内置闪存可存储数据、配置文件、图像等。
(1) STVC070WT-01产品特性
- 可由任意MCU控制;
- 显示图片/文字/曲线;
- 65536色TFT显示屏;
- 带/不带触摸屏;
- RS232/RS485/TTL UART接口及USB端口;
- 宽电压范围;
(2) 应用范围
广泛应用于各类工业领域、医疗美容设备、工程机械及车辆设备、电子仪器、工业控制系统、电力行业、民用电子设备、自动化设备、交通运输等。
1.2 电气连接
(1) 电源
HMI 屏幕的电源为 5V 起始电流,大于 600mA,由后端数据采集与处理平台的降压电路生成。具体细节请参见下一节的电路图。
(2) 通信
人机界面显示控制终端通过UART端口与后端平台进行通信。由于所用型号为STVC070WT-01,尾部-x1(X=0为RS232,X=4为RS485,X=1为TTL),因此通过TTL的UART接口与之通信,波特率设置为9600BPS。
1.3 开发步骤
STVC070WT-01 型 TFT LCD 模块仅需 4 个步骤:
- 使用 TOOL-2019 开发软件设计了一组美观的“图形用户界面”。
- 通过调试工具将编辑好的图形用户界面下载到 TFT LCD 屏幕。
- 通过RS232、RS485或TTL电平直接连接至客户的MCU。
- 在MCU端编写简单程序,使MCU通过命令控制TFT LCD模块(十六进制代码),无需其他操作。
- 后台终端硬件设计
2.1 硬件组成
(1) 控制电路采用Arduino Uno开发板。
-
- 微控制器:ATmega328P;
- 工作电压:5V;
- 输入电压(推荐):7-12V;
- 输入电压(限制):6-20V;
- 模拟输入引脚:6;
- 每个I/O引脚的直流电流:40mA;
- 3.3V引脚:50mA;
- 闪存:32KB(Atmega328);
- EEPROM:1KB(Atmega328);
- 时钟频率:16MHz;
(2) 蜂鸣器采用被动式蜂鸣器
蜂鸣器是一种电子声学元件,可发出“哔哔”声,仅需直流电源供电,应用范围非常广泛; 蜂鸣器分为主动式和被动式两种。区别在于内部是否含有振动源。我们选用被动式蜂鸣器,需通过2K-5K波形脉冲信号驱动才能工作。
2.2 主控芯片
ATmega328p是AVR公司生产的8位高性能微控制器。它具有32KB ISP闪存、1024B EEPROM、2KB SRAM、23个通用输入输出引脚(GPIO)、3个定时器、10位模数转换器(ADC)以及USART和SPI接口。其资源分配如下。
1 – UART,2 – SPI,1 – I2C;
1 个输入捕获,1 个 CCP,6 个 PWM;
系统软件设计
- 显示控制前端软件设计
(1) 开发过程
首先,构建项目并加载所需的图像到项目中。这里我们制作一个背景图像,包含“速度”和“节拍”选项,通过“+”和“-”进行调整,并添加两个播放和暂停的 ICO 图标,以满足控制需求。
其次,使用TOOL-2019进行控制生产,建立动态关联关系;主要控制元件包括:“文本”、“按钮”、“图标”、“按钮返回”、“增量调整”;
第三,进行软件仿真、编译及生成可执行文件;
第四,通过调试工具将HMI屏幕连接至电脑,并将可执行文件下载至屏幕。
(2) 如何实现“速度”控制
设置值显示控制“数据变量显示”并命名为“速度”,其值设置为“120”。然后在其周围放置增减调整控制“增量调整”,并将增量间隔设置为“10”。
(3) 以相同方式设置“节拍”
(4) 实现旋转播放按钮
明确说明通信处理方式;
(5) 实现“播放”和“暂停”的串行通信控制
- 后端执行终端的软件设计
(1) 驱动蜂鸣器产生节拍的音调
Arduino封装了一个名为tone()的函数,其输入参数为驱动引脚和频率。频率越高,音调越高,原理为PWM。
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
int pinBuzzer = 3; // Pin D3 is connected to the signal pin of the buzzer module
void setup()
{
PinMode (pinBuzzer, the OUTPUT);// Set the Pinbuzzer foot to output
}
void Beep(long fre,unsigned int on,unsigned int off)
{
Long frequency = MAC;// Frequency, in Hz
// Use the tone() function to emit the waveform with frequency
Tone (pinBuzzer, frequency);
Delay (on);// Wait 1000 milliseconds
NoTone (pinBuzzer);// Stop vocalizing
Delay (off);// Wait for 2000 milliseconds
}
为了实现节奏效果,需要两个声音。我们选择具有代表性的300Hz和600Hz,默认600Hz为强拍。
(2) 设置节奏速度
实际上,计算节奏速度非常简单,主要是因为速度是设定值,而节奏模式主要为1/4、2/4、3/4、4/4,即每小节最后一个拍子的增强音(600Hz)即可;
例如,若速度为120,节拍为3/4,则每个节拍的持续时间(包括蜂鸣声和静音)为60S ÷120=0.5s,每节有4个节拍。前2个节拍为300Hz的弱音,第3个节拍为600Hz的强音。
音调顺序为:
Beep (300250250);
Beep (300250250);
Beep (600250250);
The function is encapsulated again for use in subsequent efficient Settings.
void metronome(unsigned char metr,unsigned char speed)
{
unsigned char i;
Unsigned int on = 250;
Unsigned int off = 60000 / speed - 250;
for(i=0;i<metr;i++)< span=""></metr;i++)<>
{
Beep(300,on,off);
}
Beep(600,on,off);
}
(3) 串行通信
初始化串口,调用串口初始化函数,设置串口为中断接收模式,并声明串口接收缓冲区char Uart_RX_Buf[9];
Serial.begin(115200);
void serialEvent()
{
If (Serial. The available () & gt;0)
{
char tmp = Serial.read();
//- Determined if a data packet is being received
if(Uart_Packet_IN)
{
Uart_RX_Buf[Uart_Current_Order++] = tmp;
< / span > < span > < span >The set length of the packet
if(Uart_Current_Order == 9)
{
// Check if the end-of-&& checksum is correct
Uart_Packet_Flag = 1;// A valid packet is received
Uart_Packet_IN = 0;//-- No longer in the receiving packet state
Uart_Current_Order = 0;// reset the number
}
//- Check if it is a data header
else if(tmp==Uart_Packet_Header)
{
Uart_Packet_IN = 1;
Uart_RX_Buf [0] = TMP;
Uart_Current_Order + +;
}
}
The processing instruction is parsed and executed as follows:
void process(void)
{
Uart0_Packet_Flag = 0;
The switch (Uart0_RX_Buf [5])
{
//-- Determinate whether it is speed or tempo
Case 0 x06:
{
Speed = Uart0_RX_Buf [8];
break;
}
//-- Determinate whether it is speed or tempo
Case 0 x07:
{
Metr = Uart0_RX_Buf [8];
break;
}
Default: break;
}
系统运行效果测试
通过串口同步调整速度并打印指令。连接至Arduino并开始现场操作。效果如图所示。
STONE STVC070WT-01 HMI 屏幕+Arduino+音乐节拍器