反复调试了好几个版本的收音机终于可以发布了,真是一个开心的时刻。
我对收音机的感情非常深厚,早年创客文化和经济并不发达的年代,在封闭的小乡村中,收音机伴随着我度过了童年,给我带来了莫大的欢乐。
如今已经很少有人听收音机了,地方电台节目逐步沦落,充斥着到各种恶俗的广告。很庆幸,首都北京还是有好多高质量的FM电台的,比如91.5MHz的EasyFM,飞鱼秀、摩天轮这些节目,给我忙碌的工作中增添了几分轻松和愉悦。
在大城市中,AM的广播基本无法正常收听,干扰太多,而FM广播具有先天的抗干扰能力,让其能够在嘈杂的都市中特立独行。目前比较物美价廉的FM芯片解决方案有两种,一种是飞利浦(现在是NXP)的TEA5767芯片,另外一种是Silicon Labs的Si4703,后者价格较贵并且不易获得,所以我选择了TEA5767。
市场上有一种基于TEA5767的微型模块,很便宜。这个模块把基本的外围元件都焊接好了,包括晶振电阻电容。使用起来很方便。
我们需要使用I2C总线控制TEA5767,最重要的操作就是设定电台频率。使用Arduino来操作I2C总线的器件很方便,更方便的是,已经有开发好的Arduino Library可以直接使用。
http://mathertel.github.io/Radio/
我使用了一片TM1638芯片来实现LED数码管的驱动和按键的扫描,这样就可以显示电台频率,读取用户输入操作了。
TM1638芯片功能强大,也有做好的Arduino Library可以直接拿来使用。
http://code.google.com/p/tm1638-library/
音频输出部分使用了一块PAM8403 D类功放芯片,D类功放的最大特点就是效率高。
设计制作此收音机的最大难点在于降低各种干扰,因此我在电路中使用了各种滤波手段,大家可以在电路板上看到很多电容和磁珠,这都是经过多次实践后的选择。最终版本在实际收听过程中,背景噪音极低,效果很好。
下面是完整的操作收音机的Arduino源码,供大家参考。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
#include <Arduino.h> #include <Wire.h> #include <radio.h> #include <TEA5767.h> #include <TM1638.h> #include <EEPROM.h> // define a module on data pin 2, clock pin 3 and strobe pin 4 TM1638 module(2, 3, 4,true,2); #define SADDR 999 TEA5767 radio; uint16_t stations[]={8760,8870,9000,9050,9150,9660, 9740,10060,10180,10250,10390,10610,10730}; int8_t i=0; uint8_t n=sizeof(stations)/sizeof(uint16_t); void up() { i++; if(i >= n){ i=0; } } void down() { i--; if(i < 0) { i=n-1; } } uint32_t get_display_number(uint32_t i){ uint32_t station=stations[i]; station = station * 1000; return station; } void setup() { i=EEPROM.read(SADDR); if(i>=n) i=4; Serial.begin(9600); radio.init(); radio.setBandFrequency(RADIO_BAND_FM, stations[i]); radio.setVolume(0); radio.setBassBoost(false); radio.setMono(true); module.setDisplayToDecNumber(get_display_number(i), 0b00100000,true); } void loop() { byte keys = 0; keys = module.getButtons(); if(keys != 0 ){; Serial.println(keys,HEX); if(keys == 4) { up(); } if(keys == 64) { down(); } module.setDisplayToDecNumber(get_display_number(i), 0b00100000,true); delay(200); } if(EEPROM.read(SADDR) != i) { radio.setFrequency(stations[i]); EEPROM.update(SADDR,i); char s[12]; radio.formatFrequency(s, sizeof(s)); } } |
参考资料:
https://www.sparkfun.com/datasheets/Wireless/General/TEA5767.pdf
http://www.diodes.com/_files/datasheets/PAM8403.pdf
http://www.titanmec.com/index.php/product/lists/typeid/6/p/2.html
请问楼主,PCB还有吗?我也想弄一块出来玩玩。
还有几块,有需要可以加我QQ 34671980 。