首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Neopixel LED库

Neopixel LED库
EN

Stack Overflow用户
提问于 2021-03-23 01:15:42
回答 1查看 69关注 0票数 1

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

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

period times of the square wave

现在我想知道如何在覆盆子Pi的帮助下将24位GRB颜色转换为方形波。

Example01

代码语言:javascript
复制
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:~/Libary测试$ sudo python3 LED_testing.py

LED_testing.py:9: RuntimeWarning:此通道已在使用中,仍将继续。使用GPIO.setwarnings(False)禁用警告。GPIO.setup(18,GPIO.OUT)

条带是红色的

pi@raspberrypi:~/Libary测试$

example02

代码语言:javascript
复制
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:~/Libary测试$ sudo python3 LED_testing.py

LED_testing.py:7: RuntimeWarning:此通道已在使用中,仍将继续。使用GPIO.setwarnings(False)禁用警告。GPIO.setup(18,GPIO.OUT)条带呈白色

pi@raspberrypi:~/Libary测试$

EN

回答 1

Stack Overflow用户

发布于 2021-03-23 01:57:01

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

然后,当您查看序列图时:

您可以看到以下内容:

  • A 0表示为0.4us高电平,然后是0.85us低电平
  • A1表示为0.8us高电平,然后是0.45us低电平
  • A rest是50us或更高

的低电平信号

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

代码语言:javascript
复制
import time

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

假设您想要发送GBR值(255,16,12)。翻译为: 11111111001000000001100

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

代码语言:javascript
复制
def get_bits_from_grb(g: int, r: int, b: int) -> list:
  return list(bin(g<<16|r<<8|b).replace("0b", "")) 

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

“高位优先发送”意味着我们从左到右发送。

你的代码应该是以下几行中的某一行:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66750773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档