[CubeMX]stm32通過8266wifi模塊實現手機控制麥輪小車,使用FreeRTOS配置[hal庫]

由於機器人比賽用到了麥輪小車,自己又使用wifi模塊寫過程序,因此做了一個可以用手機APP控制的小車, 同時使用FreeRTOS實現多任務處理,使得stm32的實時性更高。

摘要

STM32F103開發板作爲WIFI麥輪小車系統控制中心,與ESP8266WIFI模塊、直流電機、L298N驅動模塊、蜂鳴器一起構成可用手機控制的WIFI麥輪小車系統。單片機輸出高低電平來驅動電機驅動模塊,控制4個麥輪的轉向,從而產生不同的移動方式。程序能夠自行創建WIFI熱點與手機實現雙向通信,通過wifi模塊完成手機對stm32外設的控制。同時創建FreeRTOS迷你的實時操作系統內核,作爲一個輕量級的操作系統,可滿足系統的多任務時效性。

系統基本方案

本設計採用STM32F103C8T6作爲主控芯片,手機作爲遙控器,通過wifi模塊ESP8266,可控制麥輪小車前進、後退、轉彎、漂移,傳輸穩定距離遠,模塊體積小不佔地方,手機打開APP連接後即可控制方向。stm32先進行wifi模塊初始化,發送AT指令使得wifi模塊進入AP模式,自動創建手機可以連接的熱點,手機接入TCP,開始控制小車。除此之外,stm32通過FreeRTOS執行多任務處理,能夠實現同時控制蜂鳴器和LED燈閃爍,提高了系統的實時響應能力。同時採用了LM2596穩壓模塊,使得航模電池可以同時給單片機和298N供電。通過麥克納母輪,依靠不同的轉向方式,麥輪最終合成一個合力矢量,使得小車在任意方向上都能自由地移動,而不改變車身的方向。

 圖1-1 系統設計程序框圖

各部分方案選擇

電源選擇

由於WIFI控制小車需要脫離電源供電的影響,因此採用航模電池供電,航模電池可移動性更高。
在這裏插入圖片描述

電機選擇

由於麥輪控制小車不需要高速運行,但需要高扭矩,因此選擇大扭矩直流電機。
在這裏插入圖片描述

電機驅動選擇

採用使用L298N芯片。L298N是一種高電壓、大電流電機驅動芯片,屬於H橋集成電路,內部包含4通道邏輯驅動電路,最高工作電壓可達46V,峯值電流可達3A,持續工作電流爲2A。
在這裏插入圖片描述

系統理論分析和計算

麥輪控制方案

在這裏插入圖片描述
全向輪和麥克納母輪常用於機器人領域,實現全方位移動。這種全方位移動方式是基於一個有許多位於機輪周邊的輪軸的中心輪的原理上,這些成角度的周邊輪軸把一部分的機輪轉向力轉化到一個機輪法向力上面。
依靠各自機輪的方向和速度,這些力的最終合成在任何要求的方向上產生一個合力矢量從而保證了這個平臺在最終的合力矢量的方向上能自由地移動,而不改變機輪自身的方向。在它的輪緣上斜向分佈着許多小滾子,故輪子可以橫向滑移。小滾子的母線很特殊,當輪子繞着固定的輪心軸轉動時,各個小滾子的包絡線爲圓柱面,所以該輪能夠連續地向前滾動。麥克納姆輪結構緊湊,運動靈活,是很成功的一種全方位輪。有4個這種新型輪子進行組合,可以更靈活方便的實現全方位移動功能。
麥克納姆輪由輪轂和輥子組成。輥子與輪彀曾45度夾角,理論上任意角度都可以,但一般爲45度。

WIFI模塊使用方案

在這裏插入圖片描述

ESP8266有3種連接模式

1.STA 模式:ESP8266 模塊通過路由器連接互聯網,手機或電腦通過互聯網實現對設備的遠程控制。
2. AP 模式:ESP8266 模塊作爲熱點,手機或電腦直接與模塊連接,實現局域網無線控制。
3. STA+AP 模式:兩種模式的共存模式,即可以通過互聯網控制可實現無縫切換,方便操作。

stm32與8266數據傳輸方案

1.stm32先進行wifi模塊初始化,發送AT指令使得wifi模塊進入AP模式,創建熱點,手機通過8266創建的熱點接入TCP,並進行數據傳輸;
2.通過手機發送信號讓wifi模塊接收到信息,並返回單片機,通過TTL在電腦上顯示;
3.手機發送操控信號,stm32通過wifi模塊接收到信息,並控制電機正反轉,從而實現麥輪控制。

wifi模塊初始化代碼

AT // 測試
AT+CWMODE=2 // 設置工作AP模式
AT+CIPMUX=1 //允許多連接
AT+CWSAP=“APPLE”,“12345678”,1,3 //創建WIFI熱點
AT+CIPSERVER=1,8080 //創建端口號

FREERTOS的編寫方案

FreeRTOS是一個迷你的實時操作系統內核。作爲一個輕量級的操作系統,功能包括:任務管理、時間管理、信號量、消息隊列、內存管理、記錄功能、軟件定時器、協程等,可基本滿足較小系統的需要。
任務調度機制是嵌入式實時操作系統的一個重要概念,也是其核心技術。對於可剝奪型內核,優先級高的任務一旦就緒就能剝奪優先級較低任務的CPU使用權,提高了系統的實時響應能力。
stm32通過FREERTOS創建2個任務,而每個任務分別控制LED燈閃爍與蜂鳴器,實現多任務處理。LED燈通過拉高點亮,拉低熄滅;蜂鳴器拉高發出聲音,拉低則關閉,通過程序語句HAL_GPIO_WritePin(GPIOF, LED0_Pin, GPIO_PIN_RESET)與HAL_GPIO_WritePin(GPIOF, LED0_Pin, GPIO_PIN_SET)來控制拉高和拉低。而HAL_Delay() 實現延遲效果,故可以看到燈閃爍、蜂鳴器報警。
在這裏插入圖片描述

電路與程序設計

核心部分電路設計

關鍵器件說明

  1. 處理器:STM32F103C8T6,8MHz主頻,滿足數據處理和運算的要求。
  2. 傳感器:ESP8266WIFI模塊,3.3-5V供電電壓,UART通訊,波特率115200。
  3. 電機:高扭矩減速電機。
  4. 電機驅動:L298N模塊,驅動部分端子供電範圍Vs:+5V~+35V。
    5) 穩壓模塊:LM2596模塊,控制輸出電壓爲5v給單片機,10v給298N。
    6) 外設:LED燈,蜂鳴器。

電路硬件設計

(1)STM32F103C8T6最小系統電路原理圖
在這裏插入圖片描述

(2)電機驅動電路
ESP8266模塊採集到的數據傳給STM32單片機進行處理,然後輸出控制信號到驅動板,實現麥輪的控制。控制底板接線圖,如圖:

在這裏插入圖片描述

(3)ESP8266模塊
根據芯片的引腳功能,模塊正常使用時,連線應該如下圖所示
在這裏插入圖片描述

(4)蜂鳴器與LED燈
在這裏插入圖片描述

(5)PCB繪製部分
在這裏插入圖片描述

程序代碼設計

程序實現設計思路

1.程序能夠使STM32上的ESP8266自行創建WIFI熱點,並實現手機與stm32雙向通信,通過wifi模塊完成手機對麥克拉姆輪的控制。
2.通過手機發送給WiFi模塊的信息,stm32控制298n的in口電壓,從而控制麥克拉姆輪的正反轉。
3.同時,LED和蜂鳴器會以不同頻率閃爍併發出聲音,實現FreeRTOS的多任務處理。

程序代碼

  1. CubeMX配置
    分配給4個電機8個GPIO口負責拉高和拉低,將UART1給ESP8266使用,UART2給TTL負責調試,再分配給蜂鳴器和LED各一個GPIO口負責控制LED燈閃爍和蜂鳴器報警。

在這裏插入圖片描述

時鐘配置根據需求調整至如下狀態:
在這裏插入圖片描述

  1. keil內代碼編寫
    (1)wifi初始化
int wifi_init()
{
	uint8_t ret=0;
	
	
	ret = Send_AT_commend("AT ", "OK", 100);
	if(!ret)
		return -1;
	ret = Send_AT_commend("AT+CIPMUX=1", "OK", 100);
	if(!ret)
		return -2;
	ret = Send_AT_commend("AT+CIPSERVER=1,8080", "OK", 200); 			//AT+CWJAP="pxc002","?????"
	if(!ret)
		return -3;
	return 1;
}

(2)串口中斷信息傳輸

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart==&huart1)
	{	
		HAL_UART_Receive_IT(&huart1,&my_re_buf1[++pt_w1],1);			
	}
	
	if(huart==&huart2)
	{	
		HAL_UART_Receive_IT(&huart2,&my_re_buf2[++pt_w2],1);
	}
	
}

(3)定時器中斷進行串口信息判斷

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef * htim)
{
	int i=0,len=0;
	if(htim==&htim4)
	{
	
		
		t4_count++;
		

			while(pt_r1<pt_w1 )
		{
			while(pt_r1<pt_w1)
				HAL_UART_Transmit(&huart2,&my_re_buf1[pt_r1++],1,1000);				//½«wifi·¢¸ø°å×ÓµÄÊý¾Ýת·¢µ½PC»ú
			HAL_UART_Transmit(&huart2,(uint8_t *)"\r\n",2,1000);						//ÿÊä³öÒ»Ðкó×Ô¶¯»»ÐÐ
								
			
	
			if(find_str("BACK")){
		
		  HAL_GPIO_WritePin(GPIOA, MOT4_L_Pin|MOT1_L_Pin, GPIO_PIN_SET);
			
			}
			

			
		}
		
		if(pt_r1>=pt_w1)
		{
			pt_w1=pt_r1=0;
			HAL_UART_AbortReceive_IT(&huart1);
			HAL_UART_Receive_IT(&huart1,my_re_buf1,1);
		}
		
		
		while(send_buf[i])send_buf[i++]=0x00;			//Çå¿Õsend_bufÊý×é
		while(pt_r2<pt_w2 )
		{
			
			
			
			
			HAL_UART_Transmit(&huart1,&my_re_buf2[pt_r2++],1,1000);					//½«PC·¢¸ø°å×ÓµÄÊý¾Ýת·¢µ½wifiÄ£¿é
			
			HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);    //LED
			
			
			
			while(pt_r2<pt_w2)
			send_buf[len++]=my_re_buf2[pt_r2++];
			wifi_send(send_buf,len);
			
			
			
		}
		if(pt_r2>=pt_w2)
		{
			pt_w2=pt_r2=0;
			HAL_UART_AbortReceive_IT(&huart2);	
			HAL_UART_Receive_IT(&huart2,my_re_buf2,1);
		}
		
	}
	
	
}

(4)WIFI接收信息及麥輪控制


			if(find_str("GO")){
				
				
				
				 HAL_GPIO_WritePin(GPIOA, MOT2_H_Pin|MOT3_H_Pin|MOT4_H_Pin|MOT1_H_Pin, GPIO_PIN_SET);
       

			
			}
			
			if(find_str("LEFT")){
		
			 HAL_GPIO_WritePin(GPIOA, MOT3_H_Pin|MOT2_H_Pin, GPIO_PIN_SET);
				
			 HAL_GPIO_WritePin(GPIOA, MOT4_L_Pin|MOT1_L_Pin, GPIO_PIN_SET);
       
			
		}
		
			if(find_str("SHOT")){
		
			 HAL_GPIO_WritePin(GPIOA, MOT3_H_Pin|MOT2_H_Pin, GPIO_PIN_SET);
			
			}
			

(5)FreeRTOS多任務創建

 osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
  defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);

  /* definition and creation of myTask02 */
  osThreadDef(myTask02, StartTask02, osPriorityIdle, 0, 128);
  myTask02Handle = osThreadCreate(osThread(myTask02), NULL);

  /* definition and creation of myTask03 */
  osThreadDef(myTask03, StartTask03, osPriorityIdle, 0, 128);
  myTask03Handle = osThreadCreate(osThread(myTask03), NULL);

  /* definition and creation of myTask04 */
  osThreadDef(myTask04, StartTask04, osPriorityIdle, 0, 128);
  myTask04Handle = osThreadCreate(osThread(myTask04), NULL);

(6)蜂鳴器報警task2

void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
  /* Infinite loop */
  for(;;)
  {
    
		 HAL_GPIO_WritePin(GPIOB,FEN_Pin, GPIO_PIN_RESET);
		
		HAL_Delay(1000);
		
		 HAL_GPIO_WritePin(GPIOB,FEN_Pin, GPIO_PIN_SET);
		
			HAL_Delay(200);
		
  }
  /* USER CODE END StartTask02 */
}

(7)LED閃爍task3

void StartTask03(void const * argument)
{
  /* USER CODE BEGIN StartTask03 */
  /* Infinite loop */
  for(;;)
  {
    
		
		 HAL_GPIO_WritePin(GPIOB,LEDB9_Pin, GPIO_PIN_RESET);
		
		HAL_Delay(1000);
		
		 HAL_GPIO_WritePin(GPIOB,LEDB9_Pin, GPIO_PIN_SET);
		
			HAL_Delay(1000);
		
		
  }
  /* USER CODE END StartTask03 */
}

測試結果

測試結果及分析

小車的搭建過程,是從電路到層次化設計中進行的。首先先安裝了底部的電機,之後將麥克納母輪連接至減速電機。

在這裏插入圖片描述

之後,將4個電機的正負極分別連接至2個L298N的8個輸出口。
在這裏插入圖片描述
將繪製好的PCB進行排針的焊接。
在這裏插入圖片描述

把3個LM2596焊接在洞洞板上,進行電源分壓部分的設計。
在這裏插入圖片描述

將之前焊接好的PCB插上STM32與WIFI模塊,完成控制部分的電路設計與連接。在這裏插入圖片描述

整體電路與外部設計完善後,小車的硬件部分基本完工。

在這裏插入圖片描述

之後多次燒錄程序進行調試,最終可以實現WiFi控制麥輪小車的多模式運動,同時LED與蜂鳴器可以根據不同頻率變換。在這裏插入圖片描述

結論與心得

這次小車的製作使我收穫頗豐,除了學到硬件搭建、電路調試、軟件測試相關的知識和技能,我還明白了FreeRTOS的重要性。以前做比賽的時候,由於對嵌入式操作系統瞭解不夠,導致寫多任務程序時很難保證很高的實時性。之後對操作系統有了更深層次的認識後,便嘗試使用了操作系統,並獲得了極大的收穫。在搭建電路時,我也遇到了不少問題。首先是供電的問題,有時候單片機供3.3V電會無法正常工作,於是查閱資料後發現單片機內有5v降壓電路,因此直接給5v供電,成功解決了這個問題。所以,遇到困難時最重要的,是不要被得失所困擾,要一心一意去解決這個問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章