Johnny-Five 驱动 LED 点阵屏(Led.Matrix)实战:从 MAX7219 到 HT16K33 的完整指南 IoT机器人嵌入式【免费下载链接】johnny-fiveJavaScript Robotics and IoT programming framework, developed at Bocoup.项目地址https://gitcode.com/gh_mirrors/jo/johnny-five点击查看免费下载本指南以 Johnny-Five 官方示例 docs/led-matrix.md 为核心系统讲解如何使用five.Led.Matrix在 Arduino 上驱动 8×8 LED 点阵屏从 MAX7219 芯片的 SPI 接线、心形图案与滚动文字绘制到基于 I2C 的 HT16K33 控制器再到双屏级联与 REPL 交互调试。读完本文你将掌握二进制点阵数据格式、核心 API 用法以及底层LedControl的实现原理可以独立实现自定义图形、字符动画和多屏显示方案。一、Led.Matrix 是什么Led.Matrix是 Johnny-Five 提供的高层 LED 点阵控制组件定义于 lib/led/matrix.js。它继承自 lib/led/ledcontrol.js 中的LedControl类构造时通过options.isMatrix true切换到矩阵模式并挂接字符表LedControl.MATRIX_CHARS。Led.Matrix同时被注册为five.Led.Matrix与five.Led、five.Led.RGB、five.Led.Digits一起通过 lib/led/index.js 对外导出。从源码结构看LedControl内部通过 Controller 机制支持两种完全不同的底层驱动控制器通信方式典型芯片构造要点DEFAULT默认SPI 类三线data/clock/csMAX7219 / MAX7221必须提供pinsHT16K33I2C宏晶 HT16K33Adafruit LED Backpack 常见必须提供controller: HT16K33与addressesLedControl的 JSDoc 明确标注默认控制器的引脚参数只接受{data, clock, cs}对象或[data, clock, cs]数组见 lib/led/ledcontrol.js L46-L54而dims屏幕尺寸、isBicolor双色等选项仅对 HT16K33 生效。二、硬件准备与接线MAX7219 默认控制器官方示例使用的硬件是 Arduino 板 基于 MAX7219 芯片的 8×8 点阵模块。接线如图接线要点MAX7219 采用类似 SPI 的三线串行协议时钟同步逐位移位输出data数据线 DIN→ Arduino 数字引脚clock时钟线 CLK→ Arduino 数字引脚cs片选线 CS/LOAD→ Arduino 数字引脚5V与GND为模块供电并与主控共地官方示例将data: 2, clock: 3, cs: 4接到 Arduino 的 D2/D3/D4。Fritzing 原始接线图见 docs/breadboard/led-matrix.fzz。在源码层面DEFAULT 控制器初始化时会把这几个引脚全部设置为OUTPUT并使用board.shiftOut(pins.data, pins.clock, byte)按设备数量逐字节移位输出见 lib/led/ledcontrol.js L762-L998 的DEFAULT控制器实现cs拉低后开始传输、拉高完成锁存。三、第一个示例心形图案与滚动文字从命令行运行官方示例node eg/led-matrix.js完整源码见 eg/led-matrix.js代码如下var five require(johnny-five); var board new five.Board(); board.on(ready, function() { var heart [ 01100110, 10011001, 10000001, 10000001, 01000010, 00100100, 00011000, 00000000 ]; var matrix new five.Led.Matrix({ pins: { data: 2, clock: 3, cs: 4 } }); matrix.on(); var msg johnny-five.split(); // Display each letter for 1 second function next() { var c; if (c msg.shift()) { matrix.draw(c); setTimeout(next, 1000); } } next(); this.repl.inject({ matrix: matrix, // Type heart() in the REPL to // display a heart! heart: function() { matrix.draw(heart); } }); });这段代码覆盖了Led.Matrix最核心的四个操作构造通过pins声明三根控制线缺省控制器即 MAX7219开机matrix.on()写入 SHUTDOWN 操作码使屏幕点亮详见下文 API 章节逐字绘制matrix.draw(c)接受单个字符内部查字符表渲染REPL 注入把matrix和自定义的heart()注入交互终端运行时可直接输入heart()显示心形。注意five.Led.Matrix的draw()一次只接受单个字符或完整行数据数组因此官方示例用msg.shift()逐个取出字符、配合setTimeout(next, 1000)实现每秒滚动一个字符的轮播效果。四、深入理解二进制点阵数据格式示例中的heart数组是点阵绘制的核心数据格式8 个字符串每行 8 个字符1表示该像素点亮0表示熄灭。把数组逐行读出来正好拼出一颗心01100110 10011001 10000001 10000001 01000010 00100100 00011000 00000000在draw()的实现中lib/led/ledcontrol.js L364-L409如果传入的是数组则直接作为逐行数据使用如果传入的是单个字符则从ledCharacters.MATRIX_CHARS字符表查找对应字形然后逐行调用row(addr, idx, rowData)下发。字符表定义于 lib/led/led-chars.js覆盖标点符号与符号空格、!#$%()*,-./[\]^_:;?{|}~数字0-9大写字母A-Z每个字形 8 行采用 5×7 风格点阵行值最高0x1F即 5 位有效另外 lib/led/ledcontrol.js L1067-L1092 会在加载时动态生成双位数00-99的字形左数字占 3 位、右数字移位合并因此matrix.draw(42)这类双字符也被原生支持。draw()还会校验字符行数与屏幕行数的一致性当传入数组长度与rows不匹配时会抛出Invalid character错误若字符表字形长度小于屏幕行数会自动补齐 0见 L385-L394。五、Led.Matrix 核心 API 详解Matrix从LedControl继承的公开方法在 lib/led/ledcontrol.js L156-L426 中有完整定义逐一说明5.1 开关与亮度on([addr])/off([addr])不带参数作用于所有级联设备带addr只作用于第addr块。实现上通过send(addr, OP.SHUTDOWN, 1|0)写入 MAX7219 的关断寄存器0x0C。brightness(addr, val)亮度val取值 0-100内部经Board.map(val, 0, 100, 0, 15)映射为 0-15 级后写入OP.INTENSITY0x0A。不传addr则作用于全部设备。5.2 绘制方法draw(chr)/draw(addr, chr)绘制单个字符或自定义行数据数组上文已述。clear([addr])清屏。DEFAULT 控制器实现为向每行写入 0。led(addr, row, col, state)点亮/熄灭单个像素点state为true/false或1/0MAX7219 模式按0x80 col计算列位并写入行寄存器。row(addr, row, val)写入一整行val可为 0-255 的数字或01100110这样的二进制字符串内部parseInt(val, 2)。仅矩阵设备支持否则抛出异常。column(addr, col, value)写入一整列value在 8×8 或 16×8 屏上为 8 位值0-0xFF在 8×16 屏上为 16 位值0-0xFFFF实现上逐行调用led()。digit(addr, position, chr)矩阵模式下会转调draw()七段数码管模式下才按位段寻址见 L224-L229。5.3 多设备辅助each(callbackfn)遍历所有级联设备回调callbackfn(deviceIndex)on/off/clear/draw/brightness等方法的无参调用都基于它广播。device(addr)返回一个以addr预绑定、可链式调用的方法集对象方便对指定设备做局部操作。5.4 尺寸与方向LedControl.MATRIX_DIMENSIONSL1094-L1107支持三种矩阵规格8x8、16x816 行 8 列、8x168 行 16 列默认8x8。构造时若行列组合非法如16x16会直接抛出Invalid matrix dimensions specified: must be 8x8, 16x8 or 8x16。LedControl.DIRECTIONSL1047-L1058定义UP/RIGHT/DOWN/LEFT四向常量供 HT16K33 旋转逻辑与上层动画使用。六、级联多屏双 MAX7219 点阵实战Led.Matrix天然支持 MAX7219 级联多个模块的DOUT → DIN串接。官方进阶示例 docs/led-matrix-tutorial.md源码 eg/led-matrix-tutorial.js演示了双屏用法var temporal require(temporal); var readline require(readline); var five require(johnny-five); var board new five.Board({ repl: false }); var CHARS five.LedControl.MATRIX_CHARS; board.on(ready, function() { var display new five.Led.Matrix({ pins: { data: 2, cs: 3, clock: 4, }, devices: 2 // 级联了两块 MAX7219 点阵 }); display.on(0); display.on(1); // 第二块屏画眨眼动画两帧交替 function winker() { var a [0, 102, 102, 102, 0, 129, 66, 60]; var b [0, 96, 96, 102, 0, 129, 66, 60]; display.draw(1, a); temporal.queue([{ delay: 50, task: ... }, ...]); } winker(); // 第一块屏通过 readline 读取终端输入逐字显示 rl.on(line, function(text) { output text; draw(); }); });这个示例体现了三个实战技巧devices: 2声明级联数量display.on(0)/display.on(1)分别点亮两块屏每块屏独立绘制display.draw(0, char)在 0 号屏显示字符display.draw(1, 帧数据数组)在 1 号屏播放动画帧动画帧复用同一数据格式a/b两个长度为 8 的数字数组就是两帧眼睛配合temporal库做 50ms 间隔的帧切换实现眨眼效果。由此可推断draw(addr, data)的第二参数既可以是字符查表也可以是直接的行数据数组这让自定义动画与从终端打字上屏都非常直接。七、HT16K33走 I2C 总线的 Adafruit 点阵如果使用 Adafruit LED Backpack 系列点阵内置 HT16K33 驱动芯片改用 I2C 控制器无需三根 SPI 线只需 SDA/SCL 两根数据线和电源。官方文档 docs/led-matrix-HT16K33.md 给出了完整示例源码 eg/led-matrix-HT16K33.jsnode eg/led-matrix-HT16K33.jsvar five require(johnny-five); var board new five.Board(); board.on(ready, function() { var heart [ 01100110, 10011001, 10000001, 10000001, 01000010, 00100100, 00011000, 00000000 ]; var matrix new five.Led.Matrix({ addresses: [0x70], controller: HT16K33, rotation: 3, }); matrix.clear(); matrix.draw(heart); });HT16K33 控制器的底层实现lib/led/ledcontrol.js L429-L754有几个关键行为地址管理合法的 I2C 地址集合为0x70-0x77Set 类型维护L429每个地址被占用后从集合中移除避免与 I2C 总线上的其他 HT16K33 冲突非法地址抛出Invalid HT16K33 controller address。rotation旋转构造时可指定1/2/3用于匹配不同封装如 Adafruit 16×8 双屏的物理方向led()内部按旋转值做行列坐标变换L592-L613并对 8×8 单色屏做列环绕L617-L619。操作码SHUTDOWN: 0x20、BRIGHTNESS: 0xE0、BLINK: 0x80。初始化时自动执行on、关闭闪烁blink(device, false)、亮度 100 并清屏。blink(addr, val)支持slow每 2 秒、normal每 1 秒、fast每 500ms三种闪烁频率或false关闭对应数据手册中的 6/4/2/0。双色支持isBicolor: true时led()的state可传LedControl.COLORS.RED / YELLOW / GREEN定义于 L1041-L1045分别控制红/绿/黄三色 LED 的位操作。writeDisplay每次修改后通过io.i2cWrite(address, bytes)一次性把 8 行的低 8 位与高 8 位写入显示缓冲。另外注意scanLimit方法在 HT16K33 控制器下未实现会抛出提示错误L698-L703print()方法在矩阵模式下同样抛出Led.Matrix does not yet support the print methodL278-L281因此矩阵场景统一使用draw()。八、运行、调试与 REPL 交互8.1 运行前提需要 Arduino 开发板并烧录 Johnny-Five 依赖的 Firmata 固件在项目根目录安装依赖后运行示例node eg/led-matrix.js示例使用../lib/johnny-five本地引用见 eg/led-matrix.js L1对 HT16K33 示例同理node eg/led-matrix-HT16K33.js。8.2 REPL 实时调试five.Board()默认会开启 REPLdocs/repl.md 有专门说明。官方示例用this.repl.inject(...)把运行时对象注入交互终端启动后可以直接输入heart() // 显示心形 matrix.off() // 关屏 matrix.on() // 开屏 matrix.draw(A) // 显示字母 A matrix.clear() // 清屏这种脚本绘制 终端即时调试的组合非常适合在不动代码的情况下快速验证图形与动画帧是点阵项目开发调试的推荐姿势。8.3 源码与测试参考想深入了解实现细节可继续阅读组件入口lib/led/matrix.jsMatrix extends LedControlisMatrix true核心实现lib/led/ledcontrol.js两种控制器、操作码、绘制方法、MATRIX_DIMENSIONS、COLORS、DIRECTIONS字形字符表lib/led/led-chars.jsMATRIX_CHARS与DIGIT_CHARS示例程序eg/led-matrix.js、eg/led-matrix-tutorial.js、eg/led-matrix-HT16K33.js官方文档docs/led-matrix.md、docs/led-matrix-tutorial.md、docs/led-matrix-HT16K33.md九、总结Led.Matrix把 MAX7219 的 SPI 时序与 HT16K33 的 I2C 寄存器操作全部封装成统一的draw/clear/on/off/led/row/columnAPI上层只需关心8 行二进制数据这一种图形描述格式。无论是官方的心形图案、滚动字母还是双屏眨眼动画、Adafruit 背板点阵都遵循同一套数据模型——这正是 Johnny-Five 矩阵驱动最值得掌握的设计思路把硬件差异收敛到 Controller 层把创造力留给数据数组。赞分享IoT机器人嵌入式【免费下载链接】johnny-fiveJavaScript Robotics and IoT programming framework, developed at Bocoup.项目地址https://gitcode.com/gh_mirrors/jo/johnny-five点击查看免费下载相关推荐Johnny-Five 与 imp-io 结合在 Electric Imp 上驱动 LED 闪烁的完整指南Johnny Five 与 imp io 结合在 Electric Imp 上驱动 LED 闪烁的完整指南 本文是一份基于 johnny five httpsIoT机器人嵌入式Johnny-Five 入门用 Board 与 Led 实现 LED 闪烁Blink实战指南Johnny Five 入门用 Board 与 Led 实现 LED 闪烁Blink实战指南 Johnny Five 是运行在 Node.js 之上的 JIoT机器人嵌入式Johnny-Five 驱动 Intel Galileo Gen 2基于 galileo-io 的 LED 闪烁入门实战Johnny Five 驱动 Intel Galileo Gen 2基于 galileo io 的 LED 闪烁入门实战 Johnny Five 是运行在 NIoT机器人嵌入式创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考