什么是 Arduino Modulino 蜂鸣器?
Arduino Modulino 蜂鸣器是一个对制作者友好的模块,允许用户快速播放旋律或发出警报声。蜂鸣器模块(Arduino 零件号 ABX00108)最初是作为 Arduino 即插即用套件的一部分提供的。与所有 Modulino 模块一样,它配备了一个 Qwiic 连接器,用于与类似配备的模块进行免面包板连接。此外,与 Modulino Pixels 类似,Modulino 蜂鸣器配备了一个 32 位 STMicroelectronics ARM 微控制器。低成本的 ARM Cortex M0 微控制器处理 I2C 通信并驱动 Murata Electronics 压电蜂鸣器。
本工程简介旨在将易于使用的模块扩展到底层硬件和通信协议。虽然 Arduino Modulinos 是为简单性而设计的,但高级学生需要理解并将其设计集成到他们自己设计的印刷电路板(PCB)中。
图 1 : Arduino Modulino蜂鸣器模块的图片。大型表面贴装的Murata蜂鸣器位于电路板的中心。微小的32位STM ARM微控制器在左下角可见。
Arduino Modulino 蜂鸣器入门
在许多方面,蜂鸣器的操作类似于 Arduino 的 tone( ) 函数,因为它接受频率和持续时间参数:
- 频率是所需音调的整数值,单位为 Hz。
- 持续时间是所需的时间,单位为毫秒,表示音调持续的时间。
例如,此代码将发出 1 kHz 的音调,持续时间为 250 毫秒:
buzzer.tone(1000, 250);
技术提示 :Arduino 使得使用 Modulino 板变得非常容易。如果您已正确安装了 modulino 库,您可以通过以下路径找到示例代码:文件(File) > 示例(Examples) > Modulino > Modulino_Buzzer。这是与经典程序(如文件(File) > 示例(Examples) > 01 基础 > Blink)相同的 IDE 位置。
面向对象编程
Modulino API(应用程序编程接口)是使用高级 C++ 面向对象语言设计的。我们可以在下面的代码中看到组件,包括用于创建蜂鸣器对象的构造函数。我们还看到了几个操作对象的方法,包括 begin( ) 和 tone( )。请注意,点符号用于将方法与对象关联。第一部分是对象,第二部分是对对象执行的操作。
#include <Modulino.h>
ModulinoBuzzer buzzer; // Constructor
void setup() {
Modulino.begin( );
buzzer.begin( ); // Initialize the buzzer object
pinMode(2, OUTPUT);
}
void loop() {
uint16_t duration = random(100, 500);
uint16_t note = random(200, 4000);
digitalWrite(2, HIGH); // Flag used by the logic analyzer
buzzer.tone(note, duration);
digitalWrite(2, LOW);
delay(duration); // ***YOU MUST WAIT*** for the specified duration before sending the next tone.
}
阻塞代码
您可能已经深刻理解了阻塞代码,因为您可能遇到过 Arduino 的 delay( ) 函数。我们称之为阻塞函数,因为当delay()在倒计时时,程序执行会暂停。这就像微控制器戴上了眼罩;在delay()操作期间,它会忽略所有其他活动。例如,在delay()生效期间,程序不会响应按钮按下。
技术提示 :阻塞是一种过于简化的说法,因为大多数微控制器使用中断服务例程(ISR)来处理时间关键的背景任务。这些幕后操作不会被delay()阻塞。例如,我们之前提到的按钮可以利用interrupt()库。如果您想探索这个重要主题,请在下方留言。
既然我们更好地理解了阻塞,我们可以说Modulino蜂鸣器的tone()命令是非阻塞的。当调用此函数时,它会向Modulino蜂鸣器发送一条消息。然后Arduino继续执行loop()中的其他任务。为了让音符播放其完整持续时间,我们必须包含一个阻塞机制。这在之前的代码清单中通过“**YOU MUST WAIT”**注释突出显示。请注意,tone()方法以相同的持续时间调用。在这种情况下,Modulino的STM微控制器和Arduino UNO R4微控制器都在倒计时。
技术提示 :“YOU MUST WAIT” 延迟在Arduino本身和Modulino之间没有协调。您需要为每个设备命令类似的等待时间。请记住,Arduino向Modulino发送一个信息包。当Modulino蜂鸣器完成时,没有握手或“我完成了”的消息。最佳实践是保持tone()方法和delay()函数之间的持续时间相同。
通信协议
Modulino蜂鸣器通过Qwicc连接器连接到主Arduino控制器。这是一个方便的功能,因为有许多微控制器扩展板可用。
I2C vs SPI
回想一下,Qwiic中的iic代表“Inter-Integrated Circuit”,通常发音为“eye-squared-see”。这是一个有40年历史的旧协议。其主要目的是在板上连接微控制器和传感器。当需要多个低速设备时,它特别有用,而串行外设接口(SPI)则更适合单个设备的高速连接。请注意,I2C协议使用2线总线(SDA和SCL)来寻址每个组件,而SPI使用3或4线总线(MOSI、MISO、SCK,有时还有SS)与单个组件通信。
技术提示 :DigiKey提供数千种传感器、模数转换器、数模转换器以及各种专用设备。许多设备都支持I2C、SPI或有时两者都支持。记住,SPI用于高速、单一设备连接,而I2C用于需要多个设备共享板上网络的低速应用。
Modulino 蜂鸣器协议
I2C通信协议是基于地址的。当主微控制器向目标设备发送唯一地址时,通信开始。在图3的示例中,通信从Arduino UNO R4发送十六进制值0x3C开始。Modulino蜂鸣器确认了“唤醒呼叫”。然后R4发送8字节的信息。
使用Digilent Analog Discovery Pro 2230观察表明,数据以4字节的频率和4字节的持续时间发送。整个帧所需的时间大约为1毫秒。测试设置如图2所示。图3展示了结果。
我将留给你来逆向工程这个帧。这应该不会太难,因为你可以编程特定的音调和持续时间,然后观察结果。提示:这似乎是一个小端协议。
图 2 :用于观察Arduino UNO R4 WiFi与Modulino蜂鸣器模块之间通信协议的设置。Digilent Analog Discovery Pro在背景中可见。
图 3 :数据以帧的形式传输,以默认的0x3C地址开始,随后是4字节的频率和4字节的持续时间。
技术提示 :通常使用微控制器引脚作为触发器来同步逻辑分析仪或示波器非常有用。在图3中,我们看到数字输入0(DI0)被用作触发器。软件方法包含在之前的代码片段中。使用随机音调和随机持续时间,用户可以听到音调并在逻辑分析仪上看到模式。
技术提示 :random( ) 函数并不像你最初想象的那么随机。你可以通过按下 Arduino 复位按钮来验证这一点。每次复位时,都会播放相同的伪随机音符。这是一个引人入胜的话题,涉及密码学和国家安全。请访问此 NIST 页面以获取更多信息。另请参阅 Arduino randomSeed( ) 函数及其与未连接的 A1 输入引脚的关系。
最后的思考
Arduino Modulino 蜂鸣器允许用户快速设置和编程经典的微控制器例程。通过精细控制音调和持续时间,你可以播放歌曲、为开关按下提供听觉反馈,或提供多种特定音调的警报。
作为一个挑战,我鼓励你找到并改编 Arduino 代码来播放超级马里奥主题曲。作为另一个挑战,使用 Modulino 旋钮和蜂鸣器来构建一个节拍器。
如果你对此产品有任何疑问,请在下方留下你的评论。最后,我们很乐意看到它在你的项目中的应用。
相关信息
请点击以下链接获取相关和有用的信息:


