TTL 串口相机:功能、使用与调试全解析

电子说

1.4w人已加入

描述

TTL 串口相机:功能、使用与调试全解析

在电子项目中,相机模块是实现图像采集和视频监控功能的重要组件。今天要给大家介绍的是一款 TTL 串口相机,它具有多种实用功能,可广泛应用于各类微控制器项目。下面我们将从相机的概述、接线、测试、不同平台的使用方法以及常见问题解答等方面进行详细介绍。

文件下载:397.pdf

一、相机概述

这款 TTL 串口相机带有 NTSC 视频输出,专为微控制器项目设计,可用于拍照或控制视频流。它具备一些内置功能,如调整图像的亮度、饱和度、色调,自动对比度和亮度调整,以及运动检测等。

1. 设计用途

该相机最初是为监控目的设计的,它可以通过视频引脚持续输出 TV 分辨率的视频(NTSC 单色格式),同时通过串口接收命令。串口命令可以让相机冻结视频并下载 JPEG 彩色图像。例如,在正常情况下,它可以将视频显示在安全监控器上;当检测到运动时,它会拍摄照片并保存到磁盘供后续分析。

2. 规格参数

  • 尺寸:32mm x 32mm
  • 图像传感器:CMOS 1/4 英寸
  • CMOS 像素:0.3M
  • 像素尺寸:5.6um * 5.6um
  • 输出格式:标准 JPEG/M - JPEG
  • 白平衡、曝光、增益:自动
  • 快门:电子滚动快门
  • 信噪比:45DB
  • 动态范围:60DB
  • 最大模拟增益:16DB
  • 帧速:640 * 480 30fps
  • 扫描模式:逐行扫描
  • 视角:60 度
  • 监控距离:最大 15 米(可调)
  • 图像尺寸:VGA(640 480)、QVGA(320 240)、QQVGA(160 * 120)
  • 波特率:默认 38400(不建议更改)
  • 电流消耗:75mA
  • 工作电压:DC +5V
  • 通信:3.3V TTL(三线 TX、RX、GND)

二、相机接线

1. 基本接线

相机模块没有自带连接器,需要将电线焊接到连接垫上。如果不使用视频输出功能,可使用 4 根电线:红色接 +5V 引脚,黑色接接地引脚,白色接 RX 引脚(数据输入到模块),绿色接 TX 引脚(数据从模块输出)。

2. 视频输出接线

若要将 NTSC 视频输出连接到电视或显示器,需再焊接一根黑色电线到第二个接地引脚,一根黄色电线到 CVBS 引脚。

3. 防水版本接线

防水版本的相机已预先接线:红色接 +5V 输入,黑色接接地,绿色接 RX,白色接 TX,黄色接 NTSC 视频信号输出,棕色接 NTSC 视频接地。

三、相机测试

1. 视频输出测试

测试相机的最快方法是使用 NTSC 视频输出连接。大多数电视和显示器需要 RCA 插孔或插头输入,可将备用的 RCA 插孔焊接到相机上,黑色为接地,黄色为信号。将 NTSC 电缆插入显示器,将红色和黑色电源线连接到 +5V 电源,显示器应立即显示单色视频输出。

2. 使用 CommTool 测试

连接设置

使用 CommTool(Windows 实用程序)时,需要建立与相机的串口连接。可以使用 FTDI 朋友或其他 USB/TTL 串口转换器,也可以通过上传空白草图到 Arduino 来“劫持”串口芯片(仅适用于具有单独 USB 接口的 Arduino,如 Uno)。对于 Leonardo、Micro、Yun 或其他基于 ATmega32U4 的控制器,需使用 Leo_passthru 草图。

操作步骤

  • 下载并安装 VC0706 CommTool 软件。
  • 启动软件,选择 Arduino 所在的 COM 端口,打开端口并点击“Get Version”,应能得到响应。
  • 点击“FBUF CTRL”,可以直接从相机获取图像进行调试。具体操作包括:将相机对准要拍照的物体,点击“Stop FBuf”冻结帧缓冲区,点击“Sel File”选择保存 JPG 文件的位置,然后点击“Read”读取相机中的 JPEG 图像。
  • 若要拍摄另一张照片,点击“Resume”恢复视频,需要拍照时再点击“Stop CFbuf”。还可以选择压缩比来调整图像质量和传输时间。

3. 注意事项

不建议更改波特率设置,因为该设置不稳定,即使更改成功,相机重新上电后也会重置。有些实验者因尝试更改波特率而意外禁用了相机,这种情况下我们不会提供更换服务。

四、不同平台的使用方法

1. Arduino 使用

接线

将相机连接到 Arduino 时,使用两个数字引脚和软件串口与相机通信。对于防水相机,部分相机的白色和绿色电线需要交换。同时,需要使用外部存储设备,如 microSD breakout 板来保存图像。

安装库

测试 microSD 卡后,从 Github 下载 Adafruit_VC0706 库,并将其放置在 Arduino 草图文件夹的 libraries 文件夹中。如果使用 Arduino v23 或更早版本,还需要安装 NewSoftSerial 库。

拍照

打开 Arduino IDE,选择 File -> Examples -> Adafruit_VC0706 -> Snapshot 草图并上传到 Arduino。打开串口监视器,相机将拍摄 640x480 的照片并保存到 microSD 卡。可以更改相机使用的引脚和快照图像的尺寸。

运动检测

相机内置运动检测功能,可通过加载 File -> Examples -> Adafruit_VC0706 -> MotionDetect 草图到 Arduino 来实现。可以通过调用 setMotionDetect() 函数开启或关闭运动检测,并通过 motionDetected() 函数轮询相机是否检测到运动。

手动对焦调整

相机使用手动对焦系统,没有自动对焦功能。建议将相机连接到视频监视器,以便直接观察对焦效果,然后使用固定螺丝锁定对焦。对于防水版本的相机,需要拧开外壳进行对焦调整。

2. CircuitPython 与 Python 使用

接线

  • CircuitPython 微控制器接线:将 TTL 相机和 micro SD 卡支架连接到 CircuitPython 板,推荐使用加载了 CircuitPython 的 Feather M0 Adalogger 板。连接相机的 5V 到板的 USB 或 5V 电源,GND 到板的 GND,RX 到板的 TX,TX 到板的 RX,并确保插入格式化有 FAT32 文件系统的 micro SD 卡。
  • Python 计算机接线:以 Raspberry Pi 为例,有两种接线方式:使用外部 USB - 串口转换器或 Pi 的内置 UART。使用内置 UART 时,需要在 raspi - config 中禁用串口控制台并启用串口硬件。

安装库

  • CircuitPython 安装 VC0706:确保运行最新版本的 Adafruit CircuitPython,从 Adafruit 的 CircuitPython 库包中安装必要的库,包括 adafruit_vc0706.mpy、adafruit_sdcard.mpy(如果板不支持 sdcardio)和 adafruit_bus_device。
  • Python 安装 VC0706 库:安装 Adafruit_Blinka 库,根据平台情况启用 UART 并确保运行 Python 3,然后使用命令 sudo pip3 install adafruit - circuitpython - vc0706 安装库。

代码示例

以 CircuitPython 为例,以下代码可实现捕获图像并保存到 micro SD 卡:

import time
import board
import busio
import storage
import sdcardio
import adafruit_vc0706

# Configuration
SD_CS_PIN = board.D10
IMAGE_FILE = "/sd/image.jpg"

# Setup SPI bus
spi = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO)
sdcard = sdcardio.SDCard(spi, SD_CS_PIN)
vfs = storage.VfsFat(sdcard)
storage.mount(vfs, "/sd")

# Create a serial connection for the VC0706
uart = busio.UART(board.TX, board.RX)
vc0706 = adafruit_vc0706.VC0706(uart)

print("VC0706 version:")
print(vc0706.version)

# Set the baud rate
vc0706.baudrate = 115200

# Set the image size
vc0706.image_size = adafruit_vc0706.IMAGE_SIZE_640x480

# Take a picture
print("Taking a picture in 3 seconds...")
time.sleep(3)
print("SNAP!")
if not vc0706.take_picture():
    raise RuntimeError("Failed to take picture!")
frame_length = vc0706.frame_length
print("Picture size (bytes): {}".format(frame_length))

# Write the image to the SD card
print("Writing image: {}".format(IMAGE_FILE), end="")
stamp = time.monotonic()
with open(IMAGE_FILE, "wb") as outfile:
    wcount = 0
    while frame_length > 0:
        to_read = min(frame_length, 32)
        copy_buffer = bytearray(to_read)
        if vc0706.read_picture_into(copy_buffer) == 0:
            raise RuntimeError("Failed to read picture frame data!")
        outfile.write(copy_buffer)
        frame_length -= 32
        wcount += 1
        if wcount >= 64:
            print(".", end="")
            wcount = 0
print()
print("Finished in %0.1f seconds!" % (time.monotonic() - stamp))
vc0706.resume_video()

3. 保存图像到内部文件系统

可以将图像保存到 CircuitPython 或 Python 的内部文件系统,但需要注意一些限制。启用内部存储写入后,无法通过 USB 驱动器连接更改代码。对于非 Express 板,内部存储空间有限,建议仅在有 2 兆字节空间的 Express 板上使用。

激活内部存储

在微控制器上,需要编辑 boot.py 文件来启用内部存储写入。例如:

import digitalio
import board
import storage

switch = digitalio.DigitalInOut(board.D5)
switch.direction = digitalio.Direction.INPUT
switch.pull = digitalio.Pull.UP
storage.remount("/", not switch.value)

代码示例

以下代码可将图像保存到内部文件系统:

import time
import busio
import board
import adafruit_vc0706

IMAGE_FILE = "/image.jpg"
uart = busio.UART(board.TX, board.RX, baudrate=115200, timeout=0.25)
vc0706 = adafruit_vc0706.VC0706(uart)

print("VC0706 version:")
print(vc0706.version)

# Set the image size
vc0706.image_size = adafruit_vc0706.IMAGE_SIZE_640x480

# Take a picture
print("Taking a picture in 3 seconds...")
time.sleep(3)
print("SNAP!")
if not vc0706.take_picture():
    raise RuntimeError("Failed to take picture!")
frame_length = vc0706.frame_length
print("Picture size (bytes): {}".format(frame_length))

# Write the image to the internal storage
print("Writing image: {}".format(IMAGE_FILE), end="", flush=True)
stamp = time.monotonic()
with open(IMAGE_FILE, "wb") as outfile:
    wcount = 0
    while frame_length > 0:
        to_read = min(frame_length, 32)
        copy_buffer = bytearray(to_read)
        if vc0706.read_picture_into(copy_buffer) == 0:
            raise RuntimeError("Failed to read picture frame data!")
        outfile.write(copy_buffer)
        frame_length -= 32
        wcount += 1
        if wcount >= 64:
            print(".", end="", flush=True)
            wcount = 0
print()
print("Finished in %0.1f seconds!" % (time.monotonic() - stamp))
vc0706.resume_video()

4. 保存图像到计算机或 Raspberry Pi / Linux

保存图像到 Raspberry Pi 或其他 Linux 计算机与保存到 CircuitPython 内部文件系统类似,只需根据使用的设置注释和取消注释相应的代码行。

五、常见问题解答

1. 能否更改相机的波特率?

不建议更改波特率,因为该设置不稳定,即使更改成功,相机重新上电后也会重置。更改波特率可能会导致相机永久禁用,我们不会提供更换服务。

2. 相机拍照速度有多快?

这是一款较慢的 UART 相机,传输一张图像可能需要长达 30 秒。它适用于快照或延时摄影,不适合实时分析。

3. 为什么图像颜色偏淡,看起来像单色图像?

由于相机是为监控设计的,其灵敏度延伸到红外范围,导致反射或发射红外线的物体看起来比人眼看到的更亮,在某些情况下图像会显得偏淡,几乎呈单色。可以使用 IR 阻挡滤镜(如 B + W 486)来获得更自然的色彩。

这款 TTL 串口相机具有丰富的功能和广泛的应用场景,但在使用过程中需要注意一些细节,如波特率设置、对焦调整和存储方式等。希望通过本文的介绍,能帮助大家更好地使用这款相机。你在使用过程中遇到过哪些问题呢?欢迎在评论区分享。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分