综合案例-云端控制舵机转动角度

  • 1、SG90 MG90S 9g舵机
  • 2、舵机角度控制
  • (1)引脚配置
  • (2)PWM脉宽调制
  • 3、阿里云端设置
  • (1)添加物模型
  • (2)烧录程序
  • (3)在线调试


1、SG90 MG90S 9g舵机

舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统,比如人形机器人的手臂和腿,车模和航模的方向控制。舵机的控制信号实际上是一个脉冲宽度调制信号( PWM信号),该信号可由FP-GA器件、模拟电路或单片机产生。

5.4 综合案例-云端控制舵机转动角度(仅支持2.2以上版本)_嵌入式硬件


信号线(黄线)红线(电源线)棕色(地线)

5.4 综合案例-云端控制舵机转动角度(仅支持2.2以上版本)_嵌入式硬件_02


舵机的控制一般需要一个20ms左右的时基脉冲(周期),该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms(高电平时长)。连接上示波器情况如图

5.4 综合案例-云端控制舵机转动角度(仅支持2.2以上版本)_物联网_03


改变高电平时长可以控制舵机转到相应角度,以180度角度伺服为例,那么对应的控制关系是这样的:

高电平时长

舵机角度位置

0.5ms

0度

1.0ms

45度

1.5ms

90度

2.5ms

180度

5.4 综合案例-云端控制舵机转动角度(仅支持2.2以上版本)_舵机_04

2、舵机角度控制

案例说明:

  • 阿里云端输入角度,控制舵机旋转至对应位置。
  • 注意:本案例使用GPIO3控制舵机,且只支持Haas2.0版本系统。
  • 需要准备Haas506开发板,SIM卡,9g舵机,各种连接线。

(1)引脚配置

  • Haas2.0有两个WPM引脚GPIO3,GPIO39(1.0版本程序没有相关功能),两个引脚适用频率范围不同

GPIO3

GPIO39

0~99hz

100~10khz

  • 案例使用GPIO3 。 在board.josn配置设备节点,即GPIO3为"pwm_lpg"。

board.json

{
  "name": "haas506",
 "version": "2.0.0",
 "io": {
   "pwm_lpg": {
     "type": "PWM",
     "port": 3
     },
   "serial1":{
     "type":"UART",
     "port":0,
     "dataWidth":8,
     "baudRate":115200,
     "stopBits":1,
     "flowControl":"disable",
     "parity":"none"
   },
   "serial2":{
     "type":"UART",
     "port":1,
     "dataWidth":8,
     "baudRate":115200,
     "stopBits":1,
     "flowControl":"disable",
     "parity":"none"
   },
   "serial3":{
     "type":"UART",
     "port":2,
     "dataWidth":8,
     "baudRate":115200,
     "stopBits":1,
     "flowControl":"disable",
     "parity":"none"
   }
 },
 "debugLevel": "DEBUG",
 "repl":"disable",
 "replPort":0
 }

(2)PWM脉宽调制

  • 舵机的控制需要一个20ms左右的时基脉冲(周期),脉冲频率为50Hz。
    该脉冲的高电平部分范围一般为0.5ms-2.5ms。占空比2.5~12.5%。
    设置好需要的频率与占空比就可以了控制舵机转动。
  • 2.2版本获取IMEI号接口有更新,需要更改以下内容(Ctrl+F 查找modem)
# 获取设备的IMEI 作为deviceName 进行动态注册
deviceName = modem.info.getDevImei()
...

main.py

# -*- coding: UTF-8 -*-
import network
import ujson
import utime as time
import modem
from  aliyunIoT import Device
import ota
import kv
import sntp
from driver import GPIO
from driver import UART
from driver import PWM


def start_pwm_lpg(i):
    param2 = {'freq':50, 'duty': int(i/18+2.5) }
    pwm_lpg.setOption(param2)


#当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 servo_data
    print('clound req data is {}'.format(request))
    params=request['params']
    params=eval(params)
    servo=params["servo"]
    start_pwm_lpg(servo)
    ret = pwm_lpg.getOption()
    print("pwm_lpg.getOption={}".format(ret))
    servo_data={}
    servo_data["servo"]= servo
    servo_data_str=ujson.dumps(servo_data)
    data={
        'params':servo_data_str
        }  
    time.sleep(1)      
    device.postProps(data)




#当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)  


if __name__ == '__main__':
    ICCID=None
    g_connect_status = False
    net = None
    device = None
    deviceSecret = None
    deviceName = None
    productKey = "a1aNr1wef2c"
    productSecret = "M8HmBEz59W6YgSL2"
    device_dyn_resigter_succed = False
    # 定义需要升级的模块和版本号
    module_name = 'default'
    default_ver = '1.0.0'
    
# 定义升级包的下载和安装路径,其中url,hash_type和hash 会通过服务端推送被保存下来

    info = {
        'url': '',
        'store_path': '/data/pyamp/app.zip',
        'install_path': '/data/pyamp/',
        'length': 0,
        'hash_type': '',
        'hash': ''
    }

    # 连接网络
    connect_network()
    #sntp 校时

    sntp.settime()
    # 获取设备的IMEI 作为deviceName 进行动态注册
    #2.2版本改为
    #deviceName = modem.info.getDevImei()
    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)


    pwm_lpg = PWM()
    pwm_lpg.open("pwm_lpg")
    servo=0
    start_pwm_lpg(servo)
    ret = pwm_lpg.getOption()
    print("pwm_lpg.getOption={}".format(ret))    
    servo_data={}
    servo_data["servo"]= servo
    servo_data_str=ujson.dumps(servo_data)
    data={
        'params':servo_data_str
        }  
    time.sleep(1)      
    device.postProps(data)

3、阿里云端设置

(1)添加物模型

(1)在阿里云物联网平台创建产品

填写产品名称、选择自定义品类,选择直连设备,选择联网方式-蜂窝,数据格式-ICA,点击确认。

5.4 综合案例-云端控制舵机转动角度(仅支持2.2以上版本)_物联网_05


创建完成后,打开动态注册

5.4 综合案例-云端控制舵机转动角度(仅支持2.2以上版本)_物联网_06

(2)编辑自定义功能

点击所建立的产品:选择查看、点击功能定义和选择编辑草稿

5.4 综合案例-云端控制舵机转动角度(仅支持2.2以上版本)_python_07


添加自定义功能:属性、功能名称、标识符、数据类型、布尔值、读写类型

(数据使用的是0~180°,代码中对数据进行了相应的转化)

5.4 综合案例-云端控制舵机转动角度(仅支持2.2以上版本)_python_08


发布上线

5.4 综合案例-云端控制舵机转动角度(仅支持2.2以上版本)_舵机_09


(3)添加设备

在产品下,添加一个设备:选择产品名、填写DeviceName(自定义,最好将设备的IMEI作为该名称)

5.4 综合案例-云端控制舵机转动角度(仅支持2.2以上版本)_python_10

(4)获取ProductSecret,ProductKey填入程序位置(第254行)

5.4 综合案例-云端控制舵机转动角度(仅支持2.2以上版本)_物联网_11

(2)烧录程序

打开串口工具,查看程序运行是否成功

日志输出

amp shakehand begin...
                      POWERONREASON:0x000b,parse:,powerkey,pinReset,charge.
[1648195564.467]<D>platform_os head thstorage 0x0

[1648195564.467]<D>mpthreadport mutex init in
                                             [1648195564.467]<D>mpthreadport main thread id 0x80d38cc8 mutex 0x80dd55a8.

[1648195564.467]<D>mpthreadport mutex init in
                                             [1648195564.468]<D>mpthreadport mutex init in
                                                                                          [1648195564.515]<D>modCheckNet entern:checknet_make_new;

[1648195564.516]<D>modCheckNet 1:xxxx

[1648195564.516]<D>modCheckNet 2:v1.0

[1648195564.516]<D>modCheckNet enter  obj_wait_network_connected; n_args = 2;

[1648195569.723]<D>modDataCall enter  obj_setcb; n_args = 1;

[1648195569.724]<D>modDataCall enter  obj_setcb; n_args = 1;

[1648195569.724]<D>modDataCall enter  obj_start; n_args = 6;

[1648195569.724]<D>platform_os create thread id 0x80e568c0 0x80e568c0.

[1648195569.724]<D>dataCall thread enter!

[1648195569.732]<I>dataCall get sim card statuts ok! => 0

[1648195570.224]<I>dataCall get gsm status ok! => 1

[1648195570.724]<I>dataCall get gprs status ok! => 1

[1648195571.224]<I>dataCall get signal quality ok! => 16

[1648195572.352]<D>modDataCall PDP: Active

[1648195572.352]<D>platform_os create thread id 0x80e599c8 0x80e599c8.

网络连接成功
[1648195572.364]<D>MOD_SNTP mp_sntp_settime, 81, timezone=8, server=ntp.ntsc.ac.cn

[1648195572.364]<D>MOD_SNTP sntp getting time.

[1648195572.364]<D>MOD_SNTP sntp config servadd start.

[1648195572.441]<I>MOD_SNTP set sntp server:cn.pool.ntp.org successfully

[1648195572.493]<I>MOD_SNTP set sntp server:0.cn.pool.ntp.org successfully

[1648195572.552]<I>MOD_SNTP set sntp server:1.cn.pool.ntp.org successfully

[1648195572.552]<I>MOD_SNTP sntp config servadd end.

[1648195572.860]<D>platform_os settime ms 1648195572894.

[1648195572.861]<D>platform_time setsystime:2022-03-25 08:06:12

[1648195572.005]<I>MOD_SNTP [sntp] OK: sec -2131713406 usec 1648195572

[1648195572.007]<D>DRIVER_KV entern  obj_get; n_args = 1;

[1648195572.008]<D>DRIVER_KV obj_get:key = _amp_customer_devicesecret;value = cb03e76b197d401f1a6e36ce6e195bef;

[1648195572.008]<D>DRIVER_KV obj_get:out

deviceSecretdict: cb03e76b197d401f1a6e36ce6e195bef
动态注册成功:cb03e76b197d401f1a6e36ce6e195bef
{'deviceName': '867082058707860', 'deviceSecret': 'cb03e76b197d401f1a6e36ce6e195bef', 'region': 'cn-shanghai', 'productKey': 'a1aNr1wef2c', 'keepaliveSec': 60}
[1648195572.010]<I>AIOT_DEVICE productKey=a1aNr1wef2c deviceName=867082058707860 deviceSecret=cb03e76b197d401f1a6e36ce6e195bef keepaliveSec=60

[1648195572.017]<D>platform_os create thread id 0x80e5c550 0x80e5c550.

[1648195572.017]<D>BOARD_MGR board config haas been loaded

[1648195572.018]<E>DRIVER_PWM pwm_device->port =135;

mod_info:DRIVER_PWM,log_info:pwm_device->port =135;
,level:3
buzzer.getOption={'period_count': 2045, 'prescaler': 244, 'duty': 51}
[1648195572.023]<D>AIOT_DEVICE start mqtt connect task

[1648195572.000][LK-0313] MQTT user calls aiot_mqtt_connect api, connect
[1648195572.000][LK-0317] 867082058707860&a1aNr1wef2c
[1648195572.000][LK-0318] 5756369B47F9C73F5F3F13DF4021B9348B2C027789D7BFC3CE835E1B76BDF364
[1648195572.051]<I>linksdk_aiot_port Connecting to addr a1aNr1wef2c.iot-as-mqtt.cn-shanghai.aliyuncs.com...

[1648195572.051]<I>linksdk_aiot_port Connecting to port 443,line 522...

[1648195572.153]<I>linksdk_aiot_port mbedtls_ssl_setup 0x80e5d1b8, 0x80e5d1b8

[1648195572.363]<I>dataCall get gprs status ok! => 1

[1648195572.496]<I>linksdk_aiot_port HAL_SSL_Establish, res: -0x0000

[1648195572.555][LK-0313] MQTT connect success in 557 ms
[1648195572.583]<D>AIOT_MQTT AIOT_MQTTEVT_CONNECT

[1648195572.583]<D>AIOT_DEVICE aiot_mqtt_message_cb IS CALLED

[1648195572.583]<D>AIOT_DEVICE message->option is 23

[1648195572.584]<D>AIOT_DEVICE message->event.type is 0

[1648195572.584]<D>platform_os create thread id 0x80e6f710 0x80e6f710.

[1648195572.584]<D>AIOT_MQTT app mqtt process start

[1648195572.584]<D>platform_os create thread id 0x80e7d250 0x80e7d250.

[1648195572.585]<D>AIOT_MQTT app mqtt rec start

<I>UA uagent_ext_comm_init[63]: [uA]prepare start uagent comm a1aNr1wef2c 867082058707860

<I>UA uagent_ext_comm_init[74]: [uA]Subsrcibe TOPIC /sys/a1aNr1wef2c/867082058707860/_thing/service/invoke

[1648195572.555][LK-0309] sub: /sys/a1aNr1wef2c/867082058707860/_thing/service/invoke
<I>UA uagent_ext_comm_init[80]: [uA]IOT_MQTT_Subscribe(/sys/a1aNr1wef2c/867082058707860/_thing/service/invoke) success

[1648195572.555][LK-0309] sub: /sys/a1aNr1wef2c/867082058707860/_thing/service/post_reply
<I>UA uagent_ext_comm_init[89]: [uA]IOT_MQTT_Subscribe(/sys/a1aNr1wef2c/867082058707860/_thing/service/post_reply) success

[1648195572.555][LK-0309] pub: /sys/a1aNr1wef2c/867082058707860/thing/config/log/get

[LK-030A] > 7B 22 69 64 22 3A 22 31  22 2C 22 76 65 72 73 69 | {"id":"1","versi
[LK-030A] > 6F 6E 22 3A 22 31 2E 30  22 2C 22 70 61 72 61 6D | on":"1.0","param
[LK-030A] > 73 22 3A 7B 22 67 65 74  54 79 70 65 22 3A 22 63 | s":{"getType":"c
[LK-030A] > 6F 6E 74 65 6E 74 22 2C  22 63 6F 6E 66 69 67 53 | ontent","configS
[LK-030A] > 63 6F 70 65 22 3A 22 64  65 76 69 63 65 22 7D 7D | cope":"device"}}

[1648195572.589]<D>PY_TASK ************* py_task_schedule_call START  *******

[1648195572.589]<D>PY_TASK ************* py_task_schedule_call END *******

[1648195572.555][LK-0309] pub: /sys/a1aNr1wef2c/867082058707860/thing/deviceinfo/update

[LK-030A] > 7B 22 69 64 22 3A 22 32  22 2C 22 76 65 72 73 69 | {"id":"2","versi
[LK-030A] > 6F 6E 22 3A 22 31 2E 30  22 2C 22 70 61 72 61 6D | on":"1.0","param
[LK-030A] > 73 22 3A 5B 7B 22 61 74  74 72 4B 65 79 22 3A 22 | s":[{"attrKey":"
[LK-030A] > 53 59 53 5F 53 44 4B 5F  4C 41 4E 47 55 41 47 45 | SYS_SDK_LANGUAGE
[LK-030A] > 22 2C 22 61 74 74 72 56  61 6C 75 65 22 3A 22 43 | ","attrValue":"C
[LK-030A] > 22 2C 22 64 6F 6D 61 69  6E 22 3A 22 53 59 53 54 | ","domain":"SYST
[LK-030A] > 45 4D 22 7D 7B 22 61 74  74 72 4B 65 79 22 3A 22 | EM"}{"attrKey":"
[LK-030A] > 53 59 53 5F 4C 50 5F 53  44 4B 5F 56 45 52 53 49 | SYS_LP_SDK_VERSI
[LK-030A] > 4F 4E 22 2C 22 61 74 74  72 56 61 6C 75 65 22 3A | ON","attrValue":
[LK-030A] > 22 61 6F 73 2D 72 2D 33  2E 30 2E 30 22 2C 22 64 | "aos-r-3.0.0","d
[LK-030A] > 6F 6D 61 69 6E 22 3A 22  53 59 53 54 45 4D 22 7D | omain":"SYSTEM"}
[LK-030A] > 7B 22 61 74 74 72 4B 65  79 22 3A 22 53 59 53 5F | {"attrKey":"SYS_
[LK-030A] > 50 41 52 54 4E 45 52 5F  49 44 22 2C 22 61 74 74 | PARTNER_ID","att
[LK-030A] > 72 56 61 6C 75 65 22 3A  22 45 6E 67 69 6E 65 6C | rValue":"Enginel
[LK-030A] > 66 20 54 65 61 6D 22 2C  22 64 6F 6D 61 69 6E 22 | f Team","domain"
[LK-030A] > 3A 22 53 59 53 54 45 4D  22 7D 7B 22 61 74 74 72 | :"SYSTEM"}{"attr
[LK-030A] > 4B 65 79 22 3A 22 53 59  53 5F 4D 4F 44 55 4C 45 | Key":"SYS_MODULE
[LK-030A] > 5F 49 44 22 2C 22 61 74  74 72 56 61 6C 75 65 22 | _ID","attrValue"
[LK-030A] > 3A 22 68 61 61 73 2D 61  6D 70 2D 73 6F 75 6E 64 | :"haas-amp-sound
[LK-030A] > 62 6F 78 40 4D 36 30 31  2D 52 54 4F 53 22 2C 22 | box@M601-RTOS","
[LK-030A] > 64 6F 6D 61 69 6E 22 3A  22 53 59 53 54 45 4D 22 | domain":"SYSTEM"
[LK-030A] > 7D 5D 7D                                         | }]}

[1648195572.620]<D>AIOT_MQTT recv sub_ack, res: 0x0000, packet id: 1, max qos: 1

[1648195572.666][LK-0309] pub: /sys/a1aNr1wef2c/867082058707860/thing/config/log/get_reply

[LK-030A] < 7B 22 63 6F 64 65 22 3A  32 30 30 2C 22 64 61 74 | {"code":200,"dat
[LK-030A] < 61 22 3A 7B 22 63 6F 6E  74 65 6E 74 22 3A 7B 22 | a":{"content":{"
[LK-030A] < 6D 6F 64 65 22 3A 30 7D  2C 22 67 65 74 54 79 70 | mode":0},"getTyp
[LK-030A] < 65 22 3A 22 63 6F 6E 74  65 6E 74 22 7D 2C 22 69 | e":"content"},"i
[LK-030A] < 64 22 3A 22 31 22 2C 22  6D 65 74 68 6F 64 22 3A | d":"1","method":
[LK-030A] < 22 74 68 69 6E 67 2E 63  6F 6E 66 69 67 2E 6C 6F | "thing.config.lo
[LK-030A] < 67 2E 67 65 74 22 2C 22  76 65 72 73 69 6F 6E 22 | g.get","version"
[LK-030A] < 3A 22 31 2E 30 22 7D                             | :"1.0"}

[1648195572.666][LK-1507] LOGPOST user log config arrived
user log switch state is: 0
toggle it using the switch in device detail page in https://iot.console.aliyun.com
[1648195572.666][LK-0309] pub: /sys/a1aNr1wef2c/867082058707860/thing/deviceinfo/update_reply

[LK-030A] < 7B 22 63 6F 64 65 22 3A  32 30 30 2C 22 64 61 74 | {"code":200,"dat
[LK-030A] < 61 22 3A 7B 7D 2C 22 69  64 22 3A 22 32 22 2C 22 | a":{},"id":"2","
[LK-030A] < 6D 65 73 73 61 67 65 22  3A 22 73 75 63 63 65 73 | message":"succes
[LK-030A] < 73 22 2C 22 6D 65 74 68  6F 64 22 3A 22 74 68 69 | s","method":"thi
[LK-030A] < 6E 67 2E 64 65 76 69 63  65 69 6E 66 6F 2E 75 70 | ng.deviceinfo.up
[LK-030A] < 64 61 74 65 22 2C 22 76  65 72 73 69 6F 6E 22 3A | date","version":
[LK-030A] < 22 31 2E 30 22 7D                                | "1.0"}

[1648195572.711]<D>AIOT_MQTT recv sub_ack, res: 0x0000, packet id: 2, max qos: 1

[1648195572.862]<I>dataCall get signal quality ok! => 16

[1648195573.021]<D>AIOT_DEVICE native_aiot_postProps is called.

[1648195573.022]<D>AIOT_DEVICE PostProps payload is {"servo": 0}

[1648195573.000][LK-0309] pub: /sys/a1aNr1wef2c/867082058707860/thing/event/property/post

[LK-030A] > 7B 22 69 64 22 3A 22 33  22 2C 22 76 65 72 73 69 | {"id":"3","versi
[LK-030A] > 6F 6E 22 3A 22 31 2E 30  22 2C 22 70 61 72 61 6D | on":"1.0","param
[LK-030A] > 73 22 3A 7B 22 73 65 72  76 6F 22 3A 20 30 7D 2C | s":{"servo": 0},
[LK-030A] > 22 73 79 73 22 3A 7B 22  61 63 6B 22 3A 31 7D 7D | "sys":{"ack":1}}

***** connect lp succeed****
[1648195573.026]<I>ota register default status cb

[1648195573.026]<D>ota_trans_mqtt SUB:cb 0x80ef9e49,userdata 0x80f41bb0

[1648195573.000][LK-0309] sub: /ota/device/upgrade/a1aNr1wef2c/867082058707860
[1648195573.027]<I>ota Public topic:/sys/a1aNr1wef2c/867082058707860/thing/deviceinfo/update

[1648195573.028]<I>ota Public msg:{"id":"0","version":"1.0","params":[{"attrKey":"SYS_OTA_ID","attrValue":"HOTA-3.3.0-1-0-0"}],"method":"thing.deviceinfo.update"}

[1648195573.000][LK-0309] pub: /sys/a1aNr1wef2c/867082058707860/thing/deviceinfo/update

[LK-030A] > 7B 22 69 64 22 3A 22 30  22 2C 22 76 65 72 73 69 | {"id":"0","versi
[LK-030A] > 6F 6E 22 3A 22 31 2E 30  22 2C 22 70 61 72 61 6D | on":"1.0","param
[LK-030A] > 73 22 3A 5B 7B 22 61 74  74 72 4B 65 79 22 3A 22 | s":[{"attrKey":"
[LK-030A] > 53 59 53 5F 4F 54 41 5F  49 44 22 2C 22 61 74 74 | SYS_OTA_ID","att
[LK-030A] > 72 56 61 6C 75 65 22 3A  22 48 4F 54 41 2D 33 2E | rValue":"HOTA-3.
[LK-030A] > 33 2E 30 2D 31 2D 30 2D  30 22 7D 5D 2C 22 6D 65 | 3.0-1-0-0"}],"me
[LK-030A] > 74 68 6F 64 22 3A 22 74  68 69 6E 67 2E 64 65 76 | thod":"thing.dev
[LK-030A] > 69 63 65 69 6E 66 6F 2E  75 70 64 61 74 65 22 7D | iceinfo.update"}
[LK-030A] > 00                                               | .

[1648195573.029]<I>ota ota init success, ret:0

[1648195573.029]<D>APP_OTA customer ota init success!

[1648195573.030]<I>ota report submode version

[1648195573.030]<I>ota Public topic:/ota/device/inform/a1aNr1wef2c/867082058707860 msg:{"id":0,"params":{"version":"amp-v2.01","module":"system"}}

[1648195573.000][LK-0309] pub: /ota/device/inform/a1aNr1wef2c/867082058707860

[LK-030A] > 7B 22 69 64 22 3A 30 2C  22 70 61 72 61 6D 73 22 | {"id":0,"params"
[LK-030A] > 3A 7B 22 76 65 72 73 69  6F 6E 22 3A 22 61 6D 70 | :{"version":"amp
[LK-030A] > 2D 76 32 2E 30 31 22 2C  22 6D 6F 64 75 6C 65 22 | -v2.01","module"
[LK-030A] > 3A 22 73 79 73 74 65 6D  22 7D 7D 00             | :"system"}}.

Traceback (most recent call last):
  File "/data/pyamp/main.py", line 144, in on_connect
KeyError: handle
MicroPython v1.13 on 2022-03-01, 14:40:21; haas506 with M601
Type "help()" for more information.
>>> [1648195573.111][LK-0309] pub: /sys/a1aNr1wef2c/867082058707860/thing/event/property/post_reply

[LK-030A] < 7B 22 63 6F 64 65 22 3A  32 30 30 2C 22 64 61 74 | {"code":200,"dat
[LK-030A] < 61 22 3A 7B 7D 2C 22 69  64 22 3A 22 33 22 2C 22 | a":{},"id":"3","
[LK-030A] < 6D 65 73 73 61 67 65 22  3A 22 73 75 63 63 65 73 | message":"succes
[LK-030A] < 73 22 2C 22 6D 65 74 68  6F 64 22 3A 22 74 68 69 | s","method":"thi
[LK-030A] < 6E 67 2E 65 76 65 6E 74  2E 70 72 6F 70 65 72 74 | ng.event.propert
[LK-030A] < 79 2E 70 6F 73 74 22 2C  22 76 65 72 73 69 6F 6E | y.post","version
[LK-030A] < 22 3A 22 31 2E 30 22 7D                          | ":"1.0"}

[1648195573.111][LK-0A08] DM recv generic reply
[1648195573.103]<D>AIOT_DEVICE aiot_app_dm_recv_handler IS CALLED.

[1648195573.103]<D>AIOT_DEVICE msg_id = 3, code = 200, data = {}, message = success

[1648195573.103]<D>PY_TASK ************* py_task_schedule_call START  *******

[1648195573.104]<D>PY_TASK ************* py_task_schedule_call END *******

[1648195573.150]<D>AIOT_MQTT recv puback, packet id: 5

[1648195573.151]<D>AIOT_MQTT recv puback, packet id: 4

[1648195573.153]<D>AIOT_MQTT recv sub_ack, res: 0x0000, packet id: 3, max qos: 1

[1648195573.111][LK-0309] pub: /sys/a1aNr1wef2c/867082058707860/thing/deviceinfo/update_reply

[LK-030A] < 7B 22 63 6F 64 65 22 3A  32 30 30 2C 22 64 61 74 | {"code":200,"dat
[LK-030A] < 61 22 3A 7B 7D 2C 22 69  64 22 3A 22 30 22 2C 22 | a":{},"id":"0","
[LK-030A] < 6D 65 73 73 61 67 65 22  3A 22 73 75 63 63 65 73 | message":"succes
[LK-030A] < 73 22 2C 22 6D 65 74 68  6F 64 22 3A 22 74 68 69 | s","method":"thi
[LK-030A] < 6E 67 2E 64 65 76 69 63  65 69 6E 66 6F 2E 75 70 | ng.deviceinfo.up
[LK-030A] < 64 61 74 65 22 2C 22 76  65 72 73 69 6F 6E 22 3A | date","version":
[LK-030A] < 22 31 2E 30 22 7D                                | "1.0"}

程序成功后,查看设备是否连接

5.4 综合案例-云端控制舵机转动角度(仅支持2.2以上版本)_haas506  2.0_12

(3)在线调试

设置好角度,点击设置(程序运行后舵机默认0°)

5.4 综合案例-云端控制舵机转动角度(仅支持2.2以上版本)_嵌入式硬件_13


查看舵机是否转动,以及物模型的舵机角度

5.4 综合案例-云端控制舵机转动角度(仅支持2.2以上版本)_haas506  2.0_14