当前位置: 首页 > news >正文

立创开源RDA5807收音机DIY:基于ESP32与GC9307屏的硬件改造与代码适配全记录

立创开源RDA5807收音机DIY:基于ESP32与GC9307屏的硬件改造与代码适配全记录

最近在立创开源平台上看到一个挺有意思的RDA5807收音机项目,自己动手复刻了一个。整个过程下来,从硬件焊接、驱动修改到功能增加,踩了不少坑,也学到了很多。今天我就把整个改造和适配的过程详细记录下来,手把手教你如何用ESP32、GC9307屏幕和RDA5807收音模块,打造一台功能完善的个人FM收音机。无论你是刚入门嵌入式的小白,还是有一定经验的爱好者,这篇记录应该都能给你一些参考。

1. 项目概述与硬件清单

这个DIY项目的核心,是把几个独立的模块整合成一个能用的产品。咱们先来看看都需要哪些东西。

核心硬件清单:

  • 主控:ESP32核心板。我选它是因为开发环境(Arduino)友好,引脚多,性能也足够,关键是自带Wi-Fi和蓝牙(虽然这个收音机项目暂时没用上),以后想扩展功能很方便。
  • 收音模块:RDA5807。这是一个数字FM收音机芯片,灵敏度不错,支持频率范围76-108MHz,通过I2C接口控制,用起来很简单。
  • 屏幕:1.47寸LCD,驱动芯片是GC9307。选择它主要是为了适配我手头的一个现成外壳(极客巢V4mini收音机外壳),而且价格比较便宜。不过要注意,它的显示驱动和常见的ST7789有点小区别,需要修改库文件。
  • 功放:NS4160。一个小功率的D类音频功放,驱动小喇叭音量足够大,效果不错。
  • 电源管理:包括TP4056锂电池充电管理芯片、ME6217线性稳压器(给数字部分供电)、以及一个“一键开关机”电路。因为外壳没有预留机械开关的位置,所以用MOS管搭了一个软开关电路。
  • 输入设备:一个旋转编码器(用于调台和音量),以及几个轻触开关。

注意:本项目的外壳采用了极客巢V4mini收音机的外壳设计,由群内的Sandy大佬设计。由于外壳非本人原创,所以不提供开源文件,你可以到立创开源硬件平台搜索“适合初学者系列之ESP-全波段收音机”项目页面自行下载。

硬件的大致连接关系是:ESP32作为大脑,通过I2C控制RDA5807收台,通过SPI驱动GC9307屏幕显示信息,通过GPIO读取编码器和按键,并通过一个GPIO控制NS4160功放的使能脚来实现静音。电池电压通过电阻分压后,送入ESP32的ADC引脚进行检测。

2. 硬件设计与改造要点

原项目的原理图和PCB都在立创EDA上开源了。但在实际制作和测试中,我发现并修改了两个比较关键的地方。

2.1 解决ESP32 GPIO0的异常抖动问题

在最初的测试中,我发现有些ESP32核心板的GPIO0引脚在上电后会有不规律的电平抖动。GPIO0是个特殊引脚,它关系到ESP32的启动模式(上电时检测其电平来决定是进入正常启动模式还是下载模式)。如果它乱跳,可能会导致系统运行不稳定,甚至无法正常启动。

我的解决办法是硬件上拉:在电路板上,找到GPIO0连接的线路,手动增加一个10kΩ的电阻连接到3.3V电源上,给它一个稳定的高电平。这样就能确保ESP32每次上电都进入正常的应用程序运行模式,避免了意外进入下载模式或重启。

// 在代码初始化时,也可以将这个引脚明确设置为上拉输入,增加可靠性 pinMode(0, INPUT_PULLUP);

2.2 电源与静音电路设计

电源部分用了两个ME6217 LDO,分别给数字部分(ESP32、屏幕等)和模拟部分(收音模块、功放)供电。这样做的好处是数字电路的噪声不会通过电源串扰到敏感的收音电路,让收音效果更干净。

一个重要的改进是“零音量静音”:在调试时发现,即使把软件音量设置为0,RDA5807模块和NS4160功放可能仍然会有微弱的底噪或电流声。为了彻底静音并可能节省一点电量,我修改了电路和代码。

  • 硬件上:NS4160功放芯片有一个“关断”或“使能”引脚(SHUTDOWN)。当这个引脚为低电平时,功放芯片完全关闭,功耗极低。
  • 软件上:在程序里判断,当用户将音量调节到0时,除了设置RDA5807的音量寄存器为0,还额外控制一个GPIO引脚,将这个引脚拉低,从而关闭NS4160功放。当音量大于0时,再重新打开功放。
// 假设控制NS4160使能端的GPIO是 GPIO_NUM_25 #define AMP_SHUTDOWN_PIN 25 void setVolume(uint8_t vol) { if (vol == 0) { rda5807.setVolume(0); // 设置收音芯片音量为0 digitalWrite(AMP_SHUTDOWN_PIN, LOW); // 关闭功放芯片 } else { digitalWrite(AMP_SHUTDOWN_PIN, HIGH); // 开启功放芯片 rda5807.setVolume(vol); // 设置收音芯片音量 } }

3. 软件驱动与代码适配

软件部分是基于国外大佬Volos在GitHub上开源的TEmbedFMRadio项目修改的。原项目可能针对不同的硬件,我们需要对它进行一系列适配。

3.1 适配GC9307显示屏驱动

这是折腾最久的部分。GC9307驱动芯片的指令集和ST7789类似,但在Arduino常用的TFT_eSPI库中,它的显示旋转(Rotation)处理可能不完整,导致屏幕显示方向不对或偏移。

修改驱动库文件:你需要找到电脑上TFT_eSPI库的安装位置,通常路径是:C:\Users\[你的用户名]\Documents\Arduino\libraries\TFT_eSPI\TFT_Drivers\

打开GC9307_Rotation.h文件(如果没有,可能是ST7789_Rotation.h,具体看库文件),找到控制旋转的代码段进行修改。

  1. 找到setRotation函数,里面通常有一个switch (rotation)语句。
  2. 我们需要增加一个旋转模式(case 4)。通常原代码只处理了0-3(0°、90°、180°、270°),但我们的屏幕可能需要一个“反转的横向”模式。
  3. 修改方法如下(以原文件结构为例):
// 找到类似这样的行,可能原来是 m % 4,改为 m % 5 以支持第4种模式 rotation = m % 5; // 修改前可能是 rotation = m % 4; // 在 switch (rotation) 语句块内,在最后一个 break; 之后,添加 case 4: case 4: // Inverted landscape (反转横向) #ifdef CGRAM_OFFSET // 以下偏移值需要根据你的具体屏幕分辨率调整,这里列出了几种常见尺寸的偏移 if (_init_width == 135) // 例如 240x135 屏幕 { colstart = 40; rowstart = 52; } else if(_init_height == 280) // 例如 240x280 屏幕 { colstart = 20; rowstart = 0; } else if(_init_width == 172) // 例如 320x172 屏幕 { colstart = 0; rowstart = 34; } else if(_init_width == 170) // 另一种常见尺寸 { colstart = 0; rowstart = 35; } else // 默认偏移 { colstart = 80; rowstart = 0; } #endif // 发送屏幕旋转指令 writedata(TFT_MAD_MV | TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); // 交换宽高值,因为旋转了90度 _width = _init_height; _height = _init_width; break;

修改后,在主程序初始化屏幕时,调用tft.setRotation(4);应该就能正确显示了。另外,GC9307的颜色映射有时会和ST7789相反,比如白色显示成黑色。我实际测试觉得默认的颜色效果可以接受,就没有深入修改颜色表。如果你觉得颜色不对,可能还需要调整TFT_eSPI库中关于颜色顺序的宏定义。

3.2 新增与修改的功能点

在原版代码基础上,我主要增加了以下几个实用功能:

  1. 手动存储15个电台:原版可能只有自动搜台。我增加了手动存台功能。将音量调节到非0值(比如1),然后单击旋转编码器,就会把当前频率存储到第1个位置。再单击,存到第2个,以此类推,最多15个。这个数据会保存到ESP32的Non-Volatile Storage (NVS)里,断电不丢失。

  2. 10秒无操作息屏:为了省电,如果10秒内没有操作任何按钮或编码器,屏幕会自动关闭。触碰任何按键,屏幕会立即点亮。

  3. 电池电压直接显示:ESP32的ADC引脚测量范围是0-3.3V。我用两个100kΩ电阻对电池电压(最高约4.2V)进行分压,这样ADC测到的电压是实际电压的一半。在代码里将读取值乘以2,就能在屏幕上直接显示准确的电池电压了,比如“3.85V”,比显示抽象的百分比更直观。

  4. 修复零音量无声:如前所述,通过控制NS4160的使能引脚,实现真正的静音。

  5. 彩蛋功能:长按编码器,屏幕会显示“HappyNewYear”字样,算是为项目增加一点趣味性。

4. 烧录与使用教程

硬件焊接好,代码也准备好之后,就可以烧录程序了。

4.1 使用乐鑫工具烧录固件

对于新手,我建议直接使用编译好的.bin固件文件进行烧录。

  1. 下载工具:从乐鑫官网下载Flash Download Tools
  2. 连接硬件:将USB转TTL烧录器的TX、RX、GND分别连接到ESP32核心板的RX、TX、GND。特别注意:将ESP32的GPIO0引脚与GND短接(这是让ESP32进入下载模式的关键一步),然后给核心板上电或按一下EN(复位)键。
  3. 配置烧录工具
    • 打开工具,选择芯片类型为ESP32
    • 在下方添加需要烧录的bin文件,并设置对应的烧录地址:
      • 第一个文件(通常是bootloader.bin)地址填0x1000
      • 第二个文件(通常是partitions.bin)地址填0x8000
      • 第三个文件(应用程序firmware.bin)地址填0x10000
    • SPI Speed 选40MHz,SPI Mode 选DIO
  4. 开始烧录:点击START,等待进度条走完,显示“FINISH”。
  5. 重启设备:烧录完成后,断开GPIO0GND的短接,然后重新上电或按一下EN键,ESP32就会运行我们刚烧进去的程序了。

4.2 收音机使用方法

设备开机后,操作很简单:

  • 按钮1:单击开机,再次单击关机(通过一键开关电路实现)。
  • 按钮2:单击音量增加,长按直接切换到下一个已存储的电台(从第1个开始,循环切换)。
  • 按钮3:单击音量减少,长按直接切换到上一个已存储的电台(从第15个开始,循环切换)。
  • 旋转编码器:逆时针旋转频率增加,顺时针旋转频率减少。单击编码器,如果当前音量值不为0(建议调到1),则执行存台操作,存储顺序从1到15循环。
  • 长按编码器:会触发显示“HappyNewYear”彩蛋。

我在高层的室内阳台测试,可以稳定收到48个FM电台,效果令人满意。整个项目从硬件拼装、问题排查到软件功能添加,是一个完整的嵌入式产品DIY过程。希望这份详细的记录能帮你少走弯路,成功做出属于自己的小收音机。如果制作过程中遇到问题,欢迎在开源项目页面下留言讨论。

http://www.jsqmd.com/news/476404/

相关文章:

  • 小红书内容采集工具:自媒体运营者的素材管理方案
  • ONLYOFFICE连接器(Connector)实战指南:从基础API到业务系统深度集成
  • Windows驱动清理终极指南:释放系统空间的专业方法
  • 4. ESP32-S3 GPIO0按键控制LED:从硬件原理到软件消抖的完整驱动实现
  • Ubuntu 18.04 系统下 GAMMA 遥感处理平台的完整部署与疑难排解
  • 新手零基础入门:借助快马ai轻松搞定vscode c/c++环境搭建全攻略
  • 集合竞价数据处理差异解析:同花顺与通达信的bar逻辑对比
  • AutosarOS深度解析:钩子例程在错误处理与系统调试中的实战应用
  • 指针函数:从避坑到实战
  • 从空间到频率:深入解析频域滤波在图像处理中的核心应用
  • DBVisualizer连接MySQL 8.0的驱动更新与配置指南
  • STM32F4软件模拟SPI驱动W25Q64 Flash存储实战
  • 【模电进阶】RC移相振荡电路:从三阶选择到频率稳定性的深度剖析
  • Windows桌面黑屏仅剩鼠标?三步快速恢复explorer.exe进程
  • 深入解析ROS软时间同步机制:message_filters实战与性能对比
  • Quantum Espresso实战进阶:HSE混合泛函在能带计算中的精准应用
  • 自动驾驶决策算法 —— 有限状态机 FSM 的优化与混合架构实践
  • 华为防火墙双机热备实战:从eNSP模拟到高可用网络架构
  • GLM-OCR助力AIGC内容创作:从图片文档中提取灵感与素材
  • Winform实现多语言切换
  • 将面试题转化为实战项目:使用快马开发高性能虚拟列表组件应用
  • CANoe Trace窗口:从数据洪流到精准洞察的实战指南
  • 2026年上海地区监控机器人专业维修,推荐靠谱的服务商 - 工业品网
  • 高效采集小红书无水印方案:开源工具XHS-Downloader技术实践指南
  • 突破多平台直播瓶颈:obs-multi-rtmp多路推流全攻略
  • 3步解锁大屏游戏体验:Moonlight TV跨设备串流全攻略
  • Anonymous GitHub —— 一键匿名化你的代码仓库(助力学术双盲评审)
  • UEC++ 虚幻5实战:智慧工地数字孪生UI系统开发全流程
  • 多项式_笔记
  • Android系统10 RK3399启动流程解析:parameter.txt中的关键参数与分区布局