Raspberry Pi(树莓派),是英国的树莓派基金会所开发的单板计算机,它是由 Eben Upton 以及他的同事设计的,最初的目的是以低价硬件及自由软件促进学校的基础计算机科学教育。
在物联网(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 在 浏览器上用好看的图表展现出来!
在探索树莓派之前,我们先一一澄清几个常见的误区:
要运行树莓派,实际上并不需要入手太多外设,我们先大致看一下树莓派(Model 3B)本身集成了哪些资源:
可以看一下入手树莓派后几个关键的“辅助设备”:
首先树莓派电源支持 MicroUSB,绝大多数 Android 手机使用的充电器都可以给树莓派供电,相信很少有人手边没有,因此不需要额外购买此外设。
显示器,其实可以不需要(后面会说),实在想要用显示器的话,大多数支持 HDMI 输入的显示器都可以直接使用。如果想要单独配置的话,可以考虑小型车载高清液晶显示器,好一点一台四五百块钱,效果如下:
键盘鼠标,其实也可以不需要(后面会说),想要的话,普通的 USB 键盘鼠标就可以。不过树莓派是低功耗的,驱动能力有限,如果接了多台 USB 外设,最好配置自带供电的 USB 集线器,如果要玩硬件开发的话,还是应该把功率留给 GPIO 使用。
存储设备,采用 8GB 以上的 MicroSD Card,甚至在很多旧手机上就可以找到。
声音输出,如果用 HDMI 设备,是视频音频集成的,不需要额外的接入。
网卡和蓝牙,Model B/B+ 内置了无线网卡,Model 3B 还集成了蓝牙,所以这些理论上都不需要额外购买。
以上是主要辅助设备,其实基本上都有或者容易找到,那么我们要买些什么呢?如果你要好好玩的话,建议你买:
差不多这些就够了,这是对于玩硬件的同学来说购买的东西,如果不打算玩硬件(有的同学拿它做服务器用,其实也可以),最后三条都可以不买。
树莓派的芯片是 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 安装,大大提升速度!
Export elegant OOP APIs to control Raspberry Pi GPIO pins with Node.js. Based on node-rpio which is a high performace library.
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
.
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 引脚可以设置为输入和输出两种状态,输出状态即是由程序控制引脚的输出,0表示低电平,1表示高电平(此时该引脚为+3.3V电压)。输入状态是由外接设备给该引脚引入信号,输入状态下的引脚是只读的不可写,可以读取状态。此时的引脚还有上拉或下拉电阻可以设置。
GPIO 编程的基本原理就是这样,本文暂不做太详细的介绍,后续文章里我会详细介绍。
下面我们通过一个直观的例子就可以体会用树莓派控制硬件设备有多简单:
//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,等等。
让我们一起来玩树莓派吧~