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

本文介绍了一种基于HaaS506开发板和AJ-SR04M-T-X超声波测距模块的雷达避障系统,该系统能够检测前方障碍物并上传数据到云端。当物体距离小于预设的安全距离时,系统会触发蜂鸣器警报,并允许用户通过云端调整安全距离。内容涵盖了硬件连接、物联网平台开发、设备端代码实现以及调试过程。
摘要由CSDN通过智能技术生成

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

点击跳转HaaS506官方最新案例







简介

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

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

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、通过在线调试更改安全距离
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值