孙瑜
常州星宇车灯股份有限公司,江苏常州 213000
LED凭借着亮度高、颜色饱和度高、低功耗、寿命长的特点逐渐取代卤素灯成为车灯行业的主流。同时随着车灯开始朝着智能化、个性化和人性化的方向发展,车灯上LED使用数量越来越多,对LED的控制要求也越来越高,这也无疑增加了软件的工作量以及工作难度。因此,本文设计了一种基于Python的车灯动画效果数据化技术,结合Excel及Python的特点,将车灯动画效果数据化。从而实现车灯效果可视化配置以及快速修改更新,大大减小了软件的工作量以及工作难度,适用于以后更加设计复杂、难度更高的LED车灯项目。
根据结构设计将灯组简图通过Excel进行绘制,并进行编号。图1为灯组分布简图。
图1 灯组分布简图
如图1所示,灰色部分为后组合1灯组,黑色为后组合灯2灯组,浅灰色为后组合2的侧标部分。其中,1~36号灯组只需要点亮熄灭功能,37~51号灯组带呼吸效果,因此需要使用PWM进行控制。本文示例后组合灯共包含51组LED灯,将详细呈现该后组合灯动画效果数据化的过程。
动画效果时序图如图2所示,按照灯组分布简图编号制作动画效果时序图,纵坐标为灯组编号及灯名,横坐标为下一帧动画的时间。图中数字0表示灯组关灯,100表示完全点亮,1~99则用于需要控制灯组。此外可附上不同的颜色用于更直观体现开关灯效果,使用颜色深浅表示值。此方案灯名命名规则如图3所示。
图2 动画效果时序图
图3 灯名命名规则
图3中,字符为灯具功能名称(此方案为位置灯,故命名为tail),数字1为该灯组所在后组合灯位置(后组合灯1用数字1表示,后组合2用数字2表示),数字2为该灯组所在IC驱动地址,处于相同IC地址使用同一数字表示,数字3在32位数据类型无法满足数据存储时进行补充。
Jupyter Notebook是基于网页的用于交互计算的应用程序,可被应用于全过程计算,包括开发、文档编写、运行代码和展示结果等。Jupyter Notebook是以网页的形式打开,可以在网页页面中直接编写代码和运行代码,代码的运行结果也会直接在代码块下显示。如在编程过程中需要编写说明文档,可在同一个页面中直接编写,便于作及时的说明和解释。
文中将通过Jupyter Notebook工具演示车灯动画效果数据化过程。
如图4所示,首先调用Openpyxl库和NumPy库,再通过Openpyxl库导入Excel中数据存储于Js_sheet中。
图4 库导入
之后通过Np.dtype定义数据类型,即Open_Type表示后组合灯动画效果类型;Tail2_Type表示后组合灯2动画效果类型;Tail1_Type表示后组合灯1动画效果类型。其中“Name”为数据名,“Formates”为对应数据类型。灯组1~36号只有开关状态,故每个灯组使用0.125 B;37~51号灯组为控制,故每个灯组需要0.875 B。数据“Time”表示下一帧动画开始时间。初始化配置如图5所示。
图5 初始化配置
根据Excel中动画效果时序图,设置动画效果总帧数(Frames_number),时间轴所在行(Time_row),动画效果起始行(Time_start_col)以及每个数据起始行及行数。并通过Np.array创建后组合灯动画效果矩阵(Open_Data),填充值为0。如下所示:
Open_Data=np.array([0]*frames_number,dtype=Open_Type)
按照数据名及数据类型定义各个数据缓存值并初始化,如图6所示。
图6 缓存数据初始化
利用For语句遍历每帧动画效果,同时将数据赋值相应数据中。
(1)“Time”值可以直接读取Js_sheet中第Time_row行数值。
Open_Data[i][’time’]=js_sheet.cell(time_row,time_start_col+i).value
(2)灯组1~36号通过判断读取值是否为0,根据灯组在该数据中位号进行赋值并做相应位移。例如Tail21赋值方式如下:
#tail21数据获取
for j in range(tail21_row_number):
if js_sheet.cell(tail21_row_start+j,time_start_col+i).value==0:
u16Tail21=u16Tail21&(~(0x01< else: u16Tail21=u16Tail21|(0x01< Open_Data[i][tail21]=u16Tail21 (3)灯组37~51号直接将读取数据赋值,因值占0.875 B,为方便读取故每次读取之后位移8位。例如Tail51赋值方式如下: #tail151数据获取 for j in range(tail151_row_number): u8value=js_sheet.cell(tail151_row_seq[j],time_start_col+i).value if u8value<=100: u32Tail151=u32Tail151&(~(0xff<<(j*8))) u32Tail151=u32Tail151|(u8value<<(j*8)) Open_Data[i][tail151]=u32Tail151 按照上述步骤,即可将Excel中数据全部导入Open_Data矩阵中。 动画效果数据表生成步骤为: (1)定义后组合灯1(Tail1_Data)和后组合灯2(Tail2_Data)数据矩阵以及用于存放后组合1和后组合2的重复数据的数组(list_tail1_del,list_tail2_del)。 Tail1_Data=np.array([0]*frames_number,dtype=Tail1_Type) Tail2_Data=np.array([0]*frames_number,dtype=Tail2_Type) list_tail2_del=[] list_tail1_del=[] (2)从Open_Data数据矩阵中后组合1和后组合2数据分别存储在Tail1_Data和Tail2_Data中。 (3)通过遍历方式将Tail1_Data和Tail2_Data中重复数组序号分别存放在list_tail1_del和list_tail2_del中。 (4)删除Tail1_Data和Tail2_Data重复数组,生成后组合灯1最终数据矩阵(Tail1)和后组合灯2最终数据矩阵(Tail1)。 Tail2=np.delete(Tail2_Data,list_tail2_del,0) Tail1=np.delete(Tail1_Data,list_tail1_del,0) (5)将最终生成的动画效果数据打印出,并将灯组数据转换为十六进制便于灯具软件调用生成数据表。 后组合2动画效果数据打印方式如下: tail2_num=Tail2.size print(’尾二动画数据量:%i%tail2_num) print(*************尾二动画数据表*************) for cell in Tail2: print({%i%(cell[time]-offset_time),end=,) print(0x%04x%cell[tail21],end=,) print(0x%02x%cell[tail22],end=,) print(0x%08x%cell[tail231],end=,) print(0x%02x%cell[tail232],end=) print(},) 后组合1动画效果数据打印方式如下: tail1_num=Tail1.size print(尾一动画数据量:%i%tail1_num) print(*************尾一动画数据表*************) for cell in Tail1: print({%i%(cell[time]-offset_time),end=,) print(0x%02x%cell[tail11],end=,) print(0x%02x%cell[tail12],end=,) print(0x%02x%cell[tail13],end=,) print(0x%02x%cell[tail14],end=,) print(0x%08x%cell[tail151],end=,) print(0x%08x%cell[tail152],end=,) print(0x%04x%cell[tail153],end=) print(},) 最终生成动画效果数据表如图7和图8所示。 图7 后组合2动画效果数据表 图8 后组合1动画效果数据表 将生成数据导入相应灯具软件之中,并根据Tail1和Tail2数据类型编写对应解析代码,即可直接使用动画效果数据表。 本文基于Python和Excel设计了一种可以将车灯动画效果数据化的技术,利用Excel可以更加直观地设计修改动画效果,之后生成的数据也能确保正确性和有效性。后期动画效果更新或者维护,仅需调整Excel中动画效果图以及相应配置参数,即可实时生成最新动画效果参数表,直接导入灯具软件中编译即可,这大大节省软件工程师的工作量及项目时间。对于目前越来越复杂的LED车灯设计,该技术也有极大的优势。该技术方案已应用于实际车灯项目,测试及使用表现良好,表明了该设计具有实用性和可靠性。4 动画效果数据表生成
5 结束语