STM32单片机介绍_单片机智能控制DIY
STM32庫函數開發系列文章目錄
第一篇:STM32F103ZET6單片機雙串口互發程序設計與實現
第二篇:最簡單DIY基于STM32單片機的藍牙智能小車設計方案
第三篇:最簡單DIY基于STM32F407探索者開發板的MPU6050陀螺儀姿態控制舵機程序
第四篇:最簡單DIY基于STM32F407探索者開發板和PCA9685舵機控制模塊的紅外遙控機械臂控制程序
第五篇:注釋最詳細、代碼最簡單的STM32+攝像頭+顯示屏的顏色跟蹤電路軟硬件方案
第六篇:最簡單DIY基于STM32單片機的WIFI智能小車設計方案
前言
????daodanjishui物聯網核心原創技術之最簡單DIY基于STM32單片機的WIFI智能小車設計方案。
????市面上有各種開源STM32+ESP8266-01S的無線WIFI控制小車,但是有復雜的有簡單的,如果想快速入門STM32+ESP8266AT固件開發,這個方案會給你一個快捷高效的方案。
一、最簡單DIY基于STM32單片機的WIFI智能小車設計方案是什么?
????我記得本欄的第二篇博文:最簡單DIY基于STM32單片機的藍牙智能小車設計方案 的設計中大量使用了庫函數和別人的開源代碼,魯迅先生的“拿來主義”表現的淋漓盡致,這也是STM32庫函數開發的魅力所在,完成了串口藍牙通信實現了無線藍牙控制的小車。為了實現WIFI高速通信和物聯網技術的融合,所以誕生第六篇博文。
????這次的方案主要是:STM32F103C8T6單片機通過串口2發送AT指令控制ESP8266-1S與筆記本電腦的網絡調試助手通信,從而實現用網絡調試助手無線遙控單片機執行小車行進。下面請看全家福:
下圖中,左上角的是串口WIFI看模塊,右上角的是串口藍牙模塊,代碼風格有一點變動,不過照樣是同一個作者的勞動成果。
網絡調試助手控制小車的指令收發如下:
單片機串口1打印調試信息如下圖。(使用到本欄第一篇原創串口互發技術)
優酷視頻演示地址:https://v.youku.com/v_show/id_XNTE2NTg5OTM2MA==.html
最簡單DIY基于STM32單片機的WIFI智能小車設計方案
二、閉門造車日記
1.準備硬件和接線
采用雙層透明亞克力板結構,使用帶有數碼管顯示的電源,帶有獨立開關的L298N模塊,一片STM32F103C8T6作為主控,兩個18650高能鋰電池供電,一個ESP8266-01S串口WIFI模塊,三根銅柱把第二層的亞克力板撐起來了,整個小車結構都由我手工設計和搭建,看起來就像是一個藝術品。這次的小車功能拓展提高了很多,首先支持三個串口同時使用,我定義串口一作為串口調試使用,串口二作為與ESP8266進行通信使用,串口三留給買家自行擴展,需要注意的是:stm32觸發串口中斷需要加入 \r\n,串口2是與ESP8266模塊鏈接的,stm32的串口2中斷必須接收到\r\n 才能觸發串口中斷,十六進制就是 0d 0a,串口2收到的數據會通過串口1輸出到電腦串口調試助手,這樣用串口1可以調試程序,看看串口2的WIFI模塊是否接收到數據另外給串口1發送數據的話,串口1會返回相同的數據,同時串口1也往串口2發送數據,這樣也可以測試WIFI模塊是否能回復給電腦網絡調試助手服務器。
根據上面兩個截圖的
連接說明:串口1作為調試打印輸出,可以不接
串口2作為ESP8266-01S與STM32F103C8T6通信的接口,必須接入
所以STM32 的PA2作為TX端 連接8266的RX端
所以STM32 的PA3作為RX端 連接8266的TX端
ESP8266必須與STM32共地,ESP8266模塊供電3.3V
ESP8266的EN接3.3V
ESP8266的RST、IO0、IO2都不需要接線
STM32的 PA4 接L298N的第一個管腳PIN0
STM32的 PA5 接L298N的第一個管腳PIN1
STM32的 PA6 接L298N的第一個管腳PIN2
STM32的 PA7 接L298N的第一個管腳PIN3
或者是(不同的L298N模塊的編號可能不一樣)
STM32的 PA4 接L298N的第一個管腳PIN1
STM32的 PA5 接L298N的第一個管腳PIN2
STM32的 PA6 接L298N的第一個管腳PIN3
STM32的 PA7 接L298N的第一個管腳PIN4
2.設計過程
????代碼都是daodanjishui原創開源和親自測試驗證,保證了代碼精簡易懂,適合快速入門上手二次開發,核心技術知識點足夠多。為了這個作品,曾經的我把正點原子開源論壇關于ESP8266的帖子都看遍了!但是后面我上手SDK開發了,這電路是我對以前走的彎路進行一次致敬!
???? 為了發布小車開源方案,daodanjishui瘋狂閉門造車,每一個開源方案就造一部車,就有點像鋼鐵俠那樣瘋狂,一個成年人造這種車,要么是想掙錢,要么就是想玩。每次造車我都會用新的模塊去搭建,因為實在不想去拆解重裝了,還有一個原因就是:總有一天我會像鋼鐵俠電影那樣,用一個眼鏡或者是頭盔去同時集群控制這些玩意兒。這些小車的構造和程序都比較簡單,盡量不要涉及到過于復雜的編碼,但是又要體現出萬物互聯的精髓。一個人不管做什么事情,只要不斷重復做成一個體系那么就容易成功。
????說說這次電路的功能和特點:這次用網絡調試助手作為服務器控制WIFI智能小車,所以需要組建一個局域網,再也不用以前AP熱點的模式了,因為用STA模式,小車具有的功能更加容易擴展,后期我要加上WebSocket技術實現集群控制的,現在是在醞釀一個大招。代碼的風格沿用MDK5串口互發的基本框架,這個框架以前我作為免費開源的資料上傳電路城。最簡單DIY基于STM32單片機的藍牙智能小車設計方案 用的是串口1和2互發進行調試,這次也不例外,不過這次代碼復雜了很多,雖然也是用串口1和串口2,但是串口2控制ESP8266的程序移植和改進了正點原子的源碼,可以完美實現斷線重連服務器,摒棄了顯示屏的優點,還有心跳程序檢測連接的功能。特別是在心跳程序的地方 詳細注釋了如何使用定時器來檢測WIFI傳輸過程中出現問題的邏輯處理。WIFI開發采用了串口AT指令控制,這也是正點原子剛開始出WIFI教程時候的方式,雖然現在廣泛用Arduino 的ESP8266集成開發環境來開發,但是這個源碼是非常值得學習的,因為涉及到非常多的知識點。小車控制使用網絡調試助手指令去觸發小車運動,這樣更加直觀看到調試信息和減少買家掌握這個電路的難度。利用串口1的打印功能,讀者很容易掌握著代碼的精髓。
3.準備一份經典的STM32串口庫函數源碼
為了快速掌握讀者STM32串口通信,最后附上STM32串口庫函數源碼免費下載鏈接。
代碼如下(示例):
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "usart2.h"
//串口實驗
//技術支持:daodanjishui
int main(void)
{
u8 t;
u8 len;
u8 len2;
delay_init(); //延時函數初始化
NVIC_Configuration(); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
uart_init(9600); //串口初始化為9600
uart2_init(9600);
//LED_Init(); //LED端口初始化
//KEY_Init(); //初始化與按鍵連接的硬件接口
while(1)
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的數據長度
/* //因為我這里要把氣象站的數據傳回來,所以不能直接返回數據給氣象站,否則可能出錯 printf("電腦 send to串口1的數據為:\r\n"); for(t=0;t<len;t++) { USART_SendData(USART1, USART_RX_BUF[t]);//單片機通過串口1發送數據給電腦 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束 //printf("\r\n發送成功\r\n");//插入換行 } printf("\r\n");//插入換行 */
u2_printf("電腦 send to串口2的數據為:\r\n");
for(t=0;t<len;t++)
{
USART_SendData(USART2, USART_RX_BUF[t]);//將串口1收到的數據轉發給串口2輸出
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);//等待發送結束
}
u2_printf("\r\n");//插入換行
USART_RX_STA=0;
}
if(USART2_RX_STA&0x8000)
{
len2=USART2_RX_STA&0x3fff;//得到此次接收到的數據長度
u2_printf("電腦 send to串口2的數據為:\r\n");
for(t=0;t<len2;t++)
{
USART_SendData(USART2, USART2_RX_BUF[t]);//單片機通過串口2給電腦發數據
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);//等待發送結束
}
u2_printf("\r\n");//插入換行
//printf("電腦 send to串口1的數據為:\r\n");
printf("\r\n");//作為指令響應的開頭
for(t=0;t<len2;t++)
{
USART_SendData(USART1, USART2_RX_BUF[t]);//將串口2收到的數據轉發給串口1輸出
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
}
printf("\r\n");//插入換行
USART2_RX_STA=0;
}
}
}
4.修改源碼和組合源碼(這部分原創)
先看看代碼截圖:
代碼修改的地方如下:
工程目錄如下:
重點編寫串口2中斷處理程序(這里說明一下,跟本欄的藍牙控制小車的代碼和控制風格差不多):
if(USART2_RX_STA&0X8000) //接收到一次數據了
{
rlen=USART2_RX_STA&0X7FFF; //得到本次接收到的數據長度
USART2_RX_BUF[rlen]=0; //添加結束符
//printf("%s",USART2_RX_BUF); //發送到串口
printf("收到%d字節,內容如下\r\n",rlen);
printf("---%s\r\n",USART2_RX_BUF);
//sprintf((char*)p,"收到%d字節,內容如下",rlen);//接收到的字節數
//在這里寫控制小車的邏輯
if(strstr((const char*)USART2_RX_BUF,"FFF")!=NULL){
flag=0;
}else if(strstr((const char*)USART2_RX_BUF,"BBB")!=NULL){
flag=1;
}else if(strstr((const char*)USART2_RX_BUF,"LLL")!=NULL){
flag=2;
}else if(strstr((const char*)USART2_RX_BUF,"RRR")!=NULL){
flag=3;
}else if(strstr((const char*)USART2_RX_BUF,"SSS")!=NULL){
flag=4;
}else flag=4;
switch (flag)
{
case 0: {
front();
printf("FFF\r\n");
//測試發送一個字符串
sprintf((char*)p,"FFF\r\n");
u2_printf("AT+CIPSEND=0,%d\r\n",strlen((char*)p));//發送數據的AT指令,先寫指令后發送數據
delay_ms(200);
atk_8266_send_data(p,"OK",100); //發送指定長度的數據
break;
}//串口收到前進
case 1: {
back();
printf("BBB\r\n");
//測試發送一個字符串
sprintf((char*)p,"BBB\r\n");
u2_printf("AT+CIPSEND=0,%d\r\n",strlen((char*)p));//發送數據的AT指令,先寫指令后發送數據
delay_ms(200);
atk_8266_send_data(p,"OK",100); //發送指定長度的數據
break;
}
case 2: {
left();
printf("LLL\r\n");
//測試發送一個字符串
sprintf((char*)p,"LLL\n");
u2_printf("AT+CIPSEND=0,%d\r\n",strlen((char*)p));//發送數據的AT指令,先寫指令后發送數據
delay_ms(200);
atk_8266_send_data(p,"OK",100); //發送指定長度的數據
break;
}
case 3: {
right();
printf("RRR\r\n");
//測試發送一個字符串
sprintf((char*)p,"RRR\r\n");
u2_printf("AT+CIPSEND=0,%d\r\n",strlen((char*)p));//發送數據的AT指令,先寫指令后發送數據
delay_ms(200);
atk_8266_send_data(p,"OK",100); //發送指定長度的數據
break;
}
case 4: {
stop();
printf("SSS\r\n");
//測試發送一個字符串
sprintf((char*)p,"SSS\r\n");
u2_printf("AT+CIPSEND=0,%d\r\n",strlen((char*)p));//發送數據的AT指令,先寫指令后發送數據
delay_ms(200);
atk_8266_send_data(p,"OK",100); //發送指定長度的數據
break;
}
default:{
stop();
printf("SSS\r\n");
//測試發送一個字符串
sprintf((char*)p,"SSS\r\n");
u2_printf("AT+CIPSEND=0,%d\r\n",strlen((char*)p));//發送數據的AT指令,先寫指令后發送數據
delay_ms(200);
atk_8266_send_data(p,"OK",100); //發送指定長度的數據
break;
}
}
//車控制結束
USART2_RX_STA=0;
//receive_flag=1;
//if(constate!='+')t=1000; //狀態為還未連接,立即更新連接狀態
//if(constate!='+')t=300; //狀態為還未連接,立即更新連接狀態
//if(constate!='+')t=3; //狀態為還未連接,立即更新連接狀態
if(constate!='+')t=10; //狀態為還未連接,立即更新連接狀態
else t=0; //狀態為已經連接了,10秒后再檢查
}
說明:以上就是我關鍵的代碼,根據工程代碼截圖來看,代碼量大,另外也請讀者尊重原創,編寫源碼也花了不少的寶貴的時間的,尊重勞動成果,請下載我最后附錄上的工程代碼,工程代碼注釋詳細,代碼精簡。
# 三、運行與調試 (1)按照實物圖購買的模塊組裝成小車,L298N,電源模塊或者電源變壓器、電池夾和18650電池兩個, STM32F103C8T6最小系統板、ESP8266-01S、小車底座 一定要注意了:要把ESP8266-01S設置波特率為115200,否則不能與單片機通信,或者買家自行修改代碼的波特率讓兩個單片機通信的串口波特率一樣,否則玩完。 根據源碼接線,燒錄程序進單片機 大概的接線關系是wifi模塊接單片機的串口2
(2)電腦打開一個網絡調試助手,并且提前創建一個局域網熱點,保證讓小車和電腦都能連上。如下:
(3)修改MDK網絡連接的參數編譯代碼燒錄代碼:服務器的IP地址根據網絡調試助手生成的填寫,端口號寫死為8080,熱點名稱和密碼跟買家實際的參數修改
(4)打開串口調試助手調試小車的串口1,上電看看串口調試打印信息:
(5)看到連上服務器之后,在服務器發送一個指令:FFF 注意要發送換行回車\r\n作為結束符號,代碼就是這樣識別指令傳輸結束的。
(6)拔掉串口1調試線,小車下地測試遠程遙控。FFF前進,BBB后退,LLL左轉,RRR右轉,SSS停止。讀者可以親自測試,都是簡單的指令,很好入門的。
根據上面的調試與仿真,證明了該設計滿足了博文提出的要求。
總結
????總結:用ESP8266AT指令來連接服務器有一個好處是可以讓STM32做控制算法的處理,如果用ESP8266做通信又做算法處理,那么可能導致性能發揮有限。雖然ESP8266與STM32直接采用串口2相連速度有點慢,但是好處就是穩定,ESP8266跑的是網絡協議棧,STM32跑的是裸機程序,相互配合,程序相當穩定。做物聯網控制的買家可以很好參考我這個代碼來改造成智能WIFI插座、WIFI機器人、智能家居等等,如果你自己想自己去寫這種基礎性代碼,你會發現困難重重一點小問題就能困住你一整天,如果用我搭好的環境去開發將會事半功倍,可能全網還真找不到像我這樣WIFI智能小車的程序。
????下個智能小車專題,我會加入手機上位機和網頁上位機或者C# 上位機實現一些方便快捷的控制,再也不用網絡助手或者是串口調試助手去控制小車了。原創開源值得期待。
最后附上本博文代碼下載地址:https://www.cirmall.com/circuit/24707/
直接跳轉
STM32串口庫函數源碼相關代碼免費下載:https://www.cirmall.com/circuit/19782/
直接跳轉
總結
以上是生活随笔為你收集整理的STM32单片机介绍_单片机智能控制DIY的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Angular NgModule 中的
- 下一篇: 什么是幂等性?(幂等处理是什么意思)(分