Arduino RGB LED模块应用:从PWM调光到智能氛围灯开发
1. 从单色到炫彩为什么RGB LED是创客的必修课如果你玩过Arduino点亮一个普通的单色LED对你来说可能已经是小菜一碟了。但当你第一次看到一个小小的灯珠能在你的代码控制下从深邃的蓝色渐变到温暖的橙色再跳跃到活力的绿色时那种感觉是完全不同的。这不仅仅是点亮一个灯而是在创造光。今天要聊的DFR0100 RGB LED模块就是带你进入这个“造光”世界的绝佳入口。它价格低廉、接线简单但背后蕴含的PWM调光、色彩混合原理却是通往更复杂项目如智能氛围灯、可视化数据展示的基石。无论你是刚入门的新手还是想给项目加点“炫技”效果的资深玩家搞懂这个三色小灯都能让你的创意维度提升一个档次。2. DFR0100 RGB LED模块拆解不只是三个灯那么简单拿到DFR0100模块你会发现它比想象中更简洁一个集成的RGB LED灯珠几个限流电阻以及四个清晰的引脚标识R G B GND。但千万别小看它它的核心是一个共阴极RGB LED。理解“共阴极”是正确使用它的第一步。2.1 共阴极 vs. 共阳极电流的流向决定你的接线逻辑市面上常见的RGB LED有两种内部结构共阴极和共阳极。共阴极三个发光二极管红、绿、蓝的负极阴极连接在一起并引出作为一个公共引脚通常是GND。你需要分别给R、G、B正极引脚提供高电平或PWM信号来控制其亮度。共阳极三个发光二极管的正极阳极连接在一起并引出作为一个公共引脚通常是VCC。你需要分别给R、G、B负极引脚提供低电平或PWM信号来控制其亮度。DFR0100采用的是共阴极设计。这意味着模块的“GND”引脚必须连接到Arduino的GND。模块的R、G、B引脚需要连接到Arduino的数字PWM引脚旁边标有“~”的引脚如3, 5, 6, 9, 10, 11。当你向R、G、B引脚输出高电平5V时对应的颜色最亮输出低电平0V时该颜色熄灭。注意如果你手头有一个不明型号的RGB LED一个简单的判断方法是使用一个3V纽扣电池和电阻如220Ω。将电池负极接一个引脚正极通过电阻依次触碰其他三个引脚。如果某个颜色亮起且电池负极接的是公共端那么它就是共阴极。反之如果电池正极接公共端负极通过电阻触碰其他引脚才亮则是共阳极。2.2 模块上的电阻默默无闻的“保护神”细看模块你会发现R、G、B引脚到LED之间都串联了一个电阻。这个电阻至关重要它的作用是限流。LED是电流驱动型器件其亮度由流过它的电流决定而非电压。如果不加电阻直接连接到5V电源过大的电流会瞬间烧毁脆弱的LED芯片。DFR0100模块通常使用220欧姆的电阻。我们可以简单计算一下假设红色LED的正向压降约为2.0VArduino引脚输出5V高电平那么限流电阻两端的电压为5V - 2.0V 3.0V。根据欧姆定律 I V/R流过LED的电流约为 3.0V / 220Ω ≈ 13.6mA。这个电流对于普通LED来说是安全且能正常发光的。模块帮你做好了这一步让你无需再外接电阻大大简化了接线。3. 硬件连接与代码初探让灯先亮起来理论懂了接下来就是动手。这是最能让概念落地的部分。3.1 接线图与引脚定义我们需要将DFR0100模块与Arduino Uno以最常见的型号为例连接起来。请准备三条公对母杜邦线。DFR0100 模块引脚连接至 Arduino Uno 引脚说明R(红色控制)~6(数字PWM引脚 6)控制红色LED亮度G(绿色控制)~5(数字PWM引脚 5)控制绿色LED亮度B(蓝色控制)~9(数字PWM引脚 9)控制蓝色LED亮度GND(地)GND提供公共回路为什么选择6, 5, 9这三个PWM引脚其实只要是带“~”的PWM引脚都可以这里的选择没有特殊含义只是为了接线方便和后续代码清晰。你可以根据自己开发板空余的PWM引脚灵活调整。3.2 第一个程序循环显示红、绿、蓝三原色我们先写一个最简单的程序让LED依次显示纯红色、纯绿色和纯蓝色每种颜色持续1秒。这个程序能帮你快速验证硬件连接是否正确。// 定义RGB引脚对应的Arduino引脚 const int redPin 6; const int greenPin 5; const int bluePin 9; void setup() { // 将三个引脚都设置为输出模式 pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); } void loop() { // 显示纯红色红最亮绿和蓝熄灭 analogWrite(redPin, 255); // 255是PWM最大值最亮 analogWrite(greenPin, 0); // 0是PWM最小值熄灭 analogWrite(bluePin, 0); delay(1000); // 保持1秒 // 显示纯绿色 analogWrite(redPin, 0); analogWrite(greenPin, 255); analogWrite(bluePin, 0); delay(1000); // 显示纯蓝色 analogWrite(redPin, 0); analogWrite(greenPin, 0); analogWrite(bluePin, 255); delay(1000); }上传代码后你应该能看到RGB LED依次发出鲜艳的红、绿、蓝光。如果某个颜色不亮请首先检查对应的接线是否松动引脚定义是否与代码一致。一个常见的低级错误是代码里定义了引脚6但线却插在了物理上的第6个引脚那是数字引脚6但不是PWM引脚6PWM引脚6在另一排务必对照开发板丝印确认。4. PWM调光与色彩混合原理解锁千万色彩的秘密能显示三原色只是开始RGB LED的魅力在于混色。而混色的基础是PWM脉冲宽度调制调光。4.1 深入理解PWM如何用数字信号模拟“亮度”Arduino的数字引脚只能输出高电平5V或低电平0V也就是“开”或“关”。那么如何实现“半亮”这种中间状态呢PWM提供了一种巧妙的解决方案它通过快速开关通常频率为490Hz或980Hz来控制一个周期内高电平所占的时间比例占空比。analogWrite(pin, 0)占空比0%始终为低电平灯熄灭。analogWrite(pin, 127)占空比约50%127/255一半时间高一半时间低。由于人眼的视觉暂留效应我们看到的是中等亮度。analogWrite(pin, 255)占空比100%始终为高电平灯最亮。analogWrite函数的参数范围是0-255对应0%-100%的占空比。这个8位的分辨率2^8256决定了我们可以控制256级亮度。对于红、绿、蓝三个通道每个通道有256级亮度通过组合理论上可以产生256 * 256 * 256 16,777,216种颜色也就是常说的1600万色。4.2 色彩模型从RGB到直观的HSL/HSV直接操作RGB值0-255来调色有时并不直观。比如你想得到一个“淡紫色”可能需要反复尝试R、G、B的组合。在图形学和更高级的灯光控制中我们常使用HSL或HSV色彩模型。H (色相)颜色的种类如红、黄、绿、青、蓝、紫。用一个角度表示0-360度。S (饱和度)颜色的鲜艳程度。0%是灰色100%是完全饱和的纯色。L (亮度) / V (明度)颜色的明亮程度。我们可以编写一个函数将更直观的HSL值转换为Arduino需要的RGB值。下面是一个简化的转换函数适用于亮度L// 将HSLH:0-360, S:0-100, L:0-100转换为RGB0-255 void hslToRgb(float h, float s, float l, int r, int g, int b) { // 将饱和度s和亮度l归一化到0-1 s / 100.0; l / 100.0; // 核心转换计算简化版基于标准公式 float c (1 - fabs(2 * l - 1)) * s; float x c * (1 - fabs(fmod(h / 60.0, 2) - 1)); float m l - c / 2.0; float r1, g1, b1; if (h 0 h 60) { r1 c; g1 x; b1 0; } else if (h 120) { r1 x; g1 c; b1 0; } else if (h 180) { r1 0; g1 c; b1 x; } else if (h 240) { r1 0; g1 x; b1 c; } else if (h 300) { r1 x; g1 0; b1 c; } else { r1 c; g1 0; b1 x; } r (int)((r1 m) * 255); g (int)((g1 m) * 255); b (int)((b1 m) * 255); // 确保值在0-255范围内 r constrain(r, 0, 255); g constrain(g, 0, 255); b constrain(b, 0, 255); }有了这个函数你就可以通过循环改变色相H0到360而保持饱和度和亮度不变轻松实现彩虹色渐变效果代码的意图会清晰很多。5. 进阶项目实战打造你的智能氛围灯掌握了基础我们就可以玩点更有趣的了。下面我们实现一个通过串口指令控制的智能氛围灯它可以切换预设场景、接收自定义颜色。5.1 项目设计串口通信协议我们设计一个简单的文本协议通过Arduino IDE的串口监视器发送指令R255,G0,B0设置颜色为纯红色。SCENE 1切换到场景1例如呼吸灯效果。SCENE 2切换到场景2例如彩虹渐变效果。OFF关闭所有灯。5.2 完整代码实现与解析const int redPin 6; const int greenPin 5; const int bluePin 9; int currentRed 0; int currentGreen 0; int currentBlue 0; int currentScene 0; // 0:手动模式1:场景12:场景2... unsigned long previousMillis 0; int breathBrightness 0; int breathStep 1; int hue 0; void setup() { pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); Serial.begin(9600); // 初始化串口通信 Serial.println(RGB LED Controller Ready.); Serial.println(Commands: Rxxx,Gyyy,Bzzz | SCENE n | OFF); } void loop() { // 第一部分检查并处理串口指令 if (Serial.available() 0) { String command Serial.readStringUntil(\n); command.trim(); // 去除首尾空白字符 if (command.startsWith(R) command.indexOf(,) 0) { // 解析类似 R255,G128,B0 的指令 currentScene 0; // 切换到手动模式 int comma1 command.indexOf(,); int comma2 command.indexOf(,, comma1 1); if (comma1 0 comma2 0) { int rVal command.substring(1, comma1).toInt(); int gVal command.substring(comma1 2, comma2).toInt(); // 2 跳过“G” int bVal command.substring(comma2 2).toInt(); // 2 跳过“B” // 约束数值范围 rVal constrain(rVal, 0, 255); gVal constrain(gVal, 0, 255); bVal constrain(bVal, 0, 255); setColor(rVal, gVal, bVal); Serial.print(Color set to: R); Serial.print(rVal); Serial.print(, G); Serial.print(gVal); Serial.print(, B); Serial.println(bVal); } } else if (command.startsWith(SCENE)) { int sceneNum command.substring(6).toInt(); // 提取“SCENE ”后面的数字 if (sceneNum 1 sceneNum 2) { currentScene sceneNum; Serial.print(Switched to Scene ); Serial.println(sceneNum); } } else if (command.equalsIgnoreCase(OFF)) { currentScene 0; setColor(0, 0, 0); Serial.println(LED Off.); } } // 第二部分根据当前场景执行对应的灯光效果 unsigned long currentMillis millis(); switch (currentScene) { case 1: // 场景1呼吸灯效果暖白色 if (currentMillis - previousMillis 10) { // 每10毫秒更新一次 previousMillis currentMillis; breathBrightness breathStep; // 计算暖白色R和G成分高B成分低 int r map(breathBrightness, 0, 255, 50, 255); // 暖色偏红黄 int g map(breathBrightness, 0, 255, 30, 200); int b map(breathBrightness, 0, 255, 0, 50); // 少量蓝色 setColor(r, g, b); if (breathBrightness 255 || breathBrightness 0) { breathStep -breathStep; // 到达峰值或谷值后反转方向 } } break; case 2: // 场景2彩虹渐变效果 if (currentMillis - previousMillis 30) { // 每30毫秒更新一次色相 previousMillis currentMillis; hue (hue 1) % 360; // 色相从0递增到359后归零 int r, g, b; hslToRgb(hue, 100, 50, r, g, b); // 使用前面定义的HSL转换函数 setColor(r, g, b); } break; // 可以在这里添加更多场景 case 3, case 4... default: // 手动模式颜色已在串口指令中设置无需额外操作 break; } } // 设置颜色的辅助函数 void setColor(int r, int g, int b) { currentRed r; currentGreen g; currentBlue b; analogWrite(redPin, r); analogWrite(greenPin, g); analogWrite(bluePin, b); } // 这里需要插入前面章节定义的 hslToRgb 函数 void hslToRgb(float h, float s, float l, int r, int g, int b) { // ... 函数体同上此处省略以节省篇幅 ... }代码关键点解析非阻塞延时场景效果中使用millis()函数进行定时而不是delay()。这是Arduino编程的一个重要技巧它保证了在执行灯光渐变的同时主循环loop()依然能快速响应串口发来的新指令不会因为delay(1000)而卡住一秒。状态机思想通过currentScene这个变量来记录当前模式手动或某个场景。主循环根据这个状态决定执行哪段灯光效果代码结构清晰易于扩展。map()函数在呼吸灯效果中map()函数被用来将breathBrightness0-255线性映射到颜色分量如红色从50到255。这比直接赋值更灵活便于调整呼吸的颜色范围和幅度。5.3 实测与调试心得上传代码后打开串口监视器波特率设为9600你会看到欢迎信息。尝试发送R255,G100,B50LED应该会变成一种橙色调。发送SCENE 1则会进入温暖的呼吸灯模式。发送OFF关闭。我踩过的一个坑在早期版本中我用了Serial.readString()来读取指令但没有设置超时或检查终止符。当串口数据发送得稍慢时程序会等待直到接收到完整字符串这期间整个loop()会被阻塞导致呼吸灯效果卡顿。后来改用Serial.readStringUntil(\n)并配合trim()问题就解决了。记住处理串口指令时明确终止符并做修剪是保证稳定性的好习惯。另一个经验是颜色校准。理论上R255,G255,B255应该产生纯白色但由于不同颜色LED芯片的发光效率光效不同你得到的“白色”很可能偏蓝或偏红。为了得到更正的白色你可能需要进行微调例如使用R255,G220,B180。最好的方法是写一个简单的校准程序循环遍历不同的组合用眼睛找到你认为最舒服的“白色点”并记录下来用于后续项目。6. 性能优化与扩展思路从玩具到工具当你的项目变得复杂或者需要驱动多个RGB LED时基础的方法可能会遇到瓶颈。6.1 驱动多个RGB LED总线扩展与专用IC用analogWrite驱动一个灯没问题但Arduino Uno只有6个PWM引脚。驱动两个RGB LED就需要6个PWM引脚三个就需要9个显然不够。这时有几种解决方案使用模拟开关或晶体管阵列这是一种硬件解决方案通过数字引脚控制模拟开关如CD4066或晶体管来切换多个LED共用PWM引脚。但电路会变复杂且软件上需要分时复用控制有闪烁风险。使用移位寄存器如74HC595可以将串行数据转换为并行输出节省引脚但它只能输出数字信号开/关无法直接产生PWM信号因此不适合需要调光的RGB LED。使用专用的LED驱动IC推荐这是最专业和高效的方案。例如WS2812B俗称NeoPixel是一种集成了控制电路和RGB芯片的智能LED。每个LED只需要一根数据线DIN串联你只需要使用Arduino的一个数字引脚通过特定的时序协议发送数据就能控制成百上千个LED的每一个的颜色和亮度。Arduino有强大的库如FastLED, Adafruit NeoPixel来驱动它们极大地简化了编程。6.2 色彩平滑过渡与Gamma校正如果你仔细观察我们之前写的彩虹渐变代码可能会发现颜色变化在某些区域比如从红到黄不够平滑或者亮度变化在低亮度区域不线性调暗到50%时感觉比预期更暗。平滑过渡简单的线性递增色相H在HSL色彩空间中本身是平滑的。但如果你是在RGB空间直接操作想要从一个颜色渐变到另一个需要使用插值算法如线性插值来计算中间每一步的RGB值而不是简单地在两个值之间跳变。// 线性插值示例从颜色1 (r1,g1,b1) 渐变到颜色2 (r2,g2,b2)共steps步 for(int i0; isteps; i){ float ratio (float)i / steps; int r r1 (r2 - r1) * ratio; int g g1 (g2 - g1) * ratio; int b b1 (b2 - b1) * ratio; setColor(r, g, b); delay(transitionDelay); }Gamma校正人眼对光强的感知不是线性的而是近似对数关系。对于暗部变化更敏感。而PWM的亮度输出是线性的占空比25% 25%亮度。这会导致低亮度时灯光调节看起来不跟手。Gamma校正通过一个查找表将线性的亮度值转换为符合人眼感知的非线性值。通常使用2.8左右的Gamma值。许多高级LED库如FastLED内置了Gamma校正功能。// 一个简单的Gamma校正查找表Gamma2.8 const byte gammaTable[256] {0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,9,9,9,10,10,10,11,11,11,12,12,13,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,22,22,23,23,24,25,25,26,27,27,28,29,29,30,31,32,32,33,34,35,35,36,37,38,39,40,40,41,42,43,44,45,46,47,48,49,50,50,51,52,53,54,55,56,58,59,60,61,62,63,64,65,66,67,68,70,71,72,73,74,75,77,78,79,80,82,83,84,85,87,88,89,91,92,93,95,96,98,99,100,102,103,105,106,108,109,111,112,114,115,117,118,120,121,123,125,126,128,130,131,133,135,136,138,140,142,143,145,147,149,151,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,197,199,201,203,206,208,210,212,215,217,219,222,224,226,229,231,234,236,239,241,244,246,249,251,254,255}; void setColorGamma(int r, int g, int b) { analogWrite(redPin, gammaTable[r]); analogWrite(greenPin, gammaTable[g]); analogWrite(bluePin, gammaTable[b]); }应用Gamma校正后你会感觉LED的调光尤其是从暗到亮的变化变得更加自然和平滑。这对于制作高品质的氛围灯来说是质的提升。从点亮一个简单的三色灯到理解PWM和混色原理再到实现串口控制的智能场景最后探讨多灯驱动和色彩优化DFR0100这个小小的模块贯穿了一条清晰的学习路径。它就像一把钥匙打开了一扇通往嵌入式系统、数字信号处理甚至图形学基础的大门。下次当你想为你的机器人加上状态指示灯或者为你的桌面制作一个反应音乐律动的灯带时你会感谢当初在这个小灯上花的时间。

相关新闻

PSO与DWA融合算法在无人机三维避障中的实战应用

PSO与DWA融合算法在无人机三维避障中的实战应用

1. 项目概述 去年夏天我在参与一个山区物资运输项目时,遇到了一个棘手的问题:无人机在复杂地形中频繁发生碰撞事故。当时我们尝试了多种传统路径规划算法,效果都不理想。直到将粒子群算法(PSO)与动态窗口法&#xff08…

2026/10/21 2:57:10 阅读更多 →
基于Arduino与MPU6050的自制可回收火箭控制系统全解析

基于Arduino与MPU6050的自制可回收火箭控制系统全解析

1. 项目概述:从“窜天猴”到可控回收的跨越看到“自制带回收功能的火箭”这个标题,很多人的第一反应可能是童年时玩的“窜天猴”或者模型火箭。但今天我们要聊的,远不止是点着引线“咻”一声上天那么简单。这个项目的核心目标,是让…

2026/10/19 22:50:13 阅读更多 →
从零手搓双足机器人:Arduino控制、3D打印与步态算法实战

从零手搓双足机器人:Arduino控制、3D打印与步态算法实战

1. 项目缘起:从“玩具”到“伙伴”的执念几年前,我在一个创客展上看到一台步履蹒跚的双足机器人,它用几个舵机驱动着3D打印的骨架,走起路来摇摇晃晃,像极了刚学会走路的孩子。那一刻,我被深深吸引了。不是因…

2026/10/20 16:34:55 阅读更多 →

最新新闻

用NocoBase 2.0低代码搭建智能工单系统的完整实践笔记

用NocoBase 2.0低代码搭建智能工单系统的完整实践笔记

我们部门的工单管理,很长一段时间其实是失控的。报修靠企业微信群里吼一声,登记靠一张在线表格,处理进度完全依赖个人的自觉。高峰期一天四十多个请求,谁在跟、跟到哪一步、有没有超时,根本说不清楚。我当时的想法很直…

2026/10/21 8:18:34 阅读更多 →
大模型面试必备:Transformer、Token与RAG核心概念精讲

大模型面试必备:Transformer、Token与RAG核心概念精讲

想进大模型赛道,先把LLM这些地基问题答明白这两年大语言模型(LLM)相关的岗位有多火,不用我多说。很多人简历上写“熟悉大模型应用”“做过Agent开发”,结果面试官随口问一句“你讲一下Transformer结构和传统序列模型的…

2026/10/21 8:18:34 阅读更多 →
分布式文件系统写入路径与元数据设计:从租约到副本一致性

分布式文件系统写入路径与元数据设计:从租约到副本一致性

简介:这是一份以 FastDHT 1.15 源码为核心的分布式文件系统学习与开发资料,面向需要理解分布式哈希表、高并发文件存储及 FastDHT 二次开发的开发者。包内含完整 C 源码骨架,覆盖服务端、客户端与 PHP 扩展三部分,配合配置与启动脚…

2026/10/21 8:18:34 阅读更多 →
Cookie注入攻击全解析:从原理到防御的实战指南

Cookie注入攻击全解析:从原理到防御的实战指南

1. 前言:为什么Cookie会成为攻击者的突破口在做Web安全测试时,很多人习惯性地只关注URL参数和表单提交的数据,却忽略了一个非常关键的输入点——Cookie。Cookie注入攻击的原理其实并不复杂,但它的隐蔽性极强,很多开发者…

2026/10/21 8:18:34 阅读更多 →
手写RSA算法:用Python从零实现非对称加密与数字签名

手写RSA算法:用Python从零实现非对称加密与数字签名

先说个普遍现象:很多人学了几年密码学,真问起RSA该怎么实现,第一反应是调库。cryptography库一行sign,一行verify,完事。但你要是问他公钥和私钥到底是怎么算出来的,为什么别人拿到公钥也没法解密&#xff…

2026/10/21 8:18:34 阅读更多 →
电商数据分析SQL面试真题解析:从连续登录到留存率的解题思路

电商数据分析SQL面试真题解析:从连续登录到留存率的解题思路

回顾前几个月集中准备数据分析岗位面试的经历,最有感触的其实是SQL这道坎。投过头部电商平台数据分析岗的都知道,笔试和一面基本就是SQL题专场,甚至到了二面三面,面试官还会临时抛一道现场写SQL的场景题。我前前后后刷了不下两百道…

2026/10/21 8:17:33 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →