Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
PWM
rt-smart
udp
rt-smart学习笔记——小实验:实现“扫描雷达”
发布于 2022-01-23 11:20:08 浏览:1036
订阅该版
[tocm] ## 一、功能描述 使用控制舵机带动超声波测距模块转动,同时进行测距,完成对0-180°范围内的障碍检测。 使用到了PWM模块、GPT模块和ENET模块 ### 硬件 - imx6ul开发板 - 舵机 - 超声波测距模块 - 网口 ### 软件 - 下位机基于rt-smart实现 - 控制舵机转动 - 控制测距模块进行测距 - 使用UDP协议和上位机进行通讯 - 上位机程序 - 向下位机发送指令,控制设备运行和停止 - 接收扫描数据 - 以雷达图的形式展示扫描结果 ## 二、功能实现 ### 2.1 舵机控制 舵机控制只使用到了PWM模块,代码上使用一个循环,实现舵机从0-180°的往复运动。 ```c void pwm3_rotor_entry(void *parameter) { angle = 1500; int16_t increase = SCAN_STEP; while(1) { if (myapp_isrunning) { rotor_set_angle(angle); if (angle == 500) { increase = SCAN_STEP; } else if (angle == 2500) { increase = -SCAN_STEP; } angle += increase; } else { rt_thread_mdelay(150); rotor_set_angle(1500); } rt_thread_mdelay(SCAN_PERIOD); } } ``` ### 2.2超声波测距模块 需要使用PWM模块和GPT模块配合控制,PWM模块用于产生10us的启动脉冲,GPT模块用于接收超声波模块返回的echo信号,具体的实现在上一篇文章进行了描述。 ### 2.3UDP通信 下位机和上位机采用服务器/客户端的方式进行通信,下位机作为服务器,上位机作为客户端 数据包分为两种,一种为指令包,上位机发给下位机;一种为数据包,下位机发给上位机。下位机在接收到开始指令后,启动扫描,并开始向上位机发送扫描数据,接收到停止指令时,停止扫描,并停止数据发送。 下位机使用UDP server的方式,参考rt-smart自带example的UDP server,绑定IP和端口。因为需要同时发送和接收,采用了两个线程,一个线程用于循环接收上位机的指令,一个线程用于循环发送扫描数据。 ``` /* 接收线程 */ while (1) { /* 接收数据,并获取客户端地址 */ lwip_recvfrom(transfer.sockfd, (void *)recv_buffer, BUFSZ -1, 0, (struct sockaddr *)&client_addr, &addr_len); /* 分析数据 */ if (recv_buffer[0] == 1) { if (recv_buffer[1] == 1 && transfer.is_running == 0) { transfer.is_running = 1; transfer.radar_control(1); } else if (recv_buffer[1] == 2 && transfer.is_running == 1) { transfer.is_running = 0; transfer.radar_control(0); } } } /* 发送线程 */ while (1) { if (transfer.is_running) { /* 【5】获取数据 */ transfer.get_data(&angle, &distance); /* 【6】整合数据 */ /*angle = htons(angle); distance = htonl(distance);*/ tran_data[1] = 0xff & angle; tran_data[2] = 0xff & (angle >> 8); tran_data[3] = 0xff & distance; tran_data[4] = 0xff & (distance >> 8); tran_data[5] = 0xff & (distance >> 16); tran_data[6] = 0xff & (distance >> 24); /* 【7】发送数据 */ lwip_sendto(transfer.sockfd, tran_data, BUFSZ, 0, (struct sockaddr *)&client_addr, sizeof(struct sockaddr)); } rt_thread_mdelay(100); } ``` ### 2.4总结 程序入口 ```c int myapp(void) { rotor_init(); /*控制舵机转动*/ rt_thread_t pwm3_rotor_thread = rt_thread_create( "pwm3_rotor", pwm3_rotor_entry, RT_NULL, 1024, 25, 5 ); if (pwm3_rotor_thread != RT_NULL) { rt_thread_startup(pwm3_rotor_thread); } hr04_enable(); /*定时获取角度值*/ rt_thread_t test_thread = rt_thread_create( "hr04", test_fun_entry, RT_NULL, 1024, 25, 5 ); if (test_thread != RT_NULL) { rt_thread_startup(test_thread); } /*监控上位机指令*/ rt_thread_t control_thread = rt_thread_create( "myapp", myapp_entry, RT_NULL, 1024, 25, 5 ); if (control_thread != RT_NULL) { rt_thread_startup(control_thread); } return 0; } ``` 下位机程序一共使用了4个线程 - 一个用于控制舵机 - 一个用于获取距离信息 - 一个用于监听上位机指令 - 一个用于发送扫描数据 ## 三、效果 ### 舵机+超声波测距  ### 上位机界面 
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
ledoen
这家伙很懒,什么也没写!
文章
2
回答
4
被采纳
0
关注TA
发私信
相关文章
1
玩iot camera笔记之3测试试用3路pwm
2
[已解决]PWM输出异常分析
3
给RT-Thread添加PWM驱动框架
4
关于rt-thread-3.1.0 pwm
5
关于rt-thread的PWM框架在stm32f103vf应用的疑问
6
rt-thread stm32 bsp adc pwm 外设适配好了吗
7
stm32f103ze 添加pwm 设备失败
8
【正点原子】潘多拉IoT-STM32L475开发板 用menuconfig 看不到PWM....
9
关于rtthread 4.0.0版本中pwm的初始化定时器寄存器读写问题
10
RT-Thread正点原子战舰V3使用PWM设备驱动没有输出
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
10
个答案
3
次被采纳
xiaorui
3
个答案
2
次被采纳
winfeng
2
个答案
2
次被采纳
三世执戟
8
个答案
1
次被采纳
KunYi
8
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
lizimu
2
篇文章
9
次点赞
swet123
1
篇文章
4
次点赞
Days
1
篇文章
4
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部