自己动手做数码相机

作者: 叶子疏
自己动手做数码相机_第1张图片
DIYer: ChaN
制作时间: 半个月
制作难度: ★★★★☆
GEEK指数: ★★★★★

编译来源

线性扫描相机是数码相机的一种。这种相机一般在各种机器中作为组成部分发挥作用,一般来说不容易在实际生活中独立见到。这个制作能帮助你DIY并且进一步了解线性扫描相机。
自己动手做数码相机_第2张图片
线性CCD传感器(Charge-coupled Device line sensor,线性电荷耦合传感器)是线性扫描相机中最为重要的部分。我十多年前就在电子城中买下了它。但是想要制作一台小体积的便携线性扫描相机有些困难,电路部分需要高性能的微处理器和大容量存储器,在当时一般的个人制作对这些昂贵的高级货只能敬而远之。于是它被我扔到一个破烂盒子里,连我自己都几乎忘记了。
十年的时间之后,拜飞速发展的半导体工业所赐,芯片们的价格终于降到了可以接受的地步。现在即使是入门的新手也能随意享受到32位的微处理器和海量的存储卡,所以我依靠最新的技术重新开始了这个项目!


1   线性扫描相机

1.1   相机原理

自己动手做数码相机_第3张图片

图注:普通平面相机和线性相机的比较

线性扫描相机是数码相机的一种,它使用线性CCD传感器(一维CCD器件)作为图像传感器。普通的数码相机用一个平面CCD器件(二维CCD器件)捕捉焦平面上的图像,获取的图案是一个二维的平面。而对线性扫描相机来说,它所获取的图案是一条一维的线!
即使每次获得的图像只有一条线,线性扫描相机还是有能力获得完整的图像。在制作一台线性扫描相机时,需要不断移动相机或者被摄物——这样每次获得的部分数据被存储在内存里,并最终像织布一样一条线一条线地拼凑成完整的图像。
在过去的胶片时代有一种狭缝相机。它和这里说的线性扫描相机类似,通过一条窄缝(一维的窗口)成像,拼合一维图像获取完整的二维图像。

1.2   功能应用

线性扫描相机具有下面这些功能:
  • 高分辨率。即使便宜的传感器也能做到10000点以上的分辨率。
  • 简单紧凑的光学系统。不需要扫描桌。
  • 对物体的尺寸和长度没有限制,对很长的物体也能正确成像。
由于这些功能,线性扫描相机在很多地方得到了广泛应用,你可以在许多重要的设备上发现它们。比如:
  • 复印机
  • 图像扫描仪
  • 传真机
  • 机器视觉(检查长形物体)
  • 卫星(比如拍下google地图的那些)
  • 终点摄影(体育比赛)

2   硬件构成

2.1   功能模块

自己动手做数码相机_第4张图片
上图展示了构成线性扫描相机的各个功能模块。线性CCD传感器将收集的光感信息传递到AD(模拟-数字)转换器数字化,然后以数字信号形式输入控制器。这些数据可以显示在显示屏上,或者传输到存储器里。扫描的频率在500线每秒到2000线每秒之间可调,视CCD器件的种类而定。
电路部分被分成三大部分,每块之间通过柔性印刷电路排线相连。我经常不使用定制的PCB因为它们太贵而且没有DIY精神,设计麻烦,之后有改动也麻烦。这种一次性的制作在洞洞板上相机行事最好了。
译注:神一样的DIYer……这是何等的飞线功力……

2.2   光路和外壳

自己动手做数码相机_第5张图片
上图展示了如何为这个线性扫描相机制作外壳。这是从一个高知电子(Takachi electric industrial)的SW-85B塑料盒改造而来的外壳,这个项目的光路需要控制的非常精确,所以设计,加工,装配的时候都需要特别注意。这里有 外壳的图纸 。带有线性传感器的模拟部分电路板安装在可动的螺钉上,这样就能随意调整距离。
这次使用的透镜是C-mount接环的,它是工业摄像头中使用的标准镜头之一,但是不那么好弄到。我用了一个C-CS的转接环来将镜头装到壳体上。一个UNC(英制统一螺纹粗牙系列)螺母粘在盒子的底面上用来固定摄像头。盒内涂了一层导电涂料做电磁屏蔽。

2.3   模拟电路部分

自己动手做数码相机_第6张图片
上图是这个制作中的模拟电路部分,它包含线性扫描相机中最为重要的器件。上面安装了一个CCD线性传感器和模拟电路。CCD线性传感器是一枚东芝的TCD132D单色CCD,它对红外光也敏感,所以为了获得与人眼感觉相近的图像需要一个红外滤镜(IRCF)。CCD线性传感器需要一个来自主控电路板的时钟信号驱动。传感器的模拟图像信号输出先经过一个可变增益放大器(AD8830),再由一个模数转换器(ADC1173)转化为数字信号。ADC1173的8位数字信号输出送入主控电路板。像素采集率从0.5MHZ到2MHZ可变,但是模数转换器必须在工作在至少两倍采样率的时钟频率下。每两次采样之后,向主控电路板输出一次数字信号。这里可以看到 波形图

自己动手做数码相机_第7张图片
这是模拟电路部分的电路图,大图下载请点击 模拟电路图大图

2.4   主控电路部分

自己动手做数码相机_第8张图片
主控电路板包括一个微处理器(MCU),一个可编程逻辑器件(PLD)和电源部分(见图4)。微处理器的芯片是一个NXP的LPC2368,它集成了一个在72MHZ下工作的ARM7TDMI核心,512K字节内存,32K+16K+8K字节的SRAM,还有给力的外围设备。它可以通过一个集成的SD卡控制器在4位原生模式下控制外置的MicroSD存储卡。LPC系列的ARM微处理器广泛用在现在的电子制作中,因为它的市场政策很对路,物美价廉。
一个可编程逻辑器件(LC4256V)被用来驱动CCD线性传感器。PLD里配置了一个用来给传感器提供时钟的时钟产生器和一个先入先出队列。电源供应部分提供了数字电源(3.3V)。和模拟部分的电源(12V)。

自己动手做数码相机_第9张图片
好可怕的一张电路图……

2.5   显示电路部分

自己动手做数码相机_第10张图片
显示部分电路安装在盒子的背面,它提供了相机的操作界面。上面的器件包括一个OLED显示屏,开关。五向键和一个MicroSD插槽。打开盒盖就能安装或者移除SD卡。

自己动手做数码相机_第11张图片
这是显示电路部分的电路图,大图下载请点击 显示电路图大图

2.6   组合效果

自己动手做数码相机_第12张图片
  • 内视图。

自己动手做数码相机_第13张图片
  • 底视图。

自己动手做数码相机_第14张图片
  • 镜头接口视图。

3   软件构成

3.1   数据处理

AD转换器的像素采集率可以高达2.1M像素每秒。首先,图像数据被存储在微处理器的缓冲存储器里。因为每秒2.1M的数据量对软件来说实在太过分,图像数据会存储到PLD的先进先出队列里。队列半满时触发微处理器的DRDT中断,然后微处理器一次接受一半队列的数据。队列的大小是16字节,也就是说软件的操作周期只要有像素采集率的1/8就足够。这对触发中断来说不算太快,但是仍然需要微处理器高速运行。这个项目里用了ARM7TDMI核心的快速中断请求功能(FIQ,fast interrpt request,通过编组寄存器产生低延迟中断),可惜在Cortex-M3核心中这一功能被去掉了。
当微处理器响应FIQ请求时,一些寄存器切换到FIQ的编组寄存器状态,然后FIQ例程可以直接进入/离开而省去了切换过程。为了最大化执行效率,一般来说FIQ例程是用汇编语言写的。在启用这一功能的 数据波形图 里,可以观察到8位的数据在不用存储的时候只需要0.8微秒处理,加上DMA模式下从总线写入SD卡也只用了2微秒,这样的延迟可以接受。
在每一行数据中有1094个像素,但其中有效的只有1024个。这些数据被存入内存,中断信号SYNC#在每一行数据的开始输出,用来同步第一个像素的数据。

3.2   重建图像

捕捉到的数据可以用通用的8位灰度BMP位图格式存储在MicroSD卡里,宽1024像素,长视拍摄时间而定。存储的格式是DCIMLCAMYnnnn.BMP(nnnn 是编号),和普通的数码相机几乎一样。
在使用廉价的微处理器将图像数据存入SD卡时会遇到一些困难,主要是输入的数据要在极短的时间内存进文件。这个制作中的最大数据传输率是2MB每秒。幸运的是LPC2368有一个MCI(SD/MMC卡的原生控制模式),它能提供8MB/s的数据读取和6MB/s的数据写入能力。但是这是指读写大文件时的平均速度,事实上每次读写之间都需要一些死时间用在SD卡的内部处理和文件系统上,为了避免这些浪费,一个数据缓冲器被用来在死时间中暂存数据,但是微处理器系统的内存大小是有限的,不一定有足够的空间进行缓冲。
让我们估计一下每次写数据操作所能容许的时间耗费。在这个制作里,所有32K的SRAM都用来做数据缓冲器,而程序在16K的ethernet RAM上运行。数据缓冲器分成两半,其中一块填充数据的时候另一块将数据写入闪存。 这要求在每8毫秒里写入16KB的数据,每次操作必须在下次操作之前完成 。接下来的软件技巧可以解决这个问题。
数据写入过程中最重要的延迟发生在集群分配时,在实时操作系统里这是个很大的问题,集群分配导致的死时间视情况不同可能高达数秒钟。这个制作里使用集群预分配(写入数据时用f-lseek函数申请一个比目前需要大很多的空间)来避免写入数据时进入分区表重新定位。每次写入操作都包含一个用来结束操作的集群边界条件。想象一下SD卡里的文件预先整理出一块整齐的空间给数据,这就避免了写入数据过程中大量导致延迟的未知问题。
尽管有这些用来尽可能减小死时间的方法,SD卡或多或少还有一些内部处理时间。在挑选SD卡的时候需要挑写入速度尽可能快的SD卡。我在许多牌子之间做过比较,结果发现东芝产SD卡有最小的写入延迟,也有最稳定的表现。

3.3   显示图像

自己动手做数码相机_第15张图片
由于获得的图像数据都是一维的线条,它不能像传统平面成像的二维图像一样显示。为了这个问题需要一些特别的显示模式。
其中一种是范围视图,输入的图像信号连接到Y轴,就像像示波器的输入。Y轴信号表示亮度,X轴信号表示各点在线性传感器上的位置。这个模式适于用来观察感光度和聚焦情况。不同点之间数据的差距可以用来帮助对焦,当图像聚焦时,波形图上产生许多峰谷,出现最大的峰峰值表明焦距已经对上。这是现在数码相机里自动对焦功能的原型。
另外一种是卷动视图,图像向上卷动,新扫描到的图像出现在屏幕底部。这个模式能够用来调整线分辨率。最后生成的二维图像的高宽比决定于线分辨率和物体移动的速度。卷动视图能够展现出捕捉到的2D景象,但是如果被摄物体不移动就只剩下水平的线了,所以相机或者物体之一一定要在给定的运动速度下拍摄,这样才能一边观察一边调节线分辨率。

4   使用说明

线性扫描相机的一般用途同胶片时代的狭缝相机类似。狭缝相机很容易在性能上击败线性扫描相机,它的感光颗粒直径14um,远远小于CCD中单元的直径,意味着极好的分辨率。但是玩狭缝相机意味着你要足够的取景,对焦,拍摄和冲印能力,非老鸟不能为。

相机位置

这个相机需要被固定在合适的角度,这样物体所成的像可以扫过线性传感器。比如说,但物体横向移动或者横方向特别长的话,相机最好固定在线性传感器处于垂直的位置。这个角度必须精确,否则拍出的图片会出现类似平行四边形的扭曲。

调节焦距

这个线性扫描相机由一个5向摇杆控制(上下左右和中键),向右按可以切换显示模式(范围模式或者卷动模式)。首先,输入信号的电平可以通过光圈或者增益控制(上下点击)。增益控制也可以通过左键自动调整。接下来,通过对焦环调节焦距直到信号的峰峰值最大。

调整传感器线分辨率

在卷动模式下可以调节相机匹配传感器线分辨率。调节直到屏幕上显示的是正确的高宽比。传感器线分辨率也可以通过物体移动的速度,物体离镜头的距离和焦距来计算,这略微有些误差,但数字图片是可以通过后期处理来修正的。当然如果传感器线分辨率实在太低的话,这个过程会损失一些信息。通常来说传感器线分辨率高不是坏事,就是灵敏度可能低些。传感器线分辨率影响曝光时间(灵敏度),所以输入电平的增益需要和不同的线分辨率匹配。

获得图像

中间的按钮用来开始/停止拍摄。按下按钮就可以开始记录图像。集群预分配会在0.5秒内完成,然后暂停直到松开。松开按钮时会开始记图像录,然后在任意按钮按下时停止或者直到写入数据到达了集群预分配区域的边界。预分配的大小被配置到10万行(大约100MB),但是可以根据拍摄物的尺寸改变。生成的图像文件可以在电脑上进行预处理,调节图片朝向,高宽比或者做伽玛校正。

5   实拍效果展示

自己动手做数码相机_第16张图片
  • 一列火车——横向运动拍摄。此图为拼图效果,原始大图请点击 火车大图

自己动手做数码相机_第17张图片

自己动手做数码相机_第18张图片

自己动手做数码相机_第19张图片

6   相关资源

电路图: 模拟电路板控制电路板显示电路板

下载: 固件PLD源文件


编辑: comein

果壳DIY站QQ群:132647923, 2群:179240860(加入时请报上你在果壳的个人主页地址,以防广告ID)

果壳DIY站微博: http://t.sina.com.cn/guokrdiy

你可能感兴趣的:(数码相机)