5. 远程调用GPIO

在一些应用中,常常会用到要以远程的形式调用虚谷号的GPIO服务,如智能家居的应用。

在虚谷号实现GPIO的方式很多,最简单的方式用让虚谷号运行WebGPIO服务,这是用Python程序写的应用。

5.1. WebGPIO简介

WebGPIO是基于Flask、xugu库开发的虚谷号专用框架,是为了方便用户让虚谷号与手机互动(App inventor)而开发。想法由谢作如提出,李琦完成初稿,yyp和谢作如在其基础上完善,夏正仁、林淼焱、郑祥等参与了测试。

WebGPIO采用WebAPI的形式,获取和控制虚谷号板载Arduino芯片的引脚电平状态,用method的方式来判断是获取信息还是控制信号,参数非常简洁。

WebGPIO的默认端口为1024,当前版本为1.2。

软件下载地址:https://github.com/vvlink/vvBoard-app/tree/master/webgpio

5.2. WebGPIO的部署

1)普通启动:运行webgpio.py文件即可;

2)开机启动:只要将webgpio.py文件,复制到vvBoard目录的Python目录下,重命名为main.py,开机即可启动。

5.3. WebGPIO使用说明

WebAPI地址:

http://[虚谷号ip]:1024/

:下面假设虚谷号的IP地址为:192.168.1.101

获取引脚状态

功能:读取引脚值

method方式:GET

参数示例:

{
        pin:"D1"
}

:Arduino的引脚范围为:D2–D13,A0–A5,不分大小写。

url范例:http://192.168.1.101:1024/?pin=D2

信息返回:当pin为D2–D13时,读取数字引脚的数字值,0为低电平,1为高电平。

{
        "pin":"D2",
        "error_code":0,
        "msg":1
}

当pin为A0–A5时,读取模拟引脚的模拟值,0-255之间。

{
        "pin":"A0",
        "error_code":0,
        "msg":255
}

当pin不为D0–D13,A0–A5时,返回错误代码。

{
        "pin":"A7",
        "error_code":1,
        "msg":"error,invalid Pin"
}

控制引脚电平

功能:设置引脚电平状态。

method方式: POST

参数示例:

{
        pin:"D2"
        value:255
        type:"digital"
}

(1)Arduino的引脚范围为:D2–D13,A0–A5,不分大小写。

(2)type分为digital、analog和servo三种:

  • 当type为digital时,设置引脚的电平值为value的值,0表示LOW,非0表示HIGH;

  • 当type为analog时,设置引脚的PWM值为value的值,即0-255之间;

  • 当type为servo时,设置引脚上舵机的转动角度为value的值,即0-180之间。

(3)Digital、Analog、Servo等词语不分大小写,也可以用“1、2、3”等数字来代替。

返回参数:

{
        "pin":"D2",
        "error_code":0,
        "msg":"success,set [pin] to [value] with [types] mode"
}

当pin不在D0–D13,A0–A5之间时:

{
        "pin":"D2",
        "error_code":1
        "msg":"error,invalid Pin"
}

当value不能转换整数时:

{
        "pin":"D2",
        "error_code":1,
        "msg":"error,Value is wrong"
}

当type不正确时:

{
        "pin":"D2",
        "error_code":1,
        "msg":"error,Type is wrong"
}

获取帮助

访问“/help/”目录,将呈现Web页面的控制端。

http://[虚谷号ip]:1024/help/

../_images/4.5-webgpio-1.png

5.4. WebGPIO的编程范例

只要能访问Web服务,都可以通过WebGPIO形式控制虚谷号。这样就涵盖了几乎所有的编程软件,以及Word、PowerPoint之类的办公软件。同样,只要能联网的智能硬件,如掌控板、树莓派,都可以作为虚谷号的控制终端。

Python代码

(1)调用POST方法,对虚谷号的引脚进行控制。

在该案例中可以修改的参数有:
  • url:设置成虚谷号的IP地址

  • pin:对应的引脚 A0-A5,D0-D13

  • value:对应的数值

  • type:控制的类型可以是1,2,3,分别代表“digital”、“analog”、“servo”

当设置D13号引脚的电平为1,该引脚对应的LED就会亮起。

import requests
vvboardip='192.168.3.42'
pin='D13'
value=1
t=1
payload = {"pin":pin,'value':value,'type':t}
re = requests.post(url='http://'+ vvboardip +':1024/',params=payload)
if (re.status_code==200):
    r=re.json()
    print('成功发送控制命令:'+ r["msg"])
    print('返回的信息为:')
    print(re.text)

官方文档中提供了源码。

(2)调用GET方法,读取A0号引脚的电平。

在该案例中可以修改的参数有:
  • url:设置成虚谷号的IP地址

  • pin:对应的引脚 A0-A5,D0-D13

注意:该方法需要外接传感器,否则数字口默认返回为低电平,模拟口返回随机数。

import requests
vvboardip='192.168.3.42'
pin='A0'
payload = {"pin":pin}
re = requests.get(url='http://'+ vvboardip +':1024/',params=payload)
if (re.status_code==200):
        r=re.json()
        print('成功获取引脚'+ r["pin"] + '的状态:'+ r["msg"])
        print('返回的原始信息为:')
        print(re.text)

App invenor代码

官方文档中提供了源码。

源代码下载:https://github.com/vvlink/vvBoard-app/tree/master/webgpio

掌控板代码范例

可以用掌控板作为终端(任何可以上网的),通过WebGPIO来和虚谷号互动。下面的代码采用mpython编写。

from mpython import *
import time
import urequests
import json
import network

def on_button_a_down(_):
    global v
    time.sleep_ms(10)
    if button_a.value() == 1: return
    _response = urequests.post('http://192.168.3.42:1024', headers={"Content-Type":"application/json"}, data=json.dumps({"pin":'D13', "value":str(v), "type":'1'}))
    v = 1 - v
    oled.fill_rect(0, 16, 128, 16, 0)
    oled.DispChar(_response.json().get('msg'), 0, 16, 1)
    oled.show()

def on_button_b_down(_):
    time.sleep_ms(10)
    if button_b.value() == 1: return
    _response = urequests.get('http://192.168.3.42:1024', headers={"Content-Type":"application/json"}, data=json.dumps({"pin":'A0'}))
    oled.fill_rect(0, 48, 128, 16, 0)
    oled.DispChar(('A0的值为:' + str(_response.json().get('msg'))), 0, 48, 1)
    oled.show()

v = 1
my_wifi = wifi()
my_wifi.connectWiFi('jf', '12345678')
button_a.irq(trigger=Pin.IRQ_FALLING, handler=on_button_a_down)
button_b.irq(trigger=Pin.IRQ_FALLING, handler=on_button_b_down)
oled.DispChar('按A键控制虚谷号13口', 0, 0, 1)
oled.show()

图形化代码如图所示。

../_images/4.5-webgpio-2.png

具体效果如图所示。按下“A”键,可以切换13号LED的开关状态;按下“B”键,读取“A0”口的数值。

../_images/4.5-webgpio-3.jpg