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

最新案例教程点击下方链接跳转,CSDN已停止更新

点击跳转HaaS506官方最新案例







1、SG90 MG90S 9g舵机

舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统,比如人形机器人的手臂和腿,车模和航模的方向控制。舵机的控制信号实际上是一个脉冲宽度调制信号( PWM信号),该信号可由FP-GA器件、模拟电路或单片机产生。
在这里插入图片描述
信号线(黄线)红线(电源线)棕色(地线)
在这里插入图片描述
舵机的控制一般需要一个20ms左右的时基脉冲(周期),该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms(高电平时长)。连接上示波器情况如图
在这里插入图片描述
改变高电平时长可以控制舵机转到相应角度,以180度角度伺服为例,那么对应的控制关系是这样的:

高电平时长舵机角度位置
0.5ms0度
1.0ms45度
1.5ms90度
2.5ms180度

在这里插入图片描述

2、舵机角度控制

案例说明:

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

(1)引脚配置

  • Haas2.0有两个WPM引脚GPIO3,GPIO39(1.0版本程序没有相关功能),两个引脚适用频率范围不同
GPIO3GPIO39
0~99hz100~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,点击确认。
在这里插入图片描述
创建完成后,打开动态注册
在这里插入图片描述

(2)编辑自定义功能
点击所建立的产品:选择查看、点击功能定义和选择编辑草稿
在这里插入图片描述
添加自定义功能:属性、功能名称、标识符、数据类型、布尔值、读写类型
(数据使用的是0~180°,代码中对数据进行了相应的转化)
在这里插入图片描述
发布上线
在这里插入图片描述
(3)添加设备
在产品下,添加一个设备:选择产品名、填写DeviceName(自定义,最好将设备的IMEI作为该名称)
在这里插入图片描述

(4)获取ProductSecret,ProductKey填入程序位置(第254行)
在这里插入图片描述

(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"}


程序成功后,查看设备是否连接
在这里插入图片描述

(3)在线调试

设置好角度,点击设置(程序运行后舵机默认0°)
在这里插入图片描述
查看舵机是否转动,以及物模型的舵机角度
在这里插入图片描述

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值