modified | Thursday 1 May 2025 |
---|
微 控 制 器 和 微 型 计 算机 中 的 Node
在 微 控 制 器 ( 比 如 Arduino) 和 微 型
计 算 机 ( 比 如 树 莓 派 ) 相 关 的 应 用
上 ,Node 已 经 有 了 很 广 泛 的 应 用 。
在 讲 到 树 莓 派 时 , 我 用 了 微 型 计 算 机
一 词 , 但 实 际 上 它 是 一 个 功 能 完 备 的
( 小 型 ) 计 算 机 。 你 可 以 在 上 面 安 装
操 作 系 统 , 如 Windows 10 或 Linux:;
还 可 以 外 接 键 盘 、 鼠 标 和 显 示 器 ; 并
运 行 多 种 应 用 程 序 , 其 中 包 括 浏 览
器 、 游 戏 以 及 办 公 应 用 程 序 。 另 一 方
面 ,Arduino 用 于 重 复 任 务 。 一 般 来
说 不 会 将 键 盘 或 显 示 器 直 接 连 接 到 设
备 上 , 而 是 将 设 备 连 接 到 计 算 机 上 ,
并使 用 相 关 应 用 来 开 发 并 将 程 序 上 传
到 设 备 中 。 与 计 算 机 ( 如 树 莓 派 ) 相
比 , 它 是 一 种 嵌 入 式 计 算 机 。
将 树 莓 派 和 Arduino 结 合 使 用
你 不 必 在 树 莓 派 和 Arduino 之
间 选 择 , 你 可 以 一 起 使 用 它
们 。 树 莓 派 是 发 布 指 令 的 大
脑 “ , 而 Arduino 则 是 执 行 指 令
的 肌 肉 “。
Arduino 和 树 莓 派 在 它 们 各 自 的 领 域
中 非 常 受 欢 迎 。 但 即 便 如 此 , 它 们 也
只 是 所 有 可 用 设 备 中 的 一 部 分 , 其 中
有 很 多 设 备 是 兼 容 Arduino 的 , 甚 至
还 有 一 个 可 穿 戴 设 备 (LilyPad) 。
套 件 中 包 含 一 切 开 发 所
需 的 东 西 , 而 且 还 不 贵 ( 一 般 都 在
100 美 元 以 下 ) 。 其 中 还 附 带 了 项 目
相 关 的 书 和 一 些 项 目 所 需 的 组 件 。
本 节 , 我 会 演 示 如 何 在 这 样 的 设 备 上
创 建 一 个 Hello World 程 序 。 这 个 程 序
可 以 访 问 GPIO 笔 上 的 LED 灯 并 让 其 闪
炸 。 我 会 分 别 在 Arduino Uno 和 树 莉
派 2 上 演 示 程 序 。
12.3.1 Fritzing
Fritzing 是 一 款 开 源 软 件 , 它 是 一 个 可
以 用 来 设 计 原 型 的 工 具 , 并 且 可 以 通
过 Fritzing Fab 实 现 该 原 型 。 这 款 软 件
是 免 费 的 。
可 以 从 Fritzing 网 站 下 载 该 程
序 。 由 于 应 用 程 序 所 需 的 图 形
组 件 数 量 庞 大 , 所 以 它 并不
小 。 它 提 供 了 Windows、OS
X 或 Linux 版 本 的 软 件 下 载 。
打 开 应 用 后 你 可 以 创 建 一 个 新 的草图
( 也 就 是 设 计 图 ) , 草 图 中 会 自 动 添
加 一 个 面 包 板 。 面 包 板 是 一 种 简 单 的
电 子 元 件 项 目 的 原 型 制 作 方 法 。 有 了
已 , 就 不 需 要 焊 接 任 何 组 件 ; 你 只 要
将 电 线 的 一 端 插 入 电 路 板 引 脚 , 将 另
一 端 插 入 面 包 板 就 够 了 。 在 面 包 板 塑
料 的 外 壳 下 面 是 导 电 金 属 条 , 坂 直 方
向 的 金 属 条 ( 如 果 有 的 话 ) 比 较 长 ,
位 于 电 源 通 道 下 面 ( 如 图 12-~2 所 示 的
高 亮 部 分 , 用 虚 线 和 波 浪 线 条 表
示 ) , 水 平 方 向 的 金 属 条 比 较 短 , 位
于 接 线 板 下 面 ( 如 图 12-3 所 示 ) 。 接
下 来 把 所 有 项 目 所 需 的 组 件 添 加 到 面
包 板 上 。
剖 析 面 包 板
如 果 想 要 了 解 关 于 面 包 板 更 细
节 的 信 息 , 比 如 它 的 历 史 或 已
如 何 工 作 , 我 推 荐 SparkFun 的
“ 如 何 使 用 面 包 板 教 程 。
LED 有 两 条 腹 , 叫 作 引 线 , 一 条 较
长 一 条 较 短 。 在 LED 的 图 标 中 , 较 长
的 引 线 显 示 为 弯 曲 状 态 , 它 是 正 极
( 阳 极 ) 引 线 , 而 较 短 的 引 线 则 是 负
极 ( 阴 极 ) 引 线 。 在 草 图 中 , 负 极 引
线 接 入 Arduino 的 地 线 , 而 正 极 引 线
接 入 11 号 引 脚 。
一 条 导 线 通 过 接 地 的 引 脚 连 接 到 面 包
板 上 。LED 的 负 极 ( 阴 极 ) 连 接 到 面
包 板 上 接 地 线 的 那 一 列 。 电 阻 的 一 条
引 线 连 接 到 面 包 板 上 接 入 LED 阳 极 的
那 一 列 。 最 后 , 还 有 一 根 导 线 连 接 电
阻 的 另 一 条 引 线 和 Arduino 的 第 11 号 引
脚 , 这 样 就 形 成 回 路 了 。
电 阻 是 一 个 新 组 件 。 顾 名 思 义 , 它 的
作 用 是 阻 挡 电 流 。 如 果 回 路 没 有 电
阻 ( 整 个 电 路 是 一 个 回 路 ) ,LED 很
可 能 会 消 耗 太 多 电 量 , 从 而 损 坏 GPIO
引 脚 和 电 路 板 。
电 阻 的 单 位 是 欧 姆 ( 符 号 为 Q, 简 称
欧 ) 。 通 过电 阻 上 的 标 签 就 可 以 知 道 它 是 多 少 欧
的 。 回 路 中 不 同 类 型 的 电 阻 可 以 通 过
频 带 上 的 不 同 颜 色 ( 以 及 频 带 的 数
量 ) 来 区 分 。
电 位
如 何 知 道 该 用 哪 个 电 阻 呢 ? 答
案 就 是 欧 姆 定 律 。 没 错 , 你
在 学 校 学 到 的 物 理 知 识 现 在 终
于 能 用 上 了 。
LED 是 极 化 的 , 也 就 是 说 它 有 方 向 。
所 以 它 连 接 到 面 包 板 ( 和 回 路 ) 上 的
方 式 很 重 要 ( 正 极 接 地 ) 。 不 过 电 阻
可 不 是 极 化 的 , 所 以 它 的 连 接 方 向 无
所 谓 。 而 且 , 电 阻 也 不 是 必 须 接 在
LED 后 面 。 就 像 图 12-2 中 所 展 示 的 ,
电 阻 也 可 以 接 在 LED 之 前 。 因 为 这 个
回 路 很 简 单 , 所 以 只 要 其 中 包 含 一 个
电 阻 就 够 了 。 电 阻 接 在 LED 之 前 的
Fritzing 草 图 如 图 12-6 所 示 ( 这 个 图
中 使 用 了 树 莓 派 , 该 项 目 会 在 第
12.3.3 节 中 详 细 介 绍 ) 。
以 上 只 是 一 些 电 路 图 元 件 的 简 单 介
绍 , 但 这 些 足 够 应 付 后 面 两 节 中 的 例
子 了 。
12.3.2 Node 和 Arduino
在 使 用 Arduino 云 编 程 之 前 , 需 要 在
计 算 机 上 安 装 Arduino 软 件 。 我 用 的
软 件 版 本 是 1.7.8, 操 作 系 统 是 Win-
dows 10 。 操 作 系 统 还 有 OS X 和
Linux 的 版 本 。Arduino 网 站 上 有 非 常
具 体 的 安 装 指 南 , 可 以 参 考 。 安 装 好
之 后 , 将 Arduino 通 过 USB 线 连 接 到
计 算 机 上 , 注 意 连 接 电 路 板 的 串 行 端
口 ( 对 我 而 言 是 COM3) 。
使 用 Node 之 前 , 还 需 要 将 Firmata 上
传 到 Arduino 上 。Firmata 是 一 个 微 控
制 器 通 信 协 议 , 通 过 该 协 议 , 可 以 让
计 算 机 或 手 持 设 备 通 过 软 件 对 其 进 行
控 制 。 在 Arduino 应 用 中 , 选 择
File 一 Examples 一 Firmata 一 Standar
dFirmata。 图 12-7 显 示 了 加 载 到
Arduino 应 用 中 的 Firmata。 窗 口 顶 部
有 一 个 向 右 箭 头 。 单 击 它 可 以 将
Firmata 上 传 到 Arduino。
Node 和 JavaScript 都 不 是 Arduino 或
树 莲 派 上 的 默 认 ( 甚 至 不 是 常 用 的 )
编 程 语 言 ( 常 用 的 是 Python) 。 不
过 , 有 一 个 叫 作 Johnny-Five 的 Node
框 架 却 能 让 我 们 在 这 些 设 备 上 编 程 。
使 用 如 下 方 式 在 Node 中 安 装 它 :
npm install johnny-five
Johnny-Five 网 站 不 仅 提 供 了 用 于 控
制 电 路 板 的 扩 展 API 描 述 , 而 且 还 有
一 些 示 例 , 其 中 包 括 被 当 作 Hello
World “ 的 LED 闪 烁 应 用 程 序 。 与
Johnny-Five 网 站 提 供 的 示 例 不 同
( 直 接 将 LED 连 接 到 Arduino 云 的 引 脚
上 ) , 在 这 里 我 们 试 着 让 嵌 入 电 路 板
中 的 LED 闪 烁 。 我 们 可 以 用 13 号 引 脚
访 问 该 LED。
下面 的 代 码 实 现 了 让 嵌 入 电 路 板 中 的
LED 闪 烁 ( 或 者 接 入 13 号 引 脚 的 外 接
var five = require(“johnny-five“);
var board = new five.,Board ( );
board.on( “ ready““ , function() {
var led = new five., Led (13) ;
led.blink(5800) ;
});
这 个 软 件 会 加 载 Johnny-Five 模 块 并
创 建 一 个 新 的 电 路 板 , 用 来 代 表
Arduino。 有 了 电 路 板 之 后 , 该 软 件
会 创 建 一 个 新 的 LED, 连 接 到 Arduino
的 13 号 引 脚 上 。 注 意 , 这 里 的 引 脚 号
跟 GPIO 不 一 样 , Johnny-Five 使 用 了
一 个 物 理 编 号 系 统 , 可 以 反 映 卡 上 标
记 的 针 脚 位 置 。 创 建 LED 对 象 之 后 ,
已 的 blink() 团 数 会 被 调 用 。 图 12-8 展
示 了 最 终 结 果 。 ( 箭 头 所 指 仨 置 为
LED。 )
程 序 运 行 时 会 打 开 一 个 REPL 。 输
入 .exit 可 以 终 止 程 序 , 即 停 止 LED 闪
烁 。 如 果 在 停 止 程 序 的 时 候 LED 灯 是
亮 着 的 , 需 要 断 电 才 能 让 它 熄 灭 掉 。
安 全 ! 安 全 ! 安 全 !
loT 本 身 很 有 意 思 , 如 果 你 没
有 炸 掉 电 路 板 或 者 计 算 机 的
话 。
说 真 的 , 只 要 你 按 照 说 明 操
作 , 还 是 可 以 轻 松 、 安 全 地 使
用 大 多 数 loT 和 小 设 备 上 的 应
用 的 。 这 也 是 为 什 么 在 挑 选 和
连 接 元 器 件 时 要 仔 细 检 查 电 路
图 。
保 持 工 作 环 境 的 清 洁 和 整 洁 也
很 重 要 , 尽 量 用 光 线 强 烈 的
灯 , 确 保 在 触 摸 任 何 电 子 设 备
( 而 你 自 己 是 接 地 状 态 ) 之
前 , 你 没 有 穿 着 袜 子 在 尼 龙 地
毯 上 走 过 ( 袜 子 和 尼 龙 摩 擦 可
能 会 产 生 静 电 ) , 更 换 组 件 之
前 一 定 要 给 设 备 断 电 , 工 作 时
尼 量 不 要 让 宠 物 或 者 小 孝 待 在
旁 边 。 同 时 , 我 建 议 不 要 把 咖啡杯放 在 电 路 板 旁 边 。
如 果 家 里 有 小 孩 子 , 最 好 在 工
作 结 束 后 把 电 子 元 件 都 收 起
来 。 因 为 除 电 路 板 之 外 , 很 多
电 子 元 件 都 比 较 小 , 可 能 被 孩
子 误 吞 下 去 ,LED 长 着 一 个 看
起 来 好 像 可 以 吃 的 样 子 。 不 过
对 于 大 一 点 的 挂 子 来 说 , 硬 件
项 目 是 一 个 很 好 的 实 践 , 至 于
多 大 的 孩 子 才 能 独 立 做 项 目 ,
我 想 大 家 都 知 道 这 个 常 识 。
如 果 你 不 像 我 一 样 戴 眼 镜 , 在
工 作 时 最 好 戴 一 副 工 作 眼 镜 来
保 扩 目 己 。
其 实 电 子 器 件 一 般 会 自 带 一 些
保 护 措 施 。 比 如 Arduino 云 上
有 板 载 调 节 器 , 可 以 防 止 那 些
看 上 去 毫 无 危 险 的 小 设 备 烧 了
你 的 计 算 机 。 不 过 电 路 板 本 身
还 是 很 容 易 损 坏 的 。 里 然 亡 们
很 便 宜 , 但 也 不 是 说 烧 坏 一 个
电 路 板 或 者 搞 坏 引 脚 就 无 所
谓 。
想 了 解 更 多 内 容 , 可 以 访 问
StackExchange 网 站 。
闪 烁 的 LED 的 确 很 有 意 思 , 不 过 现 在
我 们 有 了 闪 亮 的 新 玩 具 〔 程 序 本
身 ) , 来 看 看 它 是 怎 么 运 作 的 。LED
对 象 提 供 了 一 些 很 有 意 思 的 功 能 , 比
如 pulse() 和 fadeln()。 不 过 , 这 些 功
能 需 要 脉 宽 调 制 (PWM) 引 脚 , 也 称
为 模 拟 输 出 。13 引 脚 不 是 PWM。 不 过
11 号 引 脚 是 , 这 一 点 可 以 从 该 引 脚 前
面 的 波 浪 号 ( 一 ) 看 出 来 。
首 先 拔 下 电 路 板 , 然 后 拿 一 个 面 包
板 、LED 灯 、220Q 的 电 阻 和 两 根 导
线 。 大 多 数 套 件 应 该 都 包 含 这 些 组
件 。
把 电 路 板 摆 正 , 让 Arduino 这 个 单
词 正 面 朝 上 。 最 上 面 是 一 排 引 脚 。 将
一 根 导 线 连 到 接 地 的 引 脚 上 ( 在 电 路
板 上 用 CND 标 出 ) 。 将 第 二 根 导 线 连
到 标 有 “ ~11 的 引 脚 上 。 至 于 Arduino
旁 边 的 面 包 板 , 仿 照 Fritzing 草 图 ( 如
图 12-9 所 示 ) 将 剩 下 的 电 子 元 件 接 到
面 包 板 上 。 完 成 后 , 将 Arduino 电 路
松 接 回 去 。
例 12-1 中 的 程 序 通 过 REPL.inject() 凶
数 向 REPL 暴 露 了 一 些 闻 数 。 也 就 是
说 我 们 可 以 在 REPL 中 控 制 电 路 板
了 。 只 要 输 入 团 数 名 就 能 实 现 调 用 ,
比 如 用 on() 打 开 灯 , 用 fadeOut () 以
淡 出 的 形 式 关 灯 。
还 有 一 些 像 pulse()、fadeln() 和
fadeOut() 这 样 的 团 数 , 需 要 使 用 模 拟
输 出 引 脚 。 程 序 中 使 用 了 一 个 动 画 来
模 拟 pulse() 团 数 。 想 要 停 止 动 画 , 在
REPL 中 输 入 stop() 即 可 , 同 时 还 会 有
“Animation 轼Opped”的麦肖息o 停止
动 画 后 你 还 需 要 关 闭 LED 灯 。 一 定 要
在 关 闭 LED 之 前 停 止 动 留 , 否 则 动 画
是 不 会 自 己 停 止 的 。
例 12-1 “ 通 过 程 序 与 REPL 的 交 互 控
制 LED
var five = require(“johnny-five“);
var board = new five.Board ( );
board.on( “ ready““ , function() {
consolte. Log(“ Ready event. Rep1
instance auto-initiaLized.");
var Led = new five., Led (11);
this. rep1.inject({
// ALLow Limited on/off contro 1
access to the
// Led instance from the REPL。
ons: function() {
Led.on( );
},
off: function() {
Led.off( );
},
strobe: function() {
Led.strobe(1000) ;
},
pulse: function() {
Led.pultse ({
easing「 “linear",
duration: 3000 ,
cuePoints: [0, 0.2, 0.4, 0.6, 0.8, 1],
keyFrames: [0, 10, 0, 50, 0, 255] ,
onstop: function() {
consolte.log(“Animation stopped“ ) ;
}
});
},
stop: function() {
led.stop();
},
fade : function() {
Led.fadeIn( ) ;
了 ,
fade0ut: function() {
Led.fade0ut ( ) ;
}
});
});
用 Node 运 行 程 序 :
node fancyblinking
在 看 到 Ready event…“ 消 息 后 , 就
可 以 输 入 命 令 了 。 下 面 这 个 例 子 可 以
让 LED 开 始 闪 烁 :
strobe()
输 入 stop() 就 可 以 停 止 闪 烁 效 果 , 输
入 off() 彻 底 关 掉 LED。 接 着 可 以 试 试
更 加 炫 酷 的 pulse() 、fade() 和
fadeOut()。 图 12-10 是 LED 闪 烂 的 画
面 ( 虽 然 很 难 通 过 静 态 图 片 来 展 示 跳
动 效 果 , 不 过 相 信 我 , 它 真 的 生 效
了 丿 。