Arduino可以发出声音吗?

<h1>Arduino第10课. 发出声音</h1>
<blockquote> <br />如果您想获得有关使用Arduino使用音频板的深入课程, <br />然后检查我们的培训学院.</blockquote>
<h2>与Arduino一起使用Tone()来发出噪音的简便方法</h2>
<p>您需要用Arduino发出一些声音吗? 也许是一个简单的警报语气,也许是在达到特定输入门槛时提醒您的哔哔声,或者也许播放超级马里奥兄弟的配乐来娱乐您的少年思想(没关系,我们也在那里).</p>
<p>无论您听到什么需求,您都可能找到 <em>最简单,最快,可能是最便宜的方法</em> 发出一些噪音是使用tone()函数和压电扬声器与您的arduino. <br /></p>
<h2>这正是您将在本课程中学到的:</h2>
<ol>
<li>压电扬声器的快速介绍(又称压电蜂鸣器)</li>
<li>如何设置简单的压电扬声器电路</li>
<li>基础知识和更多使用tone()函数</li>
<li>使用音调时应该知道的限制()</li>
</ol>
<p> <br />如果您想获得有关使用Arduino使用音频板的深入课程, <br />然后检查我们的培训学院.</p>
<p>我们的培训涵盖了您播放音频文件所需的编程和硬件(i.E MP3,WAV)使用Arduino和音频板.</p>
<h3>您需要的硬件:</h3>
<ul>
<li>Arduino董事会,我正在使用Arduino Uno [1]</li>
<li>无焊面包板[1]</li>
<li>跳线[2]</li>
<li>100欧姆电阻[1]</li>
<li>压电扬声器(又名压电蜂鸣器)[1]</li>
<li>至少12厘米的牙线,带有厚蜡涂料(薄荷味的作用最好)[1]</li>
</ul>
<h2>压电扬声器的快速介绍(又称压电蜂鸣器)</h2>
<p>鸟类做到这一点,孩子们做到了 – 它可以是我们耳朵的音乐或纯粹的酷刑.</p>
<p>我们将使用压电蜂鸣器与Arduino发出一些声音.</p>
<p>压电蜂鸣器非常甜蜜. 您可能会想到的是普通的演讲者. 它使用一种材料 <em>压电</em>, 当您向其施加电力时,它实际上会改变形状. 通过将压电盘粘附到薄金属板上,然后施加电力,我们可以来回弯曲金属,从而产生噪音.</p>
<p>您弯曲材料的速度越快,产生的噪音的音调越高. 这个速率称为频率. 再次, <em>频率越高,我们听到的噪声的音调越高</em>.</p>
<p>因此,基本上,通过一遍又一迅速地震惊盘子,我们可以发出噪音. 我不知道谁想出了这些东西,但它们是卑鄙的.</p>
<p>现在,让我们设置这个电路.</p>
<h2>如何使用Arduino设置简单的压电扬声器电路</h2>
<p>用Arduino设置一个简单的压电扬声器电路非常容易.</p>
<p><img src=”https://i0.wp.com/www.programmingelectronics.com/wp-content/uploads/2015/07/Peizo-Circuit-2.jpg” alt=”用来演示音调()arduino函数的压电蜂鸣器电路” width=”720″ height=”405″ /></p>
<ol>
<li>将压电蜂鸣器放入面包板中,以便两个线条在两个单独的行上.</li>
<li>使用跳线,将正线连接到Arduino Digital Pin 8. 蜂鸣器的情况可能在其上有正符号(+),以表明正铅(如果不是,则红线通常表示正铅).</li>
<li>将另一个导线连接到100欧姆电阻,然后将.</li>
</ol>
<h2>基础知识和更多使用tone()函数</h2>
<p>tone()函数与两个参数一起起作用,但最多可以占用三个参数. 让我们首先讨论两个必需的项目:</p>
<pre>音调(PIN号,Hertz中的频率);</pre>
<ol>
<li>您将在Arduino上使用的针数.</li>
<li>赫兹指定的频率. 赫兹是每秒循环.</li>
</ol>
<p>频率是一个未签名的整数,可以提高高达65,535的价值 – 但是,如果您试图为人的耳朵制作音调,那么我们的耳朵是最多调的,而2,000至5,000之间的值是最多调的。.</p>
<p>这是一个简单的草图,演示了音调()函数:</p>
<pre>//一个素描以演示tone()函数//在arduino上指定数字别针,表明压电蜂鸣器的积极线索已附加. int piezopin = 8; void setup() < >//关闭设置void loop() < /*Tone needs 2 arguments, but can take three 1) Pin# 2) Frequency – this is in hertz (cycles per second) which determines the pitch of the noise made 3) Duration – how long teh tone plays */ tone(piezoPin, 1000, 500); //tone(piezoPin, 1000, 500); //delay(1000); ></pre>
<p>作为实验,请尝试将音调()中的第二个参数更改为100、1000、10000、650000,然后聆听其对音频信号的影响.</p>
<p>您会注意到数字越高,创建的音调越高.</p>
<h2>如何分开噪音 – 又名打败</h2>
<p>如果我们想在噪音之间添加一些空间,这样我们就可以节拍了?</p>
<p>我们可以尝试在音调()之后尝试添加延迟(1000),但是如果您对此进行测试,您会发现它不会带您到任何地方.</p>
<p>这是因为tone()函数使用Arduino的Micro-Contoller上的内置计时器之一. <strong>tone()独立于delay()函数工作.</strong> 您可以开始语气并做其他事情 – 当音调在后台播放时.</p>
<p>但是,回到这个问题, <em>我们如何将噪音分开一点</em>?</p>
<p>让我们来谈谈我们可以将第三个参数传递给the the the the函数 – 这是毫秒中音调的持续时间.</p>
<pre>音调(针数,赫兹的频率,毫秒为毫秒);</pre>
<p>如果您想生成不同的节拍,并且想使用delay()函数进行此操作,那么您需要记住我们刚才所说的,tone()函数使用arduino board上的内置计时器之一.</p>
<p>因此,如果您使用500毫秒作为音调()中的第三个参数,并以1000毫秒的延迟来遵循,您只会创建一个500毫秒的&ldquo;安静时间&rdquo;.</p>
<pre>//此代码在音调之间仅产生500毫秒的延迟(8,2000,500);延迟(1000);</pre>
<p>而不是将时间添加在一起 ​​- 如500毫秒的噪音,然后是1000毫秒的延迟 – 延迟和音调大约在同一时间开始,因此我们得到了500毫秒的音调,由500毫秒安静地分开.</p>
<p><img src=”https://i0.wp.com/www.programmingelectronics.com/wp-content/uploads/2015/07/timing.jpg” alt=”tone()函数的时机与arduino” width=”720″ height=”405″ /></p>
<p>让您的头脑缠住您有点古怪,但是如果您稍微玩耍,您就会拿起错综复杂的.</p>
<h2>使用音调时应该知道的限制()</h2>
<p>像世界上其他所有内容一样,Tone()函数也有一些局限性您应该知道. 让我们在这里触摸它们:</p>
<ol>
<li>您不能在第3或11引脚上使用AnalogWrite()时使用Tone(). 如果您这样做了 – 您会得到一些麻烦的结果 – 这两个都不会像您期望的那样工作. 这是因为tone()函数使用与pins 3和11的计时器相同内置的计时器(). 值得一试,听到奇怪的声音.</li>
<li>您无法产生低于31 Hz的音调. 您可以将值31或更少的toth()函数传递给,但这并不意味着您会得到很好的代表.</li>
<li>tone()函数不能同时由两个单独的引脚使用. 假设您有两个单独的压电扬声器,每个扬声器都在不同的别针上. 你们不能同时玩. 一个必须打开,然后是另一个. 此外,在使用另一个PIN使用tone()函数之前,您必须调用notOne()函数并&ldquo;关闭&rdquo;上一个PIN的音调.</li>
</ol>
<h2>查看课程</h2>
<p>这是我们刚刚涵盖的快速分解:</p>
<ol>
<li>压电扬声器使用压电材料弯曲金属膜片,这会使噪音发出噪音.</li>
<li>音调()函数至少需要两个参数才能操作(PIN#,HERTZ中的频率),但可以采用第三个参数,持续时间 – 以毫秒为单位.</li>
<li>tone()函数独立于delay()函数工作. 如果您不使用第三个参数,则音调的持续时间()将是连续的.</li>
<li>音调()函数的局限性包括: <ol>
<li>当您使用Tone()时,无法在第3和11号上使用PWM</li>
<li>你不能低于31赫兹.</li>
<li>在不同引脚上使用tone()时,您必须在使用其他引脚上使用tone()之前关闭当前销的音调.</li>
</ol>
<p>我发现它可以促进学习审查您涵盖的内容. <em>最好的老师是练习</em> – 因此,请获得一个压电扬声器,然后开始与您的Arduino进行一些疯狂的果酱! 我很想在评论中听到他们的消息.</p>
<h2>进一步阅读:</h2>
<ol>
<li>tone()在Arduino参考中</li>
<li>播放超级马里奥兄弟音轨的素描</li>
</ol>
<h2>Arduino第10课. 发出声音</h2>
<img src=”https://cdn-learn.adafruit.com/guides/cropped_images/000/000/130/medium640/overview.jpg?1520539967″ alt=”Arduino第10课10″ />
<p>登录后,您将重定向到本指南,然后可以订阅本指南.</p>
<p>在本课程中,您将学习如何与Arduino发出声音. 首先,您将使Arduino播放一个&ldquo;音乐&rdquo;量表,然后将其与光电器结合在一起,以制作一种类似theremin的乐器,该乐器在您挥舞着光丝时会改变音高.</p>
<p><img src=”https://cdn-learn.adafruit.com/assets/assets/000/002/293/medium260/learn_arduino_overview.jpg?1396781409″ alt=”Learn_arduino_overview.jpg” width=”” /></p>
<p>该指南首次于2012年12月12日发布. 最后一次更新于2012年10月17日.</p>
<p>此页面(概述)于2012年10月17日上次更新.</p>
<p>Tinymce提供动力的文本编辑器.</p>
困难:初学者
指南类型:技能
类别:组件<br />Arduino兼容 /学习Arduino
特色产品
<p><img src=”https://cdn-shop.adafruit.com/640×480/160-01.jpg” alt=”面包板友好的压电蜂鸣器” /></p>
压电蜂鸣器
<p><img src=”https://cdn-shop.adafruit.com/640×480/161-00.jpg” alt=”CDS轻型传感器的特写头部显示传感器元件” /></p>
照片电池(CDS光电师)
<p><img src=”https://cdn-shop.adafruit.com/640×480/758-04.jpg” alt=”高级男性/男跳线的倾斜镜头-40 x 6(150mm)” /></p>
高级男性/男性跳线-40 x 6英寸(150mm)
<p><img src=”https://cdn-shop.adafruit.com/640×480/64-06.jpg” alt=”半尺寸无焊面包板的倾斜镜头,带有红色和黑色电源线。” /></p>
半尺寸高级面包板-400个领带
<p><img src=”https://cdn-shop.adafruit.com/640×480/50-09.jpg” alt=”Adafruit Metro 328完全组装的倾斜镜头” /></p>
Adafruit Metro 328完全组装 – Arduino IDE兼容
相关指南
<p><img src=”https://cdn-learn.adafruit.com/guides/cropped_images/000/000/554/medium640/IMG_7938_small.jpg?1520541997″ alt=”Arduino和CC3000 WiFi芯片的REST API” /></p>
<p><img src=”https://cdn-learn.adafruit.com/guides/cropped_images/000/000/152/medium640/proto.jpg?1534966703″ alt=”微小的Arduino音乐可视化器” /></p>
<p><img src=”https://cdn-learn.adafruit.com/guides/cropped_images/000/000/772/medium640/Cover_Image.JPG?1515089874″ alt=”与Temboo一起发送短信” /></p>
<p><img src=”https://cdn-learn.adafruit.com/guides/cropped_images/000/000/933/medium640/main_thumbnail.jpg?1603190554″ alt=”Bluefruit Le Connect用于iOS和Android” /></p>
中间的
<p><img src=”https://cdn-learn.adafruit.com/guides/cropped_images/000/000/225/medium640/overview.jpg?1520540408″ alt=”Arduino第17课。电子邮件发送运动检测器” /></p>
中间的
<p><img src=”https://cdn-learn.adafruit.com/guides/cropped_images/000/001/129/medium640/hero-slide-02.jpg?1535066754″ alt=”蓝牙控制的电动相机滑块” /></p>
<p><img src=”https://cdn-learn.adafruit.com/guides/cropped_images/000/000/564/medium640/OverviewLine.png?1520542017″ alt=”使用Simulink遵循Zumo机器人的行” /></p>
<p><img src=”https://cdn-learn.adafruit.com/guides/cropped_images/000/000/154/medium640/ID789_LRG.jpg?1520540059″ alt=”Adafruit PN532 RFID/NFC突破和盾牌” /></p>
中间的
<p><img src=”https://cdn-learn.adafruit.com/guides/cropped_images/000/000/473/medium640/gardening.jpg?1520541602″ alt=”无线园艺使用Arduino + CC3000 WiFi模块” /></p>
<p><img src=”https://cdn-learn.adafruit.com/guides/cropped_images/000/000/120/medium640/summary.png?1520539910″ alt=”Arduino第5课5″ /></p>
<p><img src=”https://cdn-learn.adafruit.com/guides/cropped_images/000/000/311/medium640/1411-06.jpg?1520540756″ alt=”Adafruit 16通道PWM/伺服盾牌” /></p>
<p><img src=”https://cdn-learn.adafruit.com/guides/cropped_images/000/000/138/medium640/overview.jpg?1520540003″ alt=”Arduino第12课。LCD显示器 – 第2部分” /></p>
<p><img src=”https://cdn-learn.adafruit.com/guides/cropped_images/000/000/118/medium640/overview.jpg?1520539899″ alt=”Arduino第2课。” /></p>
<p><img src=”https://cdn-learn.adafruit.com/guides/cropped_images/000/000/485/medium640/IMG_20140121_151804.jpg?1520541660″ alt=”8bitbox” /></p>
<p><img src=”https://cdn-learn.adafruit.com/guides/cropped_images/000/000/274/medium640/2013_04_21_IMG_1718-1024.jpg?1520540525″ alt=”重涂器Eink开发委员会” /></p>
<h5>库存通知</h5>
<p>您已成功地订阅了此产品的通知列表,因此将收到我们的电子邮件,当它返回库存时!</p>
<p>出于安全原因,已向您发送电子邮件,以确认您的订阅. 请记住,此订阅不会导致您从我们那里收到有关此项目的补货以外的任何其他电子邮件的电子邮件.</p>
<p>如果出于任何原因,您想取消订阅此产品的通知列表!</p>
<h2>Arduino可以发出声音吗?</h2>
<p><b>Об этой странице</b></p>
<p>limыыы电函. stourpodin,ччю第. 祸?</p>
<p>listion listimout list. 寻找. 端эээ电电电讯.</p>
<p>Источником запросов может служить вредоносное ПО, подключаемые модули браузера или скрипт, настроенный на автоматических рассылку запросов. e lOmom /щÖ可Öщдоб敦激. 。. подробне. </p>
<p>μ。执函,极.</p>
<h2>迈克尔·玛格利斯(Michael Margolis)的Arduino食谱</h2>
<p>完全访问 <em>Arduino食谱</em> 和60k+其他标题,并免费进行10天的O’Reilly试用.</p>
<p>也有现场活动,通过工作角色策划的课程以及更多.</p>
<h2>第9章. 音频输出</h2>
<h2>9.0. 介绍</h2>
<p>Arduino并非是合成器的,但它肯定可以通过扬声器等输出设备产生声音.</p>
<p>声音是通过振动空气产生的. 如果振动定期重复,声音具有独特的音调. Arduino可以通过驾驶扬声器或 <em>压电设备</em> (脉冲时会产生声音的小陶瓷传感器)将电子振动转换为扬声器脉冲,从而振动空气. 声音的音高(频率)取决于扬声器进出的时间所需的时间;时间越短,频率越高.</p>
<p>频率单位是在赫兹(Hertz)中测量的,它是指信号在一秒钟内通过其重复周期的次数. 人类听力的范围是大约20赫兹(Hz),最高20,000赫兹(尽管它因人而变化,随着年龄的变化而变化).</p>
<p>Arduino软件包括用于产生声音的音调功能. 食谱9.1和9.2显示如何使用此功能制作声音和音乐. 音调功能使用硬件计时器. 在标准的Arduino板上,一次只能产生一种音调. 其他功能所需的计时器(timer2)的素描,例如9或10上的模拟图,无法使用音调功能. 为了克服这一限制,食谱9.3显示了如何使用增强的音调库作为多种音调,以及食谱9.4显示了如何在不使用音调功能或硬件计时器的情况下产生声音.</p>
<p>声音可以 .</p>
<p>得到 <em>Arduino食谱</em> 现在使用O&rsquo;Reilly Learning平台.</p>
<p>O&rsquo;Reilly会员体验书籍,现场活动,由工作角色策划的课程,以及O&rsquo;Reilly的更多内容以及近200名顶级出版商.</p>
<h2>技能构建器:高级Arduino声音综合</h2>
<p><img src=”https://makezine.com/wp-content/uploads/2013/08/arduino_waveform.jpg” alt=”技能构建器:高级Arduino声音综合” /></p>
<p>乔恩·汤普森(Jon Thompson)是英国的自由技术作家兼颠覆电路有限公司董事总经理. 除其他外,他花时间为魔术师做奇怪的道具.</p>
<p><img src=”https://i0.wp.com/cdn.makezine.com/uploads/2013/08/arduino_waveform.jpg?resize=620%2C465&ssl=1″ alt=”arduino_waveform” width=”620″ height=”465″ /></p>
<p>Arduino是各种项目的惊人平台,但是在发起声音方面,许多用户难以超越简单的蜂鸣声. 有了更深入的了解硬件,您可以使用Arduino来产生您可以想象的任何波形,并实时操纵它.</p>
<h2>项目步骤</h2>
<h3>基本声音输出</h3>
<p>&ldquo; Bit Banging&rdquo;是从Arduino产生声音的最基本方法. 只需将数字输出引脚连接到一个小扬声器,然后快速并反复将销钉在高和低点之间翻转. 这就是Arduino的音调()语句的工作方式. 输出引脚甚至可以驱动直接在销钉和接地之间连接的小(4厘米或更少)的8欧姆扬声器,而无需任何扩增.</p>
<p> <img src=”https://i0.wp.com/cdn.makezine.com/uploads/2013/08/skillbuilder_figa2.jpg” alt=”图” width=”620″ height=”465″ /></p>
<p>将销骑从低到高和又一次骑行会产生一个平方波(<strong>图</strong>). 在高州度过的时间被称为 <em>标记时间</em> 和时间低的时间, <em>时空</em>. 改变标记与太空时间之间的比率,又称 <em>占空比</em>, 不会改变波浪的频率,将改变声音的质量或&ldquo;音色&rdquo;.</p>
<p> <img src=”https://i0.wp.com/cdn.makezine.com/uploads/2013/08/m35_arduinowaveform-photo-1.jpg” alt=”图b” width=”620″ height=”465″ /></p>
<p>Arduino的AnalogWrite()函数以490Hz的固定频率输出方波很方便说明该概念. 将您的扬声器连接到引脚D9和接地(<strong>图b</strong>)并运行此草图:</p>
<pre>void setup() < pinMode(9,OUTPUT); >void loop() < for (int i=0; i></pre>
<p>您应该听到恒定音调的音调,音色从薄薄的和reedy(主要是时空)慢慢变成圆形和柔软的(相等的标记和时空),然后又回到薄和reedy(主要是标记时间).</p>
<p>具有可变占空比周期的平方波被正确地称为 <em>脉冲宽度调制(PWM)</em> 海浪. 更改更改音调的占空比可能具有非常基本的声音功能,但是要产生更复杂的输出,您需要一个更高级的方法.</p>
<h3>从数字到模拟</h3>
<p>PWM波是严格的数字,高还是低. 对于模拟波,我们需要产生这两个极端之间的电压水平. 这是一个 <em>数字到分析转换器(DAC)</em>.</p>
<p> <img src=”https://i0.wp.com/cdn.makezine.com/uploads/2013/08/skillbuilder_figb.jpg” alt=”图c” width=”620″ height=”465″ /></p>
<p>有几种类型的DAC. 最简单的可能是R-2R梯子(<strong>图c</strong>). 在此示例中,我们有4个数字输入,标记为D0 – D3. D0是最不重要的位,D3是最重要的.</p>
<p>如果将D0设置高,其电流必须通过2R + R + R + R = 5R的大电阻才能达到输出. 某些电流还通过相对较小的电阻2R泄漏到地面. 因此,D0处的高电压比D3处的高电压产生的输出电压要小得多,D3仅面对2R的较小电阻以达到输出.</p>
<p> <img src=”https://i0.wp.com/cdn.makezine.com/uploads/2013/08/skillbuilder_figc.jpg” alt=”图d” width=”620″ height=”465″ /></p>
<p>将D0 – D3设置为二进制值从0000到1111(0-15个小数),然后快速返回到000,应该输出所示的三角形波 <strong>图d</strong>. 从理论上讲,要产生其他波形,我们必须简单地以正确的速率将正确的二进制序列呈现给D0 – d3.</p>
<p>不幸的是,使用R-2R DAC存在一些缺点,最重要的是,它需要非常精确的电阻值以防止复合错误累加并扭曲波形. 还必须使用低通滤波器将锯齿状的&ldquo;步骤&rdquo;平滑,以防止不和谐的金属声音. 最后,R-2R DAC消耗的输出引脚超过了严格必要的.</p>
<p>尽管难以理解一些,但&ldquo; 1位&rdquo; DAC仅使用一个输出引脚,用单个电阻器和电容器作为滤波器产生非常光滑的高质量波形。. 它还让Arduino可以在声音播放时自由地做其他事情.</p>
<h3>一位DAC理论</h3>
<p>如果您用LED替换扬声器的扬声器,您会发现随着占空比从0增加到100%,它的亮度会增加. 在这两个极端之间,LED确实在490Hz左右闪烁,但我们认为这些闪光是连续的亮度.</p>
<p> <img src=”https://i0.wp.com/cdn.makezine.com/uploads/2013/08/skillbuilder_figd.jpg” alt=”图e” width=”620″ height=”465″ /></p>
<p>这种&ldquo;平滑&rdquo;现象称为&ldquo;视觉的持久性&rdquo;,可以将其视为与所示的低通滤波电路的视觉类比 <strong>图e</strong>. 您可以使用此过滤器使1位DAC的输出平滑.</p>
<p>传入PWM波的标记时间决定V处的电压<sub>出去</sub> 瞬间. 例如,50:50的标记/空间比输出了传入信号的高压的50%,75:25的比率输出了该电压的75%,依此类推. Arduino的数字引脚产生的高度为5V,因此,50%的占空比将提供2.5V在v<sub>出去</sub>.</p>
<p> <img src=”https://i0.wp.com/cdn.makezine.com/uploads/2013/08/m35_arduinowaveform-photo-4.jpg” alt=”一个受&ldquo;钻头爆炸&rdquo;代替扬声器的LED将稳步提高亮度。” width=”620″ height=”465″ /></p>
<p>为了获得最佳音质,PWM信号的频率应尽可能高. 幸运的是,Arduino可以产生快速的PWM波浪高达62.5kHz. 该硬件还提供了一种方便的机制,可以绝对定期从查找表更新标记时间,同时让Arduino免费做其他事情.</p>
<h3>Arduino 1位DAC</h3>
<p>Arduino Nano 3中心的Atmega328芯片包含3个硬件计时器. 每个计时器都包含一个计数器,该计数器在每个时钟刻度上递增,在其范围末端自动溢出到0. 柜台被命名为tcnt<em>n</em>, 在哪里 <em>n</em> 是计时器的数量.</p>
<p>timer0和timer2是8位计时器,因此TCNT0和TCNT2反复计数为0到255. Timer1是一个16位计时器,因此TCNT1反复计数从0到65535,也可以在8位模式下工作. 实际上,每个计时器都有几种不同的模式. 我们需要的一个称为&ldquo;快速pwm&rdquo;,仅在timer1上可用.</p>
<p>在此模式下,每当TCNT1溢出到零时,输出就会高以标记下一个周期的开始. 要设置标记时间,timer1包含一个名为OCR1A的寄存器 . 当TCNT1计数到OCR1A中存储的值时,输出会降低,结束了周期的标记时间并开始其时空. TCNT1一直在增量直到溢出,并且该过程再次开始.</p>
<p> <img src=”https://i0.wp.com/cdn.makezine.com/uploads/2013/08/skillbuilder_fige.jpg” alt=”图f” width=”620″ height=”465″ /></p>
<p>此过程以图形方式表示 <strong>图f</strong>. 我们设置的OCR1A越高,PWM输出的标记时间越长,并且V处的电压越高<sub>出去</sub>. 通过预先计算的查找表定期更新OCR1A,我们可以生成我们喜欢的任何波形.</p>
<h3>基本波浪表播放</h3>
<p>清单1(下载列表1-6作为一个 .zip文件)包含一个使用查找表,快速PWM模式和1位DAC生成正弦波的草图.</p>
<h3>清单1</h3>
<pre>#include //使用计时器中断库 / ********正弦波参数******** / #define pi2 6.283185 // 2*pi保存计算后来#define amp 127 //正弦波的缩放系数#define offset 128 //偏移偏移波向所有> 0值 /********************************************************************************************************************************************************************************************************************************** ***/ #define长度256 //波的长度查找表字节波[长度]; //波形void设置的存储()存储 < /* Populate the waveform table with a sine wave */ for (int i=0; i/****Set timer1 for 8-bit fast PWM output ****/ pinMode(9, OUTPUT); // Make timer&rsquo;s PWM pin an output TCCR1B = (1 void loop() < // Nothing to do! >/ ********每次tcnt2 = ocr2a ********/ isr(timer2_compa_vect) < // Called when TCNT2 == OCR2A static byte index=0; // Points to each table entry OCR1AL = wave[index++]; // Update the PWM output asm(&ldquo;NOP;NOP&rdquo;); // Fine tuning TCNT2 = 6; // Timing to compensate for ISR run time ></pre>
<p>首先,我们计算波形并将其存储在数组中,作为一系列字节. 这些将在适当的时间直接加载到OCR1A中. 然后,我们启动timer1生成快速pwm波. 因为Timer1默认为16位,所以我们还必须将其设置为8位模式.</p>
<p>我们使用timer2定期中断CPU并调用特殊功能以加载OCR1A,并在波形中使用下一个值. 此功能称为 <em>中断服务例程(ISR)</em>, 每当TCNT2等于OCR2A时,Timer2称为 . ISR本身就像其他任何功能一样,除了没有返回类型之外.</p>
<p>Arduino Nano的系统时钟持续16MHz,这会导致Timer2呼叫ISR太快. 我们必须通过参与&ldquo;预拉仪&rdquo;硬件来减慢它的速度,该硬件在让它们增加TCNT2之前将系统时钟脉冲的频率分开 . 我们将预定器设置为除以8,这使TCNT2在2MHz处更新.</p>
<p>为了控制生成的波形的频率,我们简单地设置了OCR2A . 要计算结果波的频率,请将TCNT2更新(2MHz)的速率除以OCR2A的值,然后将结果除以查找表的长度. 例如,将OCR2A设置为128,给出了一个频率:</p>
<p><img src=”https://i0.wp.com/cdn.makezine.com/uploads/2013/08/arduino-synth-equation.jpg?resize=620%2C118&ssl=1″ alt=”arduino-synth-equation” width=”620″ height=”118″ /></p>
<p>大约是中间C以下2个八度的B. 这是一个值表,给标准音符.</p>
<p>ISR需要一些时间来运行,我们通过将TCNT2 2设置为6而不是0来补偿,而不是在返回之前. 为了进一步收紧时间,我添加了指令ASM(&ldquo; NOP; nop&rdquo;),使用一个时钟周期执行2个&ldquo;无操作&rdquo;指令.</p>
<p><img src=”https://i0.wp.com/cdn.makezine.com/uploads/2013/08/skillbiulder_figf.jpg?resize=620%2C465&ssl=1″ alt=”声音Synth_figf” width=”620″ height=”465″ /></p>
<p> <img src=”https://i0.wp.com/cdn.makezine.com/uploads/2013/08/m35_arduinowaveform-photo-2.jpg” alt=”图g” width=”620″ height=”465″ /></p>
<p>运行草图并连接电阻器和电容器(<strong>图g</strong>). 在将示波器连接到V时,您应该看到光滑的正弦波<sub>出去</sub>. 如果您想通过小扬声器听到输出,请添加晶体管以增强信号(<strong>图H,下面</strong>).</p>
<p><img src=”https://i0.wp.com/cdn.makezine.com/uploads/2013/08/skillbuilder_figj.jpg?resize=620%2C465&ssl=1″ alt=”声音Synth_figj” width=”620″ height=”465″ /></p>
<p> <img src=”https://i0.wp.com/cdn.makezine.com/uploads/2013/08/m35_arduinowaveform-photo-3.jpg” alt=”图h” width=”620″ height=”465″ /></p>
<h3>编程简单的波</h3>
<p>一旦您知道如何从查找表中&ldquo;播放&rdquo;波浪,创建所需的任何声音就很容易,就像事先将正确的值存储在表中一样容易. 您唯一的限制是Arduino相对较低的速度和记忆力.</p>
<p>列表2包含一个波形()函数,可以用简单的波形预填充表:正方形,正弦,三角形,坡道和随机 . 播放它们以查看它们的声音(下面).</p>
<p> <img src=”https://i0.wp.com/cdn.makezine.com/uploads/2013/08/skillbuilder_figi-1.jpg” alt=”平方波形的音色范围从圆形和脆性到薄和芦苇,具体取决于其占空比。从我们的最初敲击实验中,我们已经知道,50%的占空比会产生类似长笛的声音。” width=”620″ height=”255″ /> <img src=”https://i0.wp.com/cdn.makezine.com/uploads/2013/08/skillbuilder_figi-2.jpg” alt=”正弦波形由代表三角函数图的平滑振荡弯曲信号组成。它产生了一种清晰,玻璃状的音调,听起来很像调谐叉。” width=”620″ height=”255″ /> <img src=”https://i0.wp.com/cdn.makezine.com/uploads/2013/08/skillbuilder_figi-3.jpg” alt=”三角形波形看起来有点像正弦波,尖锐的点和直线,或2个斜坡波形后背挤压。它比正弦波更有趣,圆形,有点像双簧管。” width=”620″ height=”255″ /> <img src=”https://i0.wp.com/cdn.makezine.com/uploads/2013/08/skillbuilder_figi-4.jpg” alt=”坡道波形由稳定增加的值组成,从零开始。在波形的末尾,值突然下降到零以开始下一个周期。结果是声音明亮而浅黄色的声音。” width=”620″ height=”255″ /> <img src=”https://i0.wp.com/cdn.makezine.com/uploads/2013/08/skillbuilder_figi-5.jpg” alt=”从理论上讲,随机波形听起来像任何东西,但通常听起来像是嘈杂的静态。 Arduino仅产生伪数字,因此特定的随机()值总是给出相同的&ldquo;随机&rdquo;波形。” width=”620″ height=”255″ /></p>
<p>随机函数仅根据种子值填充表格. 使用RandomSeed()函数更改种子值,我们可以生成不同. 有些听起来很薄又杂草,有些则更有机. 这些随机波形很有趣,但嘈杂. 我们需要一种更好的方法来塑造复杂波.</p>
<h3>加性合成</h3>
<p>在19世纪,约瑟夫·傅立叶(Joseph Fourier)表明我们可以繁殖或 <em>合成</em>, 通过组合足够的不同振幅和频率的正弦波来通过任何波形. 这些正弦波被称为 <em>部分</em> 或者 <em>谐波</em>. 最低的谐波称为第一个谐波或 <em>基本的</em>. 组合谐波创建新波形的过程称为 <em>加性合成</em>.</p>
<p>给定一个复杂的波,我们可以 <em>合成</em> 大致结合了少量谐波. 我们包括的谐波越多,我们的合成越准确.</p>
<p>专业添加剂合成器可以通过这种方式结合100多种谐波,并实时调整其幅度以创建戏剧性的音色更改. 这超出了Arduino的力量,但我们仍然可以做足够的功能,可以充满有趣的声音.</p>
<p> <img src=”https://i0.wp.com/cdn.makezine.com/uploads/2013/08/additivesynthexample1.jpg” alt=”图J-添加第三个谐波会产生一个波形,其外观和声音明显,尽管仍然非常圆。” width=”620″ height=”465″ /></p>
<p>考虑列表1计算正弦波的循环. 称这是基本的. 再加上,例如1/4振幅的第三个谐波(<strong>图J。</strong>),我们添加了一个新步骤:</p>
<pre>for(int i = 0; i</pre>
<p>在这个新步骤中,我们将环计数器乘以3以产生第三个谐波,然后除以&ldquo;衰减&rdquo;因子4,以减少其振幅.</p>
<p>清单3(可在Makezine上找到.com/35)包含此功能的一般版本. 它包括2个阵列,列出了我们要组合的谐波(包括1个,基本)及其衰减因素.</p>
<p> <img src=”https://i0.wp.com/cdn.makezine.com/uploads/2013/08/additivesynthoddharmonics.jpg” alt=”图k – 添加前8个奇数谐波给出了方波的近似值。单个正弦波显示出小小的波纹。组合更多的部分将减少这些波纹的大小。” width=”620″ height=”465″ /></p>
<p>要更改加载到查找表中的声音的音色,我们只是更改两个数组中的值. 零衰减意味着相应的谐波被忽略. 列表3中的阵列(如书面)产生了相当不错的方波(<strong>图k</strong>). 实验阵列,看看结果是什么.</p>
<h3>变形波形</h3>
<p>专业合成器包含电路或程序以&ldquo;过滤&rdquo;声音以获得特殊效果. 例如,大多数都有一个低通滤波器(LPF),该过滤器为开始赋予某个&ldquo; waa&rdquo;,而&ldquo; yeow&rdquo;到了声音的结尾. 基本上,LPF逐渐滤除了更高的部分. 从计算上来说,对Arduino来说,真正的过滤太多了,但是在播放时我们可以做一些事情,以产生类似的效果.</p>
<p>列表4包括一个函数,该函数将波表中的每个值与第二个&ldquo;滤波&rdquo;表中的每个值进行比较. 当值不同时,函数将波值推向滤波器值,慢慢&ldquo;变形&rdquo;声音播放.</p>
<p>使用正弦波作为&ldquo;滤波&rdquo;近似于真正的低通滤波. 谐波逐渐删除,添加了一个&ldquo; oww&rdquo;. 如果我们以另一种方式变形 – 通过用正弦波和更复杂的波和&ldquo;滤波器&rdquo;表加载波桌 – 我们为开始添加了&ldquo; waa&rdquo;质量. 您可以用自己喜欢的任何波加载2张桌子.</p>
<h3>创建笔记</h3>
<p>如果我们想让声音褪色,就像被拔出,弹奏或击中的真正乐器一样?</p>
<p>列表5包含一个函数,该函数&ldquo;衰减&rdquo;声音通过稳步缩短波动表值向平坦的线路稳定下来的声音. 它跨过波浪表,检查每个值 – 如果超过127,则减少了,如果较少,则增加. 衰减的速率受延迟()函数的控制.</p>
<p>一旦波浪被&ldquo;压缩&rdquo;,运行ISR就可以将CPU绑在不发声的情况下。 CLI()函数清除SEI()设置中的中断标志,将其关闭.</p>
<h3>使用程序内存</h3>
<p>Arduino的Atmel处理器基于&ldquo;哈佛&rdquo;架构,该体系结构将程序内存与可变内存分开,而可变内存又分为挥发性和非易失性区域. 纳米只有2kb的可变空间,但是(相对)的30kb左右,可用的程序空间.</p>
<p>可以将波浪数据存储在这个空间中,从而大大扩展了我们可玩声音的曲目. 仅读取存储在程序空间中的数据,但是我们可以将其中的很多存储.</p>
<p><strong>清单6</strong> 演示此技术,从存储在程序空间中的阵列中加载正弦波. 我们必须包括 <em>PGMSpace.H</em> 在草图顶部的库,并在我们的数组声明中使用关键字progmem:</p>
<pre>prog_char ref [256] progmem =;</pre>
<p>prog_char在 <em>PGMSpace.H</em> 并且与熟悉的&ldquo;字节&rdquo;数据类型相同.</p>
<p>如果我们尝试正常访问REF []数组,则该程序将在可变空间中查看. 我们必须使用内置函数PGM_READ_BYTE. 它以参数为参数,即您要访问的数组的地址,以及指向各个数组条目的偏移量.</p>
<p>如果要以这种方式存储多个波形,则可以像普通的二维数组一样访问pgm_read_byte中的数组. 如果阵列具有[10] [256]的尺寸,则在循环中使用pgm_read_byte(&ref [4] [i])来访问波形4. 不要忘记阵列名称之前!</p>
<h3>生成波表数据</h3>
<p>要从程序内存中读取波表数据,您必须将其对草图进行硬编码,并且无法在运行时生成它. 所以它来自哪里? 一种方法是在电子表格中生成波表数据并将其粘贴到草图中. 我们创建了一个电子表格,该电子表格将允许您使用添加剂合成生成波表,以查看产生的波的形状,并复制原始波浪表数据以插入草图. 在这里下载.</p>
<h3>走得更远</h3>
<p>音频反馈是指示运行程序内部条件的重要方法,例如错误,钥匙按下和传感器事件.</p>
<p>您的Arduino产生的声音可以通过软件采样器包进行记录并操纵,并用于音乐项目</p>
<p>序列,随机或在性能参数的影响下存储的波形之间的变形可能在交互式艺术安装中很有用.</p>
<p>如果我们升级到Arduino到期,事情就会变得令人兴奋. 在84MHz时,到期的速度比纳米快5倍以上,并且可以在快速PWM模式下处理更多和更高的频率部分. 从理论上讲,到期甚至可以实时计算部分,创建真正的加性合成引擎.</p>