跳转至

摄像头拍照和扫码

一、简易 UI-摄像头概述

Air724UG 支持一路摄像头接口。可以用于扫码,拍照应用。

特点如下:

  • 只支持 SPI 接口
  • 最高像素 30W 像素 @15fps
  • 支持数据格式 YUV422, Y420, RAW8, RAW10
  • 集成 GC0310 驱动

二、准备硬件环境

“古人云:‘工欲善其事,必先利其器。’在深入介绍本功能示例之前,我们首先需要确保以下硬件环境的准备工作已经完成。”

2.1 Air724UG 开发板

本 demo 使用的是 Air724UG_A14 开发板,如下图所示:

点击链接购买:EVB_Air724UG_A14 开发板淘宝购买链接

此开发板的详细使用说明参考:Air724UG 产品手册中的开发板硬件资料中《EVB_Air724UG_A14 开发板使用说明.pdf》;开发板使用过程中遇到任何问题,可以直接参考这份使用说明 pdf 文档。

2.2 SIM 卡

请准备一张可正常上网的 SIM 卡,该卡可以是物联网卡或您的个人手机卡。

特别提醒:请确保 SIM 卡未欠费且网络功能正常,以便顺利进行后续操作。

2.3 PC 电脑

准备一台电脑;

电脑操作系统为:WIN10 以及以上版本的 WINDOWS 系统。

注意:电脑有 USB 口,并且可以正常上网!!!

2.4 数据通信线

请准备一根用于连接 EVB_Air724UG_A14 开发板和 PC 电脑的数据线,该数据线将实现业务逻辑的控制与交互。

  • USB 数据线:此数据线不仅用于为测试板供电,还用于查看数据日志。其一端为 Micro-B 接口(俗称老安卓口),用于连接 EVB_Air724UG_A14 开发板;另一端为标准 USB 接口,连接 PC 电脑。

2.5 准备一个 7735 的屏幕(7735 型号有带后缀的也可以的)

  • 注:EVB_Air724UG_A14 的开发板显示屏接线口只有 7 个口
  • 将屏幕的 GND 对齐 开发板的 GND 接上, 最后显示屏的 BLK,会悬空(如果不调节亮度,悬空默认最亮,其他亮度 这个口接 PWM)
  • 在使用 EVB_Air724UG_A14 开发套件时如下图所示插入即可

2.6 摄像头 GC0310

2.7 组装硬件环境

2.7.1 请按 SIM 卡槽指示方向正确插入 SIM 卡,避免插反损坏

通常,插入 SIM 卡的步骤如下:

  • 将 SIM 卡的金属卡槽下滑打开。
  • 平稳地将 SIM 卡放入卡槽。
  • 上滑关闭卡槽。

2.7.2 USB 数据线,连接电脑和 EVB_Air724UG_A14 开发板,如下图所示:

2.7.3 EVB_Air724UG_A14 开发板和显示屏连接,如下图所示:

2.7.3 EVB_Air724UG_A14 开发板和摄像头连接,如下图所示:

开发板上的 Camera 接口使用 24Pin 的上接触式端子,安装时摄像头朝上插入,注意正反。

三、准备软件环境

“凡事预则立,不预则废。”在详细阐述本功能示例之前,我们需先精心筹备好以下软件环境。

3.1 Luatools 工具

要想烧录 LuatOS 固件到 4G 模组中,需要用到合宙的强大的调试工具:Luatools;

下载地址:Luatools v3 下载调试工具

Luatools 工具集具备以下几大核心功能:

  • 一键获取最新固件:自动连接合宙服务器,轻松下载最新的合宙模组固件。
  • 固件与脚本烧录:便捷地将固件及脚本文件烧录至目标模组中。
  • 串口日志管理:实时查看模组通过串口输出的日志信息,并支持保存功能。
  • 串口调试助手:提供简洁的串口调试界面,满足基本的串口通信测试需求。

Luatools 下载之后, 无需安装, 解压到你新建的文件中,点击 Luatools_v3.exe 运行,出现如下界面,就代表 Luatools 安装成功了:

3.2 烧录代码

首先要说明一点: 脚本代码, 要和固件的 LuatOS-Air_V4030_RDA8910_TTS_NOLVGL_FLOAT.pac(注:支持 LCD,字库,图片,TTS,WIFI Scan,SD 卡,VOLTE) 文件一起烧录。

整体压缩文件:如图所示。

3.2.1 压缩文件:完整脚本文件包

右键点我,另存为,下载完整压缩文件包

3.2.2 找到烧录的固件文件

官网下载,底层 core 下载地址:LuatOS 底层 core 注:本 demo 使用如图所示固件

3.2.3 正确连接电脑和 4G 模组电路板

使用带有数据通信功能的数据线,不要使用仅有充电功能的数据线;

3.2.4 识别 4G 模组的 boot 引脚

在下载之前,要用模组的 boot 引脚触发下载,具体到 EVB_Air724UG_A14 开发板。

  • 当我们模块没开机时,按着下载模式键然后长按开机键开机。
  • 当我们模块开机时,按着下载模式键然后点按重启键即可。

3.2.5 识别电脑的正确端口

判断是否进入 BOOT 模式:

  • 模块上电,此时在电脑的设备管理器中,查看串口设备,如下图:

  • 先按下载模式再按一下重启,会出现一个端口表示进入了 boot 下载模式,如下图所示:

  • 这时候, 硬件连接处于就绪状态,恭喜你,可以进行烧录了!

3.2.6 新建项目

首先,确保你的 Luatools 的版本大于或者等于 3.0.6 版本.

在 Luatools 的左上角上有版本显示的,如图所示:

Luatools 版本没问题的话, 就点击 Luatools 右上角的“项目管理测试”按钮,如下图所示:

这时会弹出项目管理和烧录管理的对话框,如下图:

3.2.7 开始烧录

  • 选择 Air724ug 开发板对应的底层 core 和 main.lua 脚本文件。下载到板子中。

  • 一直按下载模式按键,再按一下重启,然后点击下载底层和脚本,如图所示:

  • 出现如图所示,表示已进入 boot 模式,可以松开下载模式按键,等待下载完成。

  • 下载完成,如图所示

3.3 PC 端串口工具

SSCOM 的下载链接:SSCOM,详细使用说明可以直接参考下载网站。

注:Air724ug 开发板串口切换方式如下图,可拨动开关进行切换。

四、简易 UI-SPI 串口屏基本用法

4.1 本教程实现的功能定义:

  • 在 Air724UG-LuatOS 平台上,disp 库作为摄像头预览与屏幕显示之间的桥梁,扮演着至关重要的直接交互角色。它设计得既高效又灵活,为用户提供了极其友好的接口来预览摄像头捕捉的实时图像。本次介绍的宗旨是助力开发者快速掌握并熟练运用 disp 库的 API 接口,以便能够利用这些接口在屏幕上流畅地预览摄像头捕捉的影像,从而在 Air724UG-LuatOS 平台上实现出色的摄像头预览与控制功能。

4.2 文章内容引用

4.3 API 接口详解

4.3.1 disp.camerapreview(offsetx,offsety,startx,starty,endx,endy)

解说:

  • 打开摄像头预览。

参数:

返回值:

举例:

disp.camerapreview(10, 20, 50, 50, 200, 200)

4.3.2 disp.camerapreviewzoom(0xff)

解说:

  • 预览缩放。

参数:

返回值:

举例:

disp.camerapreviewzoom(0xff)

4.3.3 disp.camerapreviewrotation(rotation)

解说:

  • 预览旋转。

参数:

返回值:

举例:

disp.camerapreviewrotation(90)

4.3.4 disp.camerasavephoto(filename[,x][,y][,w][,h][,quality])

解说:

  • 保存指定区域的拍摄的照片到文件,默认保存整张。

参数:

返回值:

举例:

--保存指定区域的拍摄的照片到文件,默认保存整张。
disp.camerasavephoto("/photo.jpg")

4.3.5 disp.cameraopen(type,zbarscan,mirror,jump)

解说:

  • 初始化摄像头。

参数:

返回值:

  • 无。

举例:

pm.wake("testTakePhoto")
_--打开摄像头_
disp.cameraopen(1,0,0,1)
_--disp.cameraopen(1,0,0,0) _
_--因目前core中还有问题没解决,所以不能关闭隔行隔列_
_--打开摄像头预览--如果有LCD,使用LCD的宽和高_
_--如果无LCD,宽度设置为240像素,高度设置为320像素,240*320是Air268F支持的最大分辨率_
disp.camerapreview(0,0,0,0,WIDTH or DEFAULT_WIDTH,HEIGHT or DEFAULT_HEIGHT)
_--设置照片的宽和高像素并且开始拍照--此处设置的宽和高和预览时的保持一致_
disp.cameracapture(WIDTH or DEFAULT_WIDTH,HEIGHT or DEFAULT_HEIGHT)
_--设置照片保存路径_
disp.camerasavephoto("/testCamera.jpg")
log.info("testCamera.takePhotoAndDisplay fileSize",io.fileSize("/testCamera.jpg"))
_--关闭摄像头预览_
disp.camerapreviewclose()
_--关闭摄像头_
disp.cameraclose()
_--允许系统休眠_
pm.sleep("testTakePhoto")

4.3.6 disp.cameraopen_ext(param)

解说:

  • Lua 外部配置 camera 功能。

参数:

返回值:

  • 无。

举例:

_--参数定义如下所示(配置gc6153 8万摄像头)_
local gc6153 =
{
    zbar_scan = 1,  _--是否支持扫码_
    i2c_addr = 0x40,  _-- 摄像头i2c访问地址 _
    sensor_width = 240,  _-- 摄像头的宽 _
    sensor_height = 320, _-- 摄像头的高 _
    id_reg = 0xf1,      _--  摄像头ID寄存器 _
    id_value = 0x53,    _--  摄像头ID值 --  摄像头SPI是几线输出 --disp.CAMERA_SPI_MODE_LINE1 1线--disp.CAMERA_SPI_MODE_LINE2 2线--disp.CAMERA_SPI_MODE_LINE4 4线_
    spi_mode = disp.CAMERA_SPI_MODE_LINE1, 
    _--  摄像头采集速率 --disp.CAMERA_SPEED_SDR  单片采集--disp.CAMERA_SPEED_DDR  双边采集_
    spi_speed = disp.CAMERA_SPEED_SDR,  
     _--  摄像头输出YUV的格式 _
    spi_yuv_out = disp.CAMERA_SPI_OUT_U0_Y1_V0_Y0,
   _--disp.CAMERA_SPI_OUT_Y0_U0_Y1_V0--disp.CAMERA_SPI_OUT_Y0_V0_Y1_U0--disp.CAMERA_SPI_OUT_U0_Y0_V0_Y1--disp.CAMERA_SPI_OUT_U0_Y1_V0_Y0--disp.CAMERA_SPI_OUT_V0_Y0_U0_Y1--disp.CAMERA_SPI_OUT_Y1_V0_Y0_U0--disp.CAMERA_SPI_OUT_Y1_U0_Y0_V0_
    cmd = _--摄像头初始化寄存器_
    {
         0xfe, 0xa0  ,
         0xfe, 0xa0  ,
         0xfe, 0xa0  ,
         0xf6, 0x00  ,
         0xfa, 0x11  ,
         0xfc, 0x12  ,
         0xfe, 0x00  ,     
         0xfe, 0x00  ,
         0x01, 0x41  , 
         0x02, 0x12  , 
         0x0d, 0x40  , 
         0x14, 0x7E  , 
         0x16, 0x05 , 
         0x17, 0x18  , 
         0x1c, 0x31  , 
         0x1d, 0xbb  , 
         0x1f, 0x3f  , 
         0x73, 0x20  , 
         0x74, 0x71  , 
         0x77, 0x22  , 
         0x7a, 0x08  , 
         0x11, 0x18  , 
         0x13, 0x48  , 
         0x12, 0xc8  , 
         0x70, 0xc8  , 
         0x7b, 0x18  , 
         0x7d, 0x30  , 
         0x7e, 0x02  , 
         0xfe, 0x10  , 
         0xfe, 0x00  ,
         0xfe, 0x00  ,
         0xfe, 0x00  ,
         0xfe, 0x00  ,
         0xfe, 0x00  ,
         0xfe, 0x10  ,
         0xfe, 0x00  ,
         0x49, 0x61  ,  
         0x4a, 0x40  ,  
         0x4b, 0x58  ,  
         0xfe, 0x00  ,
         0x39, 0x02  , 
         0x3a, 0x80  , 
         0x20, 0x7e  , 
         0x26, 0x87  , 
         0x33, 0x10  , 
         0x37, 0x06  , 
         0x2a, 0x21  , 
         0x3f, 0x16  ,
         0x52, 0xa6  ,
         0x53, 0x81  ,
         0x54, 0x43  ,
         0x56, 0x78  ,
         0x57, 0xaa  ,
         0x58, 0xff  , 
         0x5b, 0x60  , 
         0x5c, 0x50  , 
         0xab, 0x2a  , 
         0xac, 0xb5  ,
         0x5e, 0x06  , 
         0x5f, 0x06  ,
         0x60, 0x44  ,
         0x61, 0xff  ,
         0x62, 0x69  , 
         0x63, 0x13  ,
         0x65, 0x13  , 
         0x66, 0x26  ,
         0x67, 0x07  ,
         0x68, 0xf5  , 
         0x69, 0xea  ,
         0x6a, 0x21  ,
         0x6b, 0x21  , 
         0x6c, 0xe4  ,
         0x6d, 0xfb  ,
         0x81, 0x3b  , 
         0x82, 0x3b  , 
         0x83, 0x4b  ,
         0x84, 0x90  ,
         0x86, 0xf0  ,
         0x87, 0x1d  ,
         0x88, 0x16  ,
         0x8d, 0x74  ,
         0x8e, 0x25  ,
         0x90, 0x36  ,
         0x92, 0x43  ,
         0x9d, 0x32  , 
         0x9e, 0x81  ,
         0x9f, 0xf4  ,
         0xa0, 0xa0  ,
         0xa1, 0x04  ,
         0xa3, 0x2d  ,
         0xa4, 0x01  ,
         0xb0, 0xc2  ,
         0xb1, 0x1e  ,
         0xb2, 0x10  ,
         0xb3, 0x20  ,
         0xb4, 0x2d  ,
         0xb5, 0x1b  , 
         0xb6, 0x2e  ,
         0xb8, 0x13  ,
         0xba, 0x60  ,
         0xbb, 0x62  ,
         0xbd, 0x78  , 
         0xbe, 0x55  ,
         0xbf, 0xa0  , 
         0xc4, 0xe7  ,
         0xc5, 0x15  ,
         0xc6, 0x16  ,
         0xc7, 0xeb  , 
         0xc8, 0xe4  ,
         0xc9, 0x16  ,
         0xca, 0x16  ,
         0xcb, 0xe9  ,
         0x22, 0xf8  ,
         0xfe, 0x02  ,
         0x01, 0x01  , 
         0x02, 0x80  , 
         0x03, 0x20  , 
         0x04, 0x20  ,  
         0x0a, 0x00  , 
         0x13, 0x10  , 
         0x28, 0x03  ,
         0xfe, 0x00  , 
         0x22, 0xf8  , 
         0xf2, 0x03  , 
    },    
}
disp.cameraopen_ext(gc6153)

4.3.7 disp.cameraclose()

解说:

  • 关闭摄像头。

参数:

  • 无。

返回值:

  • 无。

举例:

--关闭摄像头。
disp.cameraclose()

4.3.8 disp.camerapreviewclose()

解说:

  • 关闭预览。

参数:

  • 无。

返回值:

举例

_--关闭预览。_
local  ret = disp.camerapreviewclose()
log.info("ret= ",ret)

4.3.9 disp.cameracapture(width,height[,quality])

解说:

  • 拍照片。

参数:

返回值:

举例

--拍照片。
local ret= disp.cameracapture(100, 100, 75)
log.info("ret= ",ret)

4.3.10 disp.scanmode(mode)

解说:

  • 设置扫码模式。

参数:

返回值:

举例

--拍照片。
local ret= disp.scanmode(0)
log.info("ret= ",ret)

4.3.11 disp.scantype(value)

解说:

  • 设置正反色扫码。

参数:

返回值:

举例

--设置正反色扫码。
local ret= disp.scantype(1)
log.info("ret= ",ret)

五、简易 UI-摄像头整体演示

5.1 简易 UI-摄像头_扫码成果演示与深度解析:视频 + 图文全面展示

扫描成功展示

扫描失败展示

5.1.1 成果运行精彩呈现

5.1.2 完整实例深度剖析

  • main.lua

功能实现:主要实现调用显示屏初始化和摄像头功能函数。

--必须在这个位置定义PROJECT和VERSION变量
--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
PROJECT = "CAMERA"
VERSION = "2.0.0"

--加载日志功能模块,并且设置日志输出等级
--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
require "log"
LOG_LEVEL = log.LOGLEVEL_TRACE
--[[
如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
]]
--log.openTrace(true,1,115200)

require "sys"

require "net"
--每1分钟查询一次GSM信号强度
--每1分钟查询一次基站信息
net.startQueryAll(60000, 60000)

--此处关闭RNDIS网卡功能
--否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
--如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
--注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
ril.request("AT+RNDISCALL=0,1")

--加载控制台调试功能模块(此处代码配置的是uart1,波特率115200)
--此功能模块不是必须的,根据项目需求决定是否加载
--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
--使用说明参考demo/console下的《console功能使用说明.docx》
--require "console"
--console.setup(1, 115200)

--加载硬件看门狗功能模块
--根据自己的硬件配置决定:1、是否加载此功能模块;2、配置Luat模块复位单片机引脚和互相喂狗引脚
--合宙官方出售的Air201开发板上有硬件看门狗,所以使用官方Air201开发板时,必须加载此功能模块
--[[
require "wdt"
wdt.setup(pio.P0_30, pio.P0_31)
]]

--加载网络指示灯和LTE指示灯功能模块
--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
require "netLed"
pmd.ldoset(2,pmd.LDO_VLCD)
netLed.setup(true,pio.P0_1,pio.P0_4)
--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长

--加载错误日志管理功能模块【强烈建议打开此功能】
--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
require "errDump"
errDump.request("udp://dev_msg1.openluat.com:12425", nil, true)

--加载远程升级功能模块【强烈建议打开此功能】
--如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update
--PRODUCT_KEY = "v32xEAKsGTIEQxtqgwCldp5aPlcnPs3K"
--require "update"
--update.request()

require"color_lcd_spi_st7735"
--require"color_lcd_spi_gc9106l"
require"testCamera"

--启动系统框架
sys.init(0, 0)
sys.run()
  • color_lcd_spi_st7735.lua

功能实现:ST 7735 驱动芯片 LCD 命令配置(注:只展示核心代码)

--- 模块功能:ST 7735驱动芯片LCD命令配置
-- @author openLuat
-- @module ui.color_lcd_spi_st7735
-- @license MIT
-- @copyright openLuat
-- @release 2018.03.27

--[[
注意:disp库目前支持I2C接口和SPI接口的屏,此文件的配置,硬件上使用的是LCD专用的SPI引脚,不是标准的SPI引脚
硬件连线图如下:
Air模块           LCD
GND-------------地
LCD_CS----------片选
LCD_CLK---------时钟
LCD_DATA--------数据
LCD_DC----------数据/命令选择
VDDIO-----------电源
LCD_RST---------复位
]]

module(...,package.seeall)

--[[
函数名:init
功能  :初始化LCD参数
参数  :无
返回值:无
]]
local function init()
    local para =
    {
        width = 128, --分辨率宽度,128像素;用户根据屏的参数自行修改
        height = 160, --分辨率高度,160像素;用户根据屏的参数自行修改
        bpp = 16, --位深度,彩屏仅支持16位
        bus = disp.BUS_SPI4LINE, --LCD专用SPI引脚接口,不可修改
        xoffset = 0, --X轴偏移
        yoffset = 0, --Y轴偏移
        freq = 13000000, --spi时钟频率,支持110K到13M(即110000到13000000)之间的整数(包含110000和13000000)
        pinrst = pio.P0_6, --reset,复位引脚
        pinrs = pio.P0_1, --rs,命令/数据选择引脚
        --camera_preview_no_update_screen = 1, --0表示摄像头预览刷屏;1表示摄像头预览不刷屏
        --初始化命令
        --前两个字节表示类型:0001表示延时,0000或者0002表示命令,0003表示数据
        --延时类型:后两个字节表示延时时间(单位毫秒)
        --命令类型:后两个字节命令的值
        --数据类型:后两个字节数据的值
        initcmd =
        {
            --内容过长不便于阅读完整代码请查看 3.2.1
        },
        --休眠命令
        sleepcmd = {
            0x00020010,
        },
        --唤醒命令
        wakecmd = {
            0x00020011,
        }
    }
    disp.init(para)
    disp.clear()
    disp.update()
end

--控制SPI引脚的电压域
pmd.ldoset(15,pmd.LDO_VLCD)
init()

--打开背光
--实际使用时,用户根据自己的lcd背光控制方式,添加背光控制代码
  • testCamera.lua

功能实现:gc0310 摄像头命令配置以及调用扫描二维码拍照并发送串口接口函数的实现(注:只展示核心代码)

--- 模块功能:camera功能测试.
-- @author openLuat
-- @module fs.testFs
-- @license MIT
-- @copyright openLuat
-- @release 2018.03.27

module(...,package.seeall)

require"pm"
require"scanCode"
require"utils"
require"common"
require"testUartSentFile"

local WIDTH,HEIGHT = disp.getlcdinfo()
local DEFAULT_WIDTH,DEFAULT_HEIGHT = 128,160

-- 扫码结果回调函数
-- @bool result,true或者false,true表示扫码成功,false表示超时失败
-- @string[opt=nil] codeType,result为true时,表示扫码类型;result为false时,为nil;支持QR-Code和CODE-128两种类型
-- @string[opt=nil] codeStr,result为true时,表示扫码结果的字符串;result为false时,为nil
local function scanCodeCb(result,codeType,codeStr)
    --关闭摄像头预览
    disp.camerapreviewclose()
    --关闭摄像头
    disp.cameraclose()
    --允许系统休眠
    pm.sleep("testScanCode")
    --500毫秒后处理扫描结果
    sys.timerStart(function()
        --如果有LCD,显示扫描结果
        if WIDTH~=0 and HEIGHT~=0 then
            disp.clear()
            if result then
                disp.puttext(common.utf8ToGb2312("扫描成功"),25,10,2,70)
                disp.puttext(common.utf8ToGb2312("类型: ")..codeType,0,40)
                log.info("scanCodeCb",codeStr:toHex())
                disp.puttext(common.utf8ToGb2312("结果: ")..codeStr,0,65)
            else
                disp.puttext(common.utf8ToGb2312("扫描失败"),25,64,1,50)
            end
            disp.update()
        end
    end,500)

    sys.timerStart(scan,1000)
end

local gc0310_ddr =
{
    zbar_scan = 1,
    i2c_addr = 0x21,
    sensor_width = 320,
    sensor_height = 240,
    id_reg = 0xf1,
    id_value = 0x10,
    spi_mode = disp.CAMERA_SPI_MODE_LINE2,
    spi_speed = disp.CAMERA_SPEED_DDR,
    spi_yuv_out = disp.CAMERA_SPI_OUT_Y1_V0_Y0_U0,

    init_cmd =
    {

         --内容过长不便于阅读完整代码请查看 3.2.1
    },
}
local gc0310_ddr_big =
{
    zbar_scan = 0,
    i2c_addr = 0x21,
    sensor_width = 640,
    sensor_height = 480,
    id_reg = 0xf1,
    id_value = 0x10,
    spi_mode = disp.CAMERA_SPI_MODE_LINE2,
    spi_speed = disp.CAMERA_SPEED_DDR,
    spi_yuv_out = disp.CAMERA_SPI_OUT_Y1_V0_Y0_U0,

    init_cmd =
    {
       --内容过长不便于阅读完整代码请查看 3.2.1
    },
}
local gc0310_sdr =
{
    zbar_scan = 1,
    i2c_addr = 0x21,
    sensor_width = 320,
    sensor_height = 240,
    id_reg = 0xf1,
    id_value = 0x10,
    spi_mode = disp.CAMERA_SPI_MODE_LINE2,
    spi_speed = disp.CAMERA_SPEED_SDR,
    spi_yuv_out = disp.CAMERA_SPI_OUT_Y1_V0_Y0_U0,

    init_cmd =
    {
      --内容过长不便于阅读完整代码请查看 3.2.1
    }
}

function scan()
    --唤醒系统
    pm.wake("testScanCode")
    local ret = 0

    --设置扫码回调函数,默认10秒超时
    scanCode.request(scanCodeCb)

    --打开摄像头
    --ret = disp.cameraopen(1,1) -- 内部配置的gc0310 camera
    --ret = disp.cameraopen_ext(gc6153) -- 外部配置gc6153 camera SDR
    ret = disp.cameraopen_ext(gc0310_sdr) -- 外部配置gc0310 camera SDR
    --ret = disp.cameraopen_ext(gc0310_ddr_big) -- 外部配置gc0310 camera DDR 640*480
    --ret = disp.cameraopen_ext(gc0310_ddr) -- 外部配置gc0310 camera DDR
    --ret = disp.cameraopen_ext(bf302A_sdr) -- 外部配置bf302A camera SDR
    --ret = disp.cameraopen_ext(gc032a_ddr_big) -- 外部配置gc032a camera DDR 640*480

    log.info("testScanCode cameraopen_ext ret ", ret)
    --打开摄像头预览
    --zoom: 放缩设置, 目前仅支持0xff尺寸自适应,0不放缩
    --disp.camerapreviewxzoom(zoom)
    --缩小2倍
    disp.camerapreviewzoom(0xff)
    ret = disp.camerapreview(0,0,0,0,128,160)
    print("预览打开成功?",ret)
    --rotation:反转角度设置 暂时只支持0和90度
    --disp.camerapreviewrotation(90)
end

-- 拍照并显示
function takePhotoAndDisplay()
    --唤醒系统
    pm.wake("testTakePhoto")
    --打开摄像头
    disp.cameraopen(1,0,0,1)
    --disp.cameraopen(1,0,0,0)  --因目前core中还有问题没解决,所以不能关闭隔行隔列
    --打开摄像头预览
    --如果有LCD,使用LCD的宽和高
    disp.camerapreview(0,0,0,0,WIDTH or DEFAULT_WIDTH,HEIGHT or DEFAULT_HEIGHT)
    --设置照片的宽和高像素并且开始拍照
    --此处设置的宽和高和预览时的保持一致
    --此处的第三个参数表示拍摄质量,默认50,100最好
    disp.cameracapture(WIDTH or DEFAULT_WIDTH,HEIGHT or DEFAULT_HEIGHT)
    --设置照片保存路径
    disp.camerasavephoto("/testCamera.jpg")
    log.info("testCamera.takePhotoAndDisplay fileSize",io.fileSize("/testCamera.jpg"))
    --关闭摄像头预览
    disp.camerapreviewclose()
    --关闭摄像头
    disp.cameraclose()
    --允许系统休眠
    pm.sleep("testTakePhoto")

    --testUartSentFile.sendFile()
    --显示拍照图片
    if WIDTH~=0 and HEIGHT~=0 then
        disp.clear()
        disp.putimage("/testCamera.jpg",0,0)
        disp.puttext(common.utf8ToGb2312("照片尺寸: "..io.fileSize("/testCamera.jpg")),0,5)
        disp.update()
    end

    sys.timerStart(takePhotoAndDisplay,5000)
end

-- 拍照并通过uart1发送出去
function takePhotoAndSendToUart()
    --唤醒系统
    pm.wake("testTakePhoto")
    --打开摄像头
    disp.cameraopen(1,0,0,1)
    --disp.cameraopen(1,0,0,0)  --因目前core中还有问题没解决,所以不能关闭隔行隔列
    --打开摄像头预览
    --如果有LCD,使用LCD的宽和高
    disp.camerapreview(0,0,0,0,DEFAULT_WIDTH,DEFAULT_HEIGHT)
    --设置照片的宽和高像素并且开始拍照
    --此处设置的宽和高和预览时的保持一致
    disp.cameracapture(DEFAULT_WIDTH,DEFAULT_HEIGHT)
    --设置照片保存路径
    disp.camerasavephoto("/testCamera.jpg")
    log.info("testCamera.takePhotoAndSendToUart fileSize",io.fileSize("/testCamera.jpg"))
    --关闭摄像头预览
    disp.camerapreviewclose()
    --关闭摄像头
    disp.cameraclose()
    --允许系统休眠
    pm.sleep("testTakePhoto")

    testUartSentFile.sendFile()

    sys.timerStart(takePhotoAndSendToUart,30000)
end

--sys.timerStart(takePhotoAndDisplay,1000)
--sys.timerStart(takePhotoAndSendToUart,1000)
sys.timerStart(scan,1000)

5.2 简易 UI-摄像头_拍照成果演示与深度解析:视频 + 图文全面展示

5.2.1 成果运行精彩呈现

5.2.2 完整实例深度剖析

注:代码和扫码案例共用,只需要注释和打开 testCamera.lua 中相关代码,如下图所示即可。

5.3 简易 UI-摄像头_照片发送到串口成果演示与深度解析:视频 + 图文全面展示

注:此测试 demo 拍摄的照片分辨率是 128*160,接收串口为 Uart1,接线方式如下。

成果展示。

5.3.1 成果运行精彩呈现

5.2.2 完整实例深度剖析

注:代码和扫码案例共用,只需要注释和打开 testCamera.lua 中相关代码,如下图所示即可。

六、总结

在 Air724UG-LuatOS 中吗,disp 库使开发者能够高效地管理摄像头的启动、预览画面展示、参数调整、实时数据处理以及附加的预览控制功能。通过合理利用这些接口,开发者可以构建出具备流畅预览体验的摄像头应用程序,满足用户在多种拍摄场景下的需求。同时,也需关注接口之间的协同配合,以确保摄像头预览功能的实时性和稳定性。

七、常见问题

7.1 白屏、黑屏或扫码不成功

当遇到屏幕显示异常(如白屏、黑屏)或扫码功能无法正常工作时,请按照以下步骤进行排查:

  • 检查屏幕连接: 确认屏幕是否正确且牢固地插入到相应的接口中,检查屏幕与主板之间的连接线是否完好,无破损或松动。
  • 引脚连接检查: 验证屏幕连接线的引脚是否按照正确的顺序和极性接入主板,如有必要,参考设备的技术手册或接线图进行核对。
  • 核心选择确认: 确认设备的核心(如 CPU、MCU 等)型号是否与软件或固件的要求相匹配,如有不同,可能需要更换核心或更新软件/固件版本。

7.2 图像左移问题

当图像在屏幕上显示时出现左移现象时,可能是预览缩放设置不当导致的。请按照以下步骤进行调整:

  • 检查缩放设置: 使用 disp.camerapreviewzoom(zoom) 函数来设置预览缩放比例,zoom 参数为整数,正数表示放大,负数表示缩小,最大支持 4 倍放大,0 表示不放缩。
  • 缩小预览: 如果希望将预览图像缩小 2 倍,应将 zoom 参数设置为-2,即调用 disp.camerapreviewzoom(-2)

7.3 LCD 屏幕如何设置预览区

7.3 照片发送串口失败

默认固件只能拍 8w 像素,大于 8W 像素底层固件需要定制。

八、扩展

8.1 照片超过 8W 像素如何处理

如下提供大于 30W 像素底层固件和 demo,固件和脚本使用固件文件,剩余操作步骤和 5.3 完全一样。

演示如下图所示

LuatOS 摄像头预览软件地址:摄像头预览_1.0.9.zip

给读者的话

本篇文章由永仔开发;

本篇文章描述的内容,如果有错误、细节缺失、细节不清晰或者其他任何问题,总之就是无法解决您遇到的问题;

请登录合宙技术交流论坛文档找错赢奖金-Air724UG-LuatOS-软件指南-多媒体应用-摄像头拍照和扫码

用截图标注+文字描述的方式跟帖回复,记录清楚您发现的问题;

我们会迅速核实并且修改文档;

同时也会为您累计找错积分,您还可能赢取月度找错奖金!