那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

19.4-STM32接收數據-狀態顯示在屏幕 openMV尋跡與小車控制 Openmv+STM32F103C8T6視覺巡線小車

dfhjgfg ? 來源:dfhjgfg ? 作者:dfhjgfg ? 2024-08-20 11:12 ? 次閱讀

** **功能介紹放開頭, 使用便捷無需愁

這是全網最詳細、性價比最高的STM32實戰項目入門教程,通過合理的硬件設計和詳細的視頻筆記介紹,硬件使用STM32F103主控資料多方便學習,通過3萬字筆記、12多個小時視頻、20多章節代碼手把手教會你如何開發和調試。讓你更快掌握嵌入式系統開發。

**V3.3.0-STM32智能小車 **

**視頻: **[https://www.bilibili.com/video/BV16x4y1M7EN/?spm_id_from=333.337.search-card.all.click]
V3:HAL庫開發、功能:PID速度控制、PID循跡、PID跟隨、遙控、避障、PID角度控制、視覺控制、電磁循跡、RTOS等功能。

19.4-STM32接收數據-狀態顯示在屏幕

先通過串口上位機模擬發送、

STM32有視覺循跡模式、該模式下接收到數據根據狀態顯示在屏幕上,現在此狀態并不控制電機。
在這里插入圖片描述
復制一下18在上面基礎改,命名成****19-4_LED

可以先復制到桌面英文路徑,防止出現中文路徑兼容問題。
在這里插入圖片描述
在這里插入圖片描述
看原理圖攝像頭是預留什么引腳
在這里插入圖片描述
PCB中可以看到接口位置
在這里插入圖片描述
所以我們要初始化一下串口二,然后開啟串口接收中斷
在這里插入圖片描述
串口2 開啟初始化

在這里插入圖片描述
開啟串口中斷
在這里插入圖片描述
生成代碼
在這里插入圖片描述
打開代碼

在這里插入圖片描述
如果發現18章代碼經常出現黑屏,那可能就是6050的初始化卡住了,我們可以注釋掉一下MPU6050部分的代碼。
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
我們先定義一個串口二接收數據變量

uint8_t g_ucUsart2ReceiveData;  //保存串口二接收的數據

在這里插入圖片描述
開啟接收中斷

HAL_UART_Receive_IT(&huart2,&g_ucUsart2ReceiveData,1);  //串口二接收數據

在這里插入圖片描述
聲明一下變量

extern uint8_t g_ucUsart2ReceiveData;  //保存串口二接收的數據

在這里插入圖片描述
我們需要在串口中斷回調函數中加入我們對接收到數據的解析

if(huart == &huart2)//判斷中斷源 是否來自串口二
{
//這里增加解析函數
HAL_UART_Receive_IT(&huart2,&g_ucUsart2ReceiveData,1);  //啟動串口二接收數據
}

在這里插入圖片描述
在usart.c文件中定義一個函數
在這里插入圖片描述
在這里插入圖片描述

/*******************
*  @brief  攝像頭串口協議解析函數 可以連接K210或openmv等
*  @param  data:串口接收到的每個字節
*  @return  
*
*******************/
void usartCamera_Receive_Data(uint8_t data)
{
static uint8_t state = 0;//定義靜態static 變量

if(state==0&&data==0xA5) //判斷第一個是不是幀頭0xA5
{
state=1;//是幀頭0xA5 賦值state=1 表示接收下一個數據
//數據存儲在數組中 "g_ucUsart2ReceivCounter++",這里是先用后加,比如g_ucUsart2ReceivCounter 初值為0,執行這個是先g_ucaUsart2ReceiveBuffer[0]=data,然后g_ucUsart2ReceivCounter++,即后g_ucUsart2ReceivCounter = 1的
g_ucaUsart2ReceiveBuffer[g_ucUsart2ReceivCounter++] = data;
}
else if(state==1&&data==0xA6) //第二個是不是幀頭0xA6
{
state=2;//如果第二個是幀頭0xA6 賦值state=2 表示接收下一個數據
g_ucaUsart2ReceiveBuffer[g_ucUsart2ReceivCounter++] = data;//保存數據
}
else if(state==2)//然后確定開頭是0XA5 0XA6 就開始接收
{
g_ucaUsart2ReceiveBuffer[g_ucUsart2ReceivCounter++]=data;
if(g_ucUsart2ReceivCounter >9||data==0x5B) state=3;  //接收大于9個或者接收到幀尾0X5B 就置位狀態三
}
else if(state==3) //狀態三
{
if(g_ucaUsart2ReceiveBuffer[g_ucUsart2ReceivCounter-1] == 0x5B)  //確定 最后一個是不是0x5B幀尾 是幀尾0x5B 就認為通信正確 處理數據
{
state = 0;//這里就可以處理數據了、處理完記得清空數組和重置標志位與計數值
g_ucUsart2ReceivCounter = 0;//清零計數值
//比如根據數據設置紅外旋轉偏移狀態
?
//1.設置快速 慢速右邊 左邊 數字存儲的變量意義: [0]和[1]:幀頭、[2]:攝像頭左邊數第一個感興趣區域、[3]:左邊第二個、[4]:左邊第三個、[5]:左邊第四個、[6]:左邊第五個、[7]:幀尾
 if(g_ucaUsart2ReceiveBuffer[6]==0&&g_ucaUsart2ReceiveBuffer[5]==0&&g_ucaUsart2ReceiveBuffer[3]==0&&g_ucaUsart2ReceiveBuffer[2]==0)
 {
g_cThisState=0;//前進
g_lHW_State=22222;//設置這個顯示在OLED上方便調試 五個值 以此從左向右表示 從左向右的五個區域
 }
 if(g_ucaUsart2ReceiveBuffer[6]==0&&g_ucaUsart2ReceiveBuffer[5]==1&&g_ucaUsart2ReceiveBuffer[3]==0&&g_ucaUsart2ReceiveBuffer[2]==0)
 {
g_cThisState=-1;//應該右轉
g_lHW_State=22212;//表示右數第二個 識別到線
 }
 if(g_ucaUsart2ReceiveBuffer[6]==1&&g_ucaUsart2ReceiveBuffer[5]==0&&g_ucaUsart2ReceiveBuffer[3]==0&&g_ucaUsart2ReceiveBuffer[2]==0)
 {g_cThisState=-2;//快速右轉
 g_lHW_State=22221;
 }
 if(g_ucaUsart2ReceiveBuffer[6]==1&&g_ucaUsart2ReceiveBuffer[5]==1&&g_ucaUsart2ReceiveBuffer[3]==0&&g_ucaUsart2ReceiveBuffer[2]==0)
 {g_cThisState=-3;//快速右轉
 g_lHW_State=22211;
 }
 if(g_ucaUsart2ReceiveBuffer[6]==0&&g_ucaUsart2ReceiveBuffer[5]==0&&g_ucaUsart2ReceiveBuffer[3]==1&&g_ucaUsart2ReceiveBuffer[2]==0)
 {g_cThisState=1;//應該左轉
 g_lHW_State=21222;
 }
                 if(g_ucaUsart2ReceiveBuffer[6]==0&&g_ucaUsart2ReceiveBuffer[5]==0&&g_ucaUsart2ReceiveBuffer[3]==0&&g_ucaUsart2ReceiveBuffer[2]==1)
 {g_cThisState=2;//快速左轉
 g_lHW_State=12222;
 }
                 if(g_ucaUsart2ReceiveBuffer[6]==0&&g_ucaUsart2ReceiveBuffer[5]==0&&g_ucaUsart2ReceiveBuffer[3]==1&&g_ucaUsart2ReceiveBuffer[2]==1)
 {g_cThisState=3;//快速左轉
 g_lHW_State=11222;
 }
?
//2.然后清空數組
for(int i=0;i< 10;i++) g_ucaUsart2ReceiveBuffer[i]=0x00;//清空數組

}
else //不是幀尾說明通信錯誤重新開始接收
{
state=0;
g_ucUsart2ReceivCounter =0;
for(int i=0;i< 10;i++) g_ucaUsart2ReceiveBuffer[i]=0x00;//清空數組
}
}
else
{//其他異常清空
state=0;
g_ucUsart2ReceivCounter =0;
for(int i=0;i< 10;i++) g_ucaUsart2ReceiveBuffer[i]=0x00;//清空數組
}
}

然后聲明一下變量

extern int8_t g_cThisState ;//這次狀態

在這里插入圖片描述
定義一個變量 并且在main文件中聲明一下

int g_lHW_State = 0;//幫助視覺調試 用于表示紅外對管或者視覺攝像頭識別狀態

在這里插入圖片描述
聲明一下

extern int g_lHW_State;//幫助視覺調試 用于表示紅外對管或者視覺攝像頭識別狀態

在這里插入圖片描述
我們需要再定義模式,這個模式是視覺循跡模式

視覺模式下 我們顯示一下,我們之前賦值的變量 以測試我們接收的數據是否正確。

//這里編寫觸發中斷后要執行的程序
			if(g_ucMode == 6) g_ucMode = 1;//g_ucMode模式是0 1 2 3 4 5  6
			else
			{
				g_ucMode+=1;
			}

在這里插入圖片描述
增加模式6,的功能,我們先只顯示視覺識別結果

if(g_ucMode == 6)
	{
		sprintf((char*)OledString, "lHW:%d  ", g_lHW_State);//視覺識別結果
		OLED_ShowString(0,0,OledString,12);//這個是oled驅動里面的,是顯示位置的一個函數,
		motorPidSetSpeed(0,0);//停住電機防止亂跑 方便調試
	}

在這里插入圖片描述
別忘記我們的解析函數,加到串口中斷處理函數中

usartCamera_Receive_Data(g_ucUsart2ReceiveData);

在這里插入圖片描述
修改上面程序經過測試,單片機

編譯上面程序,并燒錄到我們的單片機、單片機連接到電腦、然后電腦模擬openmv發送正確格式的數據,手動點擊SSCOM發送數據、單片機可以接收到數據并顯示在OLED上(觀察的是OLED的第一行數值變化)、當我們設置每1ms發送一次數據時候,單片機的OLED有時候會出現卡死的情況。所以是單片機串口接收大量數據卡死的情況,經過網上搜索發現解決問題的辦法。

這個博客是搜索到可以解決問題的鏈接: [https://blog.csdn.net/qq_44629109/article/details/131002223]

參考博客如下部分:
在這里插入圖片描述
所以我們要更改如下代碼:

__HAL_UART_ENABLE_IT(&huart2, UART_IT_ERR);// 啟用UART2的錯誤中斷功能

在這里插入圖片描述
在USART.C 中添加如下代碼

/* UART 錯誤回調函數 處理串口錯誤 */
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
    if(__HAL_UART_GET_FLAG(huart,UART_FLAG_ORE) != RESET) //使用__HAL_UART_GET_FLAG宏檢查UART的overrun錯誤標志位是否被置位。如果返回值不等于RESET,表示overrun錯誤標志位被置位,即發生了overrun錯誤
    {
        __HAL_UART_CLEAR_OREFLAG(huart);//使用__HAL_UART_CLEAR_OREFLAG宏清除UART的overrun錯誤標志位
        HAL_UART_Receive_IT(&huart2,&g_ucUsart2ReceiveData,1);  //使用HAL庫函數啟動UART2接收中斷,并設置接收緩沖區的大小為1字節
    }
}

在這里插入圖片描述
添加串口2接收變量的聲明

extern uint8_t g_ucUsart2ReceiveData;  //保存串口二接收的數據

在這里插入圖片描述
讓單片機處于模式6(按六下 KEY1)
在這里插入圖片描述
上面我們測試通過上位機發送數據,然后觀察屏幕。

然后我們把STM32底板接到openmv,openmv連接電腦,openmv使用的程序是19章3節的程序****19-3-openmv
在這里插入圖片描述
然后上面如果沒有問題,就可以把openmv 程序通過"將打開的腳本保存到openmv Cam(作為main.py)"

接法如下:
在這里插入圖片描述
這里就說明了如何接受的數據,后面的19.5講解利用數據

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5092

    文章

    19178

    瀏覽量

    307696
  • 小車
    +關注

    關注

    0

    文章

    54

    瀏覽量

    21030
  • STM32F103C8T6
    +關注

    關注

    109

    文章

    162

    瀏覽量

    83994
  • 尋跡
    +關注

    關注

    0

    文章

    6

    瀏覽量

    12645
  • openMV
    +關注

    關注

    3

    文章

    39

    瀏覽量

    9853
收藏 人收藏

    評論

    相關推薦

    19.3-星曈科技 openmv Hopenmv發送五個uchar Openmv+STM32F103C8T6視覺小車 STM32循跡小車系列教程

    19.3-【星曈科技】openmv Hopenmv發送五個uchar Openmv+STM32F103C8T6視覺
    的頭像 發表于 08-20 11:32 ?1020次閱讀
    19.3-星曈科技 <b class='flag-5'>openmv</b> Hopenmv發送五個uchar <b class='flag-5'>Openmv+STM32F103C8T6</b><b class='flag-5'>視覺</b><b class='flag-5'>巡</b><b class='flag-5'>線</b><b class='flag-5'>小車</b> <b class='flag-5'>STM32</b>循跡<b class='flag-5'>小車</b>系列教程

    怎樣設計OPENMVSTM32的識別追蹤小車

    OPENMVSTM32的識別追蹤小車(詳細版)之STM32端二:STM32的介紹以及程序2.1(STM
    發表于 08-11 06:27

    通過STM32輸出PWM波給驅動模塊進行小車運動狀態控制

    、與樹莓派串口通信:實現與樹莓派的串口收發字符類型數據功能。4、OLED屏的顯示:讓OLED屏能顯示表示當前狀態的字符。1、控制
    發表于 08-16 07:33

    基于stm32紅外小車的設計資料分享

    基于stm32的紅外小車(基礎版)硬件篇軟件篇一、硬件篇1.stmf103c8t6最小系統板2.l298n電機驅動模塊3.兩個紅外傳感器
    發表于 12-07 06:22

    基于openMV的追球小車設計資料分享

    程序設計【microPython】2)STM32控制程序設計 【C語言】①對OpenMV發送的數據包進行解析②
    發表于 01-14 09:23

    基于STM32F103C8T6小車制作過程以及出現的問題參考

    基于STM32F103C8T6小車制作過程以及出現的問題參考
    發表于 01-20 06:56

    基于openmv與51小車串口通信的相關資料推薦

    **基于openmv與51小車的串口通信**新手小菜雞,寫的可能不大行,歡迎大神指正。硬件連接:我用的是openmv3(注意供電電壓端V
    發表于 01-24 07:26

    基于OPENMVSTM32的識別追蹤小車設計實現

    STM32控制器的尋物小車,不多說,直接進入正題!材料準備小車底盤直流減速電機杜邦若干7.2V電源L298N模塊
    發表于 02-25 06:21

    基于stm32的紅外小車(基礎版)

    基于stm32的紅外小車(基礎版)硬件篇軟件篇一、硬件篇1.stmf103c8t6最小系統板2.l298n電機驅動模塊3.兩個紅外傳感器
    發表于 11-23 18:21 ?0次下載
    基于<b class='flag-5'>stm32</b>的紅外<b class='flag-5'>巡</b><b class='flag-5'>線</b><b class='flag-5'>小車</b>(基礎版)

    基于openmv與51小車的串口通信

    **基于openmv與51小車的串口通信**新手小菜雞,寫的可能不大行,歡迎大神指正。硬件連接:我用的是openmv3(注意供電電壓端V
    發表于 11-29 11:06 ?54次下載
    基于<b class='flag-5'>openmv</b>與51<b class='flag-5'>小車</b>的串口通信<b class='flag-5'>巡</b><b class='flag-5'>線</b>

    循跡識別小車:(二)STM32部分

    、與樹莓派串口通信:實現與樹莓派的串口收發字符類型數據功能。4、OLED屏的顯示:讓OLED屏能顯示表示當前狀態的字符。1、控制
    發表于 12-28 19:09 ?8次下載
    循跡識別<b class='flag-5'>小車</b>:(二)<b class='flag-5'>STM32</b>部分

    OPENMVSTM32的識別追蹤小車(詳細版)之OPENMV

    STM32控制器的尋物小車,不多說,直接進入正題!材料準備小車底盤直流減速電機杜邦若干7.2V電源L298N模塊
    發表于 01-13 12:05 ?0次下載
    <b class='flag-5'>OPENMV</b>和<b class='flag-5'>STM32</b>的識別追蹤<b class='flag-5'>小車</b>(詳細版)之<b class='flag-5'>OPENMV</b>端

    【DIY】基于OpenMVSTM32追球小車

    簡單識別程序設計【microPython】2)STM32控制程序設計 【C語言】①對OpenMV發送的數據包進行解析②
    發表于 01-14 13:01 ?40次下載
    【DIY】基于<b class='flag-5'>OpenMV</b>的<b class='flag-5'>STM32</b>追球<b class='flag-5'>小車</b>

    使用stm32f103c8t6設計的藍牙小車

    使用stm32f103c8t6設計的藍牙小車,具有前進后退,左轉右轉等功能
    發表于 08-07 16:08 ?33次下載

    第19.2章-星曈科技 openmv H7 plus openmv視覺循跡功能-完成視覺識別指定區域 OpenMV視覺模塊循跡 STM32F103C8T6視覺

    第19.2章-【星曈科技】openmv H7 plus openmv視覺循跡功能-完成視覺識別指定區域 OpenMV
    的頭像 發表于 08-20 11:28 ?609次閱讀
    邯郸百家乐园怎么样| 百家乐官网博欲乐城| 百家乐官网娱乐平台代理佣金| 温州百家乐真人网| 百家乐轮盘| 威尼斯人娱乐平台代理| 太阳城会员| 优博娱乐城信誉| 拉萨市| 百家乐官网电子路单破解| 百家乐官网什么平台好| 百家乐官网赢钱的技巧是什么| 百家乐官网英皇赌场娱乐网规则| 网上百家乐怎么破解| 游戏机百家乐庄闲| 澳盈88开户,| 百家乐官网对子的玩法| bet365提款要多久| 百家乐官网有什么打法| 在车库做生意风水| 大发888新址| 定制百家乐官网桌垫| 新锦江百家乐娱乐场开户注册| 澳门赌场视频| 百家乐官网开过的路纸| 百家乐网上最好网站| 百乐坊娱乐城官网| 天天百家乐官网的玩法技巧和规则 | 大发888娱乐城刮刮乐| 最好的百家乐官网娱乐场| 百家乐赌的是心态吗| 百家乐官网使用技法| 百家乐官网庄闲和赢率| 至富百家乐的玩法技巧和规则| 香港六合彩网| 丽景湾百家乐官网的玩法技巧和规则 | 娱乐城开户送金| 功夫百家乐官网的玩法技巧和规则 | 哪个百家乐投注平台信誉好| 大发888娱乐城34| 打百家乐官网的介绍|