亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

带 TEA5767 模块的 DIY 复古外观 FM 收音机

组件和用品

Arduino Nano R3
× 1
TEA5767 FM 收音机模块
× 1
旧收音机的模拟仪表
× 2
Adafruit 标准 LCD - 16x2 蓝底白字
× 1
立体声电位器 10k log
× 1
D级音频功放模块2x3W
× 1
扬声器:3W,4 ohms
× 2
扬声器:0.25W,8 ohms
× 2
带按钮的旋转编码器
× 1
SparkFun 按钮开关 12mm
× 4
1microF 电容
× 2
LED(通用)
× 3

应用和在线服务

Arduino IDE

关于这个项目

该项目的基础是 Rodolfo Broco Manin(GitHub 上的 RodLophus)的代码,其中包含一个漂亮的 16x2 LCD 模拟刻度。我修改了他的代码,添加了两个用于读取信号强度和频率的模拟仪表、“立体声”LED 和“自动/手动搜索”LED。此外,作为复古细节,我添加了四个记忆键,其频率在代码中预定义,因此收音机具有完全古董的外观。 TEA5767 的音频输出通过立体声电位器连接到 D 类功放模块,功率为 2x3w,足以达到此目的。放大器连接了两个具有足够功率的 2 路扬声器。高音喇叭与中低音喇叭用1mf电容隔开。 Аnalog 仪表来自旧的有缺陷的收音机,但您可以使用任何仪表,指针的完全偏差将使用微调电位器进行调整。设备由两节锂电池串联供电,通过7805稳压器,稳定5V电源。

您可以在此处找到 TEA5767 Arduino 库。电路图和代码如下。

让我提一下,频率计指针每 1Mhz 会按顺序更新,我认为这是库的结果,但如果有人找到指针平滑移动的解决方案,我会很乐意接受。接收非常好,特别是对于强大的本地 FM 电台,而在较弱的电台中,由于立体声到单声道的频繁中断,反之亦然,因此需要立体声/单声道切换。下次更新代码时,我打算插入“立体声/单声道”和“静音”开关。

整个组件嵌在合适的盒子里,盒子上安装了一个伸缩天线,这样我们就有了一个完整的调频立体声接收器,外观漂亮。

代码

  • 代码
代码Arduino
/*使用Arduino Leonardo和飞利浦TEA5767模块的简单收音机调谐器(Arduino Uno版)注意:------ TEA5767最大供电电压为5V。确保您的 Arduino 供电不超过 5V - TEA5767 在读取时不会更新信号电平指示器。信号电平只会在电台更改时更新 - 如果编码器或按钮上出现一些故障,请使用缓冲网络,如下所示:Arduino pin>----+----/\/\/\ /---------> 编码器或开关引脚 | 100Ohms 电阻 ----- ----- 47nF 电容 | --- GNDConnections:------------ 编码器(带有“可推式”轴开关):按钮---> Arduino pin 2Encoder pin "A" ---> Arduino pin 3Encoder pin "B " ---> Arduino pin 4- LCD:D7 ---> Arduino pin 8D6 ---> Arduino pin 9D5 ---> Arduino pin 10D4 ---> Arduino pin 11RS ---> Arduino pin 13RW ---> GNDE ----> Arduino pin 12VO ---> 2k2 电阻接地(对比)- TEA5756 模块:顶视图:+-10--9--8--7--6-+| +------+ ++ || |茶 | || || | 5767 | || || +------+ ++ |+--1--2--3--4--5-+1 ----> Arduino SDA2 ----> Arduino SCL3 ----> GND5 ----> +5V6 ----> GND7 ----> 音频输出(右声道)8 ----> 音频输出(左声道)10 ---> 天线感谢您的关注。祝您玩得开心! [email protected]*/#include #include // 获取 TEA5767 库 https://github.com/andykarpov/TEA5767#include // 编码器pin#define ENCODER_SW 2#define ENCODER_A 3#define ENCODER_B 4#define button_freq1 A0#define button_freq2 A1#define button_freq3 A2#define button_freq4 A3//自定义字符#define SCALE_CLEAR 5 //无线电拨号标度#define STEREO_CHAR_S 6 //风格化” S"#define STEREO_CHAR_T 7 // 程式化的 "T" // 全局状态标志#define ST_AUTO 0 // 自动模式(通过按钮切换)#define ST_STEREO 1 // 无线电模块检测到立体声飞行员#define ST_GO_UP 2 //编码器顺时针转动#define ST_GO_DOWN 3 // 编码器逆时针转动#define ST_SEARCH 4 // 无线电模块正在执行自动搜索常量int LED =0;intanalogsignal=0;intanalogscale=0;intstereoled=0; TEA5767 Radio;float frequency =88;byte status =0;LiquidCrystal lcd(13, 12, 11, 10, 9, 8);/******************** ************************\ * updateScale() * * 在无线电刻度上移动“指针” *\********* **********************************/void updateScale() { int lcdBase =(频率 - 88) * 4; // LCD 列像素索引 (0 <=lcdBase <=(16 * 5)) if(lcdBase> 79) lcdBase =79; int lcdMajor =lcdBase / 5; // LCD 字符索引 (0 <=lcdMajor <=15) int lcdMinor =lcdBase % 5; // 字符内 LCD 像素列索引 (0 <=lcdMinor <=4) if(lcdMajor> 0) { // 无线电拨号针不在最左边位置: // 清除左边的字符(擦除之前的指针位置) lcd.setCursor(lcdMajor - 1, 0); lcd.write(SCALE_CLEAR); } else lcd.setCursor(lcdMajor, 0); lcd.write(lcdMinor); if(lcdMajor <15) // 不在最右边:清除右边的字符 lcd.write(SCALE_CLEAR);}/********************** ********\ * isrEncoder() * * 捕捉编码器的中断 *\******************************** **/void isrEncoder() { 延迟(50); // 去抖动(对于糟糕的编码器) if(digitalRead(ENCODER_B) ==HIGH){ bitWrite(status, ST_GO_UP, 1); } else bitWrite(status, ST_GO_DOWN, 1);}/*****************************\ * isrSwitch() * * Catch switch?s 中断 *\************************************/void isrSwitch() { delay(50); // 去抖动 if(bitRead(status, ST_AUTO)) bitWrite(status, ST_AUTO, 0); else bitWrite(status, ST_AUTO, 1);}/*******************\ * Arduino Setup() *\*********** ********/void setup() { Serial.end(); pinMode(button_freq1,输入);数字写入(button_freq1,低); pinMode(button_freq2,输入);数字写入(button_freq2,低); pinMode(button_freq3,输入);数字写入(button_freq3,低); pinMode(button_freq4,输入);数字写入(button_freq4,低); pinMode(LED,输出); pinMode(6,OUTPUT); pinMode(7,输出); pinMode(5,OUTPUT);国际我;字节needleChar[8]; // 程式化的“S”字节stereoChar1[8] ={ 0b01111, 0b11000, 0b11011, 0b11101, 0b11110, 0b11000, 0b01111, 0b00000 }; lcd.createChar(STEREO_CHAR_S,stereoChar1); // 程式化的“T”字节stereoChar2[8] ={ 0b11110, 0b00011, 0b10111, 0b10111, 0b10111, 0b10111, 0b11110, 0b00000 }; lcd.createChar(STEREO_CHAR_T,stereoChar2); // 表盘刻度背景字节 scaleChar[8] ={ 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00100, 0b10101, 0b10101 }; lcd.createChar(SCALE_CLEAR, scaleChar); // 创建自定义字符来表示所有(5)个可能的针的位置 for(int j =0; j <5; j++) { for(i =0; i <8; i++)needleChar[i] =scaleChar[i ] | (0b10000>> j); lcd.createChar(j,needleChar); } lcd.begin(16, 2);液晶显示器(); // 绘制刻度盘的背景 for(i =0; i <16; i++) lcd.write(SCALE_CLEAR); pinMode(编码器_SW,输入);数字写入(编码器_SW,高); pinMode(编码器_A,输入);数字写入(编码器_A,高); pinMode(编码器_B,输入);数字写入(编码器_B,高); attachInterrupt(0, isrSwitch, RISING); attachInterrupt(1, isrEncoder, RISING); // 初始化无线电模块 Wire.begin(); Radio.init(); Radio.set_frequency(frequency);}/******************\ * Arduino Loop() ****************** ***/void loop() { unsigned char buf[5];国际立体声;整数信号级别; int搜索方向;国际我;我=0; // 更新自动/手动指标 lcd.setCursor(12, 1); lcd.write(bitRead(status, ST_AUTO) ? 'A' :'M'); if bitRead(status, ST_AUTO) // 自动/手动 LED { digitalWrite(LED, LOW); } else { digitalWrite(LED, HIGH); } if (Radio.read_status(buf) ==1) { // 获取无线电数据频率 =floor(Radio.frequency_available(buf) / 100000 + .5) / 10;立体声 =Radio.stereo(buf); // 0 <=Radio.signal_level <=15 signalLevel =(Radio.signal_level(buf) * 100) / 15;模拟信号=地图(信号电平,0,100,0,255);模拟刻度=地图(频率,88,114,0,255);立体=地图(立体,0.7,1,0,255);模拟写入(5,模拟信号); // 信号计analogWrite(6,analogscale); //频率计analogWrite (7,stereoled); //立体声LED // 更新无线电拨号 updateScale(); // 信号电平指示器 lcd.setCursor(0, 1);液晶显示器(183); // 看起来像天线的日语字符 :) if(signalLevel <100) lcd.write(' '); lcd.print(信号电平); lcd.write('%'); // 频率指示器 lcd.setCursor(6, 1); if(频率 <100) lcd.write(' '); lcd.print(频率,1); // 单声道/立体声指示器 lcd.setCursor(14, 1); if(stereo){ lcd.write(STEREO_CHAR_S); lcd.write(STEREO_CHAR_T); } else lcd.print(" "); } if(bitRead(status, ST_SEARCH)) { // 无线电是否在执行自动搜索? if(Radio.process_search(buf, searchDirection) ==1) { bitWrite(status, ST_SEARCH, 0); } } if(digitalRead(button_freq2)==HIGH){ //“记忆”按钮 if(frequency> 94.8) { frequency=94.8; Radio.set_frequency(频率);位写入(状态,ST_GO_DOWN,0); } else { 频率=94.8; Radio.set_frequency(频率);位写入(状态,ST_GO_UP,0); } precrtajScale(); }if(digitalRead(button_freq1)==HIGH){ if(frequency> 92) { frequency=92; Radio.set_frequency(频率);位写入(状态,ST_GO_DOWN,0); } else { 频率=92; Radio.set_frequency(频率);位写入(状态,ST_GO_UP,0); } precrtajScale();}if(digitalRead(button_freq3)==HIGH){ if(frequency> 97) { frequency=97; Radio.set_frequency(频率);位写入(状态,ST_GO_DOWN,0); } else { 频率=97; Radio.set_frequency(频率);位写入(状态,ST_GO_UP,0); } precrtajScale(); }if(digitalRead(button_freq4)==HIGH){ if(frequency> 101.2) { frequency=101.2; Radio.set_frequency(频率);位写入(状态,ST_GO_DOWN,0); } else { 频率=101.2; Radio.set_frequency(频率);位写入(状态,ST_GO_UP,0); } precrtajScale();} // 编码器顺时针旋转 (+) if(bitRead(status, ST_GO_UP)) { if(bitRead(status, ST_AUTO) &&!bitRead(status, ST_SEARCH)) { // 自动搜索模式(仅限如果无线电当前未执行搜索,则处理) bitWrite(status, ST_SEARCH, 1); searchDirection =TEA5767_SEARCH_DIR_UP; Radio.search_up(buf);延迟(50); } else { // 手动调谐模式 if(frequency <108) { frequency +=0.1; Radio.set_frequency(频率);位写入(状态,ST_GO_UP,0); } // 编码器逆时针旋转 (-) if(bitRead(status, ST_GO_DOWN)) { if(bitRead(status, ST_AUTO) &&!bitRead(status, ST_SEARCH)) { // 自动搜索模式(仅当收音机处于当前未执行搜索) bitWrite(status, ST_SEARCH, 1); searchDirection =TEA5767_SEARCH_DIR_DOWN; Radio.search_down(buf);延迟(50); } else { // 手动调谐模式 if(frequency> 88) { frequency -=0.1; Radio.set_frequency(频率);位写入(状态,ST_GO_DOWN,0); }}void precrtajScale() { int i;液晶显示器(); for(i =0; i <16; i++) lcd.write(SCALE_CLEAR);}

示意图


制造工艺

  1. 使用蓝牙网状网络进行设计:芯片还是模块?
  2. DIY Virtual Alike NEST Thermostat with Node-RED
  3. 带有 RPi 的环境传感器 API
  4. 使用 Raspberry Pi 的简单 DIY 婴儿哭闹检测器
  5. DIY 最简单的 IV9 Numitron 时钟与 Arduino
  6. 使用示例在 Python 中导入模块
  7. 用 Arduino 捕捉水滴
  8. DIY 虚拟现实滑板
  9. 基于 Arduino 的淋浴间调频收音机
  10. 如何将 Arduino Mega 与 NEO-6M GPS 模块连接
  11. DIY 电压表与 Arduino 和诺基亚 5110 显示器
  12. 带灯光效果的万圣节 PIR 近距离恐吓扬声器