camera780epm.lua 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. -- 实际使用时选1个就行
  2. -- require "bf30a2"
  3. require "gc032a"
  4. -- require "gc0310"
  5. httpplus = require "httpplus"
  6. gpio.setup(2, 1) -- GPIO2打开给camera电源供电
  7. gpio.setup(31, 1) -- GPIO31打开给camera电源供电 1.4版本
  8. gpio.setup(29, 1) -- 1.3版本 GPIO29打开给lcd电源供电
  9. gpio.setup(14, nil) -- 关闭GPIO14,防止camera复用关系出问题
  10. gpio.setup(15, nil) -- 关闭GPIO15,防止camera复用关系出问题
  11. local SCAN_MODE = 0 -- 写1演示扫码
  12. local scan_pause = true
  13. local getRawStart = false
  14. local RAW_MODE = 0 -- 写1演示获取原始图像
  15. -- SCAN_MODE和RAW_MODE都没有写1就是拍照
  16. -- 根据不同的BSP返回不同的值
  17. -- spi_id,pin_reset,pin_dc,pin_cs,bl
  18. local function lcd_pin()
  19. local rtos_bsp = rtos.bsp()
  20. if string.find(rtos_bsp, "780EPM") then
  21. return lcd.HWID_0, 36, 0xff, 0xff, 25 -- 注意:EC718P有硬件lcd驱动接口, 无需使用spi,当然spi驱动也支持
  22. else
  23. log.info("main", "你用的不是780EPM,请更换demo测试", rtos_bsp)
  24. return
  25. end
  26. end
  27. local spi_id, pin_reset, pin_dc, pin_cs, bl = lcd_pin()
  28. if spi_id ~= lcd.HWID_0 then
  29. spi_lcd = spi.deviceSetup(spi_id, pin_cs, 0, 0, 8, 20 * 1000 * 1000, spi.MSB, 1, 0)
  30. port = "device"
  31. else
  32. port = spi_id
  33. end
  34. lcd.init("st7796", {
  35. port = port,
  36. pin_dc = pin_dc,
  37. pin_pwr = bl,
  38. pin_rst = pin_reset,
  39. direction = 0,
  40. -- direction0 = 0x00,
  41. w = 320,
  42. h = 480,
  43. xoffset = 0,
  44. yoffset = 0,
  45. sleepcmd = 0x10,
  46. wakecmd = 0x11
  47. })
  48. local uartid = uart.VUART_0 -- 根据实际设备选取不同的uartid
  49. -- 初始化
  50. local result = uart.setup(uartid, -- 串口id
  51. 600000, -- 波特率
  52. 8, -- 数据位
  53. 1 -- 停止位
  54. )
  55. camera.on(0, "scanned", function(id, str)
  56. if type(str) == 'string' then
  57. log.info("扫码结果", str)
  58. elseif str == false then
  59. log.error("摄像头没有数据")
  60. else
  61. log.info("摄像头数据", str)
  62. sys.publish("capture done", true)
  63. end
  64. end)
  65. -- 按下boot(下载)按键,进行拍照
  66. local function press_key()
  67. log.info("boot press")
  68. sys.publish("PRESS", true)
  69. end
  70. gpio.setup(0, press_key, gpio.PULLDOWN, gpio.RISING)
  71. gpio.debounce(0, 100, 1)
  72. local rawbuff, err
  73. if RAW_MODE ~= 1 then
  74. rawbuff, err = zbuff.create(60 * 1024, 0, zbuff.HEAP_AUTO)
  75. else
  76. rawbuff, err = zbuff.create(640 * 480 * 2, 0, zbuff.HEAP_AUTO) -- gc032a
  77. -- local rawbuff = zbuff.create(240 * 320 * 2, zbuff.HEAP_AUTO) --bf302a
  78. end
  79. if rawbuff == nil then
  80. log.info(err)
  81. end
  82. -- 拍照完成后向USB虚拟串口发送拍的照片,用户可以使用串口调试工具保存原始文件,然后改文件后缀名为jpg
  83. local function sendFile()
  84. sys.taskInit(function()
  85. local fileHandle = io.open("/testCamera.jpg", "rb")
  86. if not fileHandle then
  87. log.error("打开文件失败")
  88. return
  89. else
  90. log.info("文件打开成功,文件大小为", io.fileSize("/testCamera.jpg"))
  91. end
  92. while true do
  93. local data = fileHandle:read(1460)
  94. -- log.info("我看看原始data", data)
  95. if not data then
  96. break
  97. end
  98. log.info("虚拟uart发送数据", uart.write(uartid, data))
  99. sys.wait(10)
  100. end
  101. fileHandle:close()
  102. end)
  103. end
  104. sys.taskInit(function()
  105. log.info("摄像头启动")
  106. -- spi的id和摄像头的id
  107. local cspiId, i2cId = 1, 1
  108. local camera_id
  109. -- 配置iic
  110. i2c.setup(i2cId, i2c.FAST)
  111. gpio.setup(5, 0) -- PD拉低
  112. -- 不同的摄像头型号就打开不同的注释
  113. -- camera_id = bf30a2Init(cspiId,i2cId,25500000,SCAN_MODE,SCAN_MODE)
  114. -- camera_id = gc0310Init(cspiId, i2cId, 25500000, SCAN_MODE, SCAN_MODE)
  115. camera_id = gc032aInit(cspiId, i2cId, 24000000, SCAN_MODE, SCAN_MODE)
  116. camera.stop(camera_id)
  117. camera.preview(camera_id, true) -- 打开LCD预览功能
  118. log.info("按下boot开始测试")
  119. log.info(rtos.meminfo("sys"))
  120. log.info(rtos.meminfo("psram"))
  121. while 1 do
  122. result, data = sys.waitUntil("PRESS", 30000)
  123. if result == true and data == true then
  124. if SCAN_MODE == 1 then
  125. if scan_pause then
  126. log.info("启动扫码")
  127. -- camera_id = gc0310Init(cspiId,i2cId,25500000,SCAN_MODE,SCAN_MODE)
  128. camera.start(camera_id)
  129. scan_pause = false
  130. sys.wait(200)
  131. log.info(rtos.meminfo("sys"))
  132. log.info(rtos.meminfo("psram"))
  133. else
  134. log.info("停止扫码")
  135. -- camera.close(camera_id) --完全关闭摄像头才用这个
  136. camera.stop(camera_id) -- 一般循环打开摄像头拍照的话就只用暂停即可
  137. scan_pause = true
  138. sys.wait(200)
  139. log.info(rtos.meminfo("sys"))
  140. log.info(rtos.meminfo("psram"))
  141. end
  142. elseif RAW_MODE == 1 then
  143. if getRawStart == false then
  144. getRawStart = true
  145. log.debug("摄像头首次捕获原始图像")
  146. camera.startRaw(camera_id, 640, 480, rawbuff) -- gc032a
  147. -- camera.startRaw(camera_id,240,320,rawbuff) --bf302a
  148. else
  149. log.debug("摄像头继续捕获原始图像")
  150. camera.getRaw(camera_id)
  151. end
  152. result, data = sys.waitUntil("capture done", 30000)
  153. log.info("摄像头捕获原始图像完成")
  154. log.info(rtos.meminfo("sys"))
  155. log.info(rtos.meminfo("psram"))
  156. -- uart.tx(uartid, rawbuff) --找个能保存数据的串口工具保存成文件就能在电脑上看了, 格式为JPG
  157. else
  158. log.debug("摄像头拍照")
  159. -- camera_id = gc0310Init(cspiId,i2cId,25500000,SCAN_MODE,SCAN_MODE)
  160. camera.capture(camera_id, "/testCamera.jpg", 1) -- 2和3需要非常多非常多的psram,尽量不要用
  161. -- camera.capture(camera_id, rawbuff, 1) -- 2和3需要非常多非常多的psram,尽量不要用
  162. result, data = sys.waitUntil("capture done", 30000)
  163. -- log.info(rawbuff:used())
  164. -- camera.close(camera_id) --完全关闭摄像头才用这个
  165. camera.stop(camera_id)
  166. log.info("rawbuff长度", rawbuff:len())
  167. sendFile() --也可以上传文件到HTTP服务器,可以结合示例"780EPM_拍照发给HTTP服务器后进入psm+模式"使用
  168. rawbuff:resize(60 * 1024)
  169. log.info("sys ram", rtos.meminfo("sys"))
  170. log.info("lua ram", rtos.meminfo("psram"))
  171. end
  172. end
  173. end
  174. end)