最近擁有了OPENMV,這可是個好攝像頭,雖然他是用我還沒接觸過的Python,但是里面例程超級多啊!大部分都是比較常用的
作為新手,剛開始不知道如何將攝像頭獲得的數據傳給單片機..
于是,迷茫的我最終獲得師兄贊助的通信程序,改成了自己需要的,就分享給大家康康啦
通過單片機給openmv供電5v,我的是openmv3,將openmv3上的P4與P5與單片機上的PA9和PA10 連接,就是單片機的Tx接攝像頭的Rx,單片機的Rx接攝像頭的Tx。如果接電以后,LCD上數值無變化,可能是接線接反了,一般交換過來就行。
openmv要脫機運行,就將程序保存進去,即在IDE界面點左上方的“工具”選擇“將打開的腳本保存到openmvcam”即可,這時給攝像頭上電就能執行程序
就是攝像頭識別四個顏色,四個顏色是有順序的,在我程序里,紅色是1,黃色是2,綠色是4,深藍色是8(本來是紅色是0001,黃色是0010,綠色是0100,深藍色是1000,傳給單片機就轉成了十進制輸出來),然后傳給單片機之后,就可以通過獲得的數據判斷識別到了哪種顏色,進而給單片機相應的指令。
可以通過實際情況修改攝像頭里面程序中的顏色閾值,以達到想要的效果。在不同的環境下,可能顏色的閾值會有點變動,就是識別沒那么準確啦..有能力的小伙伴可以自己修改程序讓攝像頭適應不同環境,我沒能力就只能修改閾值啦..唉..嘆氣,哪個伙伴會的話告訴我!我去下載!
單片機與攝像頭通信以后,識別到對應顏色,會在屏幕上顯示posX,這是顏色中心坐標的橫坐標,顯示posY,這是顏色類別的序號。
這些都是我個人理解,有不對的地方歡迎大家指正啊~我們可以多多交流,一起進步鴨!
以下是主函數的程序
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
extern u16 posX,posY
void color_s()
{
if(posY==1)
{LCD_ShowString(30,100,210,24,24,"red"); }
if(posY==2)
{LCD_ShowString(30,100,210,24,24,"yellow"); }
if(posY==4)
{LCD_ShowString(30,100,210,24,24,"green"); }
if(posY==8)
{LCD_ShowString(30,100,210,24,24,"blue"); }
}
int main(void)
{
u8 x=0;
u8 lcd_id[12];
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)
delay_init(168);
uart_init(115200);
LED_Init();
LCD_Init();
POINT_COLOR=RED;
sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id)
while(1)
{
USART1_Rx_Task();
POINT_COLOR=RED;
color_s();
LCD_ShowNum(30,40,posX,3,24);
LCD_ShowNum(30,70,posY,3,24);
x++;
if(x==12)x=0;
LED0=!LED0;
delay_ms(1000);
}
}
全部資料51hei下載地址:
STM32F407與OPENMV的通信.7z
(335.9 KB, 下載次數: 209)
2019-12-9 01:03 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|