树莓派 - JS 驱动 LCD1602

<封面摄于浙江·安吉的凤凰山,大一在这些玩了半年树莓派,现在用树莓派来写毕设,不忘初心,笑。>

最近想用树莓派驱动 IoT 写个毕设,经过一番调研选择了 Johnny-Five 库,咱前端人必须用 JS 干啥都行。开始前先驱动个 LCD1602 试试。 LCD1602 我选择的是 I2C 驱动的,既省线,又不用拖个面包板。

安装 Node.js

这里我们选择用 nvm 安装,执行以下命令:

1
2
3
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash  # 安装 nvm
$ source ~/.bashrc # 刷新 bash 命令
$ nvm install node # 安装最新 Node.js

执行一下 node -vnpm --version 查看是否安装成功。

编译 pigpio

Johnny-Five 依赖于 pigpio,但是 Johnny-Five 库中集成的 pigpio 版本太老,不支持 64 位的系统,使用我们需要手动编译最新版本的 pigpio。

1
2
3
4
5
$ git clone https://github.com/joan2937/pigpio.git  # 下载最新版
$ unzip pigpio-master.zip # 解压
$ cd pigpio-master # 进入目录
$ make # 编译
$ make install # 安装

安装 Johnny-Five

Johnny-Five 需要两个 JS 依赖,johnny-five.jsraspi-io.js

1
2
3
4
$ mkdir exp && cd exp  # 新建项目
$ npm init # 初始化
$ npm i johnny-five raspi-io --save
$ nano index.js

输入以下内容并保存:

1
2
3
4
5
6
7
8
9
10
11
12
13
const { RaspiIO } = require("raspi-io");
const five = require("johnny-five");

const board = new five.Board({
io: new RaspiIO()
});

board.on("ready", function() {
const lcd = new five.LCD({
controller: "PCF8574T" // 板子的型号
});
lcd.print("Hello, World");
});

请查看板子背部芯片上刻着的型号正确填写,PCF8574、PCF8574A、PCF8574T、PCF8574AT。

Johnny-Five 有个坑,会导致文字无法正确输出只会输出一个个方块,需要修复一下,详见:Raspberry and I2C LCD1602 with PCF8574T controller does not show text but only squares

cd 到 node_modules/johnny-five/lib/lcd.js,将 this.io.i2cWrite(this.address, this.memory); 改成 this.io.i2cWrite(this.address, [this.memory]);,保存即可。

运行

接线

LCD1602 有四根引脚,按如关联方式接入树莓派:

LCD 树莓派 备注
GND 6 接地
VCC 4 电源(5v or 3.3v)
SDA 3 数据信号
SCL 5 控制信号

连接完成后命令行输入 sudo raspi-config,Interface Options => I2C,启动 I2C 并重启。

重启后命令行输入 i2cdetect -y -r 1,若显示如下则说明 I2C 连接成功。

1
2
3
4
5
6
7
8
9
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

运行

输入 sudo node index.js 运行程序即可看到 LCD 输出了字符。

输出字符

这里只是简单的做了个输出示范,开发中对应的 API 可以查看官方文档

Johnny-Five 这个库还是挺厉害的,基本可以无脑驱动周边常用的元器件,python 能干的事儿,咱 JS 肯定要更优雅。也可以尝试一下 Cylon.js 这个库,博主试了一下有坑,对新版系统支持不好。

踩坑指北

记录一下踩过的坑:

  1. pigpio 需要手动编译最新版本,否则无法驱动 64 位系统。
  2. Johnny-Five 需要修改源码,否则会导致输出不正确。
  3. 板子型号确认正确。
  4. 运行程序需要 root 权限,请跟 sudo 命令。
  5. 运行程序后可能板子上啥也没有,试着拨一下板子背部的旋钮调节一下亮度。
    (博主调了一天源码没输出,就差给作者打电话了,晚上发现原来板子亮度没开,吐了……)
查看评论