综合案例-云端控制舵机转动角度
最新案例教程点击下方链接跳转,优快云已停止更新
点
击
跳
转
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

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

被折叠的 条评论
为什么被折叠?



