综合案例2.0-雷达避障系统
最新案例教程点击下方链接跳转,CSDN已停止更新
点
击
跳
转
简介
近年来,随着智能汽车、智能机器人的发展,雷达避障技术得到了较快的发展。避障雷达是防撞设备的辅助装置,可以根据需要对避障距离和避障范围进行调整。避障雷达通常安装在物体可移动方向的前部位置,用于探测物体移动方向前方障碍物横截面与自身的距离,由此来判断是否让物体减速或停止移动,从而避免发生碰撞。
本系统检测前方障碍物,当距离小与设定安全距离会发出警报,并将当前距离上传云端,提示采取相应措施,以避免发生碰撞。安全距离可以通过云端进行更改。
AJ-SR04M- T-X超声波测距模块
功能说明
工作原理
用IO口Trig触发测距,至少给10us的高电平。模块自动发送8个40KHZ的方波,自动检测是否有信号返回。当有信号返回时,通过IO口Echo输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。常温下测试距离=(高电平时间*声速(348M/S))/2。
模块被触发测距后,如果接收不到回波(原因超过所测范围或是探头没有正对被测物),ECHO 口会在 40MS 后自动变为低电平,标志着此次测量结束,不论成功与否。
LED 上电时末亮,只有在给了 TRIG 引脚触发信号后才亮,灯闪频率与触发周期同步,说明此时模块接收到正确的指令进入工作状态。建议测量周期为 50ms 以上,以防止发射信号对回响信号的影响。
简单来说就是主板通过IO口Trig给个不小于10us的高电平,触发测距。测距成功,模块通过IO口Echo输出一个高电平给主板;测距失败,ECHO 口会在 40MS 后自动结束本次测量。
- 其他模式可以查看模块手册
准备
本案例需要的硬件
器材 | 数量 |
---|---|
HaaS506开发板 | 1 |
AJ-SR04M- T-X超声波测距模块 | 1 |
蜂鸣器 | 1 |
SIM卡 | 1 |
杜邦线 | 若干 |
硬件连接图
代码流程
1、连接阿里云平台。
2、开机将默认安全距离上传云端。
3、重复检测前方距离,当前方物体距离小与安全距离,蜂鸣器发出警报,并将数据上传阿里云。
4、传感器有效范围20cm-600cm,当超过这个范围无法检测正确距离。
5、可以通过云端自行设置蜂鸣器报警安全距离。
功能实现
1、物联网平台开发
第一次使用物联网平台的读者,需要开通实例后使用物联网平台功能。也可以使用免费的公共实例进行开发,在阿里云物联网平台中,左上角选择‘华东2-上海’,点击‘公共实例’,即可开通。
1、平台产品创建可参考haas506 2.0开发教程-aliyunIoT
2、创建产品属性(添加物模型)
选择产品功能定义–编辑草稿
1、添加自定义功能
2、添加标识符与数据类型(标识符要与代码一致)
3、点击发布上线
选择读写类型
- 发布上线,点击确定
2、设备端开发
- 第一次使用开发板的读者可以按照haas5062.0开发教程-导学篇搭建开发环境。
- 搭建完后复制以下代码到Visual Studio Code,复制产品证书到代码相应位置。
- 替换176行 productKey ,productSecret。(物联网平台开发添加设备时请使用IMEI号)
- 2.2版本获取IMEI号接口有更新,需要更改以下内容(Ctrl+F 查找modem)
# 获取设备的IMEI 作为deviceName 进行动态注册
deviceName = modem.info.getDevImei()
...
main.py
# coding=utf-8
from driver import GPIO
from driver import PWM
import network
import _thread
import ujson
import utime as time
import modem
from aliyunIoT import Device
import kv
#当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 safe_distance
params=request['params']
params=eval(params)
if "safe_distance" in params:
safe_distance = params["safe_distance"]
print('safe_distance:',safe_distance)
upload_safe_distance(safe_distance)
#当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)
distance_data = {}
def upload_distance(n):
global distance_data
distance_data["distance"]= n
distance_data_str=ujson.dumps(distance_data)
data={
'params':distance_data_str
}
device.postProps(data)
warn_data = {}
def upload_safe_distance(safe):
global warn_data
warn_data["safe_distance"]= safe
warn_data_str=ujson.dumps(warn_data)
data1={
'params':warn_data_str
}
device.postProps(data1)
#蜂鸣器
buzzers = PWM()
buzzers.open("buzzer")
switch_buzzers = 0
buzzer = 0
def start_buzzers():
global switch_buzzers,buzzer
while True:
time.sleep_ms(200)
if switch_buzzers == 1 and buzzer == 0:
param = {'freq':3000,'duty':50}
buzzers.setOption(param)
buzzer = 1
if switch_buzzers == 0 and buzzer == 1:
param = {'freq':3000,'duty':100}
buzzers.setOption(param)
buzzer = 0
#超声波测距
def getData():
TRIG.write(0)
#set period,above 50ms
time.sleep_ms(500)
TRIG.write(1) #Set TRIG as LOW
time.sleep_us(10) #Delay of 10us
TRIG.write(0) #Set TRIG as HIGH
while ECHO.read()==0: #Check if Echo is LOW
pass
pulse_start = time.ticks_us() #Time of the last LOW pulse
while ECHO.read()==1: #Check whether Echo is HIGH
pass
pulse_end = time.ticks_us() #Time of the last HIGH pulse
#print("pulse_duration",time.ticks_diff(pulse_end,pulse_start)) # us
pulse_duration = time.ticks_diff(pulse_end,pulse_start)/10000 #pulse duration: s
d=pulse_duration*340/2
return d
if __name__ == '__main__':
ICCID=None
g_connect_status = False
net = None
device = None
deviceSecret = None
deviceName = None
#替换下列产品信息
###################################
productKey = "a1laDtv9VrO"
productSecret = "bPbyllJ80mRX5PPy"
###################################
device_dyn_resigter_succed = False
# 连接网络
connect_network()
# 获取设备的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)
#主程序
time.sleep(2)
safe_distance = 50
print('safe_distance:',safe_distance)
upload_safe_distance(safe_distance)
#creat instances
TRIG = GPIO()
ECHO = GPIO()
TRIG.open('trig') # Set pin as GPIO out
ECHO.open('echo') # Set pin as GPIO in
_thread.start_new_thread(start_buzzers, ())
try:
while True:
dis = getData()
if dis > 20 and dis < 600:
print ("distance:%0.2f cm" % dis)
if dis < safe_distance:
switch_buzzers = 1
upload_distance(dis)
else:
switch_buzzers = 0
else:
switch_buzzers = 0
print ("Out Of Range")
except KeyboardInterrupt:
print("exit")
board.json
{
"name": "haas506",
"version": "2.0.0",
"io": {
"buzzer": {
"type": "PWM",
"port": 39
},
"echo":{
"type":"GPIO",
"port": 20,
"dir": "input",
"pull":"pullup"
},
"trig":{
"type":"GPIO",
"port": 19,
"dir": "output",
"pull":"pullup"
}
},
"debugLevel": "ERROR",
"repl": "enable",
"replPort": 0
}
3、调试
1、串口调试工具log,网络连接成功–动态注册成功–打印安全距离–重复打印当前监测距离。
2、阿里云平台,打开实时刷新,物模型数值会即时改变。
3、通过在线调试更改安全距离