当前位置: 首页 > news >正文

ARM DIY(五)摄像头调试

前言

今天,就着摄像头的调试,从嵌入式工程师的角度,介绍如何从无到有,一步一步地调出一款设备。
摄像头型号:OV2640

开发步骤

分为 2 个阶段 5 个步骤
阶段一:
设备树、驱动、硬件
阶段二:
应用程序、测试

Step 1:设备树

a) 摄像头用到了 I2C 和 CSI 接口,所以要在 pinctrl 节点中添加这两种接口的引脚定义,其中 I2C 使用的是 I2C1
b) 添加 CSI 节点
arch/arm/boot/dts/sun8i-v3s.dtsi

        pio: pinctrl@1c20800 {            i2c1_pins: i2c1-pins {pins = "PE21", "PE22";function = "i2c1";};//omit-if-no-refcsi1_mclk_pin: csi1-mclk-pin {pins = "PE1";function = "csi";};csi1_clk: csi1-clk@0 {pins = "PE0","PE2","PE3";bias-disable;function = "csi";};csi1_8bit: csi1-8bit@0 {pins      = "PE6","PE7","PE8","PE9","PE10","PE11","PE12","PE13","PE14","PE15";bias-disable;function = "csi";};}soc {csi1: csi@1cb4000 {compatible = "allwinner,sun8i-v3s-csi";reg = <0x01cb4000 0x3000>;interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;clocks = <&ccu CLK_BUS_CSI>,<&ccu CLK_CSI1_SCLK>,<&ccu CLK_DRAM_CSI>;clock-names = "bus", "mod", "ram";resets = <&ccu RST_BUS_CSI>;status = "okay";};};

c) 使能 I2C 和 CSI 节点
arch/arm/boot/dts/sun8i-v3s-licheepi-zero-dock.dts

&i2c1 {pinctrl-0 = <&i2c1_pins>;pinctrl-names = "default";clock-frequency = <400000>;status = "okay";ov2640: camera@30 {compatible = "ovti,ov2640";reg = <0x30>;pinctrl-names = "default";pinctrl-0 = <&csi1_mclk_pin>;clocks = <&ccu CLK_CSI1_MCLK>;clock-names = "xvclk";assigned-clocks = <&ccu CLK_CSI1_MCLK>;assigned-clock-rates = <24000000>;port {ov2640_0: endpoint {remote-endpoint = <&csi1_ep>;bus-width = <10>;};};};
};&csi1 {status = "okay";pinctrl-names = "default";pinctrl-0 = <&csi1_clk &csi1_8bit>;port {csi1_ep: endpoint {remote-endpoint = <&ov2640_0>;hsync-active = <0>;vsync-active = <0>;bus-width = <10>;pclk-sample = <1>;};};};

Step 2:驱动

使能内核编译选项

> Device Drivers > Multimedia support > I2C Encoders, decoders, sensors and other helper chips<*> OmniVision OV2640 sensor support
注意:
要先禁用
> Device Drivers > Multimedia support[ ]   Autoselect ancillary drivers (tuners, sensors, i2c, spi, frontends)不然无法显示I2C Encoders, decoders, sensors and other helper chips
选项

Step 3:硬件

焊接 24P FPC 翻盖下接排线连接器
焊接 2.8V LDO、1.5V LDO
焊接电阻电容
在这里插入图片描述
测量短路、测量电压、确认外设好坏

Step 4:应用程序

需要用到 i2c-tools、ffmped、fswebcam
在 buildroot Target Packets 中添加

Step 5:测试

step 5.1:I2C 测试

先用 I2C 工具检测摄像头的 I2C 信息

# i2cdetect -y 10  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --                         
#

没有检测到 I2C 设备,SOC 测 I2C 软件是好的,因为 /dev/i2c-1 设备已产生,并且使用 I2C 工具操作 I2C 控制器也没报错,
所以,可能出现问题的节点
a) SOC I2C 引脚没有输出 I2C 信号
b) 摄像头 I2C 引脚没有收到 I2C 信号
c) 摄像头收到 I2C 信号,但是没有做出响应
d) 摄像头 I2C 做出响应,但是 SOC 解析失败
排查
a) 使用逻辑分析仪抓 SOC I2C 引脚信号,发现 SOC 正常发出 I2C 信号,遍历地址 0~0x77 的设备,但是没有收到任何一个响应
b) 使用万用表量摄像头 I2C 引脚到 SOC I2C 引脚的通断,导通,没问题
c) 从上述两点,可知问题原因是:摄像头收到 I2C 信号,但是没有做出响应
继续排查
c1) 检查摄像头供电,使用万用表测量,电源电压正常
c2) 难道是摄像头坏了?遂将 OV2640 插在 ESP32-CAM 板子上进行测试,可以正常摄像,所以摄像头是好的
c3) dmesg 显示

[    1.158234] i2c /dev entries driver
[    1.162410] sun8i-v3s-pinctrl 1c20800.pinctrl: 1c20800.pinctrl supply vcc-pe not found, using dummy regulator
[    1.175129] ov2640 0-0030: Product ID error fa:fa

难道是 vcc-pe 引脚没有电压?
使用万用表测量,发现电压正常
网上搜索该问题,发现可以正常检测到 I2C 的内核 log 中也有该警告,所以应该不是该问题导致
c4) 网上搜到一篇文章《camera调试:i2c不通如何排查?》,介绍了排查 I2C 地址、引脚、供电、reset 引脚、powdn 引脚、上电时序、MCLK 等步骤,我跟着流程依次检查,最后看到 MCLK 时灵光乍现,依稀记得设备树中有配置 MCLK 参数的地方

	ov2640: camera@30 {compatible = "ovti,ov2640";reg = <0x30>;pinctrl-names = "default";pinctrl-0 = <&csi1_mclk_pin>;clocks = <&ccu CLK_CSI1_MCLK>;clock-names = "xvclk";assigned-clocks = <&ccu CLK_CSI1_MCLK>; // 这两行assigned-clock-rates = <24000000>;		// 这两行port {ov2640_0: endpoint {remote-endpoint = <&csi1_ep>;bus-width = <10>;};};};

这份节点参数我是从网上找的,一般 V3S 的晶振使用的是 24MHz 的,而我使用的是 26MHz 的,问题应是这里,改成 26000000,重新测试

[    1.158263] i2c /dev entries driver
[    1.163342] sun8i-v3s-pinctrl 1c20800.pinctrl: 1c20800.pinctrl supply vcc-pe not found, using dummy regulator
[    1.176419] ov2640 1-0030: ov2640 Product ID 26:42 Manufacturer ID 7f:a2
[    1.183768] i2c i2c-1: OV2640 Probed
# i2cdetect -y 10  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

可以检测到摄像头 I2C 设备了。

step 5.2:拍照测试

fswebcam -S 20 -d /dev/video0 -p UYVY -r 800x600 --dumpframe dump.bin fswebcam.jpg

发现没有 /dev/video0 设备
在网上搜了下产生 /dev/video0 设备的内核编译选项,如下图,需要使能 Allwinner V3s Camera Sensor Interface driver
在这里插入图片描述
可是我发现我的 buildroot 中 V4L platform devices 下面并没有该选项
最终,通过在源码的 Kconfig 文件中搜索 Allwinner V3s
在这里插入图片描述再跟着关键字 VIDEO_SUN6I_CSI,在 menuconfig 中一步步搜索,将依赖的编译选项都使能后,终于该选项出现了。使能后,/dev/video0 设备就出现了

# ls /dev/video0 -lh
crw-------    1 root     root       81,   0 Jan  1 00:00 /dev/video0

拍照测试

fswebcam -S 20 -d /dev/video0 -p UYVY -r 800x600 --dumpframe dump.bin fswebcam.jpg

请添加图片描述
录像测试

ffmpeg -f video4linux2 -s 800x600 -r 30 -i /dev/video0 test.avi

请添加图片描述

step 5.3:消除横纹

可以看到,上面拍摄的照片和视频有一道道的横纹,网上搜索发现许多人都遇到了这个问题,基本明确问题原因是电源纹波导致,我尝试换了几颗电源滤波电容,还是没能消除横纹,这个硬件问题后面随缘去解吧,缩短布线是个有效的措施。

至此,摄像头调试,功能部分已 OK,性能调优 TO BE DONE(一般再也不 DONE。。。)。

相关文章:

ARM DIY(五)摄像头调试

前言 今天&#xff0c;就着摄像头的调试&#xff0c;从嵌入式工程师的角度&#xff0c;介绍如何从无到有&#xff0c;一步一步地调出一款设备。 摄像头型号&#xff1a;OV2640 开发步骤 分为 2 个阶段 5 个步骤 阶段一&#xff1a; 设备树、驱动、硬件 阶段二&#xff1a; 应…...

hadoop2.2.0伪分布式搭建

1.准备Linux环境 1.0点击VMware快捷方式&#xff0c;右键打开文件所在位置 -> 双击vmnetcfg.exe -> VMnet1 host-only ->修改subnet ip 设置网段&#xff1a;192.168.1.0 子网掩码&#xff1a;255.255.255.0 -> apply -> ok 回到windows --> 打开…...

高级IO(select、poll、epoll)

在介绍本文之前&#xff0c;先提出一个问题 什么是IO&#xff1f; 等数据拷贝 1.等 - IO事件就绪&#xff08;检测功能成分&#xff09; 2.数据拷贝 高效的IO就是&#xff1a;单位时间&#xff0c;等的比重越小&#xff0c;IO的效率越高 五种IO模型 IO模型&#xff1a; 阻塞式…...

Ceph基础知识和基础架构认识

1 Ceph基础介绍 Ceph是一个可靠地、自动重均衡、自动恢复的分布式存储系统&#xff0c;根据场景划分可以将Ceph分为三大块&#xff0c;分别是对象存储、块设备存储和文件系统服务。在虚拟化领域里&#xff0c;比较常用到的是Ceph的块设备存储&#xff0c;比如在OpenStack项目…...

【C++】快速排序的学习和介绍

前言 本篇文章我们先会学习快速排序这个算法&#xff0c;之后我们会学习sort这个函数 分治算法 在学习快速排序之前&#xff0c;我们先来学习一下分治算法&#xff0c;快速排序就是分治算法的一种&#xff0c;下面是分治算法的介绍&#xff0c; 分治算法&#xff0c;就是”…...

第九章 动态规划part12(代码随想录)

309.最佳买卖股票时机含冷冻期 1. 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j]&#xff0c;第i天状态为j&#xff0c;所剩的最多现金为dp[i][j]。 2. 确定递推公式 拆分卖出股票状态是因为冷冻期前一天一定是具体卖出股票状态。 状态一 dp[i][0]&…...

ssm珠宝首饰交易平台源码和论文

ssm珠宝首饰交易平台源码和论文101 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&a…...

交互设计都有哪些准则?

UI交互设计的本质不是完全基于用户的需求&#xff0c;而是交互设计师需要学习根据用户描述的产品形式来了解用户需要什么。 在交互设计过程中&#xff0c;遵循科学交互设计的本质是整个交互设计过程的重要组成部分&#xff0c;这与产品使用过程中给用户带来的体验密切相关。本…...

【MySQL】从哪几个角度分析数据库失败的原因?

总体评估MySQL服务器感谢 &#x1f496; 总体评估 当发现数据库出现问题时&#xff0c;我们首先应该从全局的角度考虑架构中的所有组件。包括&#xff1a; 服务器&#xff08;数据库和应用程序&#xff09; 存储&#xff1a;存储故障可能导致关键信息丢失网络接口&#xff1a…...

Spring Boot 的核心注解SpringBootApplication

SpringBootApplication 包括的注解 SpringBootConfiguration 组合了 Configuration 注解&#xff0c;实现配置文件的功能。 EnableAutoConfiguration 打开自动配置的功能&#xff0c;也可以关闭某个自动配置的选项&#xff0c; 例如&#xff1a;java 如关闭数据源自动配置功…...

自助式数据分析平台:JVS智能BI功能介绍(一)数据源

一、数据源配置 数据源概述 数据源是JVS-智能BI支持多种数据形态的基础&#xff0c;核心的目标是将不同的数据来源通过统一接入&#xff0c;实现将不同的数据实现统一的数据加工、数据应用。目前JVS-智能BI主要支持3种形态的数据&#xff1a;数据库、API、离线文件。 ​界面介…...

CSS魔术师Houdini,用浏览器引擎实现高级CSS效果

开门见山&#xff0c;直接上货 &#x1f50d; CSS Houdini是什么&#xff1f; “Houdini”一词引用自“Harry Houdini”&#xff0c;他是一位20世纪的著名魔术师&#xff0c;亦被称为史上最伟大的魔术师、逃脱术师及特级表演者。 我们都知道&#xff0c;浏览器在渲染网页显示样…...

DC/DC开关电源学习笔记(二)开关电源的分类

&#xff08;二&#xff09;开关电源的分类 1.DC/DC类开关电源2.AC/DC变换器3.电路结构分类4.功率开关管分类5.电路拓扑分类 根据变换方式&#xff0c;电源产品有下列四大类&#xff1b; &#xff08;1&#xff09;&#xff1a;第一大类&#xff1a;AC/DC开关电源&#xff1b; …...

conda创建python虚拟环境

1.查看当前存在那些虚拟环境 conda env list conda info -e 2.conda安装虚拟环境 conda create -n my_env_name python3.6 2.1在anaconda下改变python版本 当前3.7 安装3.7 conda create -n py37 python3.7 conda activate py37 conda create -n py37 python3.7conda a…...

Python 操作 MongoDB 数据库介绍

MongoDB 是一款面向文档型的 NoSQL 数据库&#xff0c;是一个基于分布式文件存储的开源的非关系型数据库系统&#xff0c;其内容是以 K/V 形式存储&#xff0c;结构不固定&#xff0c;它的字段值可以包含其他文档、数组和文档数组等。其采用的 BSON&#xff08;二进制 JSON &am…...

【ES6】Generator 函数

Generator 函数是 ES6 引入的一种新的函数类型&#xff0c;它既可以生成一个序列&#xff0c;又可以在某个条件下停止执行&#xff0c;并在需要时恢复执行。Generator 函数非常适合处理那些需要按需计算的场景&#xff0c;例如处理大数据、生成随机数等。 Generator 函数的基本…...

「操作系统」1. 基础

前言&#xff1a;操作系统基础八股文 文章目录 一 、操作系统基础1.1 什么是操作系统&#xff1f;1.2 什么是系统调用1.3 什么是中断 &#x1f680; 作者简介&#xff1a;作为某云服务提供商的后端开发人员&#xff0c;我将在这里与大家简要分享一些实用的开发小技巧。在我的职…...

Docker安装Oracl数据库!

安装Docker 查看是否安装docker: yum list installed | grep docker 安装docker: yum -y install docker 启动docker: systemctl start docker 查看docker启劝状态: systemctl status docker 查看docker版本: docker --version 设置docker开机自启动: systemctl en…...

QT子窗口为QWidget类型时,窗口背景不透明的实现方法

1...

leecode 数据库:1158. 市场分析 I

数据导入&#xff1a; SQL Schema&#xff1a; Create table If Not Exists Users (user_id int, join_date date, favorite_brand varchar(10)); Create table If Not Exists Orders (order_id int, order_date date, item_id int, buyer_id int, seller_id int); Create tab…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...