在Arduino的音乐门铃式星球大战

您好,最近我答应了,并指着视频,你可以使用Arduino的闪烁ATtiny13的,现在显示的实际使用它。

我不得不说,Fyuz,固件为十六进制文件的C代码,一个草图的Arduino的IDE,为变形杆菌7文件可以在文章的末尾下载。

嗯,这真的很拉,显示它是如何工作的:



早就想得起这样的音乐门铃,这样当你按下播放键进军帝国(三月英制或黑武士的主题)从«<一个href="http://ru.wikipedia.org/wiki/%D0%97%D0%B2%D1%91%D0%B7%D0%B4%D0%BD%D1%8B%D0%B5_%D0%B2%D0%BE%D0%B9%D0%BD%D1%8B">Звёздных战争的»,很喜欢这首曲子。


顾名思义上面的视频,该装置的主要成分 - 微控制器 ATtiny13的时,它的应用使得有可能使板几次的大小小于火柴盒:

尺寸板 B>

现在所有的连接:



功率范围为约2至6个,也就是,从两个到四个电池AA尺寸,虽然理想地将提供电压3-4伏,即用于此目的是一个移动电话或电池18650格式的理想的锂离子电池,然而,理想的是它可与受保护的,因为我还没有实现对深度放电任何保护。

好吧,我会说在电路设计上几句:

该计划是这样的(连接到文章的末尾变形杆菌文件,你甚至可以没有收集有关maketke):

涂在Proteus'e B>



因为单微控制器不能拉开足够量响彻整个出诊,我加了NPN晶体管 2N3904 < /一>,一个很常见的晶体管,在原则上,可以接近,拉扬声器,在我的情况100mA的晶体管容量的晶体管。
当使用3节AA电池的格式晶体管稍微温热,用两个 - 量保持在一个良好的水平,但晶体管是一点点温暖
。 电阻R2 - 标准安装的微控制器提供保护,防止意外复位微控制器,原则上应该没有它,电阻R1用于限制电流的晶体管的基极。
图为更多的保护二极管因疏忽保护它,即反极性,在我的情况下,逆转很快打倒微控制器,具有完全可能的烟花和声音效果。顺便说一句,在下图中,我忘了指定它,您可以使用额定为10 V的电压和200mA的电流,成为先后报名费或减去或加上二极管,负我。
音箱老拨号调制解调器合勤科技,顺便的,关于拨号调制解调器这家公司有一个著名的故事:

笑话 B>坐下两名黑客,房间配备一只猫。一个黑客问:
- ?你的猫
- 是的,我的。 Zuhel名字!
- 为什么Zuhel
- 看这里。把扫帚,捅到了他的猫说,“Zuhel,连接!!!”猫:
- !Pshshshshshshshshshshshshshsh



我的代码说,<一个href="https://www.google.com.ua/search?q=attiny13+imperial+march&oq=attiny13+imperial+march&aqs=chrome..69i57&sourceid=chrome&es_sm=93&ie=UTF-8">нагуглил
,在广袤的YouTube更精确地发现,这里的视频本身:



根据该视频有一个链接,代码的,那就是:

从说明书到视频代码 B>
&LT;代码类= QUOT; CPP&QUOT;&GT;&#包括LT; AVR / pgmspace.h&GT; // // Bytartakynov编程ATtiny13的在Arduino的IDE使用core13 http://sourceforge.net/projects/ard-core13/的#define PIN_LED 1的#define PIN_BUZZER 0#定义COUNT_NOTES 39字频率的频道[COUNT_NOTES] PROGMEM = {392 ,392,392,311,466,392,311,466,392,587,587,587,622,466,369,311,466,392,784,392,392,784,739,698,659,622 ,659,415,554,523,493,466,440,466,311,369,311,466,392};字持续时间[COUNT_NOTES] PROGMEM = {350,350,350,250,100,350,250,100,700,350,350,350,250,100,350,250,100,700,350,250,100, 350,250,100,100,100,200,100,350,250,100,100,100,200,100,350,250,100,750};无效设置(){pinMode(PIN_LED,OUTPUT); pinMode(PIN_BUZZER,OUTPUT); }空环(){对于(字节I = 0; I&LT; COUNT_NOTES;我++){蜂鸣(PIN_BUZZER,pgm_read_word(及(频率的频道[I])),2 * pgm_read_word(及(持续时间[I])) );延迟(100); }延迟(3000); }虚空的嗡嗡声(unsigned char型针,字frequencyInHertz,字timeInMilliseconds){长DELAYAMOUNT =(长)(长(1000000)/(长)frequencyInHertz);长LOOPTIME =(长)(((长)* timeInMilliseconds 500)/ DELAYAMOUNT);为(长I = 0; I&LT; LOOPTIME;我++){digitalWrite(针,HIGH); delayMicroseconds(DELAYAMOUNT); digitalWrite(针,LOW); delayMicroseconds(DELAYAMOUNT); }}中尉; /码&GT;  PRE>二进制代码草图的大小:(1024字节最大)946字节


正如你所看到的,有两个数组频率的频道 - 从英国的频率和持续时间转换 - 时间,所有的数据类型字,PROGMEM - 数据存储在闪存微控制器(不使用库pgmspace.h将无法正常工作)嗯,有一个频率发生器蜂鸣(),它有三个参数 - 销,其中产生频率时,第二 - 赫兹的频率,而第三 - 以毫秒为单位的持续时间
此代码必须是Arduino的兼容,甚至在Arduino的乌诺,Arduino的纳米或Arduino的临Mini和其它好,杜伊诺工作。

正如你可以在视频听,我的视频声音是从第二个视频略有不同,其实我是一个变化不大的纸币的持续时间和三次流行的“科学矛”的方法,提高了频率,因为这么小的音箱像我这样的坏戏这些频率的原本,并添加一个按钮,有什么不门铃按钮?

A一点自己纠正,注释掉 B> <前>&LT;代码级=&QUOT; CPP&QUOT;&GT; // Bytartakynov:// // http://youtu.be/5R7NeQkVS_8和我 - vk.com/razniepodelki的#define F_CPU 1200000L //频率,单位为赫兹MK的#include&LT; AVR / pgmspace.h&GT; //需要PROGMEM的#define PIN_BUZZER 2 // PB2扬声器的#define按钮4 // PB4按钮的#define COUNT_NOTES 39 //音符字频率的频道号[COUNT_NOTES] PROGMEM = {//此处是频率392,392,392,311, 466,392,311,466,392,587,587,587,622,466,369,311,466,392,784,392,392,784,739,698,659,622,659,415,554, 523,493,466,440,466,311,369,311,466,392};字持续时间[COUNT_NOTES] PROGMEM = {//此处的持续时间350,350,350,250,100,350,250,100,700,350,350,350,250,100,350,250,100,700,350 ,250,100,350,250,100,100,100,450,150,350,250,100,100,100,450,150,350,250,100,750}; //虚空设置()// {INT主要(无效)//这是一个模拟无效设置(),以节省空间{pinMode(PIN_BUZZER,OUTPUT); //初始化引脚pinMode(BUTTON,INPUT); //连接一个上拉电阻digitalWrite(BUTTON,HIGH); //按钮返回// LOW当你//} //无效循环()// {而(1){//模拟无效循环()(无限循环),如果(digitalRead(按钮)== LOW){/ /当按钮被按下(字节I = 0; I&LT; COUNT_NOTES;我++)//实际上失去调{嗡嗡声(PIN_BUZZER,pgm_read_word(及(频率的频道[i]))* 3,2 * pgm_read_word(及(持续时间[I]))); //最初://蜂鸣(PIN_BUZZER,pgm_read_word(及(频率的频道[I])),2 * pgm_read_word(及(持续时间[I]))); //但是我倍频3 //(pgm_read_word(及(频率的频道[I]))* 3)//就小喇叭大声发声//延迟(100); //不需要}} //延迟(3000); //这} //这些线路需要返回0; //诠释的主要(无效)} //虽然(1)无效的嗡嗡声(unsigned char型针,字frequencyInHertz,字timeInMilliseconds)//其实它{//频率发生器长DELAYAMOUNT =(长)(长(1000000)/ (长)frequencyInHertz); //参数有三个长LOOPTIME =(长)(((长)* timeInMilliseconds 500)/ DELAYAMOUNT); // 1 - 引脚(长I = 0; I&LT; LOOPTIME;我++)// 2 - {//频率3 - 持续时间digitalWrite(针,HIGH); //生成所需频率的脉冲delayMicroseconds(DELAYAMOUNT); digitalWrite(针,LOW); delayMicroseconds(DELAYAMOUNT); }}中尉; /码&GT; PRE>二进制代码草图的大小:(1024字节最大)976字节


正如你所看到的,添加的反应,当你按下按钮超过1024字节,而不得不将C代码件适合在ATtiny13的。
的凸起线蜂鸣频率(PIN_BUZZER,pgm_read_word(&(频率的频道[I]))* 3 2 * pgm_read_word(&(持续时间[I])));通过你的身影三个生成的频率倍增,这纯粹是我的突发奇想,能不能乘任何东西。

如果你是一位经验丰富的arduinschik,我认为通知,我国产软件电梯上拉电阻的端口PB4的代码。
对于那些谁也不知道它是这样做的:
展览在输入端口;思路和它的逻辑单元。现在该端口将电压近似等于电源电压,如果此端口短路到地,它将从一个逻辑单元改变其状态为逻辑零,与微控制器在同一时间将不会受到影响,因为它使用一个内部的电阻,其值10-100欧姆。
我这样做,是纯粹为了节省电路板空间,你可以焊接电阻为10k加上食物,按我们的按钮所需的端口“吸引端口地球,”这将是合乎逻辑的零。

添加代码清理AVR-C劳动AVR'schikov:

代码AVR-C B> <前>&LT;代码级=&QUOT; CPP&QUOT;&GT; // Bytartakynov:// // http://youtu.be/5R7NeQkVS_8和我 - vk.com/razniepodelki的#define F_CPU 1200000UL //频率,单位为赫兹MK的#include&LT; AVR / io.h&GT; //库输入输出的#include&LT; UTIL / delay.h&GT; //库处理延时#包括LT&; AVR / pgmspace.h&GT; //需要PROGMEM的#define PIN_BUZZER 2 // PB2扬声器的#define按钮4 // PB4按钮的#define COUNT_NOTES 39 //音符字频率的频道号[COUNT_NOTES] PROGMEM = {//此处是频率392,392,392,311, 466,392,311,466,392,587,587,587,622,466,369,311,466,392,784,392,392,784,739,698,659,622,659,415,554, 523,493,466,440,466,311,369,311,466,392};字持续时间[COUNT_NOTES] PROGMEM = {//此处的持续时间350,350,350,250,100,350,250,100,700,350,350,350,250,100,350,250,100,700,350 ,250,100,350,250,100,100,100,450,150,350,250,100,100,100,450,150,350,250,100,750}; //虚空设置()// {INT主要(无效)//这是一个模拟无效设置(),以节省空间{DDRB | =(1&LT;&LT; PIN_BUZZER); //港口initsyalizatsiya DDRB&安培; =〜(1&LT;&LT; BUTTON); //连接一个上拉电阻PORTB | =(1&LT;&LT; BUTTON); // //此按钮将重置为0时,按(zamykinii)//} //无效循环()// {而(1){//模拟无效循环()(无限循环),如果((PINB和放大器;!(1&LT ;&LT; BUTTON))){//当按钮被按下(字节I = 0; I&LT; COUNT_NOTES;我++)//实际上失去调{嗡嗡声(pgm_read_word(及(频率的频道[i]))* 3 2 * pgm_read_word(及(持续时间[I]))); //最初://蜂鸣(PIN_BUZZER,pgm_read_word(及(频率的频道[I])),2 * pgm_read_word(及(持续时间[I]))); //但是我倍频3 //(pgm_read_word(及(频率的频道[I]))* 3)//就小喇叭大声发声} // _ delay_ms(100); //为了调试} // _ delay_ms(3000); //为了调试} //这些线路需要返回0; //诠释的主要(无效)} //虽然(1)//无效的嗡嗡声(unsigned char型针,字frequencyInHertz,字timeInMilliseconds)无效的嗡嗡声(字frequencyInHertz,字timeInMilliseconds)//其实它{//频率发生器长DELAYAMOUNT =(长)(长(1,000,000)/(长)frequencyInHertz); //参数有三个长LOOPTIME =(长)(((长)* timeInMilliseconds 500)/ DELAYAMOUNT); // 1 - 引脚(长I = 0; I&LT; LOOPTIME;我++)// 2 - {//频率3 - 持续时间// digitalWrite(针,HIGH); //生成所需的频率PORTB脉冲| =(1&LT;&LT; PIN_BUZZER); //为save'll把针在C中// delayMicroseconds(DELAYAMOUNT); //延迟女士在Arduino的_delay_us(DELAYAMOUNT); //在C // digitalWrite(针,LOW); PORTB和放大器; =〜(1&LT;&LT; PIN_BUZZER); // DelayMicroseconds(DELAYAMOUNT); //延迟女士在Arduino的_delay_us(DELAYAMOUNT); //在C}}&LT; /码&GT; PRE>

看来,它应该编译没有问题,但是当你使用这个代码在Arduino的IDE,至少增加了一倍莫名其妙hex文件大小“二进制代码草图的大小:1986字节(1024个字节的最大的)”
当我发现这一切都从使用_delay_us(*);虽然arduinovskaya功能delayMicroseconds(*);本质上做同样的事情,我认为这是麻烦的内核文件tini13,对资产阶级的Arduino论坛 a的分支>在哪里我把内核文件,虽然本身很少修改,一提到修饰的核心文件,我在了解使用Arduino的。
如果有人可以帮助解决这个bug只会是幸福的,因为理论上的Arduino IDE应该很容易吞下C-shny代码。

好了,关于固件几句话 - 第一视频Tin'kov跑在频率1.2兆赫,至于我,让120万够打自己喜欢的曲子,而不是吃多了,顺便十六进制文件操作被编译成该频率。


隐藏文本 B>



现在,谁拥有AVR程序员可以重复此设备。

如许在这篇文章中的开始。

最后 - “是抵达你的实力。”

来源:

标签

另请参见

新&值得注意