AI嵌入式K210项目(13)-Camera

news2024/9/21 11:01:47

文章目录

  • 前言
  • 一、硬件介绍
  • 二、K210对硬件的支持
  • 实验过程
  • 总结


前言

我们这款开发板应该是最便宜的AI开发板了吧,200RMB左右,搭载1TOPS处理能力的K210芯片,丰富的外设接口,内置超多算法,除此之外,开发板还带了屏幕和摄像头。本章我们介绍SPI接口的另一个应用,驱动LCD屏幕。需要开发板可以联系我,可以价格更低哦!
上一章写了LCD屏幕显示,这一章介绍下摄像头,最终实现摄像头的图像在LCD上显示;开发板搭载了OV2640摄像头,OV264是Omni Vision公司生产的一颗CMOS图像传感器,支持最高200万像素,支持自动曝光控制、自动增益控制、自动白平衡、自动消除灯光条纹等自动控制功能。
在这里插入图片描述
在这里插入图片描述

一、硬件介绍

ov2640摄像头模组利用透镜成像的原理,采集图像,通过感光芯片及相关电路来记录和传输图像信号,按一定的分辨率,以隔行扫描的方式采集图像上的点,当扫描到某点时,就通过图像传感芯片将该点处图像的灰度转换成灰度一一对应的电压值,然后将此电压值通过视频信号端输出。

OV2640摄像头与K210开发板通过数字摄像头接口(DVP)连接,DVP 是常用的摄像头接口模块,具有以下特性:

a.支持支持SCCB协议配置摄像头寄存器;

b.支持640×480(30万像素)及以下分辨率,每帧大小可配置;

c.支持YUV422和RGB565格式的图像输入;

d.支持图像同时输出到KPU和显示屏:

-输出到KPU的格式可选RGB888,或YUV422输入时的Y分量,

-输出到显示屏的格式为RGB565;

e.检测到一帧开始或一帧图像传输完成时可向CPU发送中断。

二、K210对硬件的支持

硬件连接图
在这里插入图片描述
在这里插入图片描述
对应的头文件 dvp.h

为用户提供以下接口:

· dvp_init :DVP初始化。

· dvp_set_output_enable:设置输出模式(内存或AI)使能或禁止。

· dvp_set_image_format:设置图像接收模式,RGB或YUV。

· dvp_set_image_size:设置DVP图像采集尺寸。

· dvp_set_ai_addr:设置AI存放图像的地址,供AI模块进行算法处理。

· dvp_set_display_addr:设置采集图像在内存中的存放地址,可以用来显示。

· dvp_config_interrupt:设置图像开始和结束中断状态,使能或禁用。

· dvp_get_interrupt:判断是否是输入的中断类型,返回值:0为否,非0为是。

· dvp_clear_interrupt:清除中断。

· dvp_start_convert:开始采集图像,在确定图像采集开始中断后调用。

· dvp_enable_burst:使能突发传输模式。

· dvp_disable_burst:禁用突发传输模式。

· dvp_enable_auto:使能自动接收图像模式。

· dvp_disable_auto:禁用自动接收图像模式。

· dvp_sccb_send_data:通过sccb协议发送数据。

· dvp_sccb_receive_data:通过SCCB接收数据。

· dvp_sccb_set_clk_rate:设置sccb的速率。

· dvp_set_xclk_rate:设置输入时钟的速率。

实验过程

代码比较多,demo会统一放到gitee上。

首先根据上面的硬件连接引脚图,完成硬件引脚和软件功能的映射关系

#include "fpioa.h"

/*****************************HARDWARE-PIN*********************************/
// 硬件IO口,与原理图对应
#define PIN_LCD_CS             (36)
#define PIN_LCD_RST            (37)
#define PIN_LCD_RS             (38)
#define PIN_LCD_WR             (39)

// camera
#define PIN_DVP_PCLK           (47)
#define PIN_DVP_XCLK           (46)
#define PIN_DVP_HSYNC          (45)
#define PIN_DVP_PWDN           (44)
#define PIN_DVP_VSYNC          (43)
#define PIN_DVP_RST            (42)
#define PIN_DVP_SCL            (41)
#define PIN_DVP_SDA            (40)

/*****************************SOFTWARE-GPIO********************************/
// 软件GPIO口,与程序对应
#define LCD_RST_GPIONUM        (0)
#define LCD_RS_GPIONUM         (1)


/*****************************FUNC-GPIO************************************/
// GPIO口的功能,绑定到硬件IO口
#define FUNC_LCD_CS             (FUNC_SPI0_SS3)
#define FUNC_LCD_RST            (FUNC_GPIOHS0 + LCD_RST_GPIONUM)
#define FUNC_LCD_RS             (FUNC_GPIOHS0 + LCD_RS_GPIONUM)
#define FUNC_LCD_WR             (FUNC_SPI0_SCLK)

void hardware_init(void)
{
    /* lcd */
    fpioa_set_function(PIN_LCD_CS,  FUNC_LCD_CS);
    fpioa_set_function(PIN_LCD_RST, FUNC_LCD_RST);
    fpioa_set_function(PIN_LCD_RS,  FUNC_LCD_RS);
    fpioa_set_function(PIN_LCD_WR,  FUNC_LCD_WR);

    /* DVP camera */
    fpioa_set_function(PIN_DVP_RST,   FUNC_CMOS_RST);
    fpioa_set_function(PIN_DVP_PWDN,  FUNC_CMOS_PWDN);
    fpioa_set_function(PIN_DVP_XCLK,  FUNC_CMOS_XCLK);
    fpioa_set_function(PIN_DVP_VSYNC, FUNC_CMOS_VSYNC);
    fpioa_set_function(PIN_DVP_HSYNC, FUNC_CMOS_HREF);
    fpioa_set_function(PIN_DVP_PCLK,  FUNC_CMOS_PCLK);
    fpioa_set_function(PIN_DVP_SCL,   FUNC_SCCB_SCLK);
    fpioa_set_function(PIN_DVP_SDA,   FUNC_SCCB_SDA);
    
    /* 使能SPI0和DVP */
    sysctl_set_spi0_dvp_data(1);
}
//初始化电源域电压,摄像头和显示器都需要1.8V电平信号,根据所在电源域设置bank6和bank7的电压为1.8V
void io_set_power(void)
{
    sysctl_set_power_mode(SYSCTL_POWER_BANK6, SYSCTL_POWER_V18);
    sysctl_set_power_mode(SYSCTL_POWER_BANK7, SYSCTL_POWER_V18);
}

int main(void)
{
    int OV_type;
    /* 硬件引脚初始化 */
    hardware_init();
    /* 设置IO口电压 */
    io_set_power();

    /* 设置系统时钟和DVP时钟 */
    sysctl_pll_set_freq(SYSCTL_PLL0, 800000000UL);
    sysctl_pll_set_freq(SYSCTL_PLL1, 300000000UL); 
    sysctl_pll_set_freq(SYSCTL_PLL2, 45158400UL);
    uarths_init();

    /* 系统中断初始化,使能全局中断*/
    plic_init();
    sysctl_enable_irq();
    
    /* 初始化LCD */
    lcd_init();
    
    /* LCD显示图片 */
    uint16_t *img = &gImage_logo;
    lcd_draw_picture_half(0, 0, 320, 240, img);
    lcd_draw_string(16, 40, "Hello Yahboom!", RED);
    lcd_draw_string(16, 60, "Nice to meet you!", BLUE);
    sleep(1);

    OV_type=OVxxxx_read_id();
    /* 初始化摄像头 */
    if(OV_type == OV_9655)
    {
        ov9655_init();
    }   
    else if(OV_type == OV_2640) 
    {
        ov2640_init();
    }
    else 
    {
       return 0;//打不开摄像头,结束
    }

    while (1)
    {  
        /* 等待摄像头采集结束,然后清除结束标志 */
        while (g_dvp_finish_flag == 0)
            ;
        g_dvp_finish_flag = 0;

        /* 显示画面 */
       lcd_draw_picture(0, 0, 320, 240, display_buf_addr);
    }

    return 0;
}

在编译过程中有部分同学可能因为SDK版本问题,找不到iomem.h和iomem.c可以到github上下载,放到lib/drivers下

把代码中的camera复制到SDK中的src目录下,

然后进入build目录,运行以下命令编译。

cd build

cmake .. -DPROJ=camera -G "MinGW Makefiles"

make

编译完成后,在build文件夹下会生成camera.bin文件,

打开kflash将camera.bin文件烧录到K210开发板上。
在这里插入图片描述
实验结果
在这里插入图片描述


总结

K210开发板板载dvp接口可以与兼容dvp接口的ov2640摄像头连接使用,画面显示整体来说比较流畅;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1398648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重学Java 10 面向对象

正是风雨欲来的时候,火却越烧越旺了 ——24.1.20 重点 1.为何使用面向对象思想编程 2.如何使用面向对象思想编程 3.何时使用面向对象思想编程 4.利用代码去描述世间万物的分类 5.在一个类中访问另外一个类中的成员 -> new对象 6.成员变量和局部变量的区别 一…

AutoRuns下载安装使用教程(图文教程)超详细

「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 AutoRuns 是微软提供的一款「启动项管理」工具,可以检查开机自动加载的所有程…

写点啥 内核调优吧

一、命令xargs --------------- 参数替换 由于很多命令不支持管道|来传递参数,xargs用于产生某个命令的参数,xargs 可以读入 stdin 的数 据,并且以空格符或回车符将 stdin 的数据分隔成为参数,另外许多命令不能接受过多参数&am…

【论文解读】LERF:语言嵌入的辐射场(ICCV 2023 Oral)

来源:投稿 作者:橡皮 编辑:学姐 论文链接:https://arxiv.org/abs/2303.09553 项目主页:https://lerf.io](https://lerf.io 图 1:语言嵌入辐射场 (LERF)。 LERF 将 CLIP 表示建立在密集、多尺度的 3D 场中。…

Beyond Compare 4 代码对比如何重新激活使用30天

Beyond Compare 4 代码对比如何重新激活使用30天 Beyond Compare 4 是一款强大的文件比较工具,但只有30天的试用期。如果想在试用期结束后继续使用该软件,可以通过修改注册表的方式来实现。具体步骤如下: 1 同时按住“Win”“R”键&#xf…

vue流程图

效果图 组件 <template><div class"processBox" v-if"list.length"><div class"childs"><div class"child" v-for"(item,index) in list" :key"item.id -child-index"><div class&q…

免费三款备受推崇的爬虫软件

在信息爆炸的时代&#xff0c;爬虫软件成为了数据采集、信息挖掘的得力工具。为了解决用户对优秀爬虫软件的需求&#xff0c;本文将专心分享三款备受推崇的爬虫软件&#xff0c;其中特别突出推荐147采集软件&#xff0c;为您开启爬虫软件的奇妙世界。 一、爬虫软件的重要性 爬…

【 Qt 快速上手】-②- Qt 环境搭建

文章目录 1. Qt 开发工具概述1.1 Qt Creator 介绍1.2 Visual Studio 介绍1.3 Eclipse 介绍 2. Qt SDK 的下载与安装2.1 Qt SDK 的下载2.2 Qt SDK 的安装2.3 验证 Qt SDK 安装是否成功2.4 Qt 环境变量配置 1. Qt 开发工具概述 Qt 开发环境需要安装三个部分&#xff1a; C编译器…

配置zabbix平台对数据库以及主从状态的监控

引言&#xff1a;明人不说暗话&#xff0c;今天分享下配置zabbix平台对数据库以及主从状态的监控 准备好zabbix监控平台&#xff08;zabbix-server端&#xff09;例10.12.153.235 db1客户端&#xff08;zabbix-agent&#xff09;例10.12.153.73 1.安装Zabbix存储库 # rpm -Uv…

内衣洗衣机哪个牌子好用?四款小型洗衣机全自动推荐

说起内衣洗衣机很多小伙伴都不陌生&#xff0c;对于很多小伙伴来说内衣洗衣机真的是一个提高幸福感的小家电&#xff0c;市面上的内衣洗衣机无论从功能和配置上都有着很大的区别&#xff0c;没有做攻略的小伙伴很容易就踩雷了&#xff0c;今天给大家分享四款内衣洗衣机&#xf…

进程调度算法

文章目录 主要内容一.进程调度算法1.各调度算法思想2.程序流程图3.源代码代码如下&#xff08;示例&#xff09;: 4.运行结果分析5.先来先服务算法 6.短作业优先算法7.高响应优先算法8.算法结果对比 总结 主要内容 一.进程调度算法 1.各调度算法思想 先来先服务算法&#xff0…

Mysql:重点且常用的操作和理论知识整理 ^_^

目录 1 基础的命令操作 2 DDL 数据库定义语言 2.1 数据库操作 2.2 数据表操作 2.2.1 创建数据表 2.2.2 修改和删除数据表 2.2.3 添加外键 3 DML 数据库操作语言 3.1 插入语句(INSERT) 3.2 修改语句(UPDATE) 3.3 删除语句 3.3.1 DELETE命令 3.3.2 TRUNCATE命令 4 …

java.sql.SQLException: Failed to fetch schema of XXX 问题

遇到问题&#xff1a;java.sql.SQLException: Failed to fetch schema of pay_record表 i.s.r.d.s.s.c.AbstractTableMetaCache : get table meta of the table pay_record error: Failed to fetch schema of pay_record 原因分析&#xff1a; springcloud项目中使用了se…

Yaklang 中的类型和变量

Yaklang 的类型其实非常简单&#xff0c;我们仅需要记住如下类型即可 string 字符串类型&#xff0c;用以快速构建一个字符串int 整数类型&#xff1a;在 64 位机中&#xff0c;int 和 int64 是一样的float 浮点类型&#xff0c;用来定义和表示浮点数byte 本质上等同于 uint8u…

docker安装marcocesarato/php-conventional-changelog报错

composer require --dev marcocesarato/php-conventional-changelog --no-update “marcocesarato/php-conventional-changelog”: “^1.17” 在小皮环境没问题&#xff0c;在dockerswoole环境下报错 "scripts": {"changelog": "conventional-chang…

采用云端SaaS服务的云HIS基层医院信息管理系统源码

目录 一、日常运维工作内容 二、科室巡查工作 三、网络安全管理工作内容 四、业务能力提升学习 云HIS系统业务 一、日常运维工作内容 1. 系统监控&#xff1a;每天早晨第一件事就是打开电脑&#xff0c;查看各个系统的运行状况。通过监控系统&#xff0c;可以实时了解到服…

大数据质量管制规范示例

大数据质量管制规范示例 一、前提概要二、相关概念三、管理原则四、治理委员五、应用管理六、查验方式七、考核比率八、扣分标准九、责任划分十、追责范围十一、其它条例十二、总结 一、前提概要 在当今大数据信息时代&#xff0c;大数据平台&#xff08;大数据平台开发规范示…

【ChatGPT】利用ChatGPT将图片转换成JSON文件

前言 我在创建自己的GPT时,通常会上传一些JSON文件作为知识库,我还制作了一些脚本工具,将PDF文件转换成JSON文件。但是在这个过程中产生一个问题,PDF文件中会有一些图表,JSON文件就不能存储和表达这些图表的内容了。那该怎么办呢?这里跟大家介绍一个方法,可以有效地将图…

【论文笔记】Fully Sparse 3D Panoptic Occupancy Prediction

原文链接&#xff1a;https://arxiv.org/abs/2312.17118 1. 引言 现有的3D占用预测方法建立密集的3D特征&#xff0c;没有考虑场景的稀疏性&#xff0c;因此难以满足实时要求。此外&#xff0c;这些方法仅关注语义占用&#xff0c;无法区分实例。 本文认为场景的稀疏性包含两…

查询指定日期是否为法定工作日的服务接口

在现代社会中&#xff0c;人们的工作与生活节奏日益加快&#xff0c;为了更好地规划工作与休息时间&#xff0c;在开发应用软件时&#xff0c;通过查询指定日期是否为法定工作日的服务接口是一个非常有用的功能。本文将介绍一个API接口&#xff0c;可以根据国家的放假安排来判断…