久久久国产精品视频袁燕,99re久久精品国产,亚洲欧美日韩国产综合v,天天躁夜夜躁狠狠久久,激情五月婷婷激情五月婷婷

liuxiaofei126
認證:VIP會員
所在專題目錄 查看專題
多功能控制小車
STM32定時器的來龍去脈
底層程序如何在STM32上編譯運行
從IIC實測波形入手搞懂IIC通信
實例講解(一)移位寄存器
單片機之USB 硬件和數(shù)據(jù)的四種傳輸方式
作者動態(tài) 更多
stm32知識點總結(jié)
2021-11-24 23:12
工程師單片機LED項目
2021-11-11 07:46
電容型負載對跟隨器的影響
2021-10-28 23:33
圖騰柱和互補推挽兩個“小冤家”
2021-10-22 23:15
學(xué)習(xí)單片機的捷徑
2021-10-17 23:07

多功能控制小車

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

多功能車基本功能參數(shù)和關(guān)鍵部件,視頻傳輸這塊和我們現(xiàn)在智能家具這塊無線視頻原理一樣,下面會有介紹。

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

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

3.四個直流減速電機

4.WIFI數(shù)傳模塊

5.電機驅(qū)動模塊

6.STM32F105主控板

7.UVC攝像頭

8.小車底盤

最后實現(xiàn)電腦或手機通過wifi和軟件控制小車動作并實時監(jiān)控。

框圖

基本框圖:

基本編程軟件

keil5

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

這次采用庫函數(shù)編程,采用傳統(tǒng)的標(biāo)準(zhǔn)庫,HAL庫后續(xù)可以。

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

舵機這塊是兩個,上下,左右各一個,180度旋轉(zhuǎn)。

舵機的基本控制原理

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

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

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

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

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

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

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

看看程序中是怎么控制的

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

TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;   //ÅäÖÃΪPWMģʽ1

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_Pulse = Speed_Left-1;   //ÉèÖÃͨµÀ2µÄµçÆ½Ìø±äÖµ£¬Êä³öÁíÍâÒ»¸öÕ¼¿Õ±ÈµÄPWM

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   //µ±¶¨Ê±Æ÷¼ÆÊýֵСÓÚCCR1_ValʱΪ¸ßµçƽ

TIM_OC1Init(TIM5, &TIM_OCInitStructure);   //ʹÄÜͨµÀ1

TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable);

我們改變這個值

Speed_Left-1就可以改變舵機角度。

這個是整個產(chǎn)品的核心wifi模塊

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

wifi模塊的工作原理

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

這個是實際的wifi圖傳模塊

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

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

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

1:點擊打開串口,此時WIFI的狀態(tài)是沒有上電的。

2:給WIFI上電此時要注意串口開始打?。ê荜P(guān)鍵)。

3:輸入命令firstboot就可以了。

這個wifi模塊怎么刷固件openwrt系統(tǒng)的。

首先通過USB口給設(shè)備供電,通過miniUSB口加上usb轉(zhuǎn)網(wǎng)口網(wǎng)線連接電腦。

準(zhǔn)備刷機工具TFTP服務(wù)端:tftp32  就是局域網(wǎng)內(nèi)可以傳文件。

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

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

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

1.攝像頭選擇

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

2.配置 OpenWrt 支持 usb 攝像頭

看看怎么配置

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

選中 Video 支持配置:

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

在展開的選項中選中 uvc:

看看電機驅(qū)動模塊:

基本原理如下

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

看看電機是怎么正反裝的

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

這是整個系統(tǒng)的核心板STM32F105

正好國慶期間可以把程序?qū)憣?,用一個stm32f103的模板,還是103的標(biāo)準(zhǔn)庫,改一下測試再105上可以不?

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

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

就懷疑時鐘的問題,先軟件仿真看看,調(diào)試狀態(tài)找到RCC。

看看能看出來時鐘對不

寄存器里面的值不太了解

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

發(fā)現(xiàn)時鐘不對,再網(wǎng)上查看資料說105和103的啟動文件不一樣。

宏定義這需要改成STM32F10X_CL。

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

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

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

現(xiàn)在我們在仿真調(diào)試看看實際的時鐘頻率。

主頻這個16進制值為0x044AA200,經(jīng)過計算為72.000000。

這樣就配置ok了。

為了讓小車強勁有力,我們采用松下的18650電池,一個是2600MAH,兩串兩并的話就是8.4V ,總?cè)萘?0400MAH。

這是兩個電池的

加上快充充電器,網(wǎng)上買的,后續(xù)介紹。

我們現(xiàn)在準(zhǔn)備組裝小車。

這是小車底盤

組裝鋰電池

完畢。

剩下的小車組裝完畢

下面開始程序調(diào)試

小車的電機直接有電池供電,L298N驅(qū)動。

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

簡單把程序這塊介紹下,主要是串口通信。

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

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

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

1.圖形和代碼分析

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

#define MAX_SIZE  12               //緩沖區(qū)大小

 

typedef struct 

{

  unsigned char head;        //緩沖區(qū)頭部位置

  unsigned char tail;         //緩沖區(qū)尾部位置

  unsigned char ringBuf[MAX_SIZE]; //緩沖區(qū)數(shù)組

} ringBuffer_t;

 

ringBuffer_t buffer;                 //定義一個結(jié)構(gòu)體

2.定義一個結(jié)構(gòu)頭體則表示新的消息隊列已經(jīng)創(chuàng)建完成。新建創(chuàng)建的隊列,頭指針head和尾指針tail都是指向數(shù)組的元素0。如下圖所示,此時的消息隊列是“空隊列”。

當(dāng)如果有11個數(shù)據(jù)abcdefghijk存入緩沖隊列,則如下圖所示:

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

3.讀取緩沖隊列中的11個數(shù)據(jù)后,狀態(tài)如下:

當(dāng)消息隊列中的所有數(shù)據(jù)都讀取出來后,此時環(huán)形隊列是空的,狀態(tài)如下圖所示。從圖可以總結(jié)得知,如果tail和head相等,則表示緩沖隊列是空的。

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

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

這是電腦控制軟件

功能非常強大的,

這是手機APP

聲明:本內(nèi)容為作者獨立觀點,不代表電子星球立場。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯的朋友,別忘了一鍵三連哦!
贊 9
收藏 6
關(guān)注 211
成為作者 賺取收益
全部留言
0/200
  • dy-blNlwnWV 2021-02-17 10:04
    佩服
    回復(fù)
  • keyhei66 2020-12-16 22:00
    對我很有幫助
    回復(fù)
  • heiha88 2020-12-12 23:17
    小車給力
    回復(fù)
  • lihui710884923 2020-11-16 14:21
    樓主上位機軟件也可以做?
    回復(fù)
  • dy-hBP6LUqp 2020-09-19 11:34
    佩服樓主
    回復(fù)