回答

收藏

GD32Semi-Automatic-Camera

GD32 GD32 3595 人阅读 | 0 人回复 | 2017-06-16

本帖最后由 沙漠之风 于 2017-6-17 10:25 编辑

GD32Semi-Automatic-Camera
一、前言
         本作品主要是围绕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. <font size="3"><font size="5"><font size="4">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. keychar = Scan4x4key();
  60. if(keychar!=20)
  61. {
  62. if(keychar==1|keychar==2|keychar==3|keychar==10)
  63. {
  64. //第一件事情,相机随机特效
  65. printf("Do the first thing\t\n");
  66. KeyEvent=1;
  67. effect++;
  68. effect = effect%6+1;
  69. OV7670_Special_Effects(effect);//特效设置
  70. LCD_Fill(0,240,240,320,WHITE);
  71. showhanzi(15,265,10);
  72. showhanzi(55,265,11);
  73. showhanzi(95,265,12);
  74. showhanzi(135,265,13);
  75. showhanzi(175,265,14); }
  76. if(keychar==4|keychar==5|keychar==6|keychar==11)
  77. {
  78. //第二件事情,让舵机水平加垂直
  79. printf("Do the second thing\t\n");
  80. KeyEvent=2;
  81. running=1;
  82. OV7670_Special_Effects(0);//特效设置
  83. LCD_Fill(0,240,240,320,WHITE);
  84. showhanzi(15,265,10);
  85. showhanzi(55,265,11);
  86. showhanzi(95,265,12);
  87. showhanzi(135,265,13);
  88. showhanzi(175,265,14);
  89. }
  90. if(keychar==7|keychar==8|keychar==9|keychar==12)
  91. {
  92. //第三件事情,让视频上传到上位机
  93. printf("Do the third thing\t\n");
  94. KeyEvent=3;
  95. running=0;
  96. OV7670_Special_Effects(0);//特效设置
  97. LCD_Fill(0,240,240,320,WHITE);
  98. showhanzi(15,265,10);
  99. showhanzi(55,265,11);
  100. showhanzi(95,265,12);
  101. showhanzi(135,265,13);
  102. showhanzi(175,265,14);
  103. }
  104. if(keychar==15|keychar==14|keychar==0|keychar==13)
  105. {
  106. //第四件事情,舵机暂停拍照
  107. printf("Do the last thing\t\n");
  108. KeyEvent=4;
  109. running=0;
  110. OV7670_Special_Effects(0);//特效设置
  111. OVstart=1;
  112. LCD_Fill(0,240,240,320,WHITE);
  113. showhanzi(15,265,10);
  114. showhanzi(55,265,11);
  115. showhanzi(95,265,12);
  116. showhanzi(135,265,13);
  117. showhanzi(175,265,14);
  118. } }
  119. if(running==1)
  120. {
  121. delay_1ms(10); //由于舵机转动到具体位置是需要时间的,所以预留一个延迟来保证舵机运转所以需要的时间。
  122. timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_1,SG01);
  123. timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_2,SG02);
  124. if(SGdracti==0)
  125. {
  126. SG01 = SG01+2;
  127. SG02 = SG02+2;
  128. }else
  129. {
  130. SG01 = SG01-2;
  131. SG02 = SG02-2;
  132. }
  133. if(SG01>1350)
  134. {
  135. SGdracti = 1;
  136. }
  137. if(SG01<=650)
  138. {
  139. SGdracti = 0;
  140. }
  141. if(SG02>1350)
  142. {
  143. SGdracti = 1;
  144. }
  145. if(SG02<=650)
  146. {
  147. SGdracti = 0;
  148. } }}}
  149. </font></font></font>
复制代码
五、视频展示
http://player.youku.com/player.php/sid/XMjgyODc1MTgwNA==/v.swf
六、附件
        由于工程文件超过了10M,超出了这界面的要求,附上部分核心代码。
核心代码:
Semi-automatic-camera.rar (9.13 MB, 下载次数: 4, 售价: 2 与非币)


        上位机软件也实在没办法,可以下载试试,如果无法运行又确实需要直接和我联系,我发你。
所用上位机软件:
串口调试助手.rar (204.4 KB, 下载次数: 1, 售价: 2 与非币)

七、项目合作附语
      暑假马上要到,本人暑假比较闲。若哪位兄台有项目,忙不完的可以找我哦!本人很愿意从事GD32、手机APP开发、DSP、FPGA、STM32、STM8、MPS430、PLC、PCB绘图、opencv图像处理项目开发;小弟最近经济比较拮据,大家多多关照哦。联系QQ:1965257078,闲着无聊搞了个网店(https://shop157002201.taobao.com)大家有空过来关注关注,谢谢大家!
分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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