基於Qt的wifi智能小車的製做(一)

 基於Qt的wifi智能小車的製做(一)函數

        很久不寫博客了,真的是有點慚愧了。翻開上一次的博客,到如今已經2個多月了,只能說是本身太懶惰了!忙是另外一回事!趁今天晚上有點時間回顧下這一段時間的收穫以及作的一些東西,算是一份筆記,一遍之後能回想起。性能

首先說說開始作的一款wifi小車吧,一方面是由於我的的愛好,一方面算是其餘緣由。首先上幾張小車照片。spa

                                                               

因爲光線緣由,可能不太清楚。一下是個人上位機,基於Qt的,整體感受仍是挺漂亮的,不過最主要的仍是有美工的幫助了,在這裏多謝這位美工了。(小車控制主界面).net


再來一張配置控制協議。其中有視頻流地址、控制地址以及端口號,控制動做命令等等……orm


其實作這個小車根本沒有多少難度的,之因此要作也是本身的愛好罷了,今天在這裏記錄下一些珍貴的東西,但願本身之後看到後能想起其中的過程,最讓人享受的仍是作某一件東西的過程。但願高手最下留情。視頻


1.下位機blog

下位機簡單來講就是利用stm32控制驅動小車作動做,不外乎前進、後退、左轉、右轉、中止,在加上雲臺的上升,降低,左轉和右轉,實現的基本原理很簡單,使用的驅動的L298N,控制起來也最簡單;而云臺方向的控制就是利用PWM進行控制。
首先說說舵機的控制吧,這個用到了PWM,下車速度也是利用這個控制的。

舵機的相關原理
1)什麼是舵機
在機器人機電控制系統中,舵機控制效果是性能的重要影響因素。舵機能夠在微機電系統和航模中做爲基本的輸出執行結構,其簡單的控制和輸出使得單片 機系統很是容易與之接口。舵機是一種位置(角度)伺服的驅動器,適用於那些須要不斷變化並能夠保持的控制系統。
2)舵機工做原理
控制信號由接收機的通道進入信號調製芯片,得到直流偏置電壓。它內部有一個基準電路,產生週期爲 20ms,寬度爲 1.5ms 的基準信號,將得到的直流偏置電壓與電位器的電壓比較,得到電壓差輸出。最後,電壓差的正負輸出到電機驅動芯片決定電機的正反轉。當電機轉速必定時,經過級聯減速齒輪帶動電位器旋轉,使得電壓差爲 0,電機中止轉動。固然咱們能夠不用去了解它的具體工做原理,知道它的控制原理就夠了
3)舵機的控制
舵機的控制通常須要一個 20ms 左右的時機脈衝,該脈衝的高電平部分通常爲0.5ms~2.5ms 範圍內的角度控制脈衝部分。以 180 度角度伺服爲例,那麼對應的控制關係爲。
0.5ms-------------0 度
1.0ms-------------45 度
1.5ms-------------90 度
2.0ms-------------135 度
2.5ms-------------180 度

具體的描述以下圖所示:

4)實現程序代碼:

硬件鏈接:雲臺上下轉動舵機鏈接 VCC、 GND、 PB6;雲臺左右轉動舵機鏈接 VCC、GND、 PB8

  1. <span style="font-size:18px;font-weight: normal;">#define ANGLE_000   2         //0 度  
  2.   
  3. #define ANGLE_045   10        //45 度  
  4.   
  5. #define ANGLE_090   15        //90 度  
  6.   
  7. #define ANGLE_135   20        //135 度  
  8.   
  9. #define ANGLE_180   28        //180 度     
  10. /* 全局變量 */  
  11. static u8 CloudStand_Horizontal_Line = 15; //雲臺水平移動  
  12. static u8 CloudStand_Vertical_Line = 15; //雲臺垂直移動  
  13. </span>  

  1. <span style="font-size:18px;font-weight: normal;">/* TIM4 PWM 部分初始化, PWM 輸出初始化, arr 爲自動重裝值; psc 爲時鐘 
  2. 預分頻數 */</span>  
  1. <span style="font-size:18px;font-weight: normal;">  
  2. static void TIM4_PWM_Init(u16 arr,u16 psc)  
  3. {  
  4. GPIO_InitTypeDef GPIO_InitStructure;  
  5. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
  6. TIM_OCInitTypeDef TIM_OCInitStructure;</span>  
  1. <span style="font-size:18px;"><span style="font-weight: normal;">  
  2. </span>下面切記兩個 APB 時鐘初始化,調用不一樣的初始化函數,有同窗不注意,常常  
  3. 在這裏出問題</span><span style="font-size:18px;font-weight: normal;">。  
  4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,  
  5. ENABLE);  
  1. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);  
  2. //設置該引腳爲複用輸出功能,輸出 TIM4 的 PWM 脈衝波形  
  3. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_8;  
  4. //TIM_CH1 TIM_CH3  
  5. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
  6. //複用推輓輸出  
  7. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  8. GPIO_Init(GPIOB, &GPIO_InitStructure);  
  9. //初始化 GPIO  
  10. //初始化 TIM4  
  11. TIM_TimeBaseStructure.TIM_Period = arr;  
  12. //設置在下一個更新事件裝入活動的自動重裝載寄存器週期的值  
  13. TIM_TimeBaseStructure.TIM_Prescaler = psc;  
  14. //設置用來做爲 TIMx 時鐘頻率除數的預分頻值  
  15. TIM_TimeBaseStructure.TIM_ClockDivision = 0;  
  16. //設置時鐘分割  
  17. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  18. //TIM 向上計數模式  
  19. TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);  
  20. //根據 TIM_TimeBaseInitStruct 中指定的參數初始化 TIMx 的時間基數單位  
  21. //初始化 TIM4 通道 1 PWM 模式  
  22. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;  
  23. //選擇定時器模式:TIM 脈衝寬度調製模式 2  
  24. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
  25. //正向通道有效  
  26. TIM_OCInitStructure.TIM_Pulse = 300;  
  27. //佔空時間 總的週期爲 20ms 佔空時間爲約爲 1ms  
  28. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;  
  29. //輸出極性:TIM 輸出比較極性高  
  30. 這 裏 的 TIM_OC1Init 、 TIM_OC1PreloadConfig 、 TIM_OC3Init 、  
  31. TIM_OC3PreloadConfig 的調用,庫函數已經將管腳和 TIM 的通道進行匹配,讀者一  
  32. 定要與本身的配置符合。  
  33. TIM_OC1Init(TIM4, &TIM_OCInitStructure);  
  34. TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);  
  35. //使能預裝載寄存器  
  36. //初始化 TIM4 通道 3 PWM 模式  
  37. TIM_OC3Init(TIM4, &TIM_OCInitStructure);  
  38. TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);  
  39. //使能預裝載寄存器  
  40. TIM_ARRPreloadConfig(TIM4, ENABLE);  
  41. TIM_Cmd(TIM4, ENABLE);  
  42. //使能 TIM4  
  43. CloudStand_Middle();  
  44. }  
  45. void CloudStand_Up(void)  
  46. {  
  47.    if(CloudStand_Vertical_Line > ANGLE_000 +1 )  
  48.   {  
  49.      CloudStand_Vertical_Line--;  
  50.      TIM_SetCompare1(TIM4,CloudStand_Vertical_Line);  
  1. 注意:這裏的 TIM_SetCompare一、 TIM_SetCompare3 函數的調用,要與前面的  
  2. 硬件鏈接管腳、 TIM 通道一致,由於本人此處爲 TIM1 通道和 TIM3 通道,因此這裏調用 TIM_SetCompare一、 TIM_SetCompare3 函數。 <span style="font-weight: normal;">  
  3. //將上下轉動值與寄存器 1 中的值進行比較,左右轉動值和寄存器 3 中的值進  
  4. 行比較  
  5. }  
  6.    if(CloudStand_Vertical_Line == ANGLE_000 +1 )  
  7.    {  
  8.       CloudStand_Vertical_Line++;  
  9.    }  
  10. }  
  11. void CloudStand_Down(void)  
  12. {  
  13.    if(CloudStand_Vertical_Line < ANGLE_180 -1 )  
  14.    {  
  15.       CloudStand_Vertical_Line++;  
  16.       TIM_SetCompare1(TIM4,CloudStand_Vertical_Line);  
  17.   }  
  18.   if(CloudStand_Vertical_Line == ANGLE_180 -1 )  
  19.   {  
  20.       CloudStand_Vertical_Line--;  
  21.   }  
  22. }  
  1. void CloudStand_Left(void)  
  2. {  
  3.    if(CloudStand_Horizontal_Line > ANGLE_000 +1 )  
  4.    {  
  5.        CloudStand_Horizontal_Line--;  
  6.        TIM_SetCompare3(TIM4,CloudStand_Horizontal_Line);  
  7.    }  
  8.   if(CloudStand_Horizontal_Line == ANGLE_000 +1 )  
  9.   {  
  10.      CloudStand_Horizontal_Line++;  
  11.    }  
  12. }  
  1. void CloudStand_Right(void)  
  2. {  
  1. if(CloudStand_Horizontal_Line < ANGLE_180 -1 )  
  2.   
  3.    CloudStand_Horizontal_Line++;  
  4.   TIM_SetCompare3(TIM4,CloudStand_Horizontal_Line);  
  5. }  
  1.   if(CloudStand_Horizontal_Line == ANGLE_180 -1 )  
  2.   {  
  3.      CloudStand_Horizontal_Line--;  
  4.   }  
  5. }  
  1. void CloudStand_Middle(void)  
  2. {  
  3. CloudStand_Horizontal_Line = 15;  
  4. CloudStand_Vertical_Line = 15;  
  5. TIM_SetCompare1(TIM4,ANGLE_000);  
  6. TIM_SetCompare3(TIM4,ANGLE_090);  
  7. }  
  1. void CloudStand_Init(void)  
  2. {  
  3. TIM4_PWM_Init(199,7199); //PWM 頻率 = 50Hz  
  4. }  

小車方向控制相關原理接口

小車的方向就是經過控制stm32管腳的電平的高低來驅動LM298N實現所要的功能。詳情看附件中的代碼。在這裏就不作過多的介紹,介紹多了會被人說成……………………。罵人事件


2.上位機

在下一篇中將重點記錄上位機功能的實現。
相關文章
相關標籤/搜索