0

我正在尝试使用超锁(“Turbo”模式)Raspberry Pi 和两个 MCP23017 i2c 端口扩展器来复用 63 个 RGB LED 阵列。我遇到的问题是 LED 闪烁很多。

每个 LED 基本上是三个 LED 合二为一,共阳极。因此,我将它们视为单独的 LED。因此,我实际上在 14x14 矩阵中有 189 个 LED,而不是 63 个 LED。它由以下人员创建:

pin_array=[[0]*14 for i in range(14)]

然后,矩阵中的每个条目都填充有 1 表示 LED 应该打开,或者 0 表示应该关闭。要循环打开/关闭每个 LED,我使用以下代码:

#Example continous loop
while (1==1):
    #Cycle through pins and turn on/off appropriate LEDs
    for row_index, row in enumerate(pin_array):
        #Power on row
        mcp1.output(row_index,1) #for mcp1 a value of 1 is On
        for col_index, column in enumerate(row):
            #If the value is 1 turn on the LED then turn it off
            if column==1:
                mcp2.output(col_index,0) #for mcp2 a value of 0 is On
                mcp2.output(col_index,1)
        #Power off row
        mcp1.output(row_index,0)

有什么方法可以改进/优化上面的代码,让它运行得更快,这样闪烁就消失了?

更新:我尝试使用 zero.zero.seven、user2357112 和 kindall 给出的一些优化和建议,结果如下:

last_row=13
last_col=13
while 1:
    row=0
    #Cycle through pins and turn on/off appropriate LEDs
    while row<14:
        col=0
        #Power on row
        mcp1.output(row,1) #for mcp1 a value of 1 is On
        while col<14:
            if pin_array[row][col]==1:
                mcp2.output(last_col,1) #for mcp2 a value of 0 is On
                mcp2.output(col,0)
                last_row=row
                last_col=col
            col+=1
        mcp1.output(row,0)
        row+=1

我必须判断闪烁的唯一方法是悲伤地用眼睛。在我看来,随着优化和激活计划的变化,闪烁没有任何明显的变化。

4

2 回答 2

0

我认为这些是您需要的微优化

#Example continous loop
#these are optional
#pin_array_len = len(pin_array)
#i_len = len(pin_array[0])
while True:
    i = 0
    #Cycle through pins and turn on/off appropriate LEDs
    while i < 14:
        j = 0
        #Power on row
        mcp1.output(i,1) #for mcp1 a value of 1 is On
        while j < 14:
            #If the value is 1 turn on the LED then turn it off
            if pin_array[i][j]==1:
                mcp2.output(j,0) #for mcp2 a value of 0 is On
                mcp2.output(j,1)
            j += 1
        #Power off row
        mcp1.output(i,0)
        i += 1
于 2013-08-04T03:58:58.120 回答
0

我认为您最大的问题是您几乎在打开 LED 时就将其关闭。由于循环的开销,LED 将花费比关闭更少的时间。避免这种情况的一种方法可能是记住您打开的最后一列,并在打开下一个 LED 之前将其关闭,而不是相反。

您还可以进行一些微优化。例如,不要强制 Python每次通过循环进行比较,只需执行1或什至我认为会稍微快一点(因为这是一个必须查找的全局名称)。这不会有很大的不同,因为这种比较不会经常发生。1whilewhile Truewhile 1True

通过一些技巧,您也许可以将内部循环编写为生成器表达式。虽然这不利于可读性,但您可能会获得更好的性能。enumerate()此外,您可以尝试预先生成行和列索引列表并仅迭代索引,而不是使用 进行迭代。当然,您将需要对此进行分析,以查看它是否实际上更快。

但是,您永远不会从 CPython 获得真正的高性能。幸运的是,PyPy 2.1 运行在 ARM 上,可以部署在树莓派上;你可以试试。

于 2013-08-04T04:00:40.183 回答