文章目录

  • 1 前言
  • 2 硬件连接
  • 3 官方代码
  • 4 代码
  • 5 结果
  • 6 小结

1 前言

本章测试下camera的拍照并存储照片到tf卡中。

2 硬件连接


注意:该tf卡模块的MOSI对应SPI2的MOSI。

3 官方代码

拍照
https://gitee.com/openLuat/LuatOS/blob/master/demo/camera/Air105/capture/main.lua

存储
https://gitee.com/openLuat/LuatOS/blob/master/demo/fatfs/Air105/main.lua

4 代码

分成三个lua文件,main、t5_fatfs、t8_camera

main.lua

-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "camera_capture"
VERSION = "1.0.0"-- sys库是标配
_G.sys = require("sys")
require("t5_fatfs")
require("t8_camera")if wdt thenwdt.init(15000)--初始化watchdog设置为15ssys.timerLoopStart(wdt.feed, 10000)--10s喂一次狗
end-- 初始化屏幕
spi_lcd = spi.deviceSetup(5,pin.PC14,0,0,8,20*1000*1000,spi.MSB,1,1)log.info("lcd.init",
lcd.init("gc9306",{port = "device",pin_dc = pin.PE08 ,pin_rst = pin.PC12,pin_pwr = pin.PE09,direction = 0,w = 240,h = 320,xoffset = 0,yoffset = 0},spi_lcd))local uartid = 1 -- 根据实际设备选取不同的uartid
--初始化
local result = uart.setup(uartid,--串口id115200,--波特率8,--数据位1--停止位
)t8_camera_init()
t8_camera_start()function camera_capture()log.debug("摄像头捕获图像")camera.capture(camera_id, "/sd/temp.jpg", 1)sys.wait(2000)local f = io.open("/sd/temp.jpg", "r")local dataif f thendata = f:read("*a")log.info("fs", #data)f:close()enduart.write(uartid, data) --找个能保存数据的串口工具保存成文件就能在电脑上看了, 格式为JPG
endsys.taskInit(function()--sys.wait(1000) -- 启动延时-- 测试1: tf卡读写t5_fatfs_init()test_boot_time()test_add()test_readline()-- 测试2: 拍照存储while 1 docamera_capture()sys.wait(5000)endend)-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

t8_camera.lua

--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 ={0xf3,0xff,0xf7,0x01,0xf8,0x03,0xf9,0xce,0xfa,0x00,0xfc,0x02,0xfe,0x02,0x81,0x03,0xfe, 0x00,0x77, 0x64,0x78, 0x40,0x79, 0x60,0xfe, 0x00,0x03, 0x01,0x04, 0xcb,0x05, 0x01,0x06, 0xb2,0x07, 0x00,0x08, 0x10,0x0a, 0x00,0x0c, 0x00,0x0d, 0x01,0x0e, 0xe8,0x0f, 0x02,0x10, 0x88,0x17, 0x54,0x19, 0x08,0x1a, 0x0a,0x1f, 0x40,0x20, 0x30,0x2e, 0x80,0x2f, 0x2b,0x30, 0x1a,0xfe, 0x02,0x03, 0x02,0x05, 0xd7,0x06, 0x60,0x08, 0x80,0x12, 0x89,0xfe, 0x00,0x18, 0x02,0xfe, 0x02,0x40, 0x22,0x45, 0x00,0x46, 0x00,0x49, 0x20,0x4b, 0x3c,0x50, 0x20,0x42, 0x10,0xfe, 0x01,0x0a, 0xc5,0x45, 0x00,0xfe, 0x00,0x40, 0xff,0x41, 0x25,0x42, 0xef,0x43, 0x10,0x44, 0x82,0x46, 0x22,0x49, 0x03,0x52, 0x02,0x54, 0x00,0xfe, 0x02,0x22, 0xf6,0xfe, 0x01,0xc1, 0x38,0xc2, 0x4c,0xc3, 0x00,0xc4, 0x2c,0xc5, 0x24,0xc6, 0x18,0xc7, 0x28,0xc8, 0x11,0xc9, 0x15,0xca, 0x20,0xdc, 0x7a,0xdd, 0xa0,0xde, 0x80,0xdf, 0x88,0xfe, 0x01,0x50, 0xc1,0x56, 0x34,0x58, 0x04,0x65, 0x06,0x66, 0x0f,0x67, 0x04,0x69, 0x20,0x6a, 0x40,0x6b, 0x81,0x6d, 0x12,0x6e, 0xc0,0x7b, 0x2a,0x7c, 0x0c,0xfe, 0x01,0x90, 0xe3,0x91, 0xc2,0x92, 0xff,0x93, 0xe3,0x95, 0x1c,0x96, 0xff,0x97, 0x44,0x98, 0x1c,0x9a, 0x44,0x9b, 0x1c,0x9c, 0x64,0x9d, 0x44,0x9f, 0x71,0xa0, 0x64,0xa1, 0x00,0xa2, 0x00,0x86, 0x00,0x87, 0x00,0x88, 0x00,0x89, 0x00,0xa4, 0xc2,0xa5, 0x9b,0xa6, 0xc8,0xa7, 0x92,0xa9, 0xc9,0xaa, 0x96,0xab, 0xa9,0xac, 0x99,0xae, 0xce,0xaf, 0xa9,0xb0, 0xcf,0xb1, 0x9d,0xb3, 0xcf,0xb4, 0xac,0xb5, 0x00,0xb6, 0x00,0x8b, 0x00,0x8c, 0x00,0x8d, 0x00,0x8e, 0x00,0x94, 0x55,0x99, 0xa6,0x9e, 0xaa,0xa3, 0x0a,0x8a, 0x00,0xa8, 0x55,0xad, 0x55,0xb2, 0x55,0xb7, 0x05,0x8f, 0x00,0xb8, 0xc7,0xb9, 0xa0,0xfe, 0x01,0xd0, 0x40,0xd1, 0x00,0xd2, 0x00,0xd3, 0xfa,0xd4, 0x4a,0xd5, 0x02,0xd6, 0x44,0xd7, 0xfa,0xd8, 0x04,0xd9, 0x08,0xda, 0x5c,0xdb, 0x02,0xfe, 0x00,0xfe, 0x00,0xba, 0x00,0xbb, 0x06,0xbc, 0x0b,0xbd, 0x10,0xbe, 0x19,0xbf, 0x26,0xc0, 0x33,0xc1, 0x3f,0xc2, 0x54,0xc3, 0x68,0xc4, 0x7c,0xc5, 0x8c,0xc6, 0x9c,0xc7, 0xb4,0xc8, 0xc9,0xc9, 0xd8,0xca, 0xe4,0xcb, 0xee,0xcc, 0xf4,0xcd, 0xf9,0xce, 0xfa,0xcf, 0xff,0xfe, 0x00,0x5a, 0x08,0x5b, 0x0f,0x5c, 0x15,0x5d, 0x1c,0x5e, 0x28,0x5f, 0x36,0x60, 0x45,0x61, 0x51,0x62, 0x6a,0x63, 0x7d,0x64, 0x8d,0x65, 0x98,0x66, 0xa2,0x67, 0xb5,0x68, 0xc3,0x69, 0xcd,0x6a, 0xd4,0x6b, 0xdc,0x6c, 0xe3,0x6d, 0xf0,0x6e, 0xf9,0x6f, 0xff,0xfe, 0x00,0x70, 0x50,0xfe, 0x00,0x4f, 0x01,0xfe, 0x01,0x0c, 0x01,0x0d, 0x00,0x12, 0xa0,0x13, 0x4a,0x44, 0x04,0x1f, 0x40,0x20, 0x40,0x23, 0x0a,0x26, 0x9a,0x3e, 0x20,0x3f, 0x2d,0x40, 0x40,0x41, 0x5b,0x42, 0x82,0x43, 0xb7,0x04, 0x0a,0x02, 0x79,0x03, 0xc0,0xfe, 0x01,0xcc, 0x08,0xcd, 0x08,0xce, 0xa4,0xcf, 0xec,0xfe, 0x00,0x81, 0xb8,0x82, 0x04,0x83, 0x10,0x84, 0x01,0x86, 0x50,0x87, 0x18,0x88, 0x10,0x89, 0x70,0x8a, 0x20,0x8b, 0x10,0x8c, 0x08,0x8d, 0x0a,0xfe, 0x00,0x8f, 0xaa,0x90, 0x1c,0x91, 0x52,0x92, 0x03,0x93, 0x03,0x94, 0x08,0x95, 0x6a,0x97, 0x00,0x98, 0x00,0xfe, 0x00,0x9a, 0x30,0x9b, 0x50,0xa1, 0x30,0xa2, 0x66,0xa4, 0x28,0xa5, 0x30,0xaa, 0x28,0xac, 0x32,0xfe, 0x00,0xd1, 0x3f,0xd2, 0x3f,0xd3, 0x38,0xd6, 0xf4,0xd7, 0x1d,0xdd, 0x72,0xde, 0x84,0xfe, 0x00,0x05, 0x01,0x06, 0xad,0x07, 0x00,0x08, 0x10,0xfe, 0x01,0x25, 0x00,0x26, 0x4d,0x27, 0x01,0x28, 0xce,0x29, 0x01,0x2a, 0xce,0x2b, 0x01,0x2c, 0xce,0x2d, 0x01,0x2e, 0xce,0x2f, 0x01,0x30, 0xce,0x31, 0x01,0x32, 0xce,0x33, 0x01,0x34, 0xce,0x3c, 0x10,0xfe, 0x00,0xfe,0x00,0x44,0x06,--RGB565输出0x46,0x0f,}
}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)function t8_camera_init()-- 拍照, 自然就是RGB输出了camera_id = camera.init(GC032A_InitReg)--屏幕输出rgb图像
endfunction t8_camera_start()log.info("摄像头启动")camera.start(camera_id)--开始指定的camera-- -- PA10作为中断,上升沿/下降沿都触发-- gpio.setup(pin.PA10, function()--     sys.publish("CAPTURE", true)-- end, gpio.PULLUP,gpio.FALLING)end

t5_fatfs.lua

--[[
接线要求:SPI 使用常规4线解法
Air105开发板         TF模块
PB3                  CS
PB2(SPI1_CLK)        CLK
PB5(SPI1_MISO)       MISO
PB4(SPI1_MOSI)       MOSI
5V                   VCC
GND                  GND
]]function t5_fatfs_init()local spiId = 2local result = spi.setup(spiId,--串口id255, -- 不使用默认CS脚0,--CPHA0,--CPOL8,--数据宽度400*1000  -- 初始化时使用较低的频率)print("spi setup:",result)local TF_CS = pin.PB3gpio.setup(TF_CS, 1)-- fatfs.debug(1) -- 若挂载失败,可以尝试打开调试信息,查找原因fatfs.mount("SD", spiId, TF_CS, 12000000)local data, err = fatfs.getfree("SD")if data thenlog.info("fatfs", "getfree", json.encode(data))elselog.info("fatfs", "err", err)end-- 重新设置spi,使用更高速率-- spi.close(0)-- sys.wait(100)-- spi.setup(spiId, 255, 0, 0, 8, 24*1000*1000)
end-- #################################################
-- 文件操作测试
-- #################################################
function test_boot_time()local f = io.open("/sd/boottime", "rb")local c = 0if f thenlocal data = f:read("*a")log.info("fs", "data", data, data:toHex())c = tonumber(data)f:close()endlog.info("fs", "boot count", c)c = c + 1f = io.open("/sd/boottime", "wb")if f ~= nil thenlog.info("fs", "write c to file", c, tostring(c))f:write(tostring(c))f:close()elselog.warn("sdio", "mount not good?!")endif fs thenlog.info("fsstat", fs.fsstat("/"))log.info("fsstat", fs.fsstat("/sd"))end
endfunction test_add()-- 测试一下追加, fix in 2021.12.21os.remove("/sd/test_a")sys.wait(50)f = io.open("/sd/test_a", "w")if f thenf:write("ABC")f:close()endf = io.open("/sd/test_a", "a+")if f thenf:write("def")f:close()endf = io.open("/sd/test_a", "r")if  f thenlocal data = f:read("*a")log.info("data", data, data == "ABCdef")f:close()end
endfunction test_readline()-- 测试一下按行读取, fix in 2022-01-16f = io.open("/sd/testline", "w")if f thenf:write("abc\n")f:write("123\n")f:write("wendal\n")f:close()endsys.wait(100)f = io.open("/sd/testline", "r")if f thenlog.info("sdio", "line1", f:read("*l"))log.info("sdio", "line2", f:read("*l"))log.info("sdio", "line3", f:read("*l"))f:close()end
end-- #################################################

5 结果

[2022-03-27 18:00:21.742] D/user.摄像头捕获图像
[2022-03-27 18:00:21.964] D/fatfs f_open /temp.jpg w
[2022-03-27 18:00:21.967] D/camera capture data 9243byte
[2022-03-27 18:00:23.741] D/fatfs f_open /temp.jpg r
[2022-03-27 18:00:23.745] I/user.fs 9243

6 小结

成功存储照片,后续再尝试

  1. uart将jpg图片传给esp32
  2. 将图片传给服务器,网页显示
  3. uart传给迪文屏显示

【Luat-air105】8.2 fatfs及照片存储相关推荐

  1. 380免费云存储_2019年最好的在线照片存储,让你的照片安全存储在云端

    你的手机只能存储这么多照片.即使它包含成千上万的图片,如果你把它放错了地方,你也会很高兴有一个备份. 而且云存储便宜.方便.容量大.特别是对于照片,在线服务可以做的不仅仅是存储你的照片.许多在线照片服 ...

  2. 控制Canon相机进行拍照,并把拍摄的照片存储到D盘

    语言 C# 使用的SDK,https://github.com/thrixton/EDSDK.NET 使用相机Canon 760D 最近公司需求,需要控制相机拍照并把照片存储到电脑上用于智能视觉的分析 ...

  3. iOS 照片存储到沙盒 和读取

    iOS 照片存储到沙盒 和读取 这里介绍简单的ios照片保存到沙盒,然后读取出来. 1. 照片保存到沙盒 UIImage *image=[UIImage imageNamed:@"20141 ...

  4. NodeJs实战-Express构建照片存储网站(2)-上传、展示文件

    Express构建照片存储网站2-上传.展示文件 静态资源显示图片 photo页面展示文件夹下的图片 上传文件 增加上传页面的路由 增加提交接口的路由 网站效果图 项目地址 上一节使用的静态数据存储的 ...

  5. 最好和最便宜的照片存储网站(优质图库摄影)

    我们都听说过一句谚语--"一张照片胜过千言万语". 为了促进您的电子商务业务或使用高级图像使您的博客更加逼真,您必须寻找优质库存照片,而不仅仅是在 Google 上进行随机搜索. ...

  6. 另类解决android中用三星手机拍的照片存储后旋转问题。

    这几天在做安卓图片的处理,偶然发现在测试三星手机的时候存在一个小bug.就是调用手机拍摄图片后,照片保存时自动旋转了90度. 测试其他机型并不存在这样的问题,只有三星机子有这样的bug. 网上有很多类 ...

  7. 可以储存照片的字段类型是_如果将学生的“照片”存储在表中,则数据应采用的字段类型为...

    将学据柴可夫斯基创作的<1812序曲>其结构为_____曲式. 照片表中则数2015年环保部出台<关于推进生态环境监测服务市场化的指导意见>,全面放开服务性监测市场 存储采用2 ...

  8. java 图片放在哪_在Java Web应用程序中,应该将用户照片存储在哪里?

    小编典典 解决方案前要考虑的事项: 您是否会水平扩展Web应用程序(即,您是否正在运行多个servlet容器实例). 您期望什么样的流量? 图片需要更新的速度(即用户更改了头像后,他们和所有其他用户是 ...

  9. 怎么把备忘录里的照片存储到相册

    1:点开有照片的那条内容,进入详情页. 2:点击图片模块右边的"...",然后点击"下载全部",就可以将本条内容里的全部图片下载下来了. 3:我们点击某一张图片 ...

最新文章

  1. 先搞懂这八大基础概念,再谈机器学习入门!
  2. Timus 1204 Idempotents
  3. android 单例的作用,Android中单例模式的几个坑
  4. sql union 与多个order by 一起使用
  5. spring的controller是单例模式,但是是多线程,各个线程之间不影响
  6. 变压器耦合和电容耦合_超越变压器和抱抱面的分类
  7. java h5 上拉加载更多_移动端H5页面上拉加载更多功能实现(二)
  8. 拉拢中小网站 淘宝百度暗战升级...
  9. 函数式编程语言天生就慢吗?
  10. java fastdfs 压测_利用jmeter+JAVA对RPC的单接口(dubbo接口等)进行性能测试,零基础(2)...
  11. jQuery中的gt和lt
  12. 内存超频时序怎么调_内存超频(ddr4内存时序多少为好)
  13. 10015---MySQL--事务
  14. Tomcat服务器安装和替换阿里云免费ssl证书步骤(超详细)
  15. 拒绝被淘汰,如何打造自己的金饭碗?
  16. 基于MobileNetv3实现人脸面部表情识别
  17. 面向对象编程03:封装、继承、多态
  18. ​LeetCode刷题实战216:组合总和 III
  19. 试用Unity3D体验(三):添加Loading页面
  20. 认证服务:注册和登录

热门文章

  1. xz1推送android9.0,索尼XZ1/XZP港版正式推送Android 9.0更新 搭载4K HDR显示屏
  2. 8421码到5421码的转换_如何实现用283加法器实现8421码到5421码的转换
  3. c语言蚂蚁搬,小班语言蚂蚁搬豆教案
  4. 一种改进的进化模型和混沌优化的萤火虫算法-附代码
  5. Redis的list,set,zset类型应用及排行榜的实现
  6. 青岛企业掘金大数据时代 大数据时代已经来临
  7. java unparseable_java.text.ParseException: Unparseable date: 2015-06-09 hh:56:19
  8. 向量空间中的基底和基变换以及坐标变换
  9. 在Python中一步一步实现Principal Component Analysis(PCA)
  10. Github+域名搭建个人主页(个人博客)