扫二维码,用手机遥控小车

Posted by 小一在此 on January 5, 2017

demo说明

视频中用手机扫二维码然后进行控制。共演示了如下的功能:

  • 在PythonPi平台上在线运行一段Python程序,设置控制功能并生成一个二维码

  • 扫二维码打开一个web应用

  • 手指触摸遥控板遥控小车行进(由一个树莓派控制)

  • 开关另一个树莓派连接的LED灯(演示多个树莓派的组网与互操作能力)

  • 滑动滑块对nodeMCU单片机连接的强光LED调节其亮度(演示物联网控制能力)

演示环境拓扑图:

演示环境

对比下微信小程序

实现这个功能也是受了微信小程序的启发:以后可能就不再需要开关面板什么的了,在需要的地方贴一张二维码,手机扫一下,什么就都可以控制了。

根据开发这个功能的经验,尝试分析下微信小程序的优缺点:

  • 我实现的webApp是手机直接访问控制系统,微信小程序则是手机->微信服务器(内部还得有几跳)->服务方的小程序服务器->现场的接口服务器->控制系统,圈子兜的有点大

  • 微信小程序由于通路都是在互联网上,因此所有连接都是TLS(运输层加密)的,整体开销和网络时延会非常大,而且制约因素太多,尤其还存在第三方服务器的性能问题,估计用做现场控制会由于时延太长,用户体验不会很好。反正这个小车无论如何都控制不了

  • 但是微信小程序由于微信的加持,能提供非常多的辅助能力,如个体识别,以后也不需要什么门禁卡了,门口贴张二维码扫一下门就开了。如果微信能给小程序提供保持服务,那连手机都不用掏出来,走过去门就开了,前面那个被拒之门外怎么都找不到开门机关的就只能大呼“苍天啊、大地啊,实在没人性啊”

  • webApp和微信小程序都是基于web的,而web是无状态的、非连接的,这样就只能是用户主动访问才能进行交互,控制系统如果需要通知用户实时状态变化,就需要定时频繁刷新,以微信小程序的联通模式,开销不是一点两点大。但微信本身就是通讯工具,可以开放微信后台接口来提供实时状态更新的通知,但这又存在滥用的风险,估计微信很难开放

总的来说,webApp和微信小程序这样的东东对现在的控制系统会有很大的冲击:未来的手机会根据日程安排、用户习惯等和沿途及目的地的各种智能体系统主动的进行沟通,磋商个性化的控制策略,真正的走到哪都是为你量身定制。我们可以畅想下,比如从工作系统中收到一个到苏州出差的工作安排:

  • 手机(还叫手机吗?)就会根据各种条件来规划行程安排,和12306机器人磋商车次、席位,和租车公司机器人约接送车辆,和工作地点附近的宾馆机器人约房间

  • 到了宾馆,从大门到房间的行走引导将你直接引入房间而无需再办理checkin,并开放沿途的安防、电梯、门禁

  • 房间内的空调、灯光、水温等都已切到你最舒适的设定

  • 第二天准点morning call,吃完专为你定制的早餐,拎包出门即走,出门后自动结算、安防、电梯、门禁自动取消你的通过权限

这些东西已经被我们畅想了无数遍,现在随着微信小程序的发布真的就要来了。但未来走向还要看手机操作系统和微信之间pk的结果,谁能控制以手机为承载前端的个性化智能控制的平台,谁就是智能时代的王者。

功能实现

1、生成web应用界面。下面这段Python代码定义了名为RemoteControlCar的web应用界面,包含了一个遥控面板、一个树莓派摄像头输出、一个开灯按钮、一个关灯按钮和一个调光滑块:

w=webApp.get("RemoteControlCar")
#在webApp中添加遥控面板
w.addHelm("myCar","remote control car")
#在webApp中添加树莓派摄像头输出(由于我又拍又要操作,手机屏幕又小,所以demo中去掉了摄像头的视频输出)
w.addVideo("myVideo","pi1")
#在webApp中添加关灯按钮
w.addButton("myLed","close led",1)
#在webApp中添加开灯按钮
w.addButton("myLed","open led",0)
#在webApp中添加pwm调光滑动块
w.addSlider("myPWM","PWM control",10)
#设置该应用为默认应用
w.setDefaultApp("RemoteControlCar")

2、运行这段代码后,系统如果发现定义了默认的web应用,会将这个默认的web应用的所有控件的描述做成二维码显示到页面上

3、扫描这个二维码就会打开web应用的执行界面,根据这些控件的描述动态生成web应用界面

4、用户操作这些控件,会通过PythonPi平台的REST接口发送相应的数据(如滑块是发送当前滑动到的位置,遥控面板是发送鼠标或手指相对面板中心点的方向角和距离)

5、PythonPi平台将接收到的数据作为一个webInput输入源在整个系统中广播,相应的控制逻辑处理部件在接收到输入数据后进行相应的操作

附:demo的Python代码

from cn.ijingxi.corpuscle.python import car
from cn.ijingxi.corpuscle.python import active
from cn.ijingxi.corpuscle.python import input
from cn.ijingxi.corpuscle.python import condition
from cn.ijingxi.corpuscle.python import webApp

#左车轮的控制动作
leftEN=active.getPWM("/pi1/15")
leftIn1_high=active.getGPIO("/pi1/16",active.HIGH)
leftIn1_low=active.getGPIO("/pi1/16",active.LOW)
leftIn2_high=active.getGPIO("/pi1/1",active.HIGH)
leftIn2_low=active.getGPIO("/pi1/1",active.LOW)
#右车轮的控制动作
rightEN=active.getPWM("/pi1/8")
rightIn1_high=active.getGPIO("/pi1/9",active.HIGH)
rightIn1_low=active.getGPIO("/pi1/9",active.LOW)
rightIn2_high=active.getGPIO("/pi1/7",active.HIGH)
rightIn2_low=active.getGPIO("/pi1/7",active.LOW)

#小车的控制信号
#启停
iswitch=input.getWebInput("/RemoteControlCar/myCar")
#方向角
iradian=input.getWebInput("/RemoteControlCar/myCar_radian")
#速度
ipower=input.getWebInput("/RemoteControlCar/myCar_power")

#2号树莓派的led控制
iled=input.getWebInput("/RemoteControlCar/myLed")
aopen=active.getGPIO("/pi2/15",active.HIGH)
aclose=active.getGPIO("/pi2/15",active.LOW)

#1号树莓派下连的nodeMCU单片机PWM控制
ipwm=input.getWebInput("/RemoteControlCar/myPWM")
apwm=active.getNodeMCU_pwm("/pi2/nodeMCU_nodeMCU1/1")

#小车的定义
c=car("myCar")
#左车轮的控制
c.addLeftWheel(leftIn1_high,leftIn1_low,leftIn2_high,leftIn2_low,leftEN)
#右车轮的控制
c.addRightWheel(rightIn1_high,rightIn1_low,rightIn2_high,rightIn2_low,rightEN)
#启停、方向角、速度的控制
c.addInputSignal(iswitch,iradian,ipower)

#输入识别条件
c0=condition.getCompare(condition.Equal,0)
c1=condition.getCompare(condition.Equal,1)
cg=condition.getCompare(condition.GreateEqual,0)

#定义状态机
c.addTrans("closed","open","opened","开灯",aopen)
c.addTrans("opened","close","closed","开灯",aclose)
c.setInitState("closed")
#开灯
c.addInput(iled,c0,"open")
#关灯
c.addInput(iled,c1,"close")
#pwm调光
c.addProduction(ipwm,cg,apwm)

#定义一个webApp
w=webApp.get("RemoteControlCar")
#在webApp中添加遥控面板
w.addHelm("myCar","remote control car")
#在webApp中添加树莓派摄像头输出
w.addVideo("myVideo","pi1")
#在webApp中添加关灯按钮
w.addButton("myLed","close led",1)
#在webApp中添加开灯按钮
w.addButton("myLed","open led",0)
#在webApp中添加pwm调光滑动块
w.addSlider("myPWM","PWM control",10)
#设置该应用为默认应用
w.setDefaultApp("RemoteControlCar")

====================================================================================================

关注我的公众号及时获取推送的最新文章

公众号