网页钢琴

演示视频

下面的视频展示了锐客创新嵌入式平台的一个简单应用-网页钢琴。

每个不同的音阶有对应的频率。通过嵌入式平台向蜂鸣器发送特定频率的电信号,蜂鸣器即可发出对应的音阶。

音符对应不同的频率

每个音符对应着一个特定的频率。在这个项目中,想要发出的音符是:do, #do, re, #re, mi, fa, #fa, so, #so, la, #la, ti, do, 一共十三个音符,对应的频率为261.63Hz, 277.18Hz, 293.66Hz, 311.13Hz, 329.63Hz, 349.23Hz, 369.99Hz, 392Hz, 415.30Hz, 440Hz, 466.16Hz, 493.88Hz和523.25Hz。

请参考音符和频率的对应表

蜂鸣器工作原理

蜂鸣器是一种电子元件,里面有一块金属片叫蜂鸣片,当在蜂鸣片上加不同的电压时,蜂鸣片会产生形变。当形变交替产生并按某个频率时,即可产生声音。如果我们想要听到Do(261.63Hz)的音符,我们只需要让蜂鸣器在一秒中产生261.63*2,即523次形变。

这里需要乘以2是因为一个周期蜂鸣片的形状改变两次,第一次从原状态变为其他状态,第二次变回原状态。

PWM控制

PWM广泛用于电子领域,PWM的全称为Pulse-Width Modulation,即一种可以调节周期(频率)和占空比的信号发生方式。

这个项目使用PWM发出特定频率的方波,当蜂鸣器接受到方波后,便可根据方波的频率发出对应的音符。

如果我们需要产生261.63Hz的音符Do,方波的周期为1/261.63=0.003793秒,即3793微秒。

蜂鸣器的音量可由占空比控制,当蜂鸣片在原状态和其他状态停留的时间基本一样时,发出的音量最大。反之,如果原状态和其他状态停留的时间差别越大,那么发出的音量越小。反映到PWM的控制上,当我们把占空比设置为50%,音量最大; 反之占空比越小,音量越小。

我们选择使用嵌入式平台的PWM1,通道A,平台和蜂鸣器的连接如下图:

网站页面

用户可以将下方链接中的文件保存到SD卡中的public文件夹,当平台上电后,通过浏览器访问平台,即可使用网页钢琴。

下载:网页钢琴-网站页面

index.html里每个音符的定义在tone_map对象中,比如la的定义为2272us,即周期为2272微秒,初始的占空比为1500/2272=66%。用户可以通过音量键改变占空比。每次按键的发声时间为0.3秒。

la: {
  unit: 'us',
  period: 2272,
  duration_a: 1500,
  duration_b: 0,
  duration_c: 0,
  running_time: 30
}

通过硬件控制命令可以方便地向嵌入式平台发送请求。代码如下:

body = {
  'event': 'now',
  'actions': [['pwm', 1, 'enabled', this.tone_map[tone].unit, this.tone_map[tone].period, parseInt(this.tone_map[tone].period * 0.5 * volumn / 100),
              this.tone_map[tone].duration_b, this.tone_map[tone].duration_c, this.tone_map[tone].running_time]]
}
try {
  const response = await fetch(request, {
      method: 'post',
      body: JSON.stringify(body)
  }).then(response => response.text())
  .then(response => {
      document.getElementById('mainResponse').innerHTML += timerHelpers.responseDisplay(response);
  });
  } catch(err) {
      console.error(`Error: ${err}`);
  }
}