图标

超声波空气鼓

我是一个空气乐器的狂热爱好者,你可以假装你真的在演奏一种乐器,所以这给了我一个想法,我可以做一套空气鼓,你可以在演奏的时候不碰任何东西。

这些鼓基于一组URM09超声波传感器,由FireBeetle ESP32板控制,然后作为蓝牙MIDI控制器连接到计算机或任何其他支持MIDI的合成器。

硬件列表
4 URM09
1 FireBeetle ESP32 IoT微控制器
1 重力I/O膨胀屏蔽
1 重力:I2C HUB
代码
#include < dfrobot_urm9 .h> #include  #include  BLEMIDI_CREATE_INSTANCE("AWESOME_INSTRUMENT", MIDI) int offset = 0;Int distance = 10;DFRobot_URM09传感器[4];Bool sensor_hit[4] = {false, false, false, false};Int8_t note[8] = {36, 38, 45, 55, 35, 40, 47, 37};void setup() {Serial.begin(115200);MIDI.begin ();/** * I2c设备号1-127 *当I2c设备号不被传递时,默认参数是0x11 */ for (int i = 0;I < 4;i++) {while(!传感器[I]。begin(17 + i)){序列。println("I2c device 11 number error"); delay(1000); } } /** * The module is configured in automatic mode or passive * MEASURE_MODE_AUTOMATIC automatic mode * MEASURE_MODE_PASSIVE passive mode * The measurement distance is set to 500,300,150 * MEASURE_RANG_500 Ranging from 500 * MEASURE_RANG_300 Ranging from 300 * MEASURE_RANG_150 Ranging from 150 */ for (int i = 0; i < 4; i++) { sensor[i].setModeRange(MEASURE_MODE_AUTOMATIC, MEASURE_RANG_500); delay(100); } } void loop() { offset = 0; if (digitalRead(D4) == LOW) { offset = 4; } for (int i = 0; i < 4; i++) { int16_t measurements[3]; for (int j = 0; j < 3; j++) { measurements[j] = sensor[i].getDistance(); delay(5); } float dist = (measurements[0] + measurements[1] + measurements[2]) / 3.0; if (dist < distance) { if(sensor_hit[i] == false) { sensor_hit[i] = true; MIDI.sendNoteOn(note[i + offset], 127, 4); } } else { sensor_hit[i] = false; } } }

我曾设想该项目的最初版本是通过DFPlayer Pro模块作为MP3播放声音,但我意识到我将无法同时播放多个声音,所以我转而使用MIDI版本。

硬件列表
1 一个迷你MP3播放器
代码
#include  #include  #include  /*创建URM09对象与IIC通信。*/ DFRobot_URM09 URM09_01;DFRobot_URM09 URM09_02;DFRobot_URM09 URM09_03;DFRobot_URM09 URM09_04;软件系列DF1201SSerial(D2, D3);DFRobot_DF1201S DF1201S;Int offset = 0;void setup() {Serial.begin(115200);DF1201SSerial.begin (115200); while(!DF1201S.begin(DF1201SSerial)){ Serial.println("Init failed, please check the wire connection!"); delay(1000); } DF1201S.setVol(/*VOL = */20); DF1201S.switchFunction(DF1201S.MUSIC); /*Wait for the end of the prompt tone */ delay(2000); /*Set playback mode to "single"*/ DF1201S.setPlayMode(DF1201S.SINGLE); /** * I2c device number 1-127 * When the i2c device number is not passed, the default parameter is 0x11 */ while(!URM09_01.begin(0x11)){ Serial.println("I2c device 11 number error"); delay(1000); } while(!URM09_02.begin(0x12)){ Serial.println("I2c device 12 number error"); delay(1000); } while(!URM09_03.begin(0x13)){ Serial.println("I2c device 13 number error"); delay(1000); } while(!URM09_04.begin(0x14)){ Serial.println("I2c device 14 number error"); delay(1000); } /** * The module is configured in automatic mode or passive * MEASURE_MODE_AUTOMATIC automatic mode * MEASURE_MODE_PASSIVE passive mode * The measurement distance is set to 500,300,150 * MEASURE_RANG_500 Ranging from 500 * MEASURE_RANG_300 Ranging from 300 * MEASURE_RANG_150 Ranging from 150 */ URM09_01.setModeRange(MEASURE_MODE_AUTOMATIC ,MEASURE_RANG_500); delay(100); URM09_02.setModeRange(MEASURE_MODE_AUTOMATIC ,MEASURE_RANG_500); delay(100); URM09_03.setModeRange(MEASURE_MODE_AUTOMATIC ,MEASURE_RANG_500); delay(100); URM09_04.setModeRange(MEASURE_MODE_AUTOMATIC ,MEASURE_RANG_500); delay(100); } void loop() { offset = 0; if(digitalRead(D4) == LOW) { offset = 4; } int should_play = -1; int16_t dist = URM09_01.getDistance(); // Read distance float temp = URM09_01.getTemperature(); // Read temperature Serial.print("01: "); Serial.print(dist, DEC); Serial.print(" cm------"); Serial.print(temp, 1); Serial.println(" C"); if(dist < 10) { should_play = offset + 1; } //delay(100); dist = URM09_02.getDistance(); // Read distance temp = URM09_02.getTemperature(); // Read temperature Serial.print("02: "); Serial.print(dist, DEC); Serial.print(" cm------"); Serial.print(temp, 1); Serial.println(" C"); if(dist < 10) { should_play = offset + 2; } //delay(100); dist = URM09_03.getDistance(); // Read distance temp = URM09_03.getTemperature(); // Read temperature Serial.print("03: "); Serial.print(dist, DEC); Serial.print(" cm------"); Serial.print(temp, 1); Serial.println(" C"); if(dist < 10) { should_play = offset + 3; } //delay(100); dist = URM09_04.getDistance(); // Read distance temp = URM09_04.getTemperature(); // Read temperature Serial.print("04: "); Serial.print(dist, DEC); Serial.print(" cm------"); Serial.print(temp, 1); Serial.println(" C"); if(dist < 10) { should_play = offset + 4; } if(should_play > 0) { DF1201S.pause(); DF1201S.playFileNum(should_play); delay(500); } delay(10); }
许可证
所有权利
保留
licensBg
2