用 Node.js 玩转树莓派 —— 入门篇

Raspberry Pi(树莓派),是英国的树莓派基金会所开发的单板计算机,它是由 Eben Upton 以及他的同事设计的,最初的目的是以低价硬件及自由软件促进学校的基础计算机科学教育。

用 Node.js 玩转树莓派 —— 入门篇_第1张图片

树莓派 Model B+

在物联网(IoT)高速发展的今天,树莓派以低廉的价格、开放的硬件/软件生态、灵活的通用输入输出(GPIO)接口,成为学习、研究物联网和万维物联网(WoT)的理想设备。

树莓派不是单片机,不同于嵌入式硬件设备,它不是为集成于单一智能产品而设计的。它实际上是一台完整的电脑,只不过这台电脑只有一张 IC 卡片大小,用 5V 直流电源供电,并且有可以用程序来控制逻辑电平输出的通用接口。这意味着,如果你要为单一智能产品设计集成一体的智能电路,那么你应该选择一款可编程的 Arduino 或者其他微控制器芯片(不过树莓派也可以用作辅助开发工具),而如果你想做分布式的传感器和执行器网络,以便实现与万维网连接的智能家居系统,那么树莓派当然是再好不过的选择。

大约三年前我就接触了树莓派,我的同事阿肆更曾经仔细研究过,并分享了文章《在树莓派上使用 node.js 控制步进电机》。

不过我之前一直没怎么研究,直到最近因为翻译一本 WoT 的书加上一些其他原因,而且树莓派经过这些年的发展也更加成熟,于是就重新入手最新版的树莓派 Model B+,开始正式写一些东西玩,比如:操控 LED 灯。

树莓派可以用 Scratch、Python、C/C++ 等各种语言进行编程,而因为我这些年研究最多的语言是 JavaScript,所以也就自然希望使用 JavaScript 作为首选的编程语言。幸运地是,Node.js 在树莓派 Model 3B 下运行表现好的超出我的意料,在树莓派下跑 Node.js 4.4.7 LTS,无论是易用性、稳定性还是性能,都非常出色。

其实除去上面介绍的这些,最关键的一点是:树莓派真的非常有趣,想象一下,你有一台只有一张 IC 卡片大小的低功耗廉价电脑(Model 3B 在京东上的售价是 298 元),它可以跑几乎一切 ARM 6 架构下可以运行的软件,同时还可以拥有操控硬件的能力,你可以用它来控制温度湿度传感器,检测你房间内的温度湿度,并智能指挥你的空调该在什么时候开关机,更进一步,你还可以收集和存储从传感器获得的数据,然后将它用 ECharts 在 浏览器上用好看的图表展现出来!

澄清几个误区

在探索树莓派之前,我们先一一澄清几个常见的误区:

  • 树莓派只是一个单板,入手之后还得给它配置许多外设才能使用。
  • 树莓派安装、配置起来很麻烦,只适合专业人士。
  • 树莓派只有专用软件,和我的PC、移动设备不兼容。
  • 没有必要的硬件知识很难上手树莓派硬件开发。

要购买外设吗?

要运行树莓派,实际上并不需要入手太多外设,我们先大致看一下树莓派(Model 3B)本身集成了哪些资源:

  • CPU 和 GPU: Broadcom BCM2835
  • 内存:1024 MB(LPDDR2)
  • 视频输入: 15-针头 MIPI 相机 (CSI) 界面,可被树莓派相机或树莓派相机(无红外线版)使用
  • 视频输出: HDMI 可接入大多数通用 HDMI 接口的显示设备
  • 音源输入:I²S
  • 音源输出:HDMI 电子输出或I²S
  • 板载存储:MicroSD 卡插槽
  • 板载网卡:10/100Mbps 以太网接口(RJ45接口),支持802.11n无线网络及蓝牙4.1
  • 通用外设:14 个 GPIO
  • 电源输入:5V 电压 (通过 MicroUSB 或经 GPIO 输入)

可以看一下入手树莓派后几个关键的“辅助设备”:

首先树莓派电源支持 MicroUSB,绝大多数 Android 手机使用的充电器都可以给树莓派供电,相信很少有人手边没有,因此不需要额外购买此外设。

显示器,其实可以不需要(后面会说),实在想要用显示器的话,大多数支持 HDMI 输入的显示器都可以直接使用。如果想要单独配置的话,可以考虑小型车载高清液晶显示器,好一点一台四五百块钱,效果如下:

用 Node.js 玩转树莓派 —— 入门篇_第2张图片

我使用一款车载 LCD 显示器作为树莓派显示器

键盘鼠标,其实也可以不需要(后面会说),想要的话,普通的 USB 键盘鼠标就可以。不过树莓派是低功耗的,驱动能力有限,如果接了多台 USB 外设,最好配置自带供电的 USB 集线器,如果要玩硬件开发的话,还是应该把功率留给 GPIO 使用。

存储设备,采用 8GB 以上的 MicroSD Card,甚至在很多旧手机上就可以找到。

声音输出,如果用 HDMI 设备,是视频音频集成的,不需要额外的接入。

网卡和蓝牙,Model B/B+ 内置了无线网卡,Model 3B 还集成了蓝牙,所以这些理论上都不需要额外购买。

以上是主要辅助设备,其实基本上都有或者容易找到,那么我们要买些什么呢?如果你要好好玩的话,建议你买:

  • 自带供电的 USB 集线器,如果你想要使用一些 USB 外设的话。
  • 几块散热片(一般几块钱就够了),因为树莓派 Model 3B 的 CPU 和 GPU 运算能力比较强,发热量还是比较高的,可以给它们贴上散热片。
  • 通用的电子元件可以提前准备一些,但是也不是必须的,要做东西的时候再买也可以(这时候有点怀念在深圳的时候,如果在深圳,自己周末可以去华强北逛,随时买各种元件,种类丰富,非常便宜,现在大部分只能网购,送货比较慢)。通用元件大部分都很便宜,各种常用0.25w电阻(几百个也才几块钱),电容、晶体管、LED灯、排线(杜邦线)、面包板、PCB电路板、按键开关等等。剩下的特定元件就等做东西的时候再买,或者提前购买一些也行。
  • 工具箱/收纳盒:因为元件比较散,如果家里没地方放,再买个工具箱放起来是个好习惯。
  • 电工工具:如万用表、电烙铁等

差不多这些就够了,这是对于玩硬件的同学来说购买的东西,如果不打算玩硬件(有的同学拿它做服务器用,其实也可以),最后三条都可以不买。

树莓派系统的安装

树莓派的芯片是 ARM 6 架构的处理器(Broadcom 公司的 BCM2835),在它上面可以跑各种版本为 ARM 6 发布的 Linux 系统。官方推荐的系统是 Raspbian。从它的名字就可以看出,这个系统是 Debian 的一个分支(这意味着足够标准和通用了,Debian 的另一个著名分支是很多人,包括我在内,最喜欢用的 Ubuntu)。

树莓派的系统安装也非常简单,对于熟悉 Linux 系统的同学来说,只不过从官方下载最新的 Raspbian 镜像,然后写入一张空白的 MicroSD 卡里,将这张卡放入树莓派板底部的卡槽里,然后给树莓派接上电源就可以了。

如果你有配 HDMI 显示器和键盘鼠标,你就可以看到系统的启动画面,几秒钟后就能进入 Raspbian 系统的图形化 UI 界面。而事实上,通常我不推荐配置键盘鼠标这样的通用外设(还是把 USB 留给其他用途吧)。我们可以通过网线将树莓派和路由器连接起来,然后查看一下 IP 地址,从电脑上用终端 SSH 登录上树莓派就可以很愉快地玩耍了。

树莓派 Raspbian 系统的默认用户账号是 pi,初始密码是 raspberry

树莓派的软件安装

Rasbian 系统是 Debian 系统的分支,所以支持万能的 apt-get。大多数软件都支持 ARM6 编译,包括 Node.js,所以安装软件不是什么问题。唯一可能的问题大概是树莓派功耗低,I/O 操作较慢,所以一些软件编译的时间长一些。

在树莓派下给 Node.js 安装 npm 软件包的时候,请带上 --production 参数,这样会省掉很多 devDependancies 安装,大大提升速度!

rpio2

   

Export elegant OOP APIs to control Raspberry Pi GPIO pins with Node.js. Based on node-rpio which is a high performace library.

Installation

npm install rpio2 --production

By default the module will use /dev/gpiomem when using simple GPIO access. To access this device, your user will need to be a member of the gpio group, and you may need to configure udev with the following rule (as root):

$ cat >/etc/udev/rules.d/20-gpiomem.rules <<EOF
SUBSYSTEM=="bcm2835-gpiomem", KERNEL=="gpiomem", GROUP="gpio", MODE="0660"
EOF

For access to i²c, PWM, and SPI, or if you are running an older kernel which does not have the bcm2835-gpiomem module, you will need to run your programs as root for access to /dev/mem.

Usage

Synchronously

const Gpio = require('./lib/index.js').Gpio;
const gpio = new Gpio(40);

gpio.open(Gpio.OUTPUT);

for(var i = 0; i < 10; i++){
    gpio.toggle();
    gpio.sleep(500);
}

gpio.close();

Asynchronously

const Gpio = require('../lib/index.js').Gpio;
const gpio = new Gpio(40);

gpio.open(Gpio.OUTPUT);

void function loop(){
  Promise.resolve(gpio.toggle())
  .then(gpio.sleep.bind(null, 500, true))
  .then(loop)
}();

process.on("SIGINT", function(){
  gpio.close();

  console.log('shutdown!');
  process.exit(0);
});

Toggle with button

const Gpio = require('../lib/index.js').Gpio;
const button = new Gpio(32);
const output = new Gpio(40);

button.open(Gpio.INPUT);
output.open(Gpio.OUTPUT, Gpio.LOW);

//button down
button.on('rising', function(){
  output.toggle();
});

process.on("SIGINT", function(){
  button.close();
  output.close();

  console.log('shutdown!');
  process.exit(0);
});

驱动无线网卡

树莓派 Model 3B 板上集成了无线网卡,直接编辑 /etc/wpa_supplicant/wpa_supplicant.conf 配置:

sudo vim /etc/wpa_supplicant/wpa_supplicant.conf

编辑为:

ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
network={
    ssid=""
    scan_ssid=1
    psk=""
    priority=5
}
network={
    ssid=""
    psk=""
    priority=1
}

如果有多个 wifi 网络,你可以设置多个不同的连接,通过优先级 priority 来指定先连接哪个(数字越大优先级越高),这样做尤其方便你把树莓派带来带去。

连接了 wifi 之后,就可以省掉一条网线,通过无线连接 ssh 登录树莓派进行操作了。

树莓派和 GPIO 编程

树莓派的开发基础是用程序来控制板上的 GPIO 引脚的逻辑值(也就是电平高低)。

用 Node.js 玩转树莓派 —— 入门篇_第3张图片

这一排中右侧标记为橙色的引脚就是 GPIO

GPIO 引脚可以设置为输入和输出两种状态,输出状态即是由程序控制引脚的输出,0表示低电平,1表示高电平(此时该引脚为+3.3V电压)。输入状态是由外接设备给该引脚引入信号,输入状态下的引脚是只读的不可写,可以读取状态。此时的引脚还有上拉或下拉电阻可以设置。

GPIO 编程的基本原理就是这样,本文暂不做太详细的介绍,后续文章里我会详细介绍。

下面我们通过一个直观的例子就可以体会用树莓派控制硬件设备有多简单:

  1. 取一个发光二极管元件
  2. 将它的正极连接 P36 脚(即 GPIO 16),将它的负级接旁边的 P34 脚(GND,接地)
  3. 编写程序 blink.js:
//blink.js
var Gpio = require("rpio2");
var led = new Gpio(36);  //创建 P36 引脚

led.open(Gpio.OUTPUT, Gpio.LOW); //设置为 OUTPUT、默认低电平

for(var i = 0; i < 10; i++){
    led.toggle();  //切换 led 的电平状态
    led.sleep(500);  //等待 500ms
}

led.close();

安装 rpio2 库,执行 node blink.js,就会看到连接的 LED 元件闪烁 5 下,每次闪烁 1s。

总结

不得不说,树莓派是一个很好玩的电子设备,如果你学习做和硬件相关的编程,打算涉足 IoT,或者 WoT(Web of Thing),那么树莓派是一个很好的选择。

你入手树莓派了吗?你用树莓派来玩什么?欢迎在底下评论区讨论。

后续文章里我会详细介绍用 Node.js 开发 GPIO 的细节,除了软件编程外,还包括一些硬件基本概念比如上拉、下拉电阻,系统中断调用,I2C,等等。

让我们一起来玩树莓派吧~

你可能感兴趣的:(树梅派(Raspberry,Pi))