电子说
在电子项目中,相机模块是实现图像采集和视频监控功能的重要组件。今天要给大家介绍的是一款 TTL 串口相机,它具有多种实用功能,可广泛应用于各类微控制器项目。下面我们将从相机的概述、接线、测试、不同平台的使用方法以及常见问题解答等方面进行详细介绍。
文件下载:397.pdf
这款 TTL 串口相机带有 NTSC 视频输出,专为微控制器项目设计,可用于拍照或控制视频流。它具备一些内置功能,如调整图像的亮度、饱和度、色调,自动对比度和亮度调整,以及运动检测等。
该相机最初是为监控目的设计的,它可以通过视频引脚持续输出 TV 分辨率的视频(NTSC 单色格式),同时通过串口接收命令。串口命令可以让相机冻结视频并下载 JPEG 彩色图像。例如,在正常情况下,它可以将视频显示在安全监控器上;当检测到运动时,它会拍摄照片并保存到磁盘供后续分析。
相机模块没有自带连接器,需要将电线焊接到连接垫上。如果不使用视频输出功能,可使用 4 根电线:红色接 +5V 引脚,黑色接接地引脚,白色接 RX 引脚(数据输入到模块),绿色接 TX 引脚(数据从模块输出)。
若要将 NTSC 视频输出连接到电视或显示器,需再焊接一根黑色电线到第二个接地引脚,一根黄色电线到 CVBS 引脚。
防水版本的相机已预先接线:红色接 +5V 输入,黑色接接地,绿色接 RX,白色接 TX,黄色接 NTSC 视频信号输出,棕色接 NTSC 视频接地。
测试相机的最快方法是使用 NTSC 视频输出连接。大多数电视和显示器需要 RCA 插孔或插头输入,可将备用的 RCA 插孔焊接到相机上,黑色为接地,黄色为信号。将 NTSC 电缆插入显示器,将红色和黑色电源线连接到 +5V 电源,显示器应立即显示单色视频输出。
使用 CommTool(Windows 实用程序)时,需要建立与相机的串口连接。可以使用 FTDI 朋友或其他 USB/TTL 串口转换器,也可以通过上传空白草图到 Arduino 来“劫持”串口芯片(仅适用于具有单独 USB 接口的 Arduino,如 Uno)。对于 Leonardo、Micro、Yun 或其他基于 ATmega32U4 的控制器,需使用 Leo_passthru 草图。
不建议更改波特率设置,因为该设置不稳定,即使更改成功,相机重新上电后也会重置。有些实验者因尝试更改波特率而意外禁用了相机,这种情况下我们不会提供更换服务。
将相机连接到 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() 函数轮询相机是否检测到运动。
相机使用手动对焦系统,没有自动对焦功能。建议将相机连接到视频监视器,以便直接观察对焦效果,然后使用固定螺丝锁定对焦。对于防水版本的相机,需要拧开外壳进行对焦调整。
以 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()
可以将图像保存到 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()
保存图像到 Raspberry Pi 或其他 Linux 计算机与保存到 CircuitPython 内部文件系统类似,只需根据使用的设置注释和取消注释相应的代码行。
不建议更改波特率,因为该设置不稳定,即使更改成功,相机重新上电后也会重置。更改波特率可能会导致相机永久禁用,我们不会提供更换服务。
这是一款较慢的 UART 相机,传输一张图像可能需要长达 30 秒。它适用于快照或延时摄影,不适合实时分析。
由于相机是为监控设计的,其灵敏度延伸到红外范围,导致反射或发射红外线的物体看起来比人眼看到的更亮,在某些情况下图像会显得偏淡,几乎呈单色。可以使用 IR 阻挡滤镜(如 B + W 486)来获得更自然的色彩。
这款 TTL 串口相机具有丰富的功能和广泛的应用场景,但在使用过程中需要注意一些细节,如波特率设置、对焦调整和存储方式等。希望通过本文的介绍,能帮助大家更好地使用这款相机。你在使用过程中遇到过哪些问题呢?欢迎在评论区分享。
全部0条评论
快来发表一下你的评论吧 !