找回密码
 立即注册
首页 业界区 安全 合宙air780E解决适配ws2812b灯带发送错误问题 ...

合宙air780E解决适配ws2812b灯带发送错误问题

栓州 昨天 09:24
最近使用合宙air780E通过gpio口直驱ws2812b灯带,使用luatos开发,系统自带外设库
sensor.ws2812b(pin,data,T0H,T0L,T1H,T1L) 

详细接口文档见官方文档:luatos接口外设库文档
上测试代码:
  1. --led灯条展示
  2. local this = {}
  3. local gpioId = 24 --输出gpio引脚
  4. local timeDelay = 2000 --灯光刷新间隔 闪动间隔
  5. local cfg = {} --led灯状态
  6. local color = { --GRB
  7.     red = 0x00b400, --红色 故障
  8.     blue = 0x0000b4, --蓝色 空闲
  9.     green = 0xb40000, --绿色 充电中/充满
  10.     orange = 0x609600, --橙色 插枪时颜色
  11.     close = 0x000000, --关灯
  12.     pink = 0x00b4b4, --粉红色 急停按下 闪动
  13. }
  14. --1-电源指示灯状态 0/100-故障 红灯 1-正常
  15. --2-灯珠状态 0-熄灭 1-点亮
  16. local powerState = {
  17.     state = 100, --电源指示灯状态 0-熄灭 1-正常 绿常亮 100-故障 红闪
  18.     light = 0, --灯珠状态  0-熄灭 1-点亮
  19. }
  20. local light=0 --闪动灯珠统一的状态  0-熄灭 1-点亮
  21. --led灯光存储zbuff x=4*y=3 二维数组
  22. local buff = zbuff.create({ 4, 3, 24 }, color.red)  --x=4,y=3
  23. for i = 1, rxConfig.get("portCount") do
  24.     cfg[i] = {
  25.         state = 100, --状态 0空闲(蓝闪)、1充电中(绿闪)、3已插枪(黄闪)、4急停按下(红闪)、5充电完成(绿色常亮) 100-故障/异常/超功率(红闪)
  26.         light = 0, --灯珠状态  0-熄灭 1-点亮
  27.     }
  28. end
  29. gpio.setup(gpioId, 1)
  30. gpio.set(gpioId, 0)
  31. --pwm.open(1, 800*1000, 50,1)
  32. --ws2812.create(ws2812.PWM, 12, 1)
  33. --向led总线发送数据
  34. local function sendData()
  35.     sensor.ws2812b(gpioId, buff, 10, 0, 10, 300)
  36.     --sensor.ws2812b_pwm(1,buff)
  37.     --for i=0,11 do
  38.     --    pwm.open(0, 800*1000,buff[i],8)
  39.     --end
  40. end
  41. --延迟100毫秒显示默认红灯状态
  42. sys.timerStart(function()
  43.     sendData()
  44. end, 100)
  45. --设置某行灯珠颜色
  46. --i 1-A枪指示灯 2-系统指示灯 3-B枪指示灯
  47. --c 颜色
  48. local function setColor(i, c)
  49.     buff:drawLine(0, i - 1, 4, i - 1, c)  --绿
  50. end
  51. --设置指定接口灯珠的led颜色
  52. --port 1-10接口id  100-电源指示灯
  53. local function setPortLed(port, c)
  54.     if port == 100 then
  55.         setColor(2, c)
  56.     elseif port == 1 then
  57.         setColor(1, c)
  58.     elseif port == 2 then
  59.         setColor(3, c)
  60.     end
  61. end
  62. --获取指定接口状态的颜色和事件 1 2接口号  100电源指示灯
  63. --return 颜色,事件 1-常亮 2-闪动
  64. local function getStateData(port)
  65.     if port < 10 and cfg[port] == nil then
  66.         return nil
  67.     end
  68.     --电源指示灯处理
  69.     if port == 100 then
  70.         local state = powerState.state
  71.         if state == 0 then
  72.             return color.close, 1
  73.         elseif state == 1 then
  74.             return color.blue, 1
  75.         else
  76.             return color.red, 2
  77.         end
  78.         --return 0, 0
  79.     end
  80.     local state = cfg[port].state
  81.     if state == 0 then
  82.         --空闲 蓝色 闪动
  83.         return color.blue, 2
  84.     elseif state == 1 then
  85.         --充电中 绿色 闪动
  86.         return color.green, 2
  87.     elseif state == 3 then
  88.         --插枪 橙色 闪动
  89.         return color.orange, 2
  90.     elseif state == 4 then
  91.         --急停按下 粉红色 闪动
  92.         return color.pink, 2
  93.     elseif state == 5 then
  94.         return color.green, 1
  95.     else
  96.         return color.red, 2
  97.     end
  98. end
  99. --设置指定接口灯的状态
  100. local function setState(port, state)
  101.     if cfg[port]==nil then
  102.         return
  103.     end
  104.     log.info("rx_led.lua.setState:port,state=",port,state)
  105.     cfg[port].state = state
  106. end
  107. --led灯带处理事件
  108. local function ledEvent()
  109.     --处理电源指示灯
  110.     local powerColor, s = getStateData(100)
  111.     if s == 1 then
  112.         --常亮处理
  113.         setPortLed(100, powerColor)
  114.         powerState.light = 1
  115.     else
  116.         --闪动处理
  117.         if powerState.light == 0 then
  118.             --当前熄灭处理
  119.             setPortLed(100, powerColor)
  120.             powerState.light = 1
  121.         else
  122.             --当前亮灯处理
  123.             setPortLed(100, color.close)
  124.             powerState.light = 0
  125.         end
  126.     end
  127.     --处理各接口指示灯
  128.     for k, v in pairs(cfg) do
  129.         local c, s = getStateData(k) --获取灯的状态和颜色
  130.         if c ~= nil then
  131.             --local light=0
  132.             --if k==1 then
  133.             --    light=cfg[k].light
  134.             --end
  135.             if s == 1 then
  136.                 --常亮处理
  137.                 setPortLed(k, c)
  138.                 cfg[k].light = 1
  139.             else
  140.                 --2和其他 闪动处理
  141.                 if light == 0 then
  142.                     setPortLed(k, c)
  143.                     cfg[k].light = 1
  144.                     --light=1
  145.                 else
  146.                     setPortLed(k, color.close)
  147.                     cfg[k].light = 0
  148.                     --light=0
  149.                 end
  150.             end
  151.         end
  152.     end
  153.     if light==0 then
  154.         light=1
  155.     else
  156.         light=0
  157.     end
  158.     sendData()
  159.     --sys.timerStart(ledEvent, timeDelay)
  160. end
  161. local function ledEventLoop()
  162.     sys.taskInit(function()
  163.         while true do
  164.             ledEvent()
  165.             sys.wait(timeDelay)
  166.         end
  167.     end)
  168. end
  169. ledEventLoop()
  170. --其他业务事件代码省略
  171. return this
复制代码
 
正常灯带应该全部闪红色,但是经过测试,每间隔几秒就会出现几个灯错误颜色或者灭后个别亮起,当插在电脑usb上的时候,基本不会出现问题,本来以为是电源不稳定的,后来经过合宙官方技术支持提醒,问题存在在:
1.4g通讯类芯片,网络通讯优先级最高,可能在给灯带发送数据时,被更高优先级的网络底层通讯占用时间片
2.如果插usb正常,拔掉usb不正常,可以关闭uart0的debug日志尝试解决
 
我们先关闭uart0的日志尝试,问题就解决了,分享以下关闭uart0日志的方式:
 
需要登录合宙luatos构建平台,https://www.luatos.com/
登录后点击右上角的构建功能
新建构建,模块类型选择 EC618-luatos.
在功能模块选择中,找到"释放UART0供用户使用.不能从UART0读取底层日志了,只能通过USB读取日志"选项,选中
1.jpeg

在选择其他需要的功能模块,构建后选择该底层固件进行尝试,问题就解决了

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册