TonyChyi

我在那一角落患过抽风

用 Arduino 的蜂鸣器发出非方波声音
2018年03月14日
 

 

在网上看了很多有关 Arduino 使用蜂鸣器来播放声音的例子,然而在我们西图社区昨天的讨论中,有人提出一个问题:

对了我突然在想Arduino套件送的那个buzzer能不能用来唱歌

能不能发出除了方波以外的其他波形

我个人认为,理论上,应该是可以的,为了验证自己的想法,就写了下面这个程序

// 使用 Arduino 的第 11 个引脚,可以支持模拟输出
#define SOURCE 11
#define LED 13

// 半周期时长
#define PERIOD(x) (1000/x)/2

void setup() {
  // put your setup code here, to run once:
  pinMode(SOURCE, OUTPUT);
  pinMode(LED, OUTPUT);
  square(440, 2);
  delay(500);
  saw(440, 2);
  delay(500);
  trangle(440, 2);
  delay(500);
  sine(440, 2);
  delay(500);
  analogWrite(SOURCE, 0);
}

// 执行完成后闪灯提示
void loop() {
  // put your main code here, to run repeatedly:
  for(int i = 0; i < 3; i++){
    digitalWrite(LED, HIGH);
    delay(500);
    digitalWrite(LED, LOW);
    delay(500);
  }
  delay(1500);
}

// 传统的方波 -_-_-_
void square(double _tone, int len_second) {
  double p = PERIOD(_tone);

  for(int j = 0; j < len_second; j++){
    for(int i = 0; i < _tone; i++){
      digitalWrite(SOURCE, HIGH);
      delay((int)p);
      digitalWrite(SOURCE, LOW);
      delay((int)p);
    }
  }
}

// 锯齿波 /|/|/|
void saw(int _tone, int len_second){
  double p = PERIOD(_tone) * 1000;
  for(int j = 0; j < len_second; j++){
    for(int i = 0; i < 256; i++){
      analogWrite(SOURCE, i);
      delayMicroseconds( (int)p * 2 );
    }
  }
}

// 三角波 \/\/\/\/
void trangle(int _tone, int len_second){
  double p = PERIOD(_tone) * 1000;
  for(int j = 0; j < len_second; j++){
    for(int i = 0; i < 256; i++) {
      analogWrite(SOURCE, i);
      delayMicroseconds( (int)p  );
    }
    for(int i = 255; i >= 0; i--){
      analogWrite(SOURCE, i);
      delayMicroseconds( (int)p  );
    }
  }
}

// 正弦波 ^v^v^v^v
void sine(int _tone, int len_second) {
  double p = PERIOD(_tone);
  for(int j = 0; j < len_second; j++){
    for(int i = 0; i < 360; i++) {
      double x = sin(i) * 127.5 + 127.5;
      analogWrite(SOURCE, ( (int)x == 256)?255: (int) x);
      delayMicroseconds( (int)p * 2);
    }
  }
}

根据 Arduino 的文档1analogWrite()其实是用高频开关来模拟电压的,也就是说,用 Arduino 产生的波形如果细分的话,其实是更细的方波

但总的来说,这提供了一种可能性

Tags: #瞎折腾 · #Arduino

 

TonyChyi © 2018 GPLv2