arduino红外传感器编程,声音传感器检测,输出一个信号

Arduino模拟输入模拟输出基础知识_纸上得来终觉浅,绝知此事要躬行。_天涯博客_天涯社区
古人学问无遗力,少壮工夫老始成。纸上得来终觉浅,绝知此事要躬行。——一个教育工作者、一名爱她的孩子的母亲的教育思考。
今日访问:[$DayVisitCount$]
总访问量:382273
开博时间:
博客排名:4246
(577)(263)(107)(4)(31)(80)(47)(44)
(2)(1)(2)(3)(4)(1)(8)(1)(7)(4)(2)(2)(5)(5)(3)(1)(2)(8)(7)(3)(4)(12)(2)(3)(2)(1)(5)(5)(4)(3)(10)(9)(6)(4)(5)(6)(7)(6)(8)(9)(10)(9)(13)(8)(8)(11)(5)(7)(9)(9)(14)(10)(6)(8)(12)(9)(11)(7)(5)(5)(7)(10)(9)(13)(10)(7)(14)(9)(10)(9)(1)(3)(4)(7)(8)(9)(8)(4)(12)(9)(14)(15)(11)(13)(2)
  作为一个物理学渣,我还以为自己很难会在实际生活中用到物理知识了,与物理相关的所有活应该都是劳工的活。
结果,上次钻研Arduino模拟输入输出的问题时,产生了疑问,为什么模拟输入量是0-1023,而模拟输出却是0-255呢。
还有,因为DFROBOT的蜂鸣器太渣了,播放音乐就是一个全程蜜蜂嗡嗡嗡的过程,所以我去拆了个主机上的8欧1.5W的小喇叭下来。小喇叭只有一根红线一根黑线。我也不知道要怎么接,网上查了一下别人的作品,觉得应该可以直接接到板上。就用两根杜邦线延长了,然后正极那根接到一个模拟输入口,负极接地。然后确实也能正常工作。但其实我很想知道如何正确计算输入输出设备与Arduino连接时的电流电压等资料,以避免对板子的损害。
所以,将学习资料记录下来。
资料来源:
问题一为什么Arduino的模拟输入量是0-1023,而模拟输出却是0-255
许多单片机的管脚电压都是+5V或0V,分别对应1和0。而机器人面对的自然界却没有这么泾渭分明,例如大气温度,到墙壁的距离,声音的强度等等,这些值就是模拟值。Arduino开发板上,标记了&Analog In&的管脚,就是用来测量模拟值输入的。这些输入电压的范围是0~+5V,开发板会把它映射到0~1023的整数(1atmea328ADC是一个10位的寄存器,2的10次方=1024,所以当arduino读入值为默认的电压最大值5V时,analogRead读到的值就是1024,PS这里应该是1023)。从这个数值范围,我们可以估算出Arduino能识别的电压精度大概是5mV(5/1024 =4.8mV),小于这个范围的变换无法识别。
Arduino的微控制器只能产生高电平(5V)或者低电平(0V),而不能产生变化的电压,因此必须采用脉宽度调制技术(PWM,Pulse Width Modulation)来模拟电压变化。用于产生模拟信号的脉冲宽度,取值范围是0到255。脉冲宽度的值取0可以产生0V的模拟电压,取255则可以产生5V的模拟电压。不难看出,脉冲宽度的取值变化1,产生的模拟电压将变化0.0196V(5/255 = 0.0196)。
二& 8欧1.5瓦接模拟输出口,因为是5V供电,根据R=U^2/P,电阻应该在17欧左右,本身只有8欧,所以要接一个10欧左右的电阻(限流?又是一个新知识点!& ^o^ &&限流电阻的用法,比较常见的就是led灯的计算了。例题:亿光的白色LED的工作电压为1.8V,电流为10mA,,电源电压为3.3V,现在要求串联一个电阻,使得LED能正常工作。求电阻的大小。这道题的解法很简单,R=(3.3-1.8)/&0.01=150。限流电阻的方法基本都是这样计算的。)
三&Arduino输入输出的基本知识
在数字电子的世界中,有输出,也会有输入。这跟你在生活中有财务支出,也有收入类似。开关(switch)是一种最基本的输入形式了。通常我们按一个开关就能打开电灯,或者按一个开关打开用电器的电源。开关的功能是连接或断开电路。
Arduino的数字IO口上能读出两个状态值,一个是高电平(5V),另一个是低电平(0V)。所以我们只要设计一个电路能让Arduino的引脚在高低电平这两个状态值之间切换,就能让Arduino分辨出开关的状态了。
Arduino能对数字信号进行有效的处理和识别,但是生活上很多东西,很多概念都不是一个数字量。比如说温度值,就是一个很好的例子,它是一个连续变化的信号,不可能有0到1的突变。这也是模拟输入存在的必要性了。
很好理解。我们只要使用传感器(sensor),将模拟量有效转换为Arduino能够识别的形式。例如转换成电压。
再如,一种温度传感器能够将温度值转换成0V到5V间的某个电压,比如0.3V、3.27V、4.99V等等。由于传感器表达的是模拟信号,它不会像数字信号那样只有简单的高电平和低电平,而有可能是在这两者之间的任何一个数值。至于到底有多少可能的值则取决于模数转换的精度,精度越高能够得到的值就会越多。
而Arduino采用的ADC(Analog to DigitalConverter),称模数转换,每一个模数转换器的精度都是10bit,也就是说能够读取 = 1024)个状态。在Arduino的每一个模拟输入管脚上,电压的变化范畴是从0V到5V,因此Arduino能够感知到的最小电压变化是4.8毫伏(5/1024 = 4.8mV)。
既然都有了模拟输入了,当然少不了模拟输出。但也正如你想象的,现实生活中可能会遇到要输出0和1之外的数值。有时候除了开灯,关灯之外,可能还需要调光,而调光也就是模拟的一种输出方式。
由于Arduino的微控制器只能产生高电平(5V)或者低电平(0V),而不能产生变化的电压,因此必须采用脉宽度调制技术(PWM,Pulse Width Modulation)来模拟电压变化。
PWM是一种开关式稳压电源应用,它是借助微处理器的数字输出来对模拟电路进行控制的一种非常用效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。PWM的原理是通过改变占空比,通过低通滤波得到平均电压从而实现模拟输出。简而言之,PWM是一种对模拟信号电平进行数字编码的方法,它通过对半导体开关器件的导通和关断进行控制,使输出端得到一系列幅值相等但宽度不相等的脉冲,而这些脉冲能够被用来代替正弦波或其它所需要的波形。Arduino的数模转换PWM输出位数为8位。
我们可以通过analogWrite()函数来产生模拟输出。该函数有两个参数,其中第一个参数是要产生模拟信号的引脚(9、10或者11);第二个参数是用于产生模拟信号的脉冲宽度,取值范围是0到255。脉冲宽度的值取0可以产生0V的模拟电压,取255则可以产生5V的模拟电压。不难看出,脉冲宽度的取值变化1,产生的模拟电压将变化0.0196V(5/255 = 0.0196)。
(直流电机控制板的功能是把PWM的输出,转换成真正的模拟电压值,从而控制直流电机旋转。)
先这么理解,Arduino是个独立的个体,可以说是一个没有外围设备的计算机微控制系统。而在一些应用的环境下,我们需要让Arduino跟其他设备进行通信。在微控制领域,常见的是使用串行通信。我们将通过Arduino连接PC机进行通信,说明串行通信的一个例子:串口输出功能。
很多时候,我们需要用Arduino接收PC机下发的命令,有效的识别后,进行相应的响应。也就是通过PC机(上位机)控制Arduino(下位机)。
而实现这一功能 也是通过Arduino的串行口通信来完成的。上一篇文章讲了串行口输出,其实也就是串行口的一个发送数据功能,而这篇文章,也就是讲Arduino串口通信的接收数据功能。通过Serial.read()函数,我们可以接收到从串口发来的数据。
最后,BTW,很明显我应该在大学就学习过相关的知识,可是,我真的一点都没印象。我给自己森森的学渣风打败了。分类: |voice sensor
原厂数据如下图:
6.5元的模块。
一 产品特点:
1 可以检测周围环境的声音强度,使用注意:此传感器只能识别声音的有无(根据震动原理)不能识别声音的大小或者特定频率的声音
2 灵敏度可调(图中蓝色数字电位器调节)
3 工作电压3.3V-5V
5 输出形式 数字开关量输出(0和1高低电平)
6 设有固定螺栓孔,方便安装
7 小板PCB尺寸:3.2cm * 1.7cm
二 模块接线说明
1 VCC 外接3.3V-5V电压(可以直接与5v单片机和3.3v单片机相连)
2 GND 外接GND
3&OUT 小板开关量输出接口(0和1)
三 使用说明
1声音模块对环境声音强度最敏感,一般用来检测周围环境的声音强度。
2 模块在环境声音强度达不到设定阈值时,OUT输出高电平,当外界环境声音强度超过设定阈值时,模块OUT输出低电平;
3 小板数字量输出OUT可以与单片机直接相连,通过单片机来检测高低电平,由此来检测环境的声音;
4 小板数字量输出OUT可以直接驱动本店继电器模块,由此可以组成一个声控开关;
调试方法跟这个视频差不多。只不过我的这个模块没有模拟信号输出口,只有数字输出口{TTL电平},不能检测声音强度,只能检测声音有无。
先提供一段调试声音灵敏度的代码,当你用螺丝刀调节变阻器的时候。
要将数据介于0,1之间。
当有声音时是0,
没有声音时是1.
要调节到刚好都输出的是1, 有一点声音的时候,立即输出0.
结合串口输出并调试代码。
int sensorVoice = 2;
void setup()
pinMode(sensorVoice, INPUT);
Serial.begin(9600);
void loop()
int temp = digitalRead(sensorVoice);
Serial.println(temp);
delay(200);
图中有0输出,表示有声音。因为我在吹口哨,哈哈~
这样就能表示其比较灵敏了。TTL来说,美中不足没有analog&
下面就可以写声控程序了。
下面做个例程。做个简单的声控灯。
  有声音后,达到一定程度,激活继电器,打开电灯,亮30秒。然后熄灭。
做了一个简单的消除杂音处理,有点像消抖,其实都差不多。
就是加了个delay(若干毫秒) 函数。
//-----------voice-sensor------------
int sensorVoice = 2;
int sensorJidianqi = 13; //
void setup()
pinMode(sensorJidianqi, OUTPUT);
pinMode(sensorVoice, INPUT);
Serial.begin(9600);
void loop()
if (digitalRead(sensorVoice) ==0)
delay(100);
if (digitalRead(sensorVoice) ==0)
digitalWrite(sensorJidianqi, HIGH); //LOW to power on JiDianQi
delay(4000);
digitalWrite(sensorJidianqi, LOW); //
digitalWrite(sensorJidianqi, LOW);
这个是没有用继电器的。
用继电器的时候,注意是高电平激活,还是低电平激活继电器的。这个要留意。本人买的几个都是低电平导通的,不同继电器可能不同。
用的是arduino Uno pin13上默认自己带的那个LED灯。实验就是对着模块吹一声,而后,模块上的Pin13出默认的LED灯,就亮了4秒钟。而后自动熄灭。
代码就是这么简单
切记:一定要事先调整好模块,用螺丝刀调整好,到临界状态。
如果有声音,模块输出低电平 0 v
如果没有声音,模块输出高点平 5V&
是在一个区间内的,一个高一个低。
阅读(...) 评论()查看: 8263|回复: 5
arduino+声音传感器能否做成噪声分贝测量仪?
现在手里只有一个arduino uno 和 声音传感器 想利用做成噪声分贝测量仪不知道可否?
查了网上一些资料大概分成以下几个步骤 :1.采样 2. AD转换3. FFT&&4 倍频 5&&加权
& && && && && && && && && && && && &&&(参考这个资料)
现在用uno A0口读出了声音传感器的的值 用也经过FFT转换(将analogRead(0)的值放在S实部 虚部为0 参考这个程序)现在得到频域的值下一步不知道怎么处理了 怎样才能得到倍频分布图?能帮着讲讲为什么吗?
要是有更好基于arduino测量声音分贝方法的请不吝赐教
都设计好,没有校准条件也白搭
给个小建议,如果不具备校准条件,就索性不校准,专门进行定性分析,方法就是做好多个,在不同场合放几个,然后把所有的数据输出拿到一起(最好是网上)进行比较,也很有趣!
安卓手机上就可以装个软件当分贝仪,用它来校准了
很感兴趣这个想法,现在手上有个树莓派,谁能提供个现成的方案?
可否分享程序?
Powered byMIC声音传感器是一款基于麦克风为声音检测的传感器,可用来对周围环境中的声音强度进行检测,具有300倍的放大器,输出模拟信号能使用3.3V和5V为基准AD采集,可以用来实现根据声音大小进行互动的效果、制作声控机器人、声控开关、声控报警等。
工作电压:5V
工作电流:&10mA
最长相应时间:220ms
具有输出大小调节
蓝色:模拟信号输出
红色:电源正
灰色:电源地
具有输出大小调节电位器,根据图示,Max方向输出最大,Min方向输出最小
将模拟传感器连接线连接到Arduino的传感器扩展板上A0口,如下图:
void setup()
Serial.begin(9600); // 打开串口,设置波特率为9600 bps
void loop()
val=analogRead(0);
//传感器接于模拟口0
Serial.println(val,DEC);//从串口发送数据并换行
delay(100);
打开串口监视窗,波特率选择9600,即可得到类似以下结果。
本文整理于DFRobot wiki
纠错,疑问,交流:
获取最新文章:
扫一扫右上角的二维码加入“创客智造”公众号

我要回帖

更多关于 arduino输出脉冲信号 的文章

 

随机推荐