极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12997|回复: 2

求助用超声波测距做乐器

[复制链接]
发表于 2015-5-21 23:37:58 | 显示全部楼层 |阅读模式
目的:我要做的是一个用超声波模块或红外模块测距,并将测距结果以声音形式输出(do-ri-mi-fa-so-la-xi),每个音最好都能有渐消效果!如下图所示


以下是我的电路


我自己拼了一段代码,可是效果不对,,,,只响一声就没有然后了……
求解啊
代码如下
  1. const int TrigPin = 8;
  2. const int EchoPin = 9;
  3. float cm;
  4. void setup()
  5. {
  6.   Serial.begin(9600);
  7.   pinMode(TrigPin, OUTPUT);
  8.   pinMode(EchoPin, INPUT);
  9.   pinMode(4,OUTPUT);
  10. }
  11. void loop()
  12. {
  13.   {
  14.   if(cm>0 && cm<100.0)
  15.   {
  16.     if(cm<=20)
  17.   {
  18.     if(digitalRead(4)==LOW)
  19.   {
  20.     delay(5);
  21.     if(digitalRead(4)==LOW)
  22.     {
  23.       tone(4,784,1000); //So
  24.       while(digitalRead(4)==LOW)
  25.       {
  26.         delay(1);
  27.       }
  28.     }
  29.   }
  30.   }
  31.   else if(cm>20&&cm<=30)
  32.   {
  33.     if(digitalRead(4)==LOW)
  34.   {
  35.     delay(5);
  36.     if(digitalRead(4)==LOW)
  37.     {
  38.       tone(4,698,1000); //So
  39.       while(digitalRead(4)==LOW)
  40.       {
  41.         delay(1);
  42.       }
  43.     }
  44.   }
  45.   }
  46.   }
  47. }
  48. digitalWrite(4,HIGH);
  49. delay(100);
  50. digitalWrite(4,HIGH);
  51. delay(1000-(100-cm)*12.5);
  52. }
复制代码

相关资料:
1.        发出do-ri-mi的对应数据
{262,293,329,349,392,440,494  } ,//低音
{523,586,658,697,783,879,987  } ,//中音
{1045,1171,1316,1393,1563,1755,1971  }//高音
2.抄来的渐消音代码:
  analogWrite(5,(127+tmp[laser]-mus_long[laser])*2);//把音长距离结束的时间兑换成音量控制模拟音量渐弱
            tone(2,tmp1); //如果本光柱无故障则发出由上一句产生的颤音,(hz/100 是振幅)
            delay(7); //本句延迟5毫秒,上一句中传出的模拟量程为0-255,但延时数量最大为100,但此数段应实测
            }else delay(8);//不该发声时应延迟更久一些毫秒数
        tmp[laser]=tmp[laser]+1;//准备检查下一根光柱
        if (tmp[laser]>mus_long[laser]) {//如延时完成则
            tmp[laser]=0;mus_long[laser]=127;//则本光柱清零、音长清零
            noTone(2);//停止发声


   最终目的:测距——距离对应音(d0-ri-mi)且为渐消音



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-5-22 15:37:27 | 显示全部楼层
首先说下你的程序结构,太繁冗了,没必要if条件语句嵌套使用的,再一个程序尽量写成子函数,void loop{}循环体调用子函数就可以了,tone()函数采用递增递减就可以消音,没必要用延时,延时的那个时间段里其他程序是不执行的,有需要加我Q285944386,我给你细说,论坛看的不及时的。
回复 支持 反对

使用道具 举报

发表于 2015-5-26 10:31:23 | 显示全部楼层
本帖最后由 Ansifa 于 2015-5-26 10:34 编辑

我用vs1053做的,自带128种乐器音色,发串口指令就能控制。。。做了一个钢琴,绿色那块是带光耦的输入板,电位器调音色。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-7 21:21 , Processed in 0.036228 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表