0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

19.4-STM32接收數(shù)據(jù)-狀態(tài)顯示在屏幕 openMV尋跡與小車(chē)控制 Openmv+STM32F103C8T6視覺(jué)巡線(xiàn)小車(chē)

dfhjgfg ? 來(lái)源:dfhjgfg ? 作者:dfhjgfg ? 2024-08-20 11:12 ? 次閱讀

** **功能介紹放開(kāi)頭, 使用便捷無(wú)需愁

這是全網(wǎng)最詳細(xì)、性?xún)r(jià)比最高的STM32實(shí)戰(zhàn)項(xiàng)目入門(mén)教程,通過(guò)合理的硬件設(shè)計(jì)和詳細(xì)的視頻筆記介紹,硬件使用STM32F103主控資料多方便學(xué)習(xí),通過(guò)3萬(wàn)字筆記、12多個(gè)小時(shí)視頻、20多章節(jié)代碼手把手教會(huì)你如何開(kāi)發(fā)和調(diào)試。讓你更快掌握嵌入式系統(tǒng)開(kāi)發(fā)。

**V3.3.0-STM32智能小車(chē) **

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

19.4-STM32接收數(shù)據(jù)-狀態(tài)顯示在屏幕

先通過(guò)串口上位機(jī)模擬發(fā)送、

STM32有視覺(jué)循跡模式、該模式下接收到數(shù)據(jù)根據(jù)狀態(tài)顯示在屏幕上,現(xiàn)在此狀態(tài)并不控制電機(jī)。
在這里插入圖片描述
復(fù)制一下18在上面基礎(chǔ)改,命名成****19-4_LED

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

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

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

uint8_t g_ucUsart2ReceiveData;  //保存串口二接收的數(shù)據(jù)

在這里插入圖片描述
開(kāi)啟接收中斷

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

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

extern uint8_t g_ucUsart2ReceiveData;  //保存串口二接收的數(shù)據(jù)

在這里插入圖片描述
我們需要在串口中斷回調(diào)函數(shù)中加入我們對(duì)接收到數(shù)據(jù)的解析

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

在這里插入圖片描述
在usart.c文件中定義一個(gè)函數(shù)
在這里插入圖片描述
在這里插入圖片描述

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

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

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

然后聲明一下變量

extern int8_t g_cThisState ;//這次狀態(tài)

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

int g_lHW_State = 0;//幫助視覺(jué)調(diào)試 用于表示紅外對(duì)管或者視覺(jué)攝像頭識(shí)別狀態(tài)

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

extern int g_lHW_State;//幫助視覺(jué)調(diào)試 用于表示紅外對(duì)管或者視覺(jué)攝像頭識(shí)別狀態(tài)

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

視覺(jué)模式下 我們顯示一下,我們之前賦值的變量 以測(cè)試我們接收的數(shù)據(jù)是否正確。

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

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

if(g_ucMode == 6)
	{
		sprintf((char*)OledString, "lHW:%d  ", g_lHW_State);//視覺(jué)識(shí)別結(jié)果
		OLED_ShowString(0,0,OledString,12);//這個(gè)是oled驅(qū)動(dòng)里面的,是顯示位置的一個(gè)函數(shù),
		motorPidSetSpeed(0,0);//停住電機(jī)防止亂跑 方便調(diào)試
	}

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

usartCamera_Receive_Data(g_ucUsart2ReceiveData);

在這里插入圖片描述
修改上面程序經(jīng)過(guò)測(cè)試,單片機(jī)

編譯上面程序,并燒錄到我們的單片機(jī)、單片機(jī)連接到電腦、然后電腦模擬openmv發(fā)送正確格式的數(shù)據(jù),手動(dòng)點(diǎn)擊SSCOM發(fā)送數(shù)據(jù)、單片機(jī)可以接收到數(shù)據(jù)并顯示在OLED上(觀察的是OLED的第一行數(shù)值變化)、當(dāng)我們?cè)O(shè)置每1ms發(fā)送一次數(shù)據(jù)時(shí)候,單片機(jī)的OLED有時(shí)候會(huì)出現(xiàn)卡死的情況。所以是單片機(jī)串口接收大量數(shù)據(jù)卡死的情況,經(jīng)過(guò)網(wǎng)上搜索發(fā)現(xiàn)解決問(wèn)題的辦法。

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

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

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

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

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

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

extern uint8_t g_ucUsart2ReceiveData;  //保存串口二接收的數(shù)據(jù)

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

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

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

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5082

    文章

    19123

    瀏覽量

    305148
  • 小車(chē)
    +關(guān)注

    關(guān)注

    0

    文章

    54

    瀏覽量

    20945
  • STM32F103C8T6
    +關(guān)注

    關(guān)注

    108

    文章

    160

    瀏覽量

    83569
  • 尋跡
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    12622
  • openMV
    +關(guān)注

    關(guān)注

    3

    文章

    39

    瀏覽量

    9817
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    19.3-星曈科技 openmv Hopenmv發(fā)送五個(gè)uchar Openmv+STM32F103C8T6視覺(jué)線(xiàn)小車(chē) STM32循跡小車(chē)系列教程

    19.3-【星曈科技】openmv Hopenmv發(fā)送五個(gè)uchar Openmv+STM32F103C8T6視覺(jué)線(xiàn)
    的頭像 發(fā)表于 08-20 11:32 ?894次閱讀
    19.3-星曈科技 <b class='flag-5'>openmv</b> Hopenmv發(fā)送五個(gè)uchar <b class='flag-5'>Openmv+STM32F103C8T6</b><b class='flag-5'>視覺(jué)</b><b class='flag-5'>巡</b><b class='flag-5'>線(xiàn)</b><b class='flag-5'>小車(chē)</b> <b class='flag-5'>STM32</b>循跡<b class='flag-5'>小車(chē)</b>系列教程

    怎樣設(shè)計(jì)OPENMVSTM32的識(shí)別追蹤小車(chē)

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

    通過(guò)STM32輸出PWM波給驅(qū)動(dòng)模塊進(jìn)行小車(chē)運(yùn)動(dòng)狀態(tài)控制

    、與樹(shù)莓派串口通信:實(shí)現(xiàn)與樹(shù)莓派的串口收發(fā)字符類(lèi)型數(shù)據(jù)功能。4、OLED屏的顯示:讓OLED屏能顯示表示當(dāng)前狀態(tài)的字符。1、控制
    發(fā)表于 08-16 07:33

    基于stm32紅外線(xiàn)小車(chē)的設(shè)計(jì)資料分享

    基于stm32的紅外線(xiàn)小車(chē)(基礎(chǔ)版)硬件篇軟件篇一、硬件篇1.stmf103c8t6最小系統(tǒng)板2.l298n電機(jī)驅(qū)動(dòng)模塊3.兩個(gè)紅外傳感器
    發(fā)表于 12-07 06:22

    基于openMV的追球小車(chē)設(shè)計(jì)資料分享

    程序設(shè)計(jì)【microPython】2)STM32控制程序設(shè)計(jì) 【C語(yǔ)言】①對(duì)OpenMV發(fā)送的數(shù)據(jù)包進(jìn)行解析②
    發(fā)表于 01-14 09:23

    基于STM32F103C8T6線(xiàn)小車(chē)制作過(guò)程以及出現(xiàn)的問(wèn)題參考

    基于STM32F103C8T6線(xiàn)小車(chē)制作過(guò)程以及出現(xiàn)的問(wèn)題參考
    發(fā)表于 01-20 06:56

    基于openmv與51小車(chē)串口通信線(xiàn)的相關(guān)資料推薦

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

    基于OPENMVSTM32的識(shí)別追蹤小車(chē)設(shè)計(jì)實(shí)現(xiàn)

    STM32控制器的尋物小車(chē),不多說(shuō),直接進(jìn)入正題!材料準(zhǔn)備小車(chē)底盤(pán)直流減速電機(jī)杜邦線(xiàn)若干7.2V電源L298N模塊
    發(fā)表于 02-25 06:21

    基于stm32的紅外線(xiàn)小車(chē)(基礎(chǔ)版)

    基于stm32的紅外線(xiàn)小車(chē)(基礎(chǔ)版)硬件篇軟件篇一、硬件篇1.stmf103c8t6最小系統(tǒng)板2.l298n電機(jī)驅(qū)動(dòng)模塊3.兩個(gè)紅外傳感器
    發(fā)表于 11-23 18:21 ?0次下載
    基于<b class='flag-5'>stm32</b>的紅外<b class='flag-5'>巡</b><b class='flag-5'>線(xiàn)</b><b class='flag-5'>小車(chē)</b>(基礎(chǔ)版)

    基于openmv與51小車(chē)的串口通信線(xiàn)

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

    循跡識(shí)別小車(chē):(二)STM32部分

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

    OPENMVSTM32的識(shí)別追蹤小車(chē)(詳細(xì)版)之OPENMV

    STM32控制器的尋物小車(chē),不多說(shuō),直接進(jìn)入正題!材料準(zhǔn)備小車(chē)底盤(pán)直流減速電機(jī)杜邦線(xiàn)若干7.2V電源L298N模塊
    發(fā)表于 01-13 12:05 ?0次下載
    <b class='flag-5'>OPENMV</b>和<b class='flag-5'>STM32</b>的識(shí)別追蹤<b class='flag-5'>小車(chē)</b>(詳細(xì)版)之<b class='flag-5'>OPENMV</b>端

    【DIY】基于OpenMVSTM32追球小車(chē)

    簡(jiǎn)單識(shí)別程序設(shè)計(jì)【microPython】2)STM32控制程序設(shè)計(jì) 【C語(yǔ)言】①對(duì)OpenMV發(fā)送的數(shù)據(jù)包進(jìn)行解析②
    發(fā)表于 01-14 13:01 ?39次下載
    【DIY】基于<b class='flag-5'>OpenMV</b>的<b class='flag-5'>STM32</b>追球<b class='flag-5'>小車(chē)</b>

    使用stm32f103c8t6設(shè)計(jì)的藍(lán)牙小車(chē)

    使用stm32f103c8t6設(shè)計(jì)的藍(lán)牙小車(chē),具有前進(jìn)后退,左轉(zhuǎn)右轉(zhuǎn)等功能
    發(fā)表于 08-07 16:08 ?29次下載

    第19.2章-星曈科技 openmv H7 plus openmv視覺(jué)循跡功能-完成視覺(jué)識(shí)別指定區(qū)域 OpenMV視覺(jué)模塊循跡 STM32F103C8T6視覺(jué)線(xiàn)

    第19.2章-【星曈科技】openmv H7 plus openmv視覺(jué)循跡功能-完成視覺(jué)識(shí)別指定區(qū)域 OpenMV
    的頭像 發(fā)表于 08-20 11:28 ?532次閱讀