johnny-five
用 JavaScript 控制硬件:支持42种传感器/执行器,覆盖Arduino/树莓派/Particle等主流平台的开源机器人编程框架
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
用 JavaScript 控制硬件:支持42种传感器/执行器,覆盖Arduino/树莓派/Particle等主流平台的开源机器人编程框架
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。

Johnny-Five 项目标识
想象一下:你在电脑前喝着咖啡,手指敲击键盘写出了几行代码,然后身边的小车真的开始绕着桌子跑了起来——不是模拟器,不是游戏,而是物理世界里真实发生的事。这听起来像是科幻,但 Johnny-Five 把这件事变成了现实。
Johnny-Five 的诞生,源于一个朴素的问题:为什么学硬件编程就一定要学 C 语言或者 Python?为什么不能用几乎每个前端开发者都会的 JavaScript 来写硬件程序? 这个框架由 Rick Waldron 于 2012 年发起,是 Nodebots 社区的核心项目,得到了 Bocoup 公司的支持。它基于 Firmata 协议——一种让电脑通过串口与微控制器通信的开放协议——从而让 JavaScript 代码能够直接控制各种硬件设备。
项目自诞生以来持续维护超过 13 年,获得了超过 13,400 颗 GitHub Stars,在 IoT 和创客教育领域具有相当的影响力。对于硬件爱好者来说,Johnny-Five 就像是给硬件世界打开了一扇通往 JavaScript 生态的大门。
Johnny-Five 不是一个简单的"点亮 LED"工具,它内置了对 42 种硬件组件类型的完整支持,涵盖传感、驱动、通信三大类:
传感类:温度传感器(thermometer)、光照传感器(light)、加速度计(accelerometer)、陀螺仪(gyro)、气压计(barometer)、高度计(altimeter)、湿度计(hygrometer)、超声波测距(proximity)、颜色识别(color)、GPS 定位(gps)等。这些传感器几乎覆盖了创客项目中会用到的所有常见类型,从环境监测到运动检测无所不包。
驱动/执行类:电机(motor)、舵机(servo)、步进电机(stepper)、ESC 调速器(esc)、LED、继电器(relay)、蜂鸣器/压电片(piezo)、LCD 屏幕(lcd)。这些组件是机器人、智能小车、自动化设备的核心执行单元,Johnny-Five 提供了统一的 API 来操控它们,屏蔽了底层硬件差异。
交互/通信类:按钮(button)、开关(switch)、摇杆(joystick)、键盘(keypad)、GPS、扩展芯片(expander)等。特别值得一提的是,项目内置了 REPL(交互式解释器)功能,允许开发者在运行时实时输入命令调试硬件,这大幅提升了开发和调试效率。
项目还附带 386 个示例程序,涵盖每一种组件类型,从基础的 LED 闪烁、按钮检测,到复杂的机器臂控制、传感器融合,每一步都有可运行的参考代码。对于初学者来说,这意味着"站在巨人肩膀上"——不需要从零摸索,照着示例改参数就能出成果。

动图1:最基础的 LED 闪烁程序运行效果
Johnny-Five 的核心工作原理可以这样理解:如果把硬件项目比作一场演出,Johnny-Five 就是那个"舞台总监",它通过 Firmata 协议(一个标准的微控制器通信协议)与 Arduino 等板子上的 StandardFirmata 固件对话,接收来自 JavaScript 的指令并转化为电信号,驱动各个硬件组件工作。
这种架构有几个关键优势:
1. 跨平台一致体验:无论你用的是 Arduino、Raspberry Pi 还是 Intel Edison,只要板子支持 Firmata,写出来的代码几乎不需要修改。项目提供了 IO-Plugin 机制,让不同平台的硬件通信细节被封装在插件层,对上层代码透明。
2. 事件驱动模型:整个框架基于 Node.js 的 EventEmitter 构建,组件以事件形式暴露状态变化。例如 sensor.on('data', callback) 会在传感器读数变化时自动触发回调函数,这种编程风格对前端开发者非常友好。
3. 高度模块化:lib/ 目录下每个文件对应一种硬件组件类型,职责单一且独立。这种设计让框架易于扩展,社区开发者也可以独立开发新的组件库而不影响核心。
框架依赖非常轻量——仅依赖 chalk(终端着色)、lodash.clonedeep(深拷贝)、nanotimer(定时器)等几个小型工具库,没有任何重型 AI/ML 依赖,安装包体积极小。
这是 Johnny-Five 最令人印象深刻的地方。项目官方支持以下平台:
项目还支持通过 IO-Plugin 机制扩展更多平台,社区维护的插件包括 Raspberry Pi 的 raspi-io、Particle 的 spark-io 等。这种"基座 + 插件"的架构让 Johnny-Five 成为硬件领域的"通用翻译器"。
Johnny-Five 的安装非常简单,核心库仅需一条命令:
npm install johnny-five
以 Arduino 为例,使用流程是:
node your-code.js上手门槛对前端开发者极低——不需要学习 C 语言,不需要理解底层寄存器,只需要会写 JavaScript 就能控制硬件。但需要注意:这个框架本质上是用来操控真实物理硬件的工具,如果你没有 Arduino、Raspberry Pi 或其他支持的开发板,代码无法在纯软件环境中运行(没有模拟器)。
开发体验方面,框架提供了完整的类型提示(TypeScript 定义文件在 @types/johnny-five),以及详尽的在线 API 文档和示例集,文档质量在硬件类开源项目中属于顶尖水平。
没有任何框架是银弹,Johnny-Five 也有其局限:
实时性限制:JavaScript 的事件循环模型不适合对时间精度要求极高的场景(如高速电机控制、实时控制系统)。对于这类需求,C++ 或 Rust 等系统级语言仍是首选。
依赖物理硬件:没有 Docker 支持,无法在容器中模拟运行。开发者必须准备实际的硬件设备,这增加了学习和测试成本。
活跃度下滑:虽然项目仍在维护,但相较于高峰期,社区活跃度有所下降,Python 生态中的类似项目增长更为迅速。
Johnny-Five 的意义远超一个技术框架本身。它是"NodeBots 运动"的代表——一个将 Web 前端开发者引入硬件世界的运动。通过降低硬件编程的语言门槛,它让数十万 JavaScript 开发者有机会接触物理计算领域。
在创客教育领域,Johnny-Five + Arduino 的组合已经成为经典入门方案。相比纯 Python 方案,JavaScript 的广泛群众基础让它在教育场景中具有独特优势。
对于 IoT 应用开发,Johnny-Five 的跨平台一致性和与 Node.js 生态(Express.js、Socket.io 等)的天然融合,使它成为快速原型开发的利器。结合树莓派或 Particle 设备的联网能力,可以快速搭建可联网的智能硬件系统。
未来,随着 Web Serial API 在浏览器中的普及,Johnny-Five 的架构理念有望进一步延伸到 Web 端——开发者甚至可以直接在浏览器中运行 Johnny-Five 代码与硬件通信,而无需通过 Node.js 中转。