快三计划网页在线观看|幸运快三计划金牌导师
您好, 登錄| 注冊|
論壇導航
您好, 登錄| 注冊|
子站:
論壇首頁    電源技術綜合區
  •  發帖
  • 收藏

【工程師6】+實踐類+多功能控制小車(已完結)
閱讀: 7855 |  回復: 89 樓層直達

2019/08/10 12:40:50
1
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

QQ截圖20160321155901  【活動進行中……】禮遇感恩節!參與頂樓  免費送儀器

QQ截圖20160321155901   【風采匯】參與有獎!獲獎作品分享大賽



    DIY小車這個項目已經很多了,對于前后左右等控制,司空見慣,這次嘗試一下能監控的多功能控制小車,電腦,手機都可以!

多功能車基本功能參數和關鍵部件,視頻傳輸這塊和我們現在智能家具這塊無線視頻原理一樣,下面會有介紹

1.輸入電源:2串或3串的鋰電池(帶充電器)

2.輸出5v,3.3V等電壓為負載供電

3.四個直流減速電機

4.WIFI數傳模塊

5.電機驅動模塊

6.STM32F105主控板

7.UVC攝像頭

8.小車底盤

最后實現電腦或手機通過wifi和軟件控制小車動作并實時監控

框圖

2019/08/10 19:11:54
2
斌520
電源幣:3420 | 積分:17 主題帖:28 | 回復帖:1701
LV9
軍長
一句話新聞?具體內容呢?
2019/08/10 21:57:07
3
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
已經更新了
2019/08/10 22:05:39
4
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

基本框圖:

2019/08/10 22:10:59
5
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

基本編程軟件

keil5

2019/08/11 11:54:16
6
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

對于單片機編程這塊,目前STM32占用非常多,涉及到庫函數和寄存器編程

這次采用庫函數編程,采用傳統的標準庫,HAL庫后續可以

如上圖所示,先把框架建立好,拿一個自己用的工程,把相應的函數添加進去就可以了

2019/08/11 11:59:00
7
heiha88
電源幣:1 | 積分:1 主題帖:5 | 回復帖:33
LV4
連長
有這塊的入門教程嗎
2019/11/24 17:42:39
69
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
單片機入門視頻的話,挺多的,只能給點小建議,C語言基礎扎實,建立自己的代碼庫,到時做項目非常方便的
2019/11/24 17:53:26
73
heiha88
電源幣:1 | 積分:1 主題帖:5 | 回復帖:33
LV4
連長
謝謝啊。看大佬好多帖子都是軟件的,要是能分享代碼庫就非常給力了
2019/08/12 12:49:50
9
lihui710884923
電源幣:482 | 積分:1 主題帖:155 | 回復帖:520
LV9
軍長

這個處理視頻的話,需要上系統?

2019/09/08 20:12:58
22
gxg1122
電源幣:1678 | 積分:17 主題帖:173 | 回復帖:1661
LV10
司令
視頻實時上傳,下端有顯示屏嗎?還是通過上位機軟件顯示控制。
2019/11/24 17:47:04
71
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
通過手機APP來監控和控制小車的
2019/11/24 17:46:09
70
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
肯定要上的,需要刷OpenWrt系統的
2019/09/08 20:12:09
21
gxg1122
電源幣:1678 | 積分:17 主題帖:173 | 回復帖:1661
LV10
司令
這個STM開發,WIFI模塊、小車驅動、串口都是模塊案例及例程。
2019/11/24 17:48:12
72
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
普通的wifi模塊,比如8266例程很多的,但是視頻傳輸模塊不多
2019/08/11 21:40:28
8
gxg1122
電源幣:1678 | 積分:17 主題帖:173 | 回復帖:1661
LV10
司令
多功能控制小車的設計增加了這么多模塊,主控芯片資源及響應速度能跟上嗎?
2019/08/12 22:03:58
10
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
主控單片機只負責解析串口發來的命令并執行小車動作,
2019/08/12 23:14:28
11
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

舵機這塊是兩個,上下,左右各一個,180度旋轉

2019/08/12 23:19:41
12
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

舵機的基本控制原理

控制信號由接收機的通道進入信號調制芯片,獲得直流偏置電壓。它內部有一個基準電路,產生周期為20ms,寬度為1.5ms的基準信號,將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。最后,電壓差的正負輸出到電機驅動芯片決定電機的正反轉。當電機轉速一定時,通過級聯減速齒輪帶動電位器旋轉,使得電壓差為0,電機停止轉動。

舵機的控制一般需要一個20ms左右的時基脈沖,該脈沖的高電平部分一般為0.5ms-2.5ms范圍內的角度控制脈沖部分,總間隔為2ms。以180度角度伺服為例,那么對應的控制關系是這樣的:

   0.5ms--------------0度;

   1.0ms------------45度;

   1.5ms------------90度;

   2.0ms-----------135度;

   2.5ms-----------180度;

2019/08/15 22:25:26
13
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

看看程序中是怎么控制的

用STM32硬件PWM和模擬PWM都可以

TIM_OCInitTypeDef  TIM_OCInitStructure; 
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;	    //?????aPWM?£ê?1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = Speed_Left-1;	  //éè??í¨μà2μ?μ???ì?±??μ£?ê?3?áííaò???????±èμ?PWM
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //μ±?¨ê±?÷??êy?μD?óúCCR1_Valê±?a??μ???
  TIM_OC1Init(TIM5, &TIM_OCInitStructure);	 //ê1?üí¨μà1
  TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable);
我們改變這個值
 Speed_Left-1就可以改變舵機角度

2019/08/15 22:32:13
14
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

這個是整個產品的核心wifi模塊

wifi數傳模塊是基于MIPS 24K 高通CPU的一款WIFI1X1芯片AR9331,其SDK采用uboot作為引導。是基于MIPS 架構的,目前有x86、ARM和MIPS三種主流芯片架構,ARM集架構的主要特點:一是體積小、低功耗、低成本、高性能;二是大量使用寄存器且大多數數據操作都在寄存器中完成,命令執行速度更快;三是尋址方式靈活簡單,執行效率高;四是命令長度固定,可通過多流水線方式提高處理效率。

2019/08/15 22:46:34
15
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

wifi模塊的工作原理

WiFi模塊通過采集掛載在USB接口的MJPG格式的攝像頭的數據,并編碼封裝成http協議的視頻流,默認推送到8080端口。Android/IOS/PC設備,連接到WiFi模塊的熱點后,打開控制軟件,會自動從8080端口獲取MJPG視頻流,并進行解碼、顯示。由此實現了WiFi智能小車的實時視頻傳輸功能。

2019/08/19 12:21:34
16
lihui710884923
電源幣:482 | 積分:1 主題帖:155 | 回復帖:520
LV9
軍長
這個wifi模塊可以連接外網?
2019/08/20 07:06:05
17
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
主要是把wifi模塊作為熱點使用,連接外網不是太穩定
2019/08/20 12:33:01
18
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
其實這個要想實現WIFI的視頻傳輸,還需要一個小型的linux系統,下面會講解一下
2019/08/25 08:58:25
19
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

OpenWrt 可以被描述為一個嵌入式的 Linux 發行版。(主流路由器固件有 dd-wrt,tomato,openwrt三類)對比一個單一的、靜態的系統,OpenWrt的包管理提供了一個完全可寫的文件系統,從應用程序供應商提供的選擇和配置,并允許您自定義的設備,以適應任何應用程序。

對于開發人員,OpenWrt 是使用框架來構建應用程序,而無需建立一個完整的固件來支持;對于用戶來說,這意味著其擁有完全定制的能力,可以用前所未有的方式使用該設備。

2019/09/07 10:02:56
20
lihui710884923
電源幣:482 | 積分:1 主題帖:155 | 回復帖:520
LV9
軍長
這個還需要刷linux系統?
2019/09/15 07:49:36
27
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
這個需要刷openwrt系統的
2019/09/08 20:17:36
24
gxg1122
電源幣:1678 | 積分:17 主題帖:173 | 回復帖:1661
LV10
司令
這個不用linux系統吧,UC系統就可以了。
2019/09/08 20:20:27
25
gxg1122
電源幣:1678 | 積分:17 主題帖:173 | 回復帖:1661
LV10
司令
這個不用linux系統吧,UC系統就可以了。
2019/09/10 17:40:36
26
lihui710884923
電源幣:482 | 積分:1 主題帖:155 | 回復帖:520
LV9
軍長
UC系統是?
2019/09/16 15:05:14
35
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
UC還真不知道,這個是微小的LINUX系統
2019/09/15 17:19:39
34
heiha88
電源幣:1 | 積分:1 主題帖:5 | 回復帖:33
LV4
連長
高通驍龍的芯片,這個wifi模塊挺牛的
2019/09/16 15:05:38
36
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
就是一個圖傳模塊,還可以
2019/09/15 08:40:18
30
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

看看舵機怎么控制轉動速度

舵機的轉動速度取決于起始角度和目標角度的差,差別越大轉得越快,當接近時就放慢角度。所以沒有專門的函數控制轉速。但在大角度轉動時,你可以用程序把它設成幾個小角度遞進,這樣可以放慢速度。也通過delay進行慢速,但快速的話只有加高電壓了 。

2019/09/08 20:15:02
23
gxg1122
電源幣:1678 | 積分:17 主題帖:173 | 回復帖:1661
LV10
司令
響應速度是夠用,串口解析及小車控制。
2019/09/15 07:52:31
28
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
老哥對這塊非常熟悉啊,響應速度可以的
2019/09/15 08:29:27
29
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

這個是實際的wifi圖傳模塊

2019/09/15 08:47:40
31
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

現在在重申一下這個模塊的工作原理和使用方法

WiFi模塊通過采集掛載在USB接口的MJPG格式的攝像頭的數據,并編碼封裝成http協議的視頻流,默認推送到8080端口。Android/IOS/PC設備,連接到WiFi模塊的熱點

(wifi-robots.com開頭的SSID信號)后,打開控制軟件,會自動從8080端口獲取MJPG視頻流,并進行解碼、顯示。由此實現了WiFi智能小車的實時視頻傳輸功能。

們簡單恢復一下出廠設置就可以了,簡單說一下,用USB轉tll工具連接模塊配置好波特率(57600)和串口號一定注意先后順序

1:點擊打開串口,此時WIFI的狀態是沒有上電的

2:給WIFI上電此時要注意串口開始打印(很關鍵),

3:輸入命令firstboot就可以了

2019/09/15 09:46:34
32
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

這個wifi模塊怎么刷固件openwrt系統的

首先通過USB口給設備供電,通過miniUSB口加上usb轉網口網線連接電腦

準備刷機工具TFTP服務端:tftp32  就是局域網內可以傳文件

超級終端:putty  Telnet、SSH、rlogin、純TCP以及串行接口連接軟件

需要相應的固件具體教程http://www.wifi-robots.com/thread-108-1-1.html

2019/09/15 10:08:33
33
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

最后我們看看USB攝像頭這塊,簡單介紹一下無線監控中的攝像頭

1.攝像頭選擇

做本次實驗的時候,推薦大家用 USB 免驅的攝像頭,最好是支持 MJPEG 輸出的攝像頭類型。USB 免驅攝像頭輸出 YUV 格式和輸出 MJPEG 格式,對無線監控的效果有什么影響呢?首先大家要知道,同樣是一幀數據,YUV 格式會比 MJPEG 格式的大得多,因此我們在視頻傳輸的時候,一般是傳輸 MJPEG 格式的數據。這樣,就有這樣一個問題,如果攝像頭是輸出 YUV 格式,那么就意味著我們需要通過軟件將視頻數據由 YUV 格式轉換成 MJPEG格式,然后傳輸。如果攝像頭輸出的是 MJPEG 格式,那個將可以直接將得到的數據進行傳輸。因此,使用支持 MJPEG 壓縮的攝像頭,比一般的攝像頭,做無線監控的效果,好很多

2019/09/23 09:11:14
40
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

2.配置 OpenWrt 支持 usb 攝像頭

看看怎么配置

要支持攝像頭,就必須配置上攝像頭的驅動,因為是免驅的 USB 攝像頭,因此我們必須配置上 UVC 驅動,具體如圖所示。首先,我們選中內核模塊進行配置:

選中 Video 支持配置:

按”y”選中 kmod-video-core:

在展開的選項中選中 uvc:

2019/09/23 10:59:18
41
lihui710884923
電源幣:482 | 積分:1 主題帖:155 | 回復帖:520
LV9
軍長
只要支持UVC驅動的攝像頭都可以這樣操作?
2019/10/01 07:47:57
42
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
原理是這樣的
2019/10/01 14:55:26
43
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

看看電機驅動模塊

2019/10/01 14:57:05
44
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

基本原理如下

看看具體是怎么控制電機調速的,通過控制使能端使L298N處于工作和不工作,VSS-9引腳為芯片供電   VS-4引腳為電機供電   ENA-6引腳為通道1使能端,利用定時器的pwm輸出作用于ENA,根據脈沖占空比不同就可以得到不同的輸出電壓,從而達到調速目的。比如在VS引腳加10V的電機供電電壓,ENA端脈沖占空比為100%,那么OUT1和OUT2之間將輸出10V電壓,占空比為50%,那么輸出為5V電壓,占空比為10%,則為1V    我買的電機供電電壓為5v到12v都可以,電壓高的話也可以,長時間工作的話會對電機損壞

2019/10/01 14:59:27
45
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

看看電機是怎么正反裝 的

邏輯輸入端,為IN1\IN2\IN3\IN4,其中IN1、IN2控制電機M1;IN3、IN4控制電 機M2。例如IN1輸入高電平1,IN2輸入低電平0,對應電機M1正轉;IN1輸入低電平0,IN2輸入高電平1,對應電機M1反轉,調速就是改變高電平的占空比

2019/10/01 15:01:19
46
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

這是整個系統的核心板STM32F105

2019/10/02 15:22:56
47
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

正好國慶期間可以把程序寫寫,用一個stm32f103的模板,還是103的標準庫,改一下測試再105上可以不?

2019/10/02 15:37:29
48
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

主要就是串口這塊,但是奇怪的是串口通訊不正常

波特率9600是一致的,用串口助手發送,發送FE是沒有任何反應的,發送其他,接受的也不一樣,多年的編程,程序應該問題不大

2019/10/02 17:49:06
49
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

就懷疑時鐘的問題,先軟件仿真看看,調試狀態找到RCC

看看能看出來時鐘對不

2019/10/02 18:01:41
50
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

寄存器里面的值不太了解

可以通過一個時鐘函數RCC_GetClocksFreq(&RCC_Clocks)加到主函數里,把RCC_Clocks變量加到窗口中,看看實際的時鐘頻率

發現時鐘不對,再網上查看資料說105和103的啟動文件不一樣

宏定義這需要改成STM32F10X_CL,

2019/10/02 18:16:34
51
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

由于105系列屬于互聯型單片機,默認晶振為25M,而我們實際為8M

1.需要在這個stm32f10x.h文件里更改

2.需要在這個system_stm32f10x.c文件里更改

2019/10/02 18:31:28
52
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

現在我們在仿真調試看看實際的時鐘頻率

主頻這個16進制值為0x044AA200,經過計算為72.000000

這樣就配置ok了

2019/10/08 12:40:16
53
lihui710884923
電源幣:482 | 積分:1 主題帖:155 | 回復帖:520
LV9
軍長
用一個函數讀取當前系統時鐘,時鐘頻率這塊分析很透徹
2019/10/09 21:18:40
54
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
個人認為這個就是讀取當前系統時鐘的最好辦法了,
2019/10/17 10:44:57
55
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
基本的103移植105成功,程序這塊后續簡單分析一下,下面開始組裝調試
2019/11/02 11:25:40
56
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

為了讓小車強勁有力,我們采用松下的18650電池,一個是2600MAH,兩串兩并的話就是8.4V ,總容量10400MAH

這是兩個電池的

加上快充充電器,網上買的,后續介紹

2019/11/03 08:36:57
57
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

我們現在準備組裝小車

這是小車底盤

2019/11/03 12:32:40
58
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

組裝鋰電池

完畢

2019/11/03 12:34:20
59
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

剩下的小車組裝完畢

下面開始程序調試

2019/11/04 08:23:09
60
lihui710884923
電源幣:482 | 積分:1 主題帖:155 | 回復帖:520
LV9
軍長
手機APP是自己開發?
2019/11/06 21:41:10
61
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
手機APP這快開發的,有啥問題可以討論
2019/11/11 12:45:20
63
keyhei66
電源幣:61 | 積分:3 主題帖:1 | 回復帖:10
LV2
班長
小車的舵機是多少電壓供電的,單片機這塊能否分享資料,小白一個
2019/11/17 08:44:39
66
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

小車的電機直接有電池供電,L298N驅動

舵機這塊有電池降壓5V供電

2019/11/06 21:44:53
62
EDSTRNDDF
電源幣:56 | 積分:2 主題帖:0 | 回復帖:64
LV4
連長
2019/11/17 08:31:41
65
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
有啥疑問可以討論
2019/11/11 12:46:38
64
keyhei66
電源幣:61 | 積分:3 主題帖:1 | 回復帖:10
LV2
班長
這個計算頻率還是非常實用的
2019/11/17 08:45:14
67
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
在單片機編程中經常用
2019/11/24 16:53:19
68
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
這只是其中一種計算方法,比較常用
2019/11/24 17:56:47
75
heiha88
電源幣:1 | 積分:1 主題帖:5 | 回復帖:33
LV4
連長
105的單片機開發板不多見,我用103系列的單片機可以嗎
2019/11/24 21:30:01
76
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
103系列的當然可以,
2019/11/24 17:55:50
74
heiha88
電源幣:1 | 積分:1 主題帖:5 | 回復帖:33
LV4
連長
多功能小車,網上有好多這的,但是這種帶視頻監控的不多見,有空也做一個
2019/11/24 21:31:52
77
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
其他舵機等模塊都類似,主要視頻傳輸模塊
2019/11/30 13:55:12
78
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

      大賽馬上結束,簡單把程序這塊介紹下,主要是串口通信

      最簡單的串口數據處理機制是數據接收并原樣回發的機制是:成功接收到一個數,觸發進入中斷,在中斷函數中將數據讀取出來,然后立即。這一種數據處理機制是“非緩沖中斷方式”,雖然這種數據處理方式不消耗時間,但是這種數據處理方式嚴重的缺點是:數據無緩沖區,如果先前接收的的數據如果尚未發送完成(處理完成),然后串口又接收到新的數據,新接收的數據就會把尚未處理的數據覆蓋,從而導致“數據丟包”。

     

       對于“數據丟包”,最簡單的辦法就是使用一個數組來接收數據:每接收一個數據,數組下標偏移。雖然這樣的做法能起到一定的“緩沖效果”,但是數組的空間得不到很好的利用,已處理的數據仍然會占據原有的數據空間,直到該數組“滿載”(數組的每一個元素都保存了有效的數據),將整個數組的數據處理完成后,重新清零數組,才能開啟新一輪的數據接收。

       解決這個問題采用FIFO的機制,環形緩沖區就是一個帶“頭指針”和“尾指針”的數組。“頭指針”指向環形緩沖區中可讀的數據,“尾指針”指向環形緩沖區中可寫的緩沖空間。通過移動“頭指針”和“尾指針”就可以實現緩沖區的數據讀取和寫入。

2019/11/30 15:26:46
79
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

1.圖形和代碼分析

          當然,環形緩沖區的“頭指針”和“尾指針”可以用“頭變量”和“尾變量”來代替,因為切換數組的元素空間,除了可以用“指針偏移法”之外,還可以用“素組下標偏移法”。當串口接收到新的數組,則將數組保存到環形緩沖區中,同時將“尾變量”加一,以保存下一個數據;應用程序在讀取數據時,“頭變量”加一,以讀取下一個數據。

#define MAX_SIZE  12               //緩沖區大小

 

typedef struct 

{

  unsigned char head;        //緩沖區頭部位置

  unsigned char tail;         //緩沖區尾部位置

  unsigned char ringBuf[MAX_SIZE]; //緩沖區數組

} ringBuffer_t;

 

ringBuffer_t buffer;                 //定義一個結構體

2019/11/30 15:28:58
80
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

2.定義一個結構頭體則表示新的消息隊列已經創建完成。新建創建的隊列,頭指針head和尾指針tail都是指向數組的元素0。如下圖所示,此時的消息隊列是“空隊列”。

當如果有11個數據abcdefghijk存入緩沖隊列,則如下圖所示:

       當如果l加入隊列,則緩沖隊列處于滿載狀態,如下圖所示:如果此時,接收到新的數據并需要保存,則tail需要歸零,將接收到的數據存到數組的第一個元素空間,如果尚未讀取緩沖數組的一個元素空間的數據,則此數據會被新接收的數據覆蓋。同時head需要增加1,修改頭節點偏移位置丟棄早期數據。

2019/11/30 15:40:27
81
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

3.讀取緩沖隊列中的11個數據后,狀態如下:

當消息隊列中的所有數據都讀取出來后,此時環形隊列是空的,狀態如下圖所示。從圖可以總結得知,如果tailhead相等,則表示緩沖隊列是空的。

2019/11/30 15:58:17
82
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

我們看看程序中是怎么做的

我們需要在主函數的超級循環里讀取緩沖區數據,并判斷解析數據就可以

2019/12/01 19:23:43
83
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

這是最終的成品圖,帶超聲波避障功能

2019/12/02 13:40:07
84
lihui710884923
電源幣:482 | 積分:1 主題帖:155 | 回復帖:520
LV9
軍長
這個FIFO在串口接受中應用廣泛,不過也可以用DMA+空閑中斷
2019/12/02 21:14:46
85
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
下次可以采用DMA的方法試試咋樣
2019/12/03 22:24:55
86
heiha88
電源幣:1 | 積分:1 主題帖:5 | 回復帖:33
LV4
連長
你好,我也在學習環形隊列這塊,如何刪除隊列的數據呢,對串口接受超時做判斷?
2019/12/05 22:17:25
87
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長
刪除的話,直接覆蓋數據就可以了,超時判斷的話更好了
2019/12/06 11:41:03
88
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

最終的產品功能視頻演示,整體功能全部實現,視頻實時監控

1.電腦連接小車wifi,通過鍵盤的W A S D控制小車的前 左 后  右

2.電腦控制舵機

3.超聲波避障

4.手機APP控制


2019/12/06 22:23:24
89
liuxiaofei126
電源幣:0 | 積分:0 主題帖:9 | 回復帖:82
LV6
團長

這是電腦控制軟件

功能非常強大的,

這是手機APP

2019/12/06 22:43:30
90
heiha88
電源幣:1 | 積分:1 主題帖:5 | 回復帖:33
LV4
連長
樓主這個小車是熱點啊,其他設備連接這小車,并控制啊,明白了
客服熱線
服務時間:周一至周五9:00-18:00
微信關注
免費技術研討會
獲取一手干貨分享

互聯網違法不良信息舉報

Reporting Internet Illegal and Bad Information
[email protected]
400-003-2006
快三计划网页在线观看 网上赚钱 编写题库 12123自编选号技巧 黑龙江时时停了吗 好运来重庆时时彩计划软件好用吗 重庆时时彩是国家开吗 吉祥棋牌下载 福彩计划软件手机版 江苏11选5手机版走势图 五粮液近期股票行情 500元 倍投方案 稳赚快三 时时彩四码最准的方法 花呗马云如何赚钱 手机版4人通比牛牛 3d不杀号如何选号 pk10玩法 贵州快3直播