1,582
社区成员




【本文正在参与"2021爱智先行者-征文大赛"活动】
之前手上有一个树莓派并开发了一些有意思的小玩意儿。在看到爱智 Spirit 1 之后对这个小巧的智能边缘计算机产生了一点浓厚的兴趣,它实现了一个万物互联的平台。所以马上想到用它来连接一下树莓派,这样就可以让我的树莓派给它打工了,将爱智作为一个数据中心,处理各个地方上报上来的数据,然后再进行资源重新分配,所有的设备都可以根据自己的需求来进行工作了。
接下来用一个小应用来实现这个互动连接。
爱智 Spirit 1
树莓派3b+
HC-SR04 超声波模块
爱智 Spirit 1
CPU : Allwinner H6 (ARMv8 Cortex-A53 1.3GHz VFPv4)
CACHE : 64KBytes L1-Cache (D-32K/I-32K) 512KByte L2-Cache
PACKET : Spirit1 Allwinner H6 Packet for HardWare v3.0
ROM SIZE: 0x00400000 Bytes (0x00000000 - 0x003fffff)
RAM SIZE: 0x77000000 Bytes (0x49000000 - 0xbfffffff)
BSP : BSP version 1.5.0 for Enterprisejavascript -v
1.5.8 (0)
树莓派
Raspberry Pi 3 Model B Plus Rev 1.3
Architecture: armv7l
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
Vendor ID: ARM
Model: 4
Model name: Cortex-A53
Stepping: r0p4
CPU max MHz: 1400.0000
CPU min MHz: 600.0000
BogoMIPS: 38.40
Flags: half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
pigpiod -v
79
node -v
v10.24.1
npm -v
6.14.15
HC-SR04 超声波模块
工作电压:DC 5V
工作电流:15mA
工作频率:40Hz
射程:4cm~4.5m
测量角度:15°
输入触发信号:10μS 的TTL 脉冲
---------------------------|---------------------------------
3v3 01 02 5v -- Vcc
GPIO 2 (WiringPi 8) 03 04 5v
GPIO 3 (WiringPi 9) 05 06 GND
GPIO 4 (WiringPi 7) 07 08 GPIO 14 (WiringPi 15)
GND 09 10 GPIO 15 (WiringPi 16)
GPIO 17 (WiringPi 0) 11 12 GPIO 18 (WiringPi 1) -- Trig
GPIO 27 (WiringPi 2) 13 14 GND -- Gnd
GPIO 22 (WiringPi 3) 15 16 GPIO 23 (WiringPi 4)
3v3 17 18 GPIO 24 (WiringPi 5) -- Echo
GPIO 10 (WiringPi 12) 19 20 GND
GPIO 09 (WiringPi 13) 21 22 GPIO 25 (WiringPi 6)
GPIO 11 (WiringPi 14) 23 24 GPIO 8 (WiringPi 10)
GND 25 26 GPIO 7 (WiringPi 11)
GPIO 0 (WiringPi 30) 27 28 GPIO 1 (WiringPi 31)
GPIO 5 (WiringPi 21) 29 30 GND
GPIO 6 (WiringPi 22) 31 32 GPIO 12 (WiringPi 26)
GPIO 13 (WiringPi 23) 33 34 GND
GPIO 19 (WiringPi 24) 35 36 GPIO 16 (WiringPi 27)
GPIO 26 (WiringPi 25) 37 38 GPIO 20 (WiringPi 28)
GND 39 40 GPIO 21 (WiringPi 29)---------------------------|---------------------------------
应用的整个连接通过的是 CoAP 协议:
CoAP(Constrained Application Protocol,受限应用协议,RFC 7252)协议是一种运行在资源、通信带宽十分有限的物联网设备上的 M2M(Machine to Machine)通信协议。
CoAP 协议运行在 UDP 协议之上,并且设计得非常小巧,最小的数据包只有 4 个字节。CoAP 协议采用 C/S 架构,使用类似于 HTTP 协议的 请求/响应(Request/Response)的交互模式。设备可以通过类似于 coap://192.168.1.150:5683/floor/temperature
的 URL 来标识一个实体对象(资源),并使用类似于 HTTP 协议的 RESTful 风格 API 和 PUT
、GET
、POST
、DELETE
方法来获取或者修改这个实体对象的状态。
首先我们通过 CoAP 协议在爱智 Spirit 1 和 树莓派上建立连接,爱智中已经集成了 CoAP 包,树莓派上需要安装 nodejs 的 coap 包,然后我们在爱智应用中通过client 像 树莓派上建立的 CoAP server 发送获取距离的指令。
// routers/rest.js
const coap = require('coap');
router.get('/get-distance', function(req, res) {
// 这里填写 树莓派上 CoAP 服务地址
var coapClient = coap.request('coap://192.168.64.89:5683/get-distance', function (client) {
client.on('response', function (client, data) {
console.log('>> Recv message:', data.payload.toString());
res.json({
code: 0,
data: data.payload.toString()
})
});
}, {method: 'GET', payload: 'get-distance'});
})
// 前端页面通过 API 请求 /get-distance 资源路径回去返回的结果,进行展示
// 前端页面见参考链接
接着我们在树莓派上创建 CoAP 的 server 端
// main.js
const coap = require('coap')
const server = coap.createServer()
const trigHCSR04 = require('./libs/hc-sr04')
const PORT = 5683
server.on('request', function (req, res) {
console.log('>> url:', req.url.split('/'))
console.log('>> req:', req.payload.toString())
trigHCSR04((data) => {
res.end(`${data}`)
})
})
server.listen(PORT, function () {
console.log(`>> raspi CoAP server started on port: ${PORT} <<`)
})
CoAP 服务端接收到请求然后将获取的数据返回到 爱智APP。
// hc-sr04.js
const Gpio = require('pigpio').Gpio;
// 每ms的声速
const MICROSECDONDS_PER_CM = 1e6 / 34321;
const trigNumber = 18;
const echoNumber = 24;
const trigger = new Gpio(trigNumber, { mode: Gpio.OUTPUT });
// 设置 trigger 引脚为输出引脚
const echo = new Gpio(echoNumber, { mode: Gpio.INPUT, alert: true });
// 设置 echo 引脚为输入
trigger.digitalWrite(0);
// 设置 trigger 引脚为低电平
let cb = () => {}
const watchHCSR04 = () => {
let startTick;
echo.on('alert', (level, tick) => {
if (level == 1) { startTick = tick; }
else {
const endTick = tick;
const diff = (endTick >> 0) - (startTick >> 0);
// 无符号的 32位数据
const distance = diff / 2 / MICROSECDONDS_PER_CM;
cb(distance)
// process.exit(0)
}
});
};
watchHCSR04();
function trigHCSR04 (callback) {
cb = callback
trigger.trigger(10, 1)
}
module.exports = trigHCSR04;
我们来看看效果:
https://gitee.com/xybin1990/connect-raspi-web/blob/master/public/results.gif
爱智中的 JSRE 已经集成了多种通讯协议,这为我们开发带来了很多的便捷,也为我们的创意带来了更多的可能性。再搭配上各种传感器设备,发挥无边无际的想象力吧。