我正在尝试为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
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
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测试$
发布于 2021-03-23 01:57:01
方波只是数字信号的图形表示。下表很重要:

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

您可以看到以下内容:
的低电平信号
提示:要睡眠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)https://stackoverflow.com/questions/66750773
复制相似问题