一、功能描述
使用控制舵機(jī)帶動(dòng)超聲波測(cè)距模塊轉(zhuǎn)動(dòng),同時(shí)進(jìn)行測(cè)距,完成對(duì)0-180°范圍內(nèi)的障礙檢測(cè)。
使用到了PWM模塊、GPT模塊和ENET模塊
硬件
-
imx6ul開發(fā)板
-
舵機(jī)
-
超聲波測(cè)距模塊
-
網(wǎng)口
軟件
-
下位機(jī)基于rt-smart實(shí)現(xiàn)
-
控制舵機(jī)轉(zhuǎn)動(dòng)
-
控制測(cè)距模塊進(jìn)行測(cè)距
-
使用UDP協(xié)議和上位機(jī)進(jìn)行通訊
-
上位機(jī)程序
-
向下位機(jī)發(fā)送指令,控制設(shè)備運(yùn)行和停止
-
接收掃描數(shù)據(jù)
-
以雷達(dá)圖的形式展示掃描結(jié)果
二、功能實(shí)現(xiàn)
2.1 舵機(jī)控制
舵機(jī)控制只使用到了PWM模塊,代碼上使用一個(gè)循環(huán),實(shí)現(xiàn)舵機(jī)從0-180°的往復(fù)運(yùn)動(dòng)。
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超聲波測(cè)距模塊
需要使用PWM模塊和GPT模塊配合控制,PWM模塊用于產(chǎn)生10us的啟動(dòng)脈沖,GPT模塊用于接收超聲波模塊返回的echo信號(hào),具體的實(shí)現(xiàn)在上一篇文章進(jìn)行了描述。
2.3UDP通信
下位機(jī)和上位機(jī)采用服務(wù)器/客戶端的方式進(jìn)行通信,下位機(jī)作為服務(wù)器,上位機(jī)作為客戶端
數(shù)據(jù)包分為兩種,一種為指令包,上位機(jī)發(fā)給下位機(jī);一種為數(shù)據(jù)包,下位機(jī)發(fā)給上位機(jī)。下位機(jī)在接收到開始指令后,啟動(dòng)掃描,并開始向上位機(jī)發(fā)送掃描數(shù)據(jù),接收到停止指令時(shí),停止掃描,并停止數(shù)據(jù)發(fā)送。
下位機(jī)使用UDP server的方式,參考rt-smart自帶example的UDP server,綁定IP和端口。因?yàn)樾枰瑫r(shí)發(fā)送和接收,采用了兩個(gè)線程,一個(gè)線程用于循環(huán)接收上位機(jī)的指令,一個(gè)線程用于循環(huán)發(fā)送掃描數(shù)據(jù)。
1/*接收線程*/
2while(1)
3{
4/*接收數(shù)據(jù),并獲取客戶端地址*/
5lwip_recvfrom(transfer.sockfd,(void*)recv_buffer,BUFSZ-1,0,
6(structsockaddr*)&client_addr,&addr_len);
7/*分析數(shù)據(jù)*/
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/*發(fā)送線程*/
23while(1)
24{
25if(transfer.is_running)
26{
27/*【5】獲取數(shù)據(jù)*/
28transfer.get_data(&angle,&distance);
29/*【6】整合數(shù)據(jù)*/
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】發(fā)送數(shù)據(jù)*/
39lwip_sendto(transfer.sockfd,tran_data,BUFSZ,0,(structsockaddr*)&client_addr,sizeof(structsockaddr));
40}
41rt_thread_mdelay(100);
42}
2.4總結(jié)
程序入口
1intmyapp(void)
2{
3rotor_init();
4/*控制舵機(jī)轉(zhuǎn)動(dòng)*/
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/*定時(shí)獲取角度值*/
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/*監(jiān)控上位機(jī)指令*/
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}
下位機(jī)程序一共使用了4個(gè)線程
-
一個(gè)用于控制舵機(jī)
-
一個(gè)用于獲取距離信息
-
一個(gè)用于監(jiān)聽上位機(jī)指令
-
一個(gè)用于發(fā)送掃描數(shù)據(jù)
三、效果
舵機(jī)+超聲波測(cè)距
上位機(jī)界面
-
PWM
+關(guān)注
關(guān)注
116文章
5507瀏覽量
219351 -
雷達(dá)
+關(guān)注
關(guān)注
50文章
3119瀏覽量
120071 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5679瀏覽量
104600
原文標(biāo)題:rt-smart學(xué)習(xí)筆記——小實(shí)驗(yàn):實(shí)現(xiàn)“掃描雷達(dá)”
文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
RT-Smart的資料合集
rt-smart中斷阻塞問題是怎么引起的
請(qǐng)問rt-smart gdbserver是閉源的嗎?
請(qǐng)問rt-smart gdbserver是閉源的嗎?
基于RT-Thread操作系統(tǒng)衍生rt-smart實(shí)時(shí)操作系統(tǒng)簡(jiǎn)介
如何實(shí)現(xiàn)一種基于Ubuntu Linux環(huán)境通過USB方式燒錄rt-smart內(nèi)核的設(shè)計(jì)呢
rt-smart應(yīng)用程序系統(tǒng)調(diào)用實(shí)現(xiàn)過程是怎么樣的?
樹莓派上rt-smart的應(yīng)用編程入門

rt-smart移植分析:從樹莓派3b入手

優(yōu)雅的在D1S上運(yùn)行RT-Smart
絲滑的在RT-Smart用戶態(tài)運(yùn)行LVGL
RT-Smart riscv64匯編注釋
零基礎(chǔ)上手rt-smart適配bsp

評(píng)論