一、功能描述
使用控制舵机带动超声波测距模块转动,同时进行测距,完成对0-180°范围内的障碍检测。
使用到了PWM模块、GPT模块和ENET模块
-
imx6ul开发板
-
舵机
-
超声波测距模块
-
网口
软件
-
下位机基于rt-smart实现
-
控制舵机转动
-
控制测距模块进行测距
-
使用UDP协议和上位机进行通讯
-
上位机程序
-
向下位机发送指令,控制设备运行和停止
-
接收扫描数据
-
以雷达图的形式展示扫描结果
二、功能实现
2.1 舵机控制
舵机控制只使用到了PWM模块,代码上使用一个循环,实现舵机从0-180°的往复运动。
1voidpwm3_rotor_entry(void*parameter)
2{
3angle=1500;
4int16_tincrease=SCAN_STEP;
5while(1)
6{
7if(myapp_isrunning)
8{
9rotor_set_angle(angle);
10if(angle==500)
11{
12increase=SCAN_STEP;
13}
14elseif(angle==2500)
15{
16increase=-SCAN_STEP;
17}
18angle+=increase;
19}
20else
21{
22rt_thread_mdelay(150);
23rotor_set_angle(1500);
24}
25rt_thread_mdelay(SCAN_PERIOD);
26}
27}
2.2超声波测距模块
需要使用PWM模块和GPT模块配合控制,PWM模块用于产生10us的启动脉冲,GPT模块用于接收超声波模块返回的echo信号,具体的实现在上一篇文章进行了描述。
2.3UDP通信
下位机和上位机采用服务器/客户端的方式进行通信,下位机作为服务器,上位机作为客户端
数据包分为两种,一种为指令包,上位机发给下位机;一种为数据包,下位机发给上位机。下位机在接收到开始指令后,启动扫描,并开始向上位机发送扫描数据,接收到停止指令时,停止扫描,并停止数据发送。
下位机使用UDP server的方式,参考rt-smart自带example的UDP server,绑定IP和端口。因为需要同时发送和接收,采用了两个线程,一个线程用于循环接收上位机的指令,一个线程用于循环发送扫描数据。
1/*接收线程*/
2while(1)
3{
4/*接收数据,并获取客户端地址*/
5lwip_recvfrom(transfer.sockfd,(void*)recv_buffer,BUFSZ-1,0,
6(structsockaddr*)&client_addr,&addr_len);
7/*分析数据*/
8if(recv_buffer[0]==1)
9{
10if(recv_buffer[1]==1&&transfer.is_running==0)
11{
12transfer.is_running=1;
13transfer.radar_control(1);
14}
15elseif(recv_buffer[1]==2&&transfer.is_running==1)
16{
17transfer.is_running=0;
18transfer.radar_control(0);
19}
20}
21}
22/*发送线程*/
23while(1)
24{
25if(transfer.is_running)
26{
27/*【5】获取数据*/
28transfer.get_data(&angle,&distance);
29/*【6】整合数据*/
30/*angle=htons(angle);
31distance=htonl(distance);*/
32tran_data[1]=0xff∠
33tran_data[2]=0xff&(angle>>8);
34tran_data[3]=0xff&distance;
35tran_data[4]=0xff&(distance>>8);
36tran_data[5]=0xff&(distance>>16);
37tran_data[6]=0xff&(distance>>24);
38/*【7】发送数据*/
39lwip_sendto(transfer.sockfd,tran_data,BUFSZ,0,(structsockaddr*)&client_addr,sizeof(structsockaddr));
40}
41rt_thread_mdelay(100);
42}
2.4总结
程序入口
1intmyapp(void)
2{
3rotor_init();
4/*控制舵机转动*/
5rt_thread_tpwm3_rotor_thread=rt_thread_create(
6"pwm3_rotor",
7pwm3_rotor_entry,
8RT_NULL,
91024,
1025,
115
12);
13if(pwm3_rotor_thread!=RT_NULL)
14{
15rt_thread_startup(pwm3_rotor_thread);
16}
17hr04_enable();
18/*定时获取角度值*/
19rt_thread_ttest_thread=rt_thread_create(
20"hr04",
21test_fun_entry,
22RT_NULL,
231024,
2425,
255
26);
27if(test_thread!=RT_NULL)
28{
29rt_thread_startup(test_thread);
30}
31/*监控上位机指令*/
32rt_thread_tcontrol_thread=rt_thread_create(
33"myapp",
34myapp_entry,
35RT_NULL,
361024,
3725,
385
39);
40if(control_thread!=RT_NULL)
41{
42rt_thread_startup(control_thread);
43}
44return0;
45}
下位机程序一共使用了4个线程
-
一个用于控制舵机
-
一个用于获取距离信息
-
一个用于监听上位机指令
-
一个用于发送扫描数据
三、效果
舵机+超声波测距
上位机界面
-
PWM
+关注
关注
114文章
5175浏览量
213740 -
雷达
+关注
关注
50文章
2926浏览量
117454 -
开发板
+关注
关注
25文章
5024浏览量
97352
原文标题:rt-smart学习笔记——小实验:实现“扫描雷达”
文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论