目录
基础资料
基于Air105开发板:Air105 - LuatOS 文档
探讨重点
对官方camera - 摄像头demo中capture功能的复现,进行相关内容的学习及探讨。
实现功能
功能1:捕捉图片并存入SPI接口外置sd卡;
功能2:捕捉图片并通过Serial 串口接收数据存入电脑;
硬件准备
Air105开发板1块,面包板1块,TFTLCD 屏幕,Micro SD卡模块(SPI)接口1个,摄像头GC032A(SPI) , USB转TTL串口模块,导线若干。
Air105开发板
TFTLCD 屏幕
SD卡模块(SPI),摄像头GC032A(SPI)
CH340G-USB转TTL串口模块
软件版本
AIR105:LuatOS@AIR105 base 22.10 bsp V0011
软件使用
接口文档可参考:camera摄像头
接线示意图
功能1:捕捉图片并存入SPI接口外置SD卡
lcd初始化
spi_lcd = spi.deviceSetup(5,pin.PC14,0,0,8,48*1000*1000,spi.MSB,1,1) --debug信息:显示芯片类型st7735
log.info("lcd.init", --SHPI接口管脚对应连接
lcd.init("st7735",{port = "device",pin_dc = pin.PE08 ,pin_rst = pin.PC12,pin_pwr = pin.PE09,direction = 0,w = 128,h = 160,xoffset = 2,yoffset = 1},spi_lcd))
摄像头初始化
--GC032A输出rgb图像初始化命令
local GC032A_InitReg =
{
zbar_scan = 0,--是否为扫码
draw,开发板未引出_lcd = 1,--是否向lcd输出
i2c_id = 0,
i2c_addr = 0x21,
pwm_id = 5;
pwm_period = 12*1000*1000,
pwm_pulse = 0,
sensor_width = 640,
sensor_height = 480,
color_bit = 16,
init_cmd ="/luadb/GC032A_InitReg.txt"--此方法将初始化指令写在外部文件,支持使用 # 进行注释
}
local camera_pwdn = gpio.setup(pin.PD06, 1, gpio.PULLUP) -- PD06 camera_pwdn引脚,开发板上未引出
local camera_rst = gpio.setup(pin.PD07, 1, gpio.PULLUP) -- PD07 camera_rst引脚,开发板上未引出
camera_rst(0)
-- 拍照, 自然就是RGB输出了
local camera_id = camera.init(GC032A_InitReg)--屏幕输出rgb图像
camera.start(camera_id)--开始指定的camera
log.info("摄像头启动")
/luadb/是开发板的虚拟地址。GC032A_InitReg.txt在烧写主程序时一并烧写入开发板,和main()文件同级。PS:GC032A_InitReg.txt内容为摄像头模组GC032A的初始化的命令(寄存器操作指令及参数),后期另外撰文分析。
GC032A芯片硬件手册的最新版本为:GC032A DataSheet_Release_V1.1_20170314。
GC032ADataSheet-Release-V1.1-20170314(GC032ADataSheet-Release)-单片机文档类资源-CSDN下载
指定capture按钮
gpio.setup(pin.PA10, function() --BOOT键
sys.publish("CAPTURE", true) --点击后系统释放"CAPTURE",并由sys.waitUntil处理
end, gpio.PULLUP,gpio.FALLING)
SD卡初始化
local spiId = 2
local result = spi.setup(
spiId,--串口id
255, -- 不使用默认CS脚,通过gpio.setup(TF_CS, 1)重新指定
0,--CPHA
0,--CPOL
8,--数据宽度
400*1000 -- 初始化时使用较低的频率
)
local TF_CS = pin.PB3
gpio.setup(TF_CS, 1)
--fatfs.debug(1) -- 若挂载失败,可以尝试打开调试信息,查找原因
fatfs.mount("SD", spiId, TF_CS, 24000000)
local data, err = fatfs.getfree("SD")
if data then
log.info("fatfs", "getfree", json.encode(data))
else
log.info("fatfs", "err", err)
end
图片存储
result, data = sys.waitUntil("CAPTURE", 30000) --capture捕获周期为30s
if result==true and data==true then --获取到数据
log.debug("摄像头捕获图像")
os.remove("/sd/temp.jpg")
camera.capture(camera_id, "/sd/temp.jpg", 1) --存储在SD上
功能2:捕捉图片并通过Serial 串口接收数据存入电脑
串口初始化
local uartid = 1 -- 根据实际设备选取不同的uartid
--初始化
local result = uart.setup(
uartid,--串口id
115200,--波特率
8,--数据位
1--停止位
)
官方demo本段代码注释状态,运行前需取消注释,并将SD卡存储部分代码进行注释,不能同时运行。
串口数据接收
demo中选用U1_RX,U2_TX端口。
点击板载BOOT键进行截图后,串口接收到截图信息,API已封装摄像头截图并输出JPEG格式的相关功能。
端口收到的原始数据
串口数据处理
后期可以对HEX 16进制数据解码,采用HEX 16进制数据格式转换为JPEG格式。
HEX 16进制JPG文件信息
提示:JPG文件正常以FF D8开头,FF D9结尾,可以用来辅助判断串口接收信息是否完整。
HEX数据转换为jpeg格式文件
HEX(16进制数据)先转存在txt文档中,再通过Python的binascii库输出为jpeg文件(由十六进制字符串即十六进制数据,转换为二进制数据JPG文件)。
转换效果如下:
HEX转JPG
HEX转JPG代码示例(Python)
import binascii
# 十六进制字符串,如:“ff d8 ff e1 11 e0 45 78 69...”;存入TXT文件。经过如下代码转换,可将pic存储为图片形式并可以正常打开
o_file=r"G:\jpg数据.txt"
filepath=r"G:\jpg数据.jpg"
f = open(o_file,"r")
payload=f.read()
f.close()
f=open(filepath,"ab") # filepath为你要存储的图片的全路径
pic = binascii.a2b_hex(payload.replace(' ', '').strip())
f.write(pic)
f.close()
验证完成!
测试LOG数据分析
LOG数据分析
后续:捕捉图片存入SPI接口外置sd卡,副本存入电脑
介绍功能3:捕捉图片存入SPI接口外置sd卡,副本同步通过Serial 串口输出jpg文件存入电脑。