最近拥有了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)
|