赞
踩
常见的无线遥控小车和飞机操作范围都是在几十米, 远的几百米, 再远的几公里, 传输距离大受限制。如果能够利用4g/5g信号连上互联网来接收指令, 这样只要有信号的地方, 就可以不限距离的操作。在未来也是一个颇有发展空间的领域。
本案例只是简单对小车进行遥控,没有安装摄像头(暂不支持摄像头)。
本案例需要的硬件
器材 | 数量 |
---|---|
HaaS506开发板 | 1 |
L298N电机驱动板模块 | 2 |
电动智能小车底座 | 1套 |
5V移动电源 | 1 |
SIM卡 | 1 |
杜邦线 | 若干 |
1、连接阿里云平台。
2、设置小车状态位,根据状态位改变小车的运动模式。
3、IoT Studio 移动应用下发状态,改变小车运动状态。
第一次使用物联网平台的读者,需要开通实例后使用物联网平台功能。也可以使用免费的公共实例进行开发,在阿里云物联网平台中,左上角选择‘华东2-上海’,点击‘公共实例’,即可开通。
1、平台产品创建可参考haas506 2.0开发教程-aliyunIoT
2、创建产品属性(添加物模型)
选择产品功能定义–编辑草稿
添加自定义功能
添加标识符与数据类型(标识符要与代码一致)
点击发布上线
点击确定
# 获取设备的IMEI 作为deviceName 进行动态注册
deviceName = modem.info.getDevImei()
...
# coding=utf-8 import network import ujson import utime as time import modem from aliyunIoT import Device import kv from driver import GPIO #当iot设备连接到物联网平台的时候触发'connect' 事件 def on_connect(data): global module_name,default_ver,productKey,deviceName,deviceSecret,on_trigger,on_download,on_verify,on_upgrade print('***** connect lp succeed****') data_handle = {} data_handle['device_handle'] = device.getDeviceHandle() #当连接断开时,触发'disconnect'事件 def on_disconnect(): print('linkkit is disconnected') #当iot云端下发属性设置时,触发'props'事件 def on_props(request): global state params=request['params'] state_data=eval(params) if 'state' in state_data : state = state_data['state'] #当iot云端调用设备service时,触发'service'事件 def on_service(id,request): print('clound req id is {} , req is {}'.format(id,request)) #当设备跟iot平台通信过程中遇到错误时,触发'error'事件 def on_error(err): print('err msg is {} '.format(err)) #网络连接的回调函数 def on_4g_cb(args): global g_connect_status pdp = args[0] netwk_sta = args[1] if netwk_sta == 1: g_connect_status = True else: g_connect_status = False #网络连接 def connect_network(): global net,on_4g_cb,g_connect_status #NetWorkClient该类是一个单例类,实现网络管理相关的功能,包括初始化,联网,状态信息等. net = network.NetWorkClient() g_register_network = False if net._stagecode is not None and net._stagecode == 3 and net._subcode == 1: g_register_network = True else: g_register_network = False if g_register_network: #注册网络连接的回调函数on(self,id,func); 1代表连接,func 回调函数 ;return 0 成功 net.on(1,on_4g_cb) net.connect(None) else: print('网络注册失败') while True: if g_connect_status: print('网络连接成功') break time.sleep_ms(20) #动态注册回调函数 def on_dynreg_cb(data): global deviceSecret,device_dyn_resigter_succed deviceSecret = data device_dyn_resigter_succed = True # 连接物联网平台 def dyn_register_device(productKey,productSecret,deviceName): global on_dynreg_cb,device,deviceSecret,device_dyn_resigter_succed key = '_amp_customer_devicesecret' deviceSecretdict = kv.get(key) print("deviceSecretdict:",deviceSecretdict) if isinstance(deviceSecretdict,str): deviceSecret = deviceSecretdict if deviceSecretdict is None or deviceSecret is None: key_info = { 'productKey': productKey , 'productSecret': productSecret , 'deviceName': deviceName } # 动态注册一个设备,获取设备的deviceSecret #下面的if防止多次注册,当前若是注册过一次了,重启设备再次注册就会卡住, if not device_dyn_resigter_succed: device.register(key_info,on_dynreg_cb) state_data = {} def upload_state(): global state_data,state state_data["state"]= state state_data_str=ujson.dumps(state_data) data={ 'params':state_data_str } device.postProps(data) def left_n(n): if n == 0: left_neg0.write(0) left_neg1.write(0) if n == 1: left_neg0.write(1) left_neg1.write(0) if n == -1: left_neg0.write(0) left_neg1.write(1) def right_n(n): if n == 0: right_neg0.write(0) right_neg1.write(0) if n == 1: right_neg0.write(1) right_neg1.write(0) if n == -1: right_neg0.write(0) right_neg1.write(1) def left_p(p): if p == 0: left_pos0.write(0) left_pos1.write(0) if p == 1: left_pos0.write(1) left_pos1.write(0) if p == -1: left_pos0.write(0) left_pos1.write(1) def right_p(p): if p == 0: right_pos0.write(0) right_pos1.write(0) if p == 1: right_pos0.write(1) right_pos1.write(0) if p == -1: right_pos0.write(0) right_pos1.write(1) if __name__ == '__main__': ret = modem.sim.getStatus() print('ret:',ret) ICCID=None g_connect_status = False net = None device = None deviceSecret = None deviceName = None productKey = "your productKey " productSecret = "your productSecret " device_dyn_resigter_succed = False # 连接网络 connect_network() # 获取设备的IMEI 作为deviceName 进行动态注册 deviceName = modem.getDevImei() #获取设备的ICCID ICCID=modem.sim.getIccid() #初始化物联网平台Device类,获取device实例 device = Device() if deviceName is not None and len(deviceName) > 0 : #动态注册一个设备 dyn_register_device(productKey,productSecret,deviceName) else: print("获取设备IMEI失败,无法进行动态注册") while deviceSecret is None: time.sleep(0.2) print('动态注册成功:' + deviceSecret) key_info = { 'region' : 'cn-shanghai' , 'productKey': productKey , 'deviceName': deviceName , 'deviceSecret': deviceSecret , 'keepaliveSec': 60, } #打印设备信息 print(key_info) #device.ON_CONNECT 是事件,on_connect是事件处理函数/回调函数 device.on(device.ON_CONNECT,on_connect) device.on(device.ON_DISCONNECT,on_disconnect) device.on(device.ON_PROPS,on_props) device.on(device.ON_SERVICE,on_service) device.on(device.ON_ERROR,on_error) device.connect(key_info) time.sleep(2) state = 0 upload_state() #主程序 #实例化电机引脚 left_neg0=GPIO() left_neg0.open('left_n0') left_neg1=GPIO() left_neg1.open('left_n1') right_neg0=GPIO() right_neg0.open('right_n0') right_neg1=GPIO() right_neg1.open('right_n1') left_pos0 = GPIO() left_pos0.open('left_p0') left_pos1 = GPIO() left_pos1.open('left_p1') right_pos0 = GPIO() right_pos0.open('right_p0') right_pos1 = GPIO() right_pos1.open('right_p1') left_n(0) right_n(0) left_p(0) right_p(0) while True: if state == 1: #前 left_n(1) right_n(1) left_p(1) right_p(1) elif state == 2: #后 left_n(-1) right_n(-1) left_p(-1) right_p(-1) elif state == 3: #右移 left_n(-1) right_n(1) left_p(1) right_p(-1) elif state == 4: #左移 left_n(1) right_n(-1) left_p(-1) right_p(1) elif state == 5: #右转 left_n(1) right_n(-1) left_p(1) right_p(-1) elif state == 6: #左转 left_n(-1) right_n(1) left_p(-1) right_p(1) else : #停止 left_n(0) right_n(0) left_p(0) right_p(0) time.sleep_ms(50)
{ "version": "2.0.0", "io": { "left_n0": { "type": "GPIO", "port": 15, "dir": "output", "pull": "pullup" }, "left_n1": { "type": "GPIO", "port": 16, "dir": "output", "pull": "pullup" }, "right_n0": { "type": "GPIO", "port": 18, "dir": "output", "pull": "pullup" }, "right_n1": { "type": "GPIO", "port": 17, "dir": "output", "pull": "pullup" }, "left_p0": { "type": "GPIO", "port": 32, "dir": "output", "pull": "pullup" }, "left_p1": { "type": "GPIO", "port": 24, "dir": "output", "pull": "pullup" }, "right_p0": { "type": "GPIO", "port": 19, "dir": "output", "pull": "pullup" }, "right_p1": { "type": "GPIO", "port": 20, "dir": "output", "pull": "pullup" } }, "debugLevel": "ERROR", "repl": "enable", "replPort": 0 }
1、设备上线时,上传小车停止状态。
以下是物联网应用开发流程,接下来按以下流程介绍移动端应用的开发。
改页面名称
点击上图红框中的‘组件’,就可以看到可用的组件列表。各组件的使用说明请参考组件说明
将横向分栏 按钮组件从上到下拖到中间画布区
根据自己喜好排布按钮位置,调整上边距,按钮内容、字号等属性。
其他略
在页面‘’保存‘’并点击‘预览’进行预览。
手机扫描二维码,可以用手机遥控小车。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。