栓州 发表于 13 小时前

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

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

详细接口文档见官方文档:luatos接口外设库文档
上测试代码:
--led灯条展示

local this = {}

local gpioId = 24 --输出gpio引脚
local timeDelay = 2000 --灯光刷新间隔 闪动间隔

local cfg = {} --led灯状态
local color = { --GRB
    red = 0x00b400, --红色 故障
    blue = 0x0000b4, --蓝色 空闲
    green = 0xb40000, --绿色 充电中/充满
    orange = 0x609600, --橙色 插枪时颜色
    close = 0x000000, --关灯
    pink = 0x00b4b4, --粉红色 急停按下 闪动
}

--1-电源指示灯状态 0/100-故障 红灯 1-正常
--2-灯珠状态 0-熄灭 1-点亮
local powerState = {
    state = 100, --电源指示灯状态 0-熄灭 1-正常 绿常亮 100-故障 红闪
    light = 0, --灯珠状态0-熄灭 1-点亮
}

local light=0 --闪动灯珠统一的状态0-熄灭 1-点亮


--led灯光存储zbuff x=4*y=3 二维数组
local buff = zbuff.create({ 4, 3, 24 }, color.red)--x=4,y=3

for i = 1, rxConfig.get("portCount") do
    cfg = {
      state = 100, --状态 0空闲(蓝闪)、1充电中(绿闪)、3已插枪(黄闪)、4急停按下(红闪)、5充电完成(绿色常亮) 100-故障/异常/超功率(红闪)
      light = 0, --灯珠状态0-熄灭 1-点亮
    }
end

gpio.setup(gpioId, 1)
gpio.set(gpioId, 0)
--pwm.open(1, 800*1000, 50,1)
--ws2812.create(ws2812.PWM, 12, 1)



--向led总线发送数据
local function sendData()
    sensor.ws2812b(gpioId, buff, 10, 0, 10, 300)
    --sensor.ws2812b_pwm(1,buff)
    --for i=0,11 do
    --    pwm.open(0, 800*1000,buff,8)
    --end

end

--延迟100毫秒显示默认红灯状态
sys.timerStart(function()
    sendData()
end, 100)

--设置某行灯珠颜色
--i 1-A枪指示灯 2-系统指示灯 3-B枪指示灯
--c 颜色
local function setColor(i, c)
    buff:drawLine(0, i - 1, 4, i - 1, c)--绿
end

--设置指定接口灯珠的led颜色
--port 1-10接口id100-电源指示灯
local function setPortLed(port, c)
    if port == 100 then
      setColor(2, c)
    elseif port == 1 then
      setColor(1, c)
    elseif port == 2 then
      setColor(3, c)
    end
end

--获取指定接口状态的颜色和事件 1 2接口号100电源指示灯
--return 颜色,事件 1-常亮 2-闪动
local function getStateData(port)
    if port < 10 and cfg == nil then
      return nil
    end
    --电源指示灯处理
    if port == 100 then
      local state = powerState.state
      if state == 0 then
            return color.close, 1
      elseif state == 1 then
            return color.blue, 1
      else
            return color.red, 2
      end
      --return 0, 0
    end

    local state = cfg.state
    if state == 0 then
      --空闲 蓝色 闪动
      return color.blue, 2
    elseif state == 1 then
      --充电中 绿色 闪动
      return color.green, 2
    elseif state == 3 then
      --插枪 橙色 闪动
      return color.orange, 2
    elseif state == 4 then
      --急停按下 粉红色 闪动
      return color.pink, 2
    elseif state == 5 then
      return color.green, 1
    else
      return color.red, 2
    end
end


--设置指定接口灯的状态
local function setState(port, state)
    if cfg==nil then
      return
    end

    log.info("rx_led.lua.setState:port,state=",port,state)
    cfg.state = state
end

--led灯带处理事件
local function ledEvent()
    --处理电源指示灯
    local powerColor, s = getStateData(100)
    if s == 1 then
      --常亮处理
      setPortLed(100, powerColor)
      powerState.light = 1
    else
      --闪动处理
      if powerState.light == 0 then
            --当前熄灭处理
            setPortLed(100, powerColor)
            powerState.light = 1
      else
            --当前亮灯处理
            setPortLed(100, color.close)
            powerState.light = 0
      end
    end

    --处理各接口指示灯
    for k, v in pairs(cfg) do
      local c, s = getStateData(k) --获取灯的状态和颜色
      if c ~= nil then
            --local light=0
            --if k==1 then
            --    light=cfg.light
            --end

            if s == 1 then
                --常亮处理
                setPortLed(k, c)
                cfg.light = 1
            else
                --2和其他 闪动处理
                if light == 0 then
                  setPortLed(k, c)
                  cfg.light = 1
                  --light=1
                else
                  setPortLed(k, color.close)
                  cfg.light = 0
                  --light=0
                end
            end
      end
    end

    if light==0 then
      light=1
    else
      light=0
    end

    sendData()
    --sys.timerStart(ledEvent, timeDelay)
end

local function ledEventLoop()
    sys.taskInit(function()
      while true do
            ledEvent()
            sys.wait(timeDelay)
      end
    end)

end

ledEventLoop()

--其他业务事件代码省略

return this 
正常灯带应该全部闪红色,但是经过测试,每间隔几秒就会出现几个灯错误颜色或者灭后个别亮起,当插在电脑usb上的时候,基本不会出现问题,本来以为是电源不稳定的,后来经过合宙官方技术支持提醒,问题存在在:
1.4g通讯类芯片,网络通讯优先级最高,可能在给灯带发送数据时,被更高优先级的网络底层通讯占用时间片
2.如果插usb正常,拔掉usb不正常,可以关闭uart0的debug日志尝试解决
 
我们先关闭uart0的日志尝试,问题就解决了,分享以下关闭uart0日志的方式:
 
需要登录合宙luatos构建平台,https://www.luatos.com/
登录后点击右上角的构建功能
新建构建,模块类型选择 EC618-luatos.
在功能模块选择中,找到"释放UART0供用户使用.不能从UART0读取底层日志了,只能通过USB读取日志"选项,选中

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 合宙air780E解决适配ws2812b灯带发送错误问题