查看: 308|回复: 1

[GD32F450方案分享] 基于GD32F450半自动相机

[复制链接]

7

主题

1

好友

408

积分

秀才

Rank: 3Rank: 3

  • TA的每日心情
    开心
    2017-6-17 09:42
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2017-6-17 22:27:11 |显示全部楼层
    本帖最后由 沙漠之风 于 2017-6-18 11:20 编辑

    基于GD32F450半自动相机
    一、前言
             本作品主要是围绕OV7670+LCD来设计的,玩单片机已经玩很多年了,一直没有搞过摄像头,心里总感觉缺点什么。这几年机器人、机器视觉、图像处理相当的火,当然玩这些东西,不一定要用这种摄像头,使用USB摄像头就够了,如前些日子玩的树莓派就是直接用USB摄像头来搞的。可是作为嵌入开发的追随者,还是更喜欢这种摄像头,让人能感觉到是自己实实在在的控制着它。
           本作品非常的基础,但是基本需要的东西都覆盖了,分享出来给各位热爱摄像头,热爱机器视觉等嵌入式图像处理的伙伴们。如果你们想用来做项目,可以在我这个作品的基础上去提高其通信速度,将其中的软件IO模拟改成硬件通讯,速度定然能大大提高,做做简单的图像处理中的运动跟踪是完全没有问题的。

    二、系统框图

                                                                             图1.1半自动相机系统框图
    三、功能介绍

    图1.2 系统总体
           从上图中我们可以看到整个系统包括电机部分、显示部分、按键部分、摄像头+MCU ,其中两个舵机够成了云台,使得摄像头可以多方位多角度的拍摄。LCD带有触摸功能,其实我们的矩阵键盘可以不要,直接用这个触摸屏就能实现键盘的功能,只是觉得,按键也是一个仪器设备不可缺少的,将其添加到系统中大家可以选择性的使用。整个系统实现了如下功能:
    1、摄像头垂直+水平的移动
    2、摄像头输出视频帧的特性设置
    3、视频帧在LCD中显示

    图1.3 LCD视频帧显示
    4、视频帧在PC机的串口调试助手上显示

    图1.4 PC端串口调试助手视频帧显示
    5、LCD中实现了画板功能

                                                                                               图1.5 LCD画板


    四、核心代码部分
          代码非常的基础,没有什么好说的,所有的协议都是IO口模拟的,好处是,没有引脚的限制,坏处就是速度慢。
    1. int main(void)
    2. {      
    3.         uint8_t lightmode=1,saturation=0,brightness=1,contrast=1;
    4.         uint8_t effect=0;
    5.         uint8_t running=0;
    6.         uint8_t OVstart=0;
    7.         systick_config();
    8.         Led_gpio_config();        
    9.         BT_gpio_config();//配置引脚
    10.         BT_exit_config();//配置中断,一定要先配置引脚再配置中断,顺序有问题将运行不正确
    11.         BT4x4_gpio_config();
    12.         gd_usart2_init();
    13.         usart2_exit_config();
    14.         SG_gpio_config();
    15.         timer1_config();        
    16.         timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_1,SG01);        
    17.         timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_2,SG02);        
    18.         while(OV7670_Init())//初始化OV7670
    19.         {
    20.                 printf("\r\n The OV7670 is Error!!! \r\n");
    21.                 Delay_ms(200);
    22.         }
    23.         printf("\r\n The OV7670 Init OK!!! \r\n");
    24.         Delay_ms(1500);        
    25.         OV7670_Light_Mode(lightmode);//白平衡设置
    26.         OV7670_Color_Saturation(saturation);//色度设置
    27.         OV7670_Brightness(brightness);//亮度设置
    28.         OV7670_Contrast(contrast);//对比度设置
    29.          OV7670_Special_Effects(effect);//特效设置
    30.         EXTI15_Init();
    31.         OV7670_Window_Set(10,174,320,240);        //设置窗口
    32.         Timer4_config();//10Khz计数频率,1秒钟中断               
    33.         OV7670_Window_Set(10,174,320,240);        //设置窗口        
    34.        OV7670_CSL;//使能AL422B                 
    35.         TP_Init();
    36.         Lcd_Init();                        //初始化OLED  
    37.         spistar()  ;//模拟SPI初始化
    38.         LCD_Clear(WHITE); //清屏
    39.         BACK_COLOR=BLACK;;POINT_COLOR=WHITE;
    40.         showimage(); //显示40*40图片
    41.          while (1){
    42.                if(OVstart==1)
    43.                  {
    44.                          camera_refresh();//更新显示
    45.                  }
    46.                                  /* check whether the button is pressed */
    47.                    if(RESET == gpio_input_bit_get(GPIOA,GPIO_PIN_0)){
    48.                    delay_1ms(1);
    49.                  /* check whether the button is pressed */
    50.               if(RESET == gpio_input_bit_get(GPIOA,GPIO_PIN_0)){
    51.                 GPIO_TG(GPIOD) = GPIO_PIN_7;
    52.                 }                       
    53.                    }
    54.                                 if(jiance()) //检测触摸和按键
    55.                                 {        
    56.                                         showimage(); //显示40*40图片
    57.                                 }
    58.                                 if(ref){showimage();} //显示40*40图片
    59.                
    60.                                   keychar = Scan4x4key();
    61.                                 if(keychar!=20)
    62.                                 {
    63.                                        
    64.                                         if(keychar==1|keychar==2|keychar==3|keychar==10)
    65.                                         {
    66.                                                 //第一件事情,相机随机特效
    67.                                                 printf("Do the first thing\t\n");
    68.                                                 KeyEvent=1;
    69.                                                 effect++;
    70.                                                 effect = effect%6+1;
    71.                                                 OV7670_Special_Effects(effect);//特效设置
    72.                                                 LCD_Fill(0,240,240,320,WHITE);
    73.                                                 showhanzi(15,265,10);
    74.                                                 showhanzi(55,265,11);
    75.                                                 showhanzi(95,265,12);
    76.                                                 showhanzi(135,265,13);
    77.                                                 showhanzi(175,265,14);

    78.                                         }
    79.                                         if(keychar==4|keychar==5|keychar==6|keychar==11)
    80.                                         {
    81.                                                 //第二件事情,让舵机水平加垂直
    82.                                                 printf("Do the second thing\t\n");
    83.                                                 KeyEvent=2;
    84.                                                 running=1;
    85.                                                 OV7670_Special_Effects(0);//特效设置
    86.                                                 LCD_Fill(0,240,240,320,WHITE);
    87.                                                 showhanzi(15,265,10);
    88.                                                 showhanzi(55,265,11);
    89.                                                 showhanzi(95,265,12);
    90.                                                 showhanzi(135,265,13);
    91.                                                 showhanzi(175,265,14);
    92.                                        
    93.                                         }
    94.                                         if(keychar==7|keychar==8|keychar==9|keychar==12)
    95.                                         {
    96.                                                 //第三件事情,让视频上传到上位机
    97.                                                 printf("Do the third thing\t\n");
    98.                                                 KeyEvent=3;
    99.                                                 running=0;
    100.                                                 OV7670_Special_Effects(0);//特效设置
    101.                                                 LCD_Fill(0,240,240,320,WHITE);
    102.                                                 showhanzi(15,265,10);
    103.                                                 showhanzi(55,265,11);
    104.                                                 showhanzi(95,265,12);
    105.                                                 showhanzi(135,265,13);
    106.                                                 showhanzi(175,265,14);                        
    107.                                         }
    108.                                         if(keychar==15|keychar==14|keychar==0|keychar==13)
    109.                                         {
    110.                                                 //第四件事情,舵机暂停拍照
    111.                                                 printf("Do the last thing\t\n");
    112.                                                 KeyEvent=4;
    113.                                                 running=0;
    114.                                                 OV7670_Special_Effects(0);//特效设置
    115.                                                 OVstart=1;
    116.                                                 LCD_Fill(0,240,240,320,WHITE);
    117.                                                 showhanzi(15,265,10);
    118.                                                 showhanzi(55,265,11);
    119.                                                 showhanzi(95,265,12);
    120.                                                 showhanzi(135,265,13);
    121.                                                 showhanzi(175,265,14);                                
    122.                                         }
    123.                                 }
    124.                                 
    125.                                 
    126.                                 //printf("SG01=%d\t\n",SG01);
    127.           if(running==1)
    128.             {
    129.          delay_1ms(10);
    复制代码
    五、视频展示

    六、附件
            由于工程文件超过了10M,超出了这界面的要求,附上部分核心代码。
    核心代码:
    Semi-automatic-camera.rar (9.06 MB, 下载次数: 7, 售价: 2 铜板)

            上位机软件也实在没办法,可以下载试试,如果无法运行又确实需要直接和我联系,我发你。
    所用上位机软件:
    串口调试助手.rar (204.4 KB, 下载次数: 2, 售价: 2 铜板)
    七、项目合作附语
          暑假马上要到,本人暑假比较闲。若哪位兄台有项目,忙不完的可以找我哦!本人很愿意从事GD32、手机APP开发、DSP、FPGA、STM32、STM8、MPS430、PLC、PCB绘图、opencv图像处理项目开发;小弟最近经济比较拮据,大家多多关照哦。联系QQ:1965257078,闲着无聊搞了个网店(https://shop157002201.taobao.com)大家有空过来关注关注,谢谢大家!

    回复

    使用道具 举报

    4

    主题

    0

    好友

    567

    积分

    举人

    Rank: 4

  • TA的每日心情
    无聊
    2016-10-8 20:34
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2017-6-23 10:28:40 来自手机 |显示全部楼层
    你每年暑假都在打广告
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /3 下一条

    手机版|爱板网 |网站地图  

    GMT+8, 2017-9-25 14:04 , Processed in 0.252217 second(s), 13 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部