
简介GY-AS7262 7263 配套资料包面向嵌入式开发、电子制造与传感器应用学习者围绕 AS7262/AS7263 光谱传感模块的 Arduino 上手与二次开发整理。资源包含15个文件约1.5MB以3份PDF数据手册与原理图、3个ino示例程序、2份md说明、1个cpp与1个h驱动源码为主并附工程配置与辅助文本文件便于按“手册—库—示例”的路径查阅。已有442人学习适合需要快速验证模块通信、理解寄存器配置或移植驱动的读者。包内Arduino驱动库与示例可直接用于搭建采集环境配合PDF中的引脚、时序和电路信息能帮助读者减少接线与调试中的试错源码结构也可作为制造现场传感器集成、课程实验与项目原型的参考方便后续扩展数据读取与校准逻辑。1. 一块六通道光谱模块能干什么从 GY-AS7262 和 GY-AS7263 的两个波长窗口说起前阵子帮一个做分选设备的小团队调板子桌上摆着 GY-AS7262 和 GY-AS7263 各一块都是六通道光谱模块长得几乎一样卖家给的资料只有一张引脚图。接上总线后只认出一个设备读数还全是 0xFF。这两块板子的价值不在于能测光而在于把可见光 450–650 nm 和近红外 610–860 nm 各切成六段用几十块钱的成本替代一台微型光谱仪做小批量制造里的色差判定、材质初筛、透光率一致性检查。它不适合做实验室级光谱标定但适合产线上这款料和标准样是不是同一批这种二分类问题。后面几章按接线、自检、参数、避坑、特征提取的顺序走一遍都是我实际调试时留下的参数和脚本。2. 选型先说清楚AS7262 与 AS7263 的通道差异决定你能测什么很多人在下单时只看六通道收到货才发现测不了自己想要的东西。这两块模块的差别不是灵敏度而是六个滤光片的中心波长完全落在不同区间选错了再怎么调增益都是白费。2.1 六个通道落在哪几条波长上AS7262 覆盖可见光六个通道中心波长依次是 450 nm、500 nm、550 nm、570 nm、600 nm、650 nm工程上习惯叫 V、B、G、Y、O、R。这套配置的设计意图是覆盖人眼明视觉响应最密集的一段做颜色相关的判断时六点采样足以拟合出粗略的光谱曲线再换算到色度坐标上。做印刷品色差、液体透光色、塑料件批次色差这类活用它比用三通道 RGB 传感器靠谱得多因为 570 nm 和 600 nm 这两个点把黄橙段拆开了RGB 传感器在黄区是糊的。AS7263 覆盖近红外六个通道是 610 nm、680 nm、730 nm、760 nm、810 nm、860 nm同样叫 R、S、T、U、V、W。这段的价值在于很多物质在可见光下看起来一样在 700 nm 以上就分开了——水分在 760 nm 和 810 nm 有吸收差异叶绿素在 680 nm 附近有强吸收、在 860 nm 附近高反射深色塑料和黑色橡胶在近红外下的反射率差别往往比可见光下大一个量级。做农产品分选、塑料材质分拣、水分快检的选 7263做颜色、油墨、涂层、液体色度的选 7262。两块板子用的芯片封装、寄存器映射、I2C 时序完全一致唯一的区别是 DEVICE_TYPE 寄存器的返回值7262 读回 0x3E7263 读回 0x3F。这个设计带来一个必须提前知道的后果——它们的 7 位 I2C 地址都是 0x20不能直接挂在同一条总线上同时工作后面第 5 章会专门讲怎么绕过去。2.2 模块板载电路稳压、上拉、照明 LED 与中断脚GY 系列的模块板不是裸芯片板上至少有四样东西需要你确认清楚。第一是稳压绝大多数版本带一颗 3.3V 低压差稳压所以 VCC 引脚可以喂 5V但如果你手上这块板丝印写的是 3V3 而不是 VIN就别接 5V。第二是 I2C 上拉。上拉电阻有的拉到 3.3V有的拉到 VCC这决定了你能不能直接接 5V 逻辑的主控。我一般拿到板子第一件事是用万用表量 SCL 和 SDA 对 GND 的空闲电压读到 3.3V说明上拉在 3.3V 侧可以放心接任何主控读到 5V说明上拉被拉到了输入电源接 3.3V 主控前要么改供电为 3.3V要么确认主控引脚耐 5V。第三是板载照明 LED。芯片本身带一路 LED 驱动模块上通常焊了一颗白光或红外 LED位置就在传感窗口旁边。这颗灯是双刃剑它让测量不依赖环境光但它的发光谱和老化特性会直接进到你的数据里做长期一致性比对时必须固定驱动电流档位并且记录使用小时数。第四是 INT 引脚。芯片在单次转换完成时会拉低这个脚模块把它引出来是为了让你用中断而不是靠延时去等数据。做低速采集无所谓做高速分选比如传送带上每秒几十个工件时靠延时等会浪费大量时间用中断能把节拍压下来。2.3 按被检物选型号三个判断维度判断维度选 AS7262选 AS7263检测目标颜色、色差、油墨浓度、液体色度材质、含水量、深色件区分、植被状态环境光干扰可用白光 LED 主动照明压制环境光近红外成分少可用自然光样品温度温度对可见光谱影响小温度影响水吸收峰需记录工况典型制造场景印刷品批次比对、注塑件色差塑料分拣、农产口分选、涂层厚度趋势判断方法很简单把待测样品和标准样各测十次看六个通道里有没有至少两个通道的差值稳定超过噪声的三倍。如果差值只出现在 450 nm 和 650 nm 两个端点上、中间四个通道几乎一样说明你要区分的东西在可见光波段没有特征换 7263 试。反过来如果六个通道在近红外下全是平的一条线那说明样品在这个波段没有选择性7262 更合适。这个先测差值再看选型的流程比看 datasheet 上的光谱响应曲线有用得多。3. 把模块接到总线上接线、上电时序与最小自检接线本身不难难的是第一次上电那五分钟。我见过太多人卡在i2cdetect 扫不到设备这一步然后开始怀疑模块坏了实际上九成是供电或者上拉的问题。3.1 六针引脚怎么接GY-AS7262/7263 常见的引出是六针VCC、GND、SCL、SDA、INT、LED。不同批次的丝印顺序可能不同接之前一定按板上丝印对不要按卖家图片对——图片经常是旧版。引脚接到主控说明VCC3.3V 或 5V板载稳压优先 3.3V减少自热GNDGND与主控共地线尽量短SCLI2C 时钟100 kHz 起步确认稳定后再提到 400 kHzSDAI2C 数据与 SCL 成对长度控制在 20 cm 内INT任意 GPIO可选单次转换完成拉低低速采集可不接LED悬空或接 GPIO可选板上已有照明灯一般不用外接供电这里有个容易忽略的点如果用 5V 供电板载稳压会把多余压差变成热量芯片结温会比环境高 5–10℃温度寄存器读出来的值不能当环境温度用。做长时间连续采集时我倾向用 3.3V 供电并且把模块固定在金属支架上散热读数漂移会明显小一些。线材上杜邦线在 100 kHz 下跑 20 cm 没问题超过 30 cm 就开始出现偶发 NAK。真要做设备把 SCL/SDA 绞在一起并加地线回流或者直接上排线加屏蔽。这不是玄学是 I2C 单端信号在长线上的老问题。3.2 用 i2cdetect 和 DEVICE_TYPE 做三分钟自检接线完成后的第一步不是写业务代码是确认设备在总线上。在带 I2C 的 Linux 单板机上装好工具后直接扫# 安装 i2c 工具Debian 系 sudo apt install -y i2c-tools # 确认 I2C 总线已启用一般板载是 1 号总线 ls /dev/i2c-* # 扫描 1 号总线上的所有地址 i2cdetect -y 1正常结果是在 0x20 位置出现20。如果整张表全是--先查供电和接线如果出现的是别的地址比如 0x49说明你手上这块不是 AS7262/7263 系列或者是另一颗芯片的模块别硬套本文的寄存器表。扫到 0x20 之后还要确认它到底是 7262 还是 7263。这两块板子外观太像包装袋上的标签经常贴错用一行命令读 DEVICE_TYPE 就能分辨# 通过 AT 命令层读 0x00 寄存器先发 0x41(读1字节) 寄存器地址再读 1 字节 i2ctransfer -y 1 w20x20 0x41 0x00 r1返回0x3e是 AS7262返回0x3f是 AS7263。返回0xff或者0x00说明 AT 命令层还没准备好通常是上电后立刻就去读导致的断电重来中间等 200 ms 以上再试。这里解释一下0x41这个字节的来龙去脉。AS7262/7263 不是那种往寄存器地址写、再从寄存器地址读的常规 I2C 器件它在 I2C 之上套了一层命令协议所有对内部寄存器的访问都要先发一个命令字节。读一个字节用 0x41读两个字节用 0x42写一个字节用 0x61写两个字节用 0x62。命令字节后面跟目标寄存器地址写操作再跟数据。这个协议不搞清楚直接拿常规 I2C 库的寄存器读函数去访问读回来永远是 0xFF这是新手翻车率最高的一处。3.3 一次读出六通道完整可运行脚本确认设备在线之后用 Python 写一个最小可跑脚本。依赖只有 smbus2主控侧不需要额外驱动。#!/usr/bin/env python3 # gy_as72xx.py —— GY-AS7262 / GY-AS7263 六通道读取最小实现 import time from smbus2 import SMBus, i2c_msg ADDR 0x20 # 7 位地址8 位写法是写 0x40 / 读 0x41 AT_READ1 0x41 # 读 1 字节 AT_READ2 0x42 # 读 2 字节16 位通道值 AT_WRITE1 0x61 # 写 1 字节 REG_DEV_TYPE 0x00 REG_CTRL 0x04 REG_INT_T 0x05 REG_TEMP 0x06 REG_LED 0x07 REG_RAW_BASE 0x08 # 6 通道原始值每通道 2 字节低字节在前 REG_CAL_BASE 0x14 # 6 通道校准值同上 # 波长标签按 DEVICE_TYPE 区分 CH_TABLE { 0x3E: [450, 500, 550, 570, 600, 650], 0x3F: [610, 680, 730, 760, 810, 860], } def vread(bus, reg): 读 1 个字节先发命令地址再单独发起读事务 bus.i2c_rdwr(i2c_msg.write(ADDR, [AT_READ1, reg])) time.sleep(0.002) # 给 AT 层留处理时间 m i2c_msg.read(ADDR, 1) bus.i2c_rdwr(m) return list(m)[0] def vread16(bus, reg): 读 16 位低字节在前高字节在后 bus.i2c_rdwr(i2c_msg.write(ADDR, [AT_READ2, reg])) time.sleep(0.002) m i2c_msg.read(ADDR, 2) bus.i2c_rdwr(m) lo, hi list(m) return (hi 8) | lo def vwrite(bus, reg, val): 写 1 个字节 bus.i2c_rdwr(i2c_msg.write(ADDR, [AT_WRITE1, reg, val 0xFF])) time.sleep(0.002) def main(): bus SMBus(1) time.sleep(0.2) # 上电稳定别省这一步 dev vread(bus, REG_DEV_TYPE) if dev not in CH_TABLE: raise SystemExit(fDEVICE_TYPE0x{dev:02X}不是 AS7262/7263) ch CH_TABLE[dev] print(f检测到 {AS7262 if dev 0x3E else AS7263}通道 {ch}) vwrite(bus, REG_CTRL, 0x80) # bit7 软复位 time.sleep(0.1) vwrite(bus, REG_INT_T, 0x30) # 积分时间 (0x301)*2.8 137.2 ms vwrite(bus, REG_LED, 0x00) # 关闭板载照明先测环境光 gain 0b11 # 64x for n in range(5): # 单次模式触发MODE0b10 对应 bit3:2 写 0x08 vwrite(bus, REG_CTRL, (gain 4) | 0x08) time.sleep(0.25) # 积分时间留出转换余量 raw [vread16(bus, REG_RAW_BASE 2 * i) for i in range(6)] cal [vread16(bus, REG_CAL_BASE 2 * i) for i in range(6)] print(f[{n}] RAW, dict(zip(ch, raw))) print(f[{n}] CAL, dict(zip(ch, cal)), TEMP, vread(bus, REG_TEMP)) bus.close() if __name__ __main__: main()这段脚本有三个设计取舍要说清楚。第一读写分成两个独立的 I2C 事务中间插入 2 ms 延时而不是用组合事务一次发完。原因是 AT 命令层是收命令—内部执行—返回结果的模型命令字节发完到数据准备好之间有一个极短的处理窗口把两个事务分开更接近芯片手册描述的时序实测在 100 kHz 下比组合事务的稳定性高。第二用单次模式而不是连续模式。连续模式下 RAW 和 CAL 是两组不同时刻的快照你读到六个 RAW 和六个 CAL 之间隔了一整轮转换做比值计算时会引入不必要的误差。单次模式触发一次、等积分时间、一次性把两组值都读出来虽然慢一点但同一帧内的数据是自洽的。第三等待用的是固定延时 0.25 s 而不是轮询 DATA_RDY 位。DATA_RDY 在 CTRL 寄存器的低位具体掩码在不同固件版本上有差异靠固定延时更省事积分时间 137.2 ms加上转换开销250 ms 是安全的。真要做高速采集还是得把中断脚接上用 INT 下降沿触发读取。参数上REG_INT_T写 0x30 得到的积分时间是 137 ms这个值适合室内常光下的静态测量gain0b11是 64 倍增益配合 137 ms 的积分时间如果对着白纸测出来接近 65535说明过曝了把增益降到 0b1016 倍再来。反过来如果对着深色样品测出来只有几十就往上加。4. 参数怎么定AT 虚拟寄存器、增益阶梯与积分时间的三角权衡能读出数只是开始读出来的数能不能用全看这三个参数怎么配增益、积分时间、照明电流。它们共同决定曝光量而曝光量的可调范围有六万多倍配错了不是饱和就是噪声淹没信号。4.1 AT 命令层的读写模型前面提过 0x41/0x42/0x61/0x62 四个命令字节这里把完整的寄存器地图列出来方便对照排查。地址空间不大0x00 到 0x1F 一共 32 个字节全部可以按单字节访问。地址名称读/写说明0x00DEVICE_TYPER0x3EAS72620x3FAS72630x01HW_VERSIONR硬件版本不同批次不同0x02–0x03FW_VERSIONR固件版本高低字节0x04CONTROL_SETUPR/W复位、增益、模式、数据就绪0x05INT_TR/W积分时间0–2550x06DEVICE_TEMPR芯片结温8 位0x07LED_CONTROLR/W照明驱动方式与电流档0x08–0x13RAW×6R六通道原始计数各 2 字节0x14–0x1FCAL×6R六通道校准值各 2 字节需要注意的细节是RAW 和 CAL 的数值范围都是 0–65535但两者的含义不一样。RAW 是光电二极管加 ADC 的直接输出用来判断有没有饱和、环境光够不够CAL 是芯片内部做过多点校正后的结果补偿了各通道之间的响应差异和暗电流偏移做比值计算和色度换算时用 CAL别用 RAW。很多人拿到数据直接用 RAW 算比值结果换个模块数据就对不上问题就出在这。写寄存器时有一个顺序上的讲究改 GAIN 或 MODE 之前先写一次软复位CTRL 的 bit7 写 1复位后等 100 ms 再配置。原因是芯片上电后的默认状态不一定是你想要的而且如果上一次采集停在半途不清状态直接改配置新配置可能不生效。这个坑我在调试时踩过改了增益读数一点变化都没有复位之后才正常。4.2 CONTROL_SETUP 的位域GAIN、MODE 与 DATA_RDY0x04 这一个字节塞了四组信息位域划分如下。位名称取值含义7RST写 1 触发软复位自动清零6:4GAIN0001x0013.7x01016x01164x3:2MODE00连续转换10单次转换11待机1:0DATA_RDY只读转换完成标志增益是四档固定值不是线性可调的。1x 到 3.7x 的跳变比较大从 3.7x 到 16x 是 4.3 倍16x 到 64x 是 4 倍。这意味着你没法精细地调亮一点只能在四档里选最接近的剩下的余量靠积分时间去补。实际调参的顺序我一般是先把积分时间定在一个能接受的节拍上比如产线要求每秒 5 个件那就是 200 ms 一帧积分时间最多给到 180 ms取 INT_T63然后从低增益往高增益试选第一个不饱和的档位。单次模式和连续模式的切换就是改 bit3:2。连续模式下芯片不停转换你随时读都能拿到最新值但两次读之间可能跨帧单次模式下要显式触发读完数据后芯片待机功耗低数据帧边界清晰。做多通道比值、需要同一时刻快照的场景用单次。DATA_RDY 位在不同固件版本上位置有差异有的是 bit1有的是 bit1:0 两位组合。稳妥的做法是先用单次模式加固定延时跑通等系统稳定了再回头用逻辑分析仪抓一次 CTRL 寄存器的读回值看数据就绪时哪一位翻转把这个位写死到代码里。这属于典型的黑匣子问题——手册上写得清楚实际固件不一定照做实测一次比读十遍文档快。4.3 积分时间与量程的配比表积分时间的计算公式是积分时间 (INT_T 1) × 2.8 ms。INT本文还有配套的精品资源点击获取