rt-smart学习笔记——小实验:实现“扫描雷达” 作者:ledoen
原文链接: https://club.rt-thread.org/ask/article/cd6df3872ac4461d.html
一、功能描述
使用控制舵机带动超声波测距模块转动,同时进行测距,完成对0-180°范围内的障碍检测。
使用到了PWM模块、GPT模块和ENET模块
硬件
软件 控制舵机转动 控制测距模块进行测距 使用UDP协议和上位机进行通讯
向下位机发送指令,控制设备运行和停止 接收扫描数据 以雷达图的形式展示扫描结果
二、功能实现
2.1 舵机控制
舵机控制只使用到了PWM模块,代码上使用一个循环,实现舵机从0-180°的往复运动。 - 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和端口。因为需要同时发送和接收,采用了两个线程,一个线程用于循环接收上位机的指令,一个线程用于循环发送扫描数据。 - * 接收线程 */
- hile (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总结
程序入口 - 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个线程 一个用于控制舵机 一个用于获取距离信息 一个用于监听上位机指令 一个用于发送扫描数据
三、效果
舵机+超声波测距
上位机界面
|