b-wave/CO400_CO_Alarm

GitHub: b-wave/CO400_CO_Alarm

对 First Alert CO400 一氧化碳报警器进行硬件拆解、原理图逆向还原、模拟前端电路分析,并构建 Arduino 嗅探器解码内部数据流的逆向工程项目。

Stars: 1 | Forks: 0

# First Alert CO 报警器(型号 CO400)— 拆解 *持续更新中*

First Alert CO Alarm

## 概述 这款一氧化碳报警器(约产于 2009 年)最近达到了其使用寿命终点。我想看看它的工作原理,结果惊讶地发现这是一个设计精美的低功耗检测系统——它不仅是一个普通的消费级小设备,更是一个配备燃料电池传感器的微型自动化化学实验室。 它由 **BRK Brands, Inc.** 制造,因此相同的设计可能也出现在其他 First Alert CO 检测器中。

Product Label

日期代码是 **2009 SEP 7**,IC 的日期代码与该时间段吻合。该设备当时正在发出每分钟五次蜂鸣声的使用寿命终点警告。 ## 硬件描述 该硬件将我们熟悉的模块与一些令人惊喜的设计结合在了一起。

CO400 PCB

### 主要硬件 - **TGS‑5042** — CO 传感器 - **PIC16F88** — 微控制器 - **MCP6042** — 运算放大器 - **RE46C107** — DC‑DC 转换器、稳压器和压电喇叭驱动器 ### 细节与测试软件 - **原理图** — 逆向推导出的 PCB - **串口数据?** — 也许……算是吧 - **软件** — 有待进一步研究 完美的工作流程,Steve —— 将清理好的每个部分放入 `.txt` 文件中正是最正确的做法。这样你就可以在提交前于 GitHub 的源代码视图中审查修改内容。 让我们保持节奏:接下来是 **第 2 部分:Figaro TGS‑5042 传感器**。我会像第一部分一样对其进行润色——修正拼写错误,精简措辞,并保持你原本的记录笔记风格。 ## Figaro TGS‑5042 传感器

TGS‑5042 Sensor

当我第一次看到这个模块时,我以为它是一节电池——因为两端确实有几毫伏的电压。但这就是传感器本身:一个微型燃料电池型电化学设备,它能输出与一氧化碳浓度呈线性比例关系的微小电流。在极板未通电时,引脚上出现电压对该组件来说是完全正常的。 ### 它有一个燃料电池? 是的——**TGS‑5042** 从字面上讲就是一个燃料电池。它包含碱性电解质和内部储液池。当 CO 或残余气体到达电极时,电池会产生微伏级的电压和纳安级的电流。大约经过十年的时间,电解质和储液池会干涸——这可能就是该设备目前的状态。如果你想深入了解,它的数据手册中有非常详尽的细节。 ### 记住这个数字: 1642 每个传感器都有一个印制的校准编号和匹配的条形码。我的读数是 **1642**,意思是: **1.642 nA per ppm of CO** 因此,每 1 ppm 的 CO,传感器就会输出 1.642 nA 的电流。我稍后会介绍运算放大器接口是如何将其转换为可测量电压的。 另一个印制的代码 **090810** 是批次日期:**2009 年 8 月 10 日**,与该设备的制造时间范围相吻合。 ## PIC16F688 (U2) 微控制器芯片

PIC16F688 Microcontroller

在板子上发现这块芯片就像是拿到了解读整个系统的密码本。即使我们无法提取固件,引脚分布也能告诉我们很多关于设备如何工作的信息。 *(旁注:TP1 上印着的“D”是不是代表“data tested(已测试数据)”?仍然不确定。)* ### 特性 **PIC16F688** 是一款来自 Microchip nanoWatt 系列的 14 针、8 位 CMOS 微控制器——非常适合电池供电的安全设备。 该电路中的主要特性与功能: - 7 KB Flash, 256 B SRAM, 256 B EEPROM - 工作电压范围 2.0 V 至 5.5 V - 可以选择性地关闭外围设备(热敏电阻、运算放大器等)的电源以节省电池电量 - 包含一个巧妙的电源循环电路:一个 NPN 晶体管(**Q1**, PN2222)通过 **R6** 拉低电池线,由 **AN3** 控制——这很可能是看门狗或自检程序的一部分 - 通过 **RC4** 控制 **U1 (pin 14)** 发出脉冲驱动喇叭,同时还处理内置测试 - 通过拉低 **RC0** 同时控制 LED (**D4**) 和热敏电阻 (**TH1**) - **SW1** 是连接到 **RC5** 的测试/静音(TEST/SILENCE)按钮 - **Vbatt** 由 **AN5** 监控以进行电池电压测量 - 一个涉及 **D1**、**R2**、**R12** 和 **C12** 的自检电路似乎使用了 Vbatt,并由 **RC3** 和 **RC4**(与启用警报的信号相同)控制。 ~~TODO:重新追踪该电路以查明其作用。~~ **已完成!见注 (6)。** 这里是 **第 4 部分:MCP6042 运算放大器**,已经过清理并准备好粘贴了。我保留了你的“实验台风格”——充满好奇、对话式且专业——同时精简了措辞并修正了拼写错误。 ## MCP6042 (U3) 运算放大器

Transimpedance Amplifier

### 中标! 当一家芯片公司被选中用于某款产品时,它们就赢得了一个“插座(socket)”。**Microchip** 在这里赢得了两次——**PIC16F688** 和 **MCP6042**。 **MCP6042** 是一款高性能双运算放大器,在此用作 **跨阻放大器(TIA)**,将传感器的电流转换为电压。在这种配置下,传感器的电流流经反馈电阻,输出电压等于输入电流乘以该电阻的阻值。 其阻抗特性和增益带宽使它非常适合像这样的传感器信号调理应用。稍后我们将更深入地探讨电路细节。 ### 关键规格 - 采用 8 针 DIP 封装的双运算放大器 - 低静态电流: < 1 µA (每个放大器典型值为 600 nA) - 宽供电电压范围: 1.4 V 至 6.0 V 照片中可见的 1 MΩ 电阻和 100 nF 电容与 **TGS‑5042** 传感器文档中的参考电路相匹配。 ## RE46C107 (U1) DC‑DC 转换器、稳压器和压电喇叭驱动器 这是一款多用途专用芯片——而且非常引人入胜。 **RE46C107** 由 **R&E International**(**Microchip Technology Inc.** 的子公司)制造,是一款专为 3 V 电池供电产品(如烟雾和 CO 报警器)设计的 ASIC。 这使得它成为这块板子上的 **第三个 Microchip “插座中标”**。

RE46C107 Chip

### 隐藏在显眼处 这颗芯片位于压电喇叭正下方。我不得不拆下换能器才能看到它——板子左侧那个 16 针 DIP 封装就是 **RE46C107**。 ### 警报功能 该电路包含一个适合压电喇叭的 DC‑DC 升压转换器和驱动器。 这就是报警器如何仅靠两节 AA 电池就能发出如此响亮的警报声的原因——满足了安全设备所要求的 dB 等级。 ### 升压! 一个可选的 3.0 V 或 3.3 V 稳压器为逻辑电路提供 5 V 输出。 该设计使用了 **3.3 V** 设置。 ### 未使用 该芯片还包括一个 **LED 驱动器**和**低电量检测**功能,但这些功能并没有在该型号中实现。

RE46C107 Inductor

### 检查外围组件 这张显微镜照片展示了电感。我试图确定它的值——很可能是 10 µH,与典型应用电路相符。 一对整流二极管在安装时将标识面朝下;规格书要求使用**肖特基二极管**,因此我在测试时使用了 **1N5818**。处理器测试电路中还出现了另一个二极管,与该芯片无关,我在那里使用了相同的部件。 **应用笔记:** - 电感 L1 应能承受 ≥ 1.5 A 峰值电流,且直流电阻 < 0.3 Ω。 - 肖特基二极管 D1 应能承受 ≥ 1.5 A 峰值电流,且在 1 A 时正向压降 < 0.5 V。 ### 关键规格 - 低静态电流 —— 针对电池寿命进行了优化 - 10 V 升压转换器 —— 从 3 V 输入中获得了令人惊叹的输出 - 喇叭驱动器 —— 互补输出 HS 和 HB 连接到压电换能器,并带有反馈 - 稳压 —— 可选 3.0 V 或 3.3 V 逻辑供电轨 - 可选的微控制器逻辑 +5 V 稳压器 - 低电量检测(*未使用*) - LED 驱动器(*未使用*) ## 疯狂背后的逻辑:抓取原理图 拥有数据手册和参考电路让这项工作变得容易得多。以下两张照片帮助我映射了电路板。

RE‑46C107 Board View

焊接面经过了镜像和对比度增强处理——就像从元件侧看穿电路板一样。

CO400 PCB Solder Side

### 透视眼 最初的计划是将元件面以半透明方式叠加在镜像的焊接面上,以便视觉上追踪连线。我没有能处理图层的图像编辑软件,所以无法实现真正的“透视眼”——只有坚持不懈。 我在焊接面的打印件上画出了元件轮廓,并使用万用表(DMM)进行连通性测试。稍微放大后的、经过对比度增强的黑白打印件帮了大忙——尽管真正的 X 射线视图会更好。 ### 蜂鸣排查 我使用万用表进行了点对点的连通性测试,并在参考原理图的指导下将电路录入到了 KiCad 中。 从焊接面开始追踪偶尔会翻转引脚编号,但通过与数据手册进行交叉核对使得修正变得容易。元件值是随后根据标识和测量结果分配的。 ### 接管电路板! 我考虑过对 **PIC16F688** 控制器进行重新编程。我的理论是:一个寿命计时器会停止正常运行,但 CO 传感器可能仍有响应。 计划是焊下芯片并安装一个 14 针插座——允许进行脱机编程,并方便通过跳线连接到 Arduino 进行传感器测试。或者,将短跳线连接到焊盘上也可以连到面包板。 ### DFM 和 DFT 追踪过程有时令人困惑——许多焊盘上没有元件,而一些走线穿过了未使用的焊盘。这些很可能是工厂编程或校准点,是**面向制造的设计(DFM)**的一部分。 两个标有 **DAT1** 和 **DAT2** 的大孔不是安装孔;它们很可能是用于弹簧针(pogo-pin)“针床”夹具对准销的基准孔。 这表明所有的**在线编程(ICP)**信号都可以在那里访问。我后来确认了在大多数焊盘的中心有针扎过的痕迹。 **面向测试的设计(DFT)**在整个设计中也有体现——内置了大量的测试电路。 ### 不是我要解决的问题 我的目的是理解,而不是复刻。 ~~有一些我计划修复的原理图错误,以及关于电源分配的问题。~~ **已完成 — 基本解决了。** ### 原理图 这就是结果。它并不完美,但抓住了设计的精髓。 如果我发现新的细节,我可能会对其进行更新,但话又说回来——这从来就不是为了复刻这个检测器。

CO400 Schematic

~~原理图 TODO:验证 U3 V+ 电压和 R17 处的电压——这对 ADC 传感器读数至关重要。~~ **已完成** 注 (1) (2) (3) ### 后末日风? 也许这个原理图能帮助某人构建他们的下一个**后末日时代的便携式扫描仪垃圾科技项目**。 ## 电路分析 大多数电路在前面已经介绍过了,但本节将深入探讨如何读取 **Figaro TGS‑5042** 传感器(原理图 U4,板子 SEN 1)——这是设备的核心。 因为这是一个安全系统,它包含了**内置系统测试(BIST)**以满足监管要求。我将概述传感器读数背后的数学原理以及微控制器是如何解析它们的。 传感器的输出电流非常微弱——在纳安级别——因此电路必须将其转换为电压供 ADC 使用。这基本上就是欧姆定律,只不过是在 \(\frac{1}{1,000,000,000}\) 安培的尺度上### 1. 传感器电流到输出电压(\(V_{out}\)) 传感器产生与气体浓度成正比的微小电流。运算放大器或负载电阻将该电流转换为可测量的电压。 ### 2. 计算传感器电流(\(I_s\)) 要从测量到的输出电压推导出原始传感器电流(A): \[ I_s = \frac{V_{out} - 1.0}{1.0 \times 10^6} \] ### 3. 一氧化碳浓度 要确定以 ppm 为单位的 CO 浓度: \[ \text{CO (ppm)} = \frac{\text{传感器输出电流 (nA)}}{\text{传感器灵敏度 (nA/ppm)}} \] ### 4. Figaro 参考公式 官方的 Figaro EM5042A 评估电路应用了固定的 \(1.0 × 10^6\) 放大倍数,在清洁空气中产生 1.0 V 的基准偏移: \[ V_{out} = (\text{浓度} × \text{灵敏度}) + 1.0 \] ### 5. 微处理器测量分辨率 估算给定 ADC 的最小可测 CO 步进: \[ \text{分辨率} = \frac{C_{max}}{2^M × B_{min}} \] 其中   • \(C_{max}\) = 最大 CO 浓度   • \(M\) = ADC 位深   • \(B_{min}\) = 最小独立数字位数 ## 接口电路与操作原理 **TGS‑5042** 传感器的电流通过 **MCP6042** 双运算放大器的两个级进行处理,每一级都有其自己的诊断功能。

CO400 Analog Circuit

### 1. 抗极化分流电路 - 工作电极(WE)和 对电极(CE)之间的 100 kΩ 电阻(R15)。 - 在电源关闭时通过保持 WE–CE 电位为 0 V 来防止极化损坏。 ~~TODO:检查此电阻值——可能会产生测量干扰。~~ **已完成!注 (5)。** ### 2. 第一级:跨阻放大器(TIA) - **U3A** 引脚 1–3,1 MΩ 反馈电阻(R3),100 nF 电容,2.2 kΩ(R4)和 220 Ω(R11)隔离电阻。 - 将传感器电流转换为电压: 1 nA → 1 mV。 - 100 nF 电容滤除噪声;隔离电阻保护运算放大器输入端。 ### 3. 传感器诊断测试 1(RA5) - MCU 引脚 → 二极管(D2)→ 1 MΩ(R5)→ U3A 引脚 3。 - 正常模式:MCU 保持引脚高电平或高阻态,对 D2 进行反向偏置。 - 自检:MCU 驱动为低电平,强制电流通过 R5;运算放大器输出可预测地上升,从而验证回路完整性。 ### 4. 级间 RC 滤波器 - 240 Ω(R14)串联电阻 + 接地的 100 nF(C8)。 - 位于 U3A 输出和 U3B 输入之间的低通滤波器,可滤除高频噪声。 ### 5. 第二级:电压缓冲器与基线偏移 - **U3B** 引脚 5–7 被配置为缓冲器。 - 分压器(连至 Vcc 的 470 kΩ R17,连至 GND 的 47 kΩ R16)设定基线偏移 ≈ 清洁空气电压。 - 防止负向漂移在 0 V 处被削峰,确保 ADC 捕获全量程。 ### 6. ADC / 缓冲器验证电路 2(RA1/AN1) - MCU 引脚 → 10 kΩ(R1)→ U3B 引脚 6。 - **双重功能:**   1. 注入测试电压以验证缓冲器和 ADC 路径。   2. 通过预充电滤波器节点(~560 µs 脉冲)加速传感器预热。 这里是 **第 8 部分:模拟波形和数据流分析**,经过了清理和精简,同时保留了你的笔记本风格——既有分析性、好奇心强,又亲自动手。你可以直接将其放入你的 `.txt` 文件中。 ## 模拟波形 现在电路的操作已经很清楚了,让我们来看看模拟波形——这是该板子在运行时的心跳。

Sensor U3 Output

### 处于控制之下 在这个示波器轨迹中,平稳的直线代表传感器的“清洁空气”电压。大约每 ≈ 2.4 秒重复出现的脉冲对应于前面描述的自检位(**3**、**6**)。 当 MCU 引脚变为高阻态时,TIA 输出发生偏移,拉低了缓冲器的输出。较宽的间隔与 LED 闪烁重合——大约每 20 个周期一次。 ### 虽然老旧但看起来还不错 大幅度的跳变几乎可以肯定是传感器自检:一个双脉冲阶跃,随后是一个深度的下拉脉冲。恢复到基线的斜率表明传感器仍然是活跃的——大约需要 12.9 秒来恢复。 那条曲线表明电解质虽然老化但仍能发挥作用;如果传感器完全失效,则根本不会显示出恢复曲线。 ### 它还活着! 所以这个 2009 年生产的传感器仍然能检测到 CO。设备 10 年期的计时器“死亡开关”还没有被触发。

Sensor Test Recovery

这里是传感器测试和恢复波形的特写。12.9 秒的恢复时间是在游标之间测量的。一切都发生得很缓慢——以秒为单位。上升的斜率很可能来自于 TIA 反馈电容的充电。

Sensor and Thermistor

该轨迹同时显示了传感器和热敏电阻的电压(下方轨迹)。热敏电阻的电压只有在 LED 亮起时才有效——大约每分钟一次。 这证实了热敏电阻的读数是在那些较长的低谷期进行的。2.4 秒的节奏与数据包的定时相匹配,这表明 LED 循环可能驱动着采样的节奏。 ## TP1 处的数据流 这里的“串行”数据非常有趣——它揭示了设备内部是如何通信的。我首先用示波器探测了 TP1,以捕捉定时信息并验证真实的数据帧。

Packet Spacing

数据包是 3.3 V 逻辑电平,对 Arduino 输入是安全的。最常见的间隔约为 2.5 秒,与 LED 闪烁的速率相匹配。

Typical Packets

一个典型的数据包持续约 40 ms,尽管定时会有所变化。当我检查位宽以估计波特率时,我发现它们太规则了——不是标准的串口定时。那么这是什么协议呢?

Packet Preamble

### 前导码 在每个数据包的开始处,出现了三个短脉冲和一个长间隔——对于正常的字节来说太短了。经过一番挖掘,我发现了一项专利,描述了这种用于 CO 和烟雾报警器的确切信号传输方法:**“rattle bits(咔哒位)”。** 它非常符合这种实现方式。 有了这些信息,我写了一个 Arduino 草图来记录原始帧: **CO400 RAW PWM FRAME LOGGER v0.4.4** — 目前已修订至版本 4。 样本输出: ``` ?t=4777 ms Bits=65 FRAME: 0x55 0x40 0x95 0x2A 0x10 0x05 0x94 0x00 | STATE=NORMAL ?t=4772 ms Bits=66 FRAME: 0x55 0x40 0x95 0x2A 0x10 0x25 0x28 0x01 | STATE=NORMAL BURST led=1 horn=0 ``` ### 问题和答案 三个观察结果: 1. 4777 ms 的间隔大约是示波器定时的两倍——很可能是跳过了每隔一个的数据包。 2. 数据包长度平均为 64 位(8 字节),符合预期。 3. 最后两个字节追踪传感器的测试和恢复情况;0x94 似乎是“清洁空气”级别。 ### 它是 PWM 数据 数据包解码是一致的——不是噪声。目前大约解码了 80–90 %,尽管极性和校验和仍不确定。前导码也可能是 `0xAA 0x55 0xB5…`。 一如既往,最后 20 % 的工作需要花费 80 % 的时间来完善。 ### 永远不打算让人看到 该专利没有列出完整的代码,除了用于 CO 报警的 `10100101` (0xA5)。我们目前还没见过它——也许它只在真正的警报期间出现。这甚至可能是从不打算供外部访问的工厂测试数据。 ### 建议的测试 要将数据包与现实世界的事件相关联: - 手动测试按钮 - 热敏电阻测试 - 低电量模拟 - CO 暴露测试 - 其他任何测试? 为了将数据包与可见的行为相匹配,我还接入了 LED 和报警线。LED 大约每分钟闪烁一次,因此热敏电阻读数只在该低电平激活期间进行。 电池电压采样较慢——低电量指示之间有几分钟的间隔——但当它发生时,会出现明显的位变化。 ## 未定的结论 由于测试软件欠采样(每隔一个数据包采样一次)以及可变的数据包长度,目前唯一能确定的是第一个字节永远不会改变——这是一种交替的位模式,可能用作同步或设备 ID。 这里是 **第 9 部分:最终总结与后续步骤**,经过润色并准备好粘贴。它以同样的实验室日志风格作为拆解的总结——具有反思性、专业性,还带点趣味性。 ## 最终总结与后续步骤 经过所有这些探测、追踪和解码之后,**CO400** 展现出令人惊讶的复杂微型系统的一面——一个由两节 AA 电池供电的独立电化学实验室。 即使在十五年之后,传感器仍然有响应,模拟前端的表现完全符合数据手册的预测,而微控制器继续以自检和数据包的安静节奏运行。“每分钟五次蜂鸣”的使用寿命终点警告似乎纯粹是基于时间的,而不是实际的传感器故障。 ### 我们已知的内容 - **TGS‑5042** 传感器是一个真正的燃料电池型电化学检测器。 - **MCP6042** 运算放大器将纳安级的电流转换为稳定的电压,并具有内置诊断功能。 - **PIC16F688** 微控制器负责统筹采样、自检和通信。 - **RE46C107** 以令人印象深刻的效率处理电源调节和喇叭驱动。 - TP1 处的数据流是一种专有的 PWM 协议——很可能是工厂测试或设备间的信号传输。 ### 下一步计划 还有很多值得探索的地方: - 解码剩余的数据包位并确认它们的含义。 - 模拟 CO 暴露,以观察传感器曲线如何变化。 - 尝试在 Arduino 或 Teensy 上复用该传感器和模拟前端,以实现开源的 CO 监测。 - 更精确地记录 LED、热敏电阻和数据包传输之间的定时关系。 ### 结语 这次拆解远不仅仅是一个满足好奇心的项目——它让我们得以一窥那些在大多数人在听到它发出蜂鸣声之前从未思考过的设备中,到底倾注了多少工程设计。 即使在“退役”之后,这个小报警器仍然为我们上了一课,讲授低功耗设计、模拟精度,以及简单电路完成严肃工作时所展现出的优雅。 -- # 备注与参考 ## 备注 1. **U3 供电电压(运算放大器供电轨)** 已验证 MCP6042 接收来自 RE46C107 的 3.3 V 稳压供电轨。这确保了 TIA 输出永远不会超过 ADC 的极限值。 2. **R17 分压器电压** R17/R16 分压器在 U3B 引脚 5 处产生大约 0.30–0.32 V 的基线偏移。这与 Figaro EM5042A 参考设计相匹配。 3. **ADC 参考行为** PIC16F688 使用 Vdd 作为 ADC 参考。在 3.3 V 供电轨下,每一个 ADC 步进约为 3.22 mV。结合 1 MΩ 的 TIA 增益,得出每个 LSB(最低有效位)约为 3.22 nA。 4. **传感器恢复曲线** 12.9 秒的恢复斜率与 Figaro 数据手册中预期的、老化但仍能正常工作的 TGS‑5042 的时间常数相符。 5. **抗极化电阻(R15)** 通过色环确认其值为 100 kΩ。由于传感器在断开连接时会自身产生微电压,因此直接测量是不可靠的。 6. **自检电路(D1、R2、R12、C12)** 该网络在喇叭测试周期内于 Vbatt 线路上注入了受控的负载。PIC 监控由此产生的电压骤降,以验证电池的健康状况和内阻。 ## 参考 ### 数据手册与应用笔记 - **Figaro TGS‑504 CO 传感器** EM5042A 评估模块应用笔记 TGS‑5042 产品数据手册 - **Microchip PIC16F688** PIC16F688 8 位微控制器数据手册 ADC 模块参考 - **Microchip MCP6042** MCP6041/2/3/4 低功耗运算放大器系列数据手册 应用笔记:跨阻放大器设计 - **R&E / Microchip RE46C107** RE46C107 烟雾/CO 报警器 ASIC 数据手册 典型应用电路(升压 + 喇叭驱动器) ### 专利 - **使用 PWM“Rattle Bits”进行报警器间通信** 涵盖用于烟雾/CO 报警器的编码设备间信号传输的美国专利。 (与在 TP1 处观察到的前导码和位定时行为相匹配。) ### 附加资源 - BigClive 的拆解风格灵感 - KiCad 原理图绘制 - 来自 SDS1104X‑E 的示波器截图 - Arduino “CO400 RAW PWM FRAME LOGGER v0.4.4”(自定义工具) ## 许可证 - **代码** 采用 MIT 许可证授权(参见 `LICENSE`) - **文档** 采用 CC‑BY‑4.0 许可证授权(参见 `LICENSE-docs`)
标签:传感器, 嵌入式开发, 物联网, 电路设计, 硬件分析, 硬件逆向工程