用ShadowNode玩转硬件:GPIO、I2C、SPI、UART JavaScript开发指南
【免费下载链接】ShadowNodeUse Node.js in your end devices(QQ: 796448809)项目地址: https://gitcode.com/gh_mirrors/sh/ShadowNode
ShadowNode 是运行在边缘设备和嵌入式终端上的 Node.js 运行时,让你直接用 JavaScript 操作 GPIO、I2C、SPI、UART 等硬件接口。无需编写 C 语言底层代码,几行 JS 脚本就能点亮 LED、读取传感器、与串口设备通信。本文带你快速上手这套硬件开发的完整流程 👇
一、为什么选择 ShadowNode?
传统嵌入式开发需要 C/C++ 功底,学习曲线陡峭。ShadowNode 将 Node.js 生态"影子"投射到资源受限的设备上:
- 🎯纯 JavaScript 开发:用熟悉的
require、回调、事件驱动模型操作硬件 - 📦兼容 Node.js 生态:内置 MQTT、WebSocket、HTTP、Buffer、Stream 等模块
- ⚡轻量高效:基于 JerryScript 引擎,专为内存受限的终端设备设计
- 🔌硬件接口齐全:原生支持 GPIO、I2C、SPI、UART、PWM、ADC、BLE 等
其内部由 JerryScript 引擎负责执行 JavaScript 代码,对象属性的存储结构如下所示:
二、快速上手:5 分钟准备开发环境
1. 获取源码并构建
git clone https://gitcode.com/gh_mirrors/sh/ShadowNode cd ShadowNode npm run build2. 连接开发板
ShadowNode 支持 Linux(树莓派等)、NuttX(STM32F4-Discovery)等多个平台。下图展示了一块嵌入式开发板通过串口与主机连接并进行硬件联调的实际场景:
构建完成后即可运行示例脚本,如官方的 GPIO 闪烁 LED 示例 samples/gpio-blinkedled/gpio_led.js。
三、GPIO:用 JavaScript 点亮你的第一个 LED
GPIO(通用输入输出)是硬件开发的第一课。ShadowNode 的 GPIO 模块 提供open / write / read / close四种核心操作,支持异步回调与同步两种调用方式。
最简 GPIO 点灯步骤
require('gpio')获取 GPIO 对象- 调用
gpio.open()指定引脚号和方向(DIRECTION.OUT) - 用
writeSync(true)点亮,read()读取电平
核心逻辑只有几行:
var Gpio = require('gpio'); var gpio = new Gpio(); var led = gpio.open({ pin: 10, direction: gpio.DIRECTION.OUT }, function(err) { if (!err) led.writeSync(true); // 点亮 LED });配合setInterval翻转电平,即可实现 LED 闪烁效果,完整代码见 samples/gpio-blinkedled/gpio_led.js。测试用例 test/run_pass/test_gpio_output.js 还演示了如何在 Linux、NuttX、TizenRT 三个平台间适配不同的引脚编号和MODE.PUSHPULL等模式。
💡提示:Linux 上的引脚是逻辑编号(从 1 开始),可能与开发板的物理引脚号不同,需查阅对应开发板文档的映射表。
四、I2C:用 JS 驱动传感器与显示屏
I2C 总线只有 SDA、SCL 两根信号线,是连接温湿度传感器、OLED 屏幕等器件最常用的协议。I2C 模块 的用法非常直观:
var I2C = require('i2c'); var i2c = new I2C(); var bus = i2c.open({ device: '/dev/i2c-1', address: 0x70 }, function(err) { bus.write([0x21]); // 写入控制命令 bus.read(2, function(err, res) { console.log('read result: ' + res); // 读取传感器数据 }); });官方示例 samples/i2c/i2c_ht16k33.js 演示了如何通过 I2C 向 HT16K33 驱动的 LED 点阵屏写入 16 字节字模数据,点亮"IoT"字符图案——这是理解 I2C 时序的绝佳案例。
五、SPI:高速外设通信的 JS 方案
SPI(串行外设接口)比 I2C 速度更快,常用于 SD 卡、显示屏和 ADC 芯片。SPI 模块 支持配置 4 种时钟模式、最高传输速率、位序(MSB/LSB)等参数:
var Spi = require('spi'); var spi0 = new Spi().open({ device: '/dev/spidev0.0', maxSpeed: 500000 }); var tx = new Buffer('Hello ShadowNode'); var rx = new Buffer(tx.length); spi0.transfer(tx, rx, function(err) { // 全双工收发 console.log('transfer done'); });transfer()方法同时完成发送与接收,txBuffer和rxBuffer长度必须一致。更多实战可参考 test/run_pass/test_spi.js 和 test/run_pass/test_spi_buffer.js。
六、UART:JavaScript 实现串口通信
UART 通用异步收发器是设备间最基础的串行通信方式。UART 模块 支持波特率、数据位配置,并通过data事件接收数据:
var Uart = require('uart'); var serial = new Uart().open({ device: '/dev/ttyUSB0', baudRate: 115200, dataBits: 8 }); serial.write('Hello?', function(err) { /* ... */ }); serial.on('data', function(data) { console.log('收到: ' + data.toString()); });波特率可选 0~230400 共 19 个档位,数据位支持 5/6/7/8,足以覆盖绝大多数传感器和模块的通信需求。完整测试见 test/run_pass/test_uart.js。
七、进阶:了解 ShadowNode 内部工作机制
想深入理解 ShadowNode 如何高效执行 JS 代码,可以看看 JerryScript 引擎的解析器架构——词法分析器、语句解析器和函数解析器协同工作:
解析完成后,字节码由引擎在设备端高效执行,这正是 ShadowNode 能在 KB 级内存设备上流畅运行硬件控制脚本的原因。引擎源码位于 deps/jerry/jerry-core/ 目录,硬件模块的 C 语言绑定层则在 src/modules/ 中,例如 src/modules/iotjs_module_gpio.c 和 src/modules/iotjs_module_uart.c,适合想二次开发的进阶读者。
八、总结:你的硬件开发路线图
| 阶段 | 目标 | 推荐资源 |
|---|---|---|
| 入门 | 点亮 LED | docs/api/GPIO.md、gpio 示例 |
| 进阶 | 读写传感器 | docs/api/I2C.md、i2c 示例 |
| 深入 | 高速外设/串口 | docs/api/SPI.md、docs/api/UART.md |
| 综合 | 联网 + 硬件 | docs/api/MQTT.md、docs/api/WebSocket.md |
ShadowNode 把 Node.js 的开发体验带进了嵌入式世界——GPIO、I2C、SPI、UART 四大硬件接口全部可以用 JavaScript 优雅地驾驭。现在就可以 clone 代码、构建运行,开始你的硬件创作吧!🚀
【免费下载链接】ShadowNodeUse Node.js in your end devices(QQ: 796448809)项目地址: https://gitcode.com/gh_mirrors/sh/ShadowNode
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考