合宙Air系列开发板官方demo学习(二):camera-摄像头:(1)-capture

基础资料
基于air105开发板:air105 - luatos 文档
上手:开发上手 - 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,4810001000,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 = 1210001000,
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 = 2local result = spi.setup( spiid,--串口id 255, -- 不使用默认cs脚,通过gpio.setup(tf_cs, 1)重新指定 0,--cpha 0,--cpol 8,--数据宽度 400*1000 -- 初始化时使用较低的频率)local tf_cs = pin.pb3gpio.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=rg:jpg数据.txt
filepath=rg: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数据分析
后续
介绍功能3:捕捉图片存入spi接口外置sd卡,副本同步通过serial 串口输出jpg文件存入电脑。


基于单片机的VRAM型彩色液晶显示模块设计
如何使用DevExpress Winforms实现UI自动化
FSR3性能画质双超DLSS3!AMD RX 6750 GRE首发评测:远强于RTX 4060
AMD最顶级的RX 6900 XT下个月即将上市
MAX8607 1MHz PWM boost转换器,用于驱动
合宙Air系列开发板官方demo学习(二):camera-摄像头:(1)-capture
单片机也可以说是立于不败之地!
mW范围内的机器视觉使物联网端点推理变得切实可行
手机玻璃表面瑕疵检测对光源的要求都有哪些
目前国内的电缆故障测试仪器的领先配置介绍
光刻工艺的苛刻高精度、重复性和稳定性要求
如何最大程度的降低电源模块的电磁干扰
带通滤波器宽阻带技术解析
Pasternack射频开关有三种基本类型
电机技术种类有哪些 典型的电机选型过程
联通沃视频为用户提供端到端的全场景沉浸式VR体验
灿芯半导体推出可用于客制化ASIC/SoC设计服务的MIPI IP完整解决方案
中国移动完成5G电力应急通信测试,利用5G优势实现现场集群通信
物通博联水电站下泄生态流量监测系统解决方案
iphone8什么时候上市?iphone8最新消息:iphone8发布时间推迟2018,售价超6905元,你需要知道的十大黑科技!