综合案例2.0-雷达避障系统

  • 简介
    • AJ-SR04M- T-X超声波测距模块
  • 准备
  • 硬件连接图
  • 代码流程
  • 功能实现
    • 1、物联网平台开发
    • 2、设备端开发
    • 3、调试

简介

近年来,随着智能汽车、智能机器人的发展,雷达避障技术得到了较快的发展。避障雷达是防撞设备的辅助装置,可以根据需要对避障距离和避障范围进行调整。避障雷达通常安装在物体可移动方向的前部位置,用于探测物体移动方向前方障碍物横截面与自身的距离,由此来判断是否让物体减速或停止移动,从而避免发生碰撞。

本系统检测前方障碍物,当距离小与设定安全距离会发出警报,并将当前距离上传云端,提示采取相应措施,以避免发生碰撞。安全距离可以通过云端进行更改。

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_upgradeprint('***** 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_distanceparams=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_statuspdp = args[0]netwk_sta = args[1]if netwk_sta == 1:g_connect_status = Trueelse:g_connect_status = False#网络连接
def connect_network():global net,on_4g_cb,g_connect_status#NetWorkClient该类是一个单例类,实现网络管理相关的功能,包括初始化,联网,状态信息等.net = network.NetWorkClient()g_register_network = Falseif net._stagecode is not None and net._stagecode == 3 and net._subcode == 1:g_register_network = Trueelse:g_register_network = Falseif 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('网络连接成功')breaktime.sleep_ms(20)#动态注册回调函数
def on_dynreg_cb(data):global deviceSecret,device_dyn_resigter_succeddeviceSecret = datadevice_dyn_resigter_succed = True# 连接物联网平台
def dyn_register_device(productKey,productSecret,deviceName):global on_dynreg_cb,device,deviceSecret,device_dyn_resigter_succedkey = '_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_datadistance_data["distance"]= ndistance_data_str=ujson.dumps(distance_data)data={'params':distance_data_str}      device.postProps(data)warn_data = {}
def upload_safe_distance(safe):global warn_datawarn_data["safe_distance"]= safewarn_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,buzzerwhile True:time.sleep_ms(200)if switch_buzzers == 1 and buzzer == 0:param = {'freq':3000,'duty':50}buzzers.setOption(param)buzzer = 1if switch_buzzers == 0 and buzzer == 1:param = {'freq':3000,'duty':100}buzzers.setOption(param)buzzer = 0#超声波测距
def getData():TRIG.write(0)#set period,above 50mstime.sleep_ms(500)TRIG.write(1)                                #Set TRIG as LOW                                      time.sleep_us(10)                            #Delay of 10usTRIG.write(0)                                #Set TRIG as HIGH                               while ECHO.read()==0:                        #Check if Echo is LOWpass                 pulse_start = time.ticks_us()                #Time of the last  LOW pulsewhile ECHO.read()==1:                        #Check whether Echo is HIGHpass                  pulse_end = time.ticks_us()                  #Time of the last HIGH pulse #print("pulse_duration",time.ticks_diff(pulse_end,pulse_start))     # uspulse_duration = time.ticks_diff(pulse_end,pulse_start)/10000      #pulse duration: sd=pulse_duration*340/2return dif __name__ == '__main__':ICCID=Noneg_connect_status = Falsenet = Nonedevice = NonedeviceSecret = NonedeviceName = None#替换下列产品信息###################################productKey = "a1laDtv9VrO"productSecret = "bPbyllJ80mRX5PPy"###################################device_dyn_resigter_succed = False# 连接网络connect_network()# 获取设备的IMEI 作为deviceName 进行动态注册#2.2版本改为#deviceName = modem.info.getDevImei()deviceName = modem.getDevImei()#获取设备的ICCIDICCID=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 = 50print('safe_distance:',safe_distance)upload_safe_distance(safe_distance)#creat instancesTRIG = GPIO()                                  ECHO = GPIO()                                 TRIG.open('trig')             # Set pin as GPIO outECHO.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 = 1upload_distance(dis)     else:switch_buzzers = 0      else:switch_buzzers = 0print ("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、通过在线调试更改安全距离

5.24 综合案例2.0-雷达避障系统(仅支持2.2以上版本)相关推荐

  1. 5.18 综合案例2.0-家庭入侵报警系统(仅支持2.2以上版本)

    综合案例2.0-家庭入侵报警系统 简介 无源蜂鸣器 准备 硬件连接图 代码流程 功能实现 1.物联网平台开发 2.设备端开发 调试 3.物联网应用开发 3.1新建'普通项目' 3.2关联产品和设备 3 ...

  2. haas506 2.0开发教程-hota(仅支持2.2以上版本)

    haas506 2.0开发教程-hota 1.hota.py升级 案例说明 (1)获取URL (2)功能代码 (3)输出log 2.hota.pac升级 案例说明 (1)获取URL (2)功能代码 ( ...

  3. 5.31 综合案例2.0 - 在线音乐盒

    综合案例2.0 - 在线音乐盒 一.案例说明 二.准备器件 三.案例连线 四.代码 代码说明 复制 五.测试 一.案例说明 用python写一个在线音乐播放器,MP3云喇叭 本案例制作一个联网下载声音 ...

  4. 5.39 综合案例2.0 - STM32蓝牙遥控小车2(语音控制)

    综合案例2.0 - 蓝牙遥控小车1- 语音控制 成品展示 案例说明 器件说明 小车连线 小车源码 语音模块遥控 语音遥控连线 模块使用说明 1.MLT-BT05 4.0 蓝牙模块 2.ASRPRO-2 ...

  5. 5.38 综合案例2.0 -语音助手(短信,蓝牙,M2M设备间通信)

    综合案例2.0 - 语音助手 效果展示 案例说明 原理 器件 语音助手功能实现 1,ASRPRO-2m模块 下载代码连线 模块编程说明 2,模块与开发板接线 3,语音助手代码 功能1:语音发短信说明 ...

  6. 5.25 综合案例2.0-居家隔离监控系统(2.2版本接口有更新)

    综合案例2.0-居家隔离监控系统 简介 AJ-SR04M- T-X超声波测距模块 准备 硬件连接图 代码流程 功能实现 1.物联网平台开发 2.设备端开发 3.调试 4.创建钉钉机器人 5.IoT S ...

  7. 5.20 综合案例2.0-甲醛浓度检测系统(2.2版本接口有更新)

    综合案例2.0-甲醛浓度检测系统 简介 电化学甲醛模组 准备 硬件连接图 代码流程 1.物联网平台开发 2.设备端开发 调试 3.物联网应用开发 3.1新建'普通项目' 3.2关联设备 3.3创建we ...

  8. 5.8 综合案例2.0-智能刷卡门禁系统(仅支持2.2以上版本)

    综合案例2.0-智能刷卡门禁系统 简介 准备 硬件连接图 代码流程 功能实现 1.物联网平台开发 2.设备端开发 调试 3.场景联动设定 刷卡测试 简介 使用MFRC522 RFID传感器与舵机制作的 ...

  9. 毫米波雷达在无人机避障系统中的应用

    电子科技大学 格拉斯哥学院 2017级 郝逸嘉 摘要:近年来,无人机技术得到了快速的发展和广泛的应用,预计在未来将被应用到更多的领域.尽管日趋成熟,目前无人机技术在实际应用中仍然存在着很多安全问题,同 ...

最新文章

  1. 给定一个 n X n 的矩阵 和 R,求旋转 90 X R 度以后的矩阵
  2. opencv openpose
  3. DefaultSerializer requires a Serializable payload but received an object of type
  4. antlr 语言 库_关于ANTLR的通用库的需求:使用反射来构建元模型
  5. 转载——CVE-2019-0807
  6. 一个不错的局域网聊天工具之飞鸽传书下载地址
  7. 全民免费吃鸡,驱动人生带你玩转PUBG
  8. 打开量化交易的黑箱——note1
  9. android 免 root修改位置打卡
  10. 基于springBoot+MyBatis+Vue的前后端分离旅游管理系统
  11. 【图像超分辨率】Deep Learning for Image Super-resolution: A Survey
  12. 市场调研报告-全球与中国船用下水推车市场现状及未来发展趋势
  13. css 3d环形,CSS3 飞行的3D圆环
  14. 为什么百度搜索引擎优化比以前更难?
  15. 数字化转型导师坚鹏:数字化时代企业管理变革与创新营销
  16. Python打包出现 failed to execute script xxx解决方法
  17. chmod 777 修改文件权限
  18. 笔记本 续航测试软件,最低5小时起 这些超长续航笔记本你一定不知道
  19. 广东省工业和信息化厅关于组织开展2022年创新型中小企业评价、专精特新中小企业认定和复核工作的通知
  20. WordPress安装论坛插件

热门文章

  1. Win10官网原版安装
  2. ubuntu16.04安装GNU Radio
  3. IBM云对象存储Cleversafe 大力拓展全新战场
  4. Layui的eleTree树式选择器使用
  5. Elasticsearch6.4专题之16:Ingest Node
  6. linux下安装hadoop步骤
  7. XP系统添加网络打印机步骤
  8. python random.round 修约方法 4舍6入5看齐,奇进偶不进
  9. 计算机休眠后黑屏打不开,[电脑待机以后黑屏打不开怎么办]电脑睡眠后黑屏打不开...
  10. codeforces1194B Yet Another Crosses Problem 思维