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

本文介绍如何使用阿里云物联网平台远程控制舵机的角度。通过云端发送指令调整舵机角度,并利用Haas506开发板配合SG90MG90S9g舵机实现远程角度控制。

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

点击跳转HaaS506官方最新案例







1、SG90 MG90S 9g舵机

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

高电平时长 舵机角度位置
0.5ms 0度
1.0ms 45度
1.5ms 90度
2.5ms 180度

在这里插入图片描述

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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值