上次使用了LED的模式,这回体验一下Buzzer的模块,这两个模块都是很简单的,只是对GPIO的操作。不同的是Buzzer是PWM的方式。 通过更改PWM的点空比来调节声音的音调,类似于发出DO,RE, MI, FA, SOL, LA, SI, DO, SI的声音。 这个就是Buzzer模块,一个蜂鸣器
插接在开发 板的D5接口上。
这里我们再添加一个Button,使用Eclipse上的Sensor Support View来添加。 如下,我们可以查看到支持的传感器列表。
这里要点击Button下的grove前的复选框进行选择,会弹出如下的提示。 点击“Yes”添加头文件与源文件到工程中。
这时,头文件已经添加到的cpp文件中。其实并没有将grove.hpp复制到工程中,只是增加了一个头文件的路径。
还可以通过右键来添加,如下的方式。
接下来,添加Button的程序。 这里button使用是GPIO0,当然可以改成是其他的GPIO,但是这里说明一下,GPIO0与GPIO1是在标有UART的那个插座上的。 连接图如下:
更改程序,使用按键控制蜂鸣器,每按一下,蜂鸣器才响。 由于官方的例程不完善,程序开始前与结束后,蜂鸣器都是在响的状态。这里添加了让蜂鸣器关闭的方法sound->stopSound();否则真的是太吵了。
- #include
- #include
- #include
- #include "buzzer.hpp"
- #include
- int
- main(int argc, char **argv) {
- //! [Interesting]
- int chord[] = { DO, RE, MI, FA, SOL, LA, SI, DO, SI };
- // create Buzzer instance
- upm::Buzzer* sound = new upm::Buzzer(5);
- upm::GroveButton* button = new upm::GroveButton(0);
- // print sensor name
- std::cout << sound->name() << std::endl;
- sound->stopSound();
- // play sound (DO, RE, MI, etc...), pausing for 0.1 seconds between notes
- for (int chord_ind = 0; chord_ind < 7; chord_ind++) {
- // play each note for one second
- while(!button->value());
- std::cout << sound->playSound(chord[chord_ind], 1000000) << std::endl;
- usleep(10000);
- sound->stopSound();
- }
- //! [Interesting]
- std::cout << "exiting application" << std::endl;
- sound->stopSound();
- delete sound;
- return 0;
- }
复制代码
在deldte sound 后,蜂鸣器还是响的问题,这应该是Buzzer的析构函数中没有关闭的原因吧,这里只是失能了,并没有向端口写入0( mraa_pwm_write(m_pwm_context, 0);) 当然是可以更改析构函数的,但是库就更改了,这里我也是提倡将所有用到的头文件与源码都复制到工程中,在更改的时候不至于更改到的原有的库,最后错了还可以有个参考。
- Buzzer::~Buzzer() {
- Buzzer::stopSound();
- mraa_pwm_enable(m_pwm_context, 0);
- mraa_pwm_close(m_pwm_context);
- }
复制代码
|