【问题标题】:Neopixel LED LibraryNeopixel LED 库
【发布时间】:2021-06-19 09:02:30
【问题描述】:

我正在尝试为 Neopixel Led 灯条创建自己的库,因为没有具有我需要的功能的库,我想知道 LED 是如何工作的。在 LED 的Datasheet 中,我发现我必须以方波的形式发送 24 位 GRB 颜色值,并在 24 位之间暂停 50us。

https://i.stack.imgur.com/SG30f.png

period times of the square wave

现在我想知道如何在树莓派的帮助下将这些 24 位 GRB 颜色转换为方波。

示例01

import time
import RPi.GPIO as GPIO



us = 0
GPIO.setmode(GPIO.BOARD)

GPIO.setup(18, GPIO.OUT)

def microdelay(us):
    time.sleep(us/1e6)




def zero():
    GPIO.output(18, GPIO.HIGH)
    microdelay(0.4)
    GPIO.output(18, GPIO.LOW)
    microdelay(0.85)

def one():
    GPIO.output(18, GPIO.HIGH)
    microdelay(0.8)
    GPIO.output(18, GPIO.LOW)
    microdelay(0.45)


# Color Red : 0000 0000 1111 1111 0000 0000

if __name__ == "__main__":
    zero()
    zero()
    zero()
    zero()

    zero()
    zero()
    zero()
    zero()

    one()
    one()
    one()
    one()

    one()
    one()
    one()
    one()

    zero()
    zero()
    zero()
    zero()

    zero()
    zero()
    zero()
    zero()
    print("strip is red")

我在控制台上得到这个输出:

pi@raspberrypi:~/库测试 $ sudo python3 LED_testing.py

LED_testing.py:9: RuntimeWarning: 这个频道已经在使用中,继续。使用 GPIO.setwarnings(False) 禁用警告。 GPIO.setup(18, GPIO.OUT)

条带是红色的

pi@raspberrypi:~/库测试$

例子02

import time


import RPi.GPIO as GPIO


GPIO.setmode(GPIO.BOARD)

GPIO.setup(18, GPIO.OUT)

def usleep(us: int):
  time.sleep(us/1e6)


def one():
    GPIO.output(18, GPIO.HIGH)
    usleep(0.8)
    GPIO.output(18, GPIO.LOW)
    usleep(0.45)



def zero():
    GPIO.output(18, GPIO.HIGH)
    usleep(0.4)
    GPIO.output(18, GPIO.LOW)
    usleep(0.85)




if __name__ == '__main__':

    for i in range(0, 862):
        # Green
        one()
        one()
        one()
        one()

        one()
        one()
        one()
        one()

        # Red
        one()
        one()
        one()
        one()

        one()
        one()
        one()
        one()

        # Blue
        one()
        one()
        one()
        one()

        one()
        one()
        one()
        one()

        usleep(50)
    print("strip is white")

控制台输出: pi@raspberrypi:~/库测试 $ sudo python3 LED_testing.py

LED_testing.py:7: RuntimeWarning: 这个频道已经在使用中,继续。使用 GPIO.setwarnings(False) 禁用警告。 GPIO.setup(18, GPIO.OUT) 条带是白色的

pi@raspberrypi:~/库测试$

【问题讨论】:

    标签: python python-3.x neopixel


    【解决方案1】:

    方波只是数字信号的图形表示。 下表很重要:

    当你再看序列图时:

    您可以看到以下内容:

    • 0 表示为 0.4us 高,然后是 0.85us 低
    • 1 表示 0.8us 高,然后 0.45us 低
    • 休息是 50us 或更长时间的低信号

    提示:要休眠 0.4 毫秒,您可以执行以下操作:

    import time
    
    # sleep for 0.4us
    time.sleep(0.4/1000000)
    

    假设您要发送 GBR 值(255、16、12)。 这将转化为: 11111111001000000001100

    在python中,这可以通过位操作来完成:

    def get_bits_from_grb(g: int, r: int, b: int) -> list:
      return list(bin(g<<16|r<<8|b).replace("0b", "")) 
    

    文档说明:按照GRB的顺序发送数据,先发送高位。

    '高位先发送'表示我们从左到右发送。

    您的代码将包含以下几行:

    import time
    
    def usleep(us: int):
      time.sleep(us/1e6)
    
    def send_bit(signal_bit: bool):
      if signal_bit:
        GPIO.output(pin_number, GPIO.HIGH)
        usleep(0.8)
        GPIO.output(pin_number, GPIO.LOW)
        usleep(0.45)
      else:
        GPIO.output(pin_number, GPIO.HIGH)
        usleep(0.4)
        GPIO.output(pin_number, GPIO.LOW)
        usleep(0.85)
    
    def send_rest():
      GPIO.output(pin_number, GPIO.HIGH)
      usleep(0.51) # should be more than 50us
      GPIO.output(pin_number, GPIO.LOW)
    
    def send_bits(bit_list: list):
      for b in bit_list:
        send_bit(b)
    
    bit_list = get_bits_from_grb(176, 106, 76)
    send_bits(bit_list)
    

    【讨论】:

    • 感谢您的回答。我可以那样做。但我想在终端中输入 0-255 的 RGB 值,然后将其转换为二进制,然后我想将 24Bit 转换为方波。对于 0 0.4us 高和 0.85us 低以及 1 0.8s 高和 0.45us 低。
    • 计算机除了二进制什么都不知道;)你应该使用位操作。假设您的 GRB 值为 (255, 16, 12) 那么您应该执行 255
    • 我如何将二进制转换为方波?
    • 通过将 GPIO 引脚设置为高电平和低电平以实现正确的时序
    • 我试试,谢谢你的快速回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多