树莓派
# 树莓派
# 官网镜像
https://www.raspberrypi.com/software/operating-systems/
# 引脚定义
看这个 https://pinout.vvzero.com/
# 换源
sudo vim /etc/apt/sources.list
1
# aarch64 用户:编辑 `/etc/apt/sources.list` 文件,用以下内容取代:
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
# 对于两个架构,编辑 `/etc/apt/sources.list.d/raspi.list` 文件,删除原文件所有内容,用以下内容取代:
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ bullseye main
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
sudo apt-get update
sudo apt-get upgrade
1
2
2
# 无线(热点)IP固定方法
sudo vim /etc/dhcpcd.conf
1
其中:wlan0代表无线,也就是指定接口 ip_address代表设置的静态ip地址 routers代表路由器/网关IP地址
# 管脚图
# WS2812像素灯
CSDN教程:https://blog.csdn.net/cv7xz/article/details/123674270
# 库安装
sudo pip install rpi_ws281x
1
# 库函数介绍
# setGamma
# show
刷新led buffer
# setPixelColor
设置指定像素位置的颜色
color参数
# setPixelColorRGB
# getBrightness
获取当前led亮度
# setBrightness
亮度范围0 - 255
# getPixels
获取所有led的color列表,可以通过遍历此值还原某一帧画面
# numPixels
获取当前显示的像素点的个数
# getPixelColor
获取指定位置像素点的color
# getPixelColorRGB
获取指定位置像素点的color
# getPixelColorRGBW
# 一些思路
# 实现物体在彩色背景移动
- 使用
getPixels()
保存当前画面为背景 - 开始绘制每一帧
- 使用
setPixelColor
先把背景写入buffer - 使用
setPixelColor
先把动画对象写入buffer - 使用
show()
刷新缓存
# 支持多线程
# 案例代码
import time
from rpi_ws281x import PixelStrip, Color
import threading
import argparse
LED_COUNT = 256 # LED灯的个数
LED_PIN = 18 # DI端接GPIO18
# 以下可以不用改
LED_FREQ_HZ = 800000 # LED signal frequency in hertz (usually 800khz)
LED_DMA = 10 # DMA channel to use for generating signal (try 10)
LED_BRIGHTNESS = 1 # Set to 0 for darkest and 255 for brightest
LED_INVERT = False # True to invert the signal (when using NPN transistor level shift)
LED_CHANNEL = 0 # set to '1' for GPIOs 13, 19, 41, 45 or 53
# 以下为LED模式变换的各个函数
def colorWipe(strip, color, wait_ms=20):
"""一次擦除显示像素的颜色."""
for i in range(strip.numPixels()):
strip.setPixelColor(i, color)
strip.show()
time.sleep(wait_ms / 1000.0)
def theaterChase(strip, color, wait_ms=50, iterations=10):
"""电影影院灯光风格的追逐动画."""
for j in range(iterations):
for q in range(3):
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i + q, color)
strip.show()
time.sleep(wait_ms / 1000.0)
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i + q, 0)
def wheel(pos):
"""生成横跨0-255个位置的彩虹颜色."""
if pos < 85:
return Color(pos * 3, 255 - pos * 3, 0)
elif pos < 170:
pos -= 85
return Color(255 - pos * 3, 0, pos * 3)
else:
pos -= 170
return Color(0, pos * 3, 255 - pos * 3)
def rainbow(strip, wait_ms=20, iterations=1):
"""绘制彩虹,褪色的所有像素一次."""
for j in range(256 * iterations):
for i in range(strip.numPixels()):
strip.setPixelColor(i, wheel((i + j) & 255))
strip.show()
time.sleep(wait_ms / 1000.0)
def rainbowCycle(strip, wait_ms=10, iterations=5):
"""画出均匀分布在所有像素上的彩虹."""
for j in range(256 * iterations):
for i in range(strip.numPixels()):
strip.setPixelColor(i, wheel(
(int(i * 256 / strip.numPixels()) + j) & 255))
strip.show()
time.sleep(wait_ms / 1000.0)
def theaterChaseRainbow(strip, wait_ms=50):
"""旋转的彩色灯光."""
for j in range(256):
for q in range(3):
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i + q, wheel((i + j) % 255))
strip.show()
time.sleep(wait_ms / 1000.0)
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i + q, 0)
def brightness(strip):
"""设置灯光的亮度."""
while True:
for i in range(255):
strip.setBrightness(i)
strip.show()
time.sleep(0.01)
for i in range(255, 1, -1):
strip.setBrightness(i)
strip.show()
time.sleep(0.01)
# Main program logic follows:
if __name__ == '__main__':
# Process arguments
parser = argparse.ArgumentParser()
parser.add_argument('-c', '--clear', action='store_true', help='clear the display on exit')
args = parser.parse_args()
# Create NeoPixel object with appropriate configuration.
strip = PixelStrip(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)
# Intialize the library (must be called once before other functions).
strip.begin()
print('Press Ctrl-C to quit.')
if not args.clear:
print('Use "-c" argument to clear LEDs on exit')
try:
# t = threading.Thread(target=brightness, name='aa', args=(strip,))
# t.start()
while True:
print('Color wipe animations.')
colorWipe(strip, Color(255, 255, 0)) # Red wipe
print(strip.getPixels()[1])
colorWipe(strip, Color(0, 0, 0), 30)
colorWipe(strip, Color(0, 255, 255)) # Blue wipe
colorWipe(strip, Color(0, 0, 0), 30)
colorWipe(strip, Color(255, 0, 255)) # Green wipe
colorWipe(strip, Color(0, 0, 0), 30)
print('Theater chase animations.')
print('Rainbow animations.')
rainbow(strip)
colorWipe(strip, Color(0, 0, 0), 50)
rainbowCycle(strip)
colorWipe(strip, Color(0, 0, 0), 40)
break
while True:
rainbowCycle(strip)
#print('***********************')
colorWipe(strip, Color(0, 0, 0), 100)
except:
colorWipe(strip, Color(0, 0, 0), 100)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
编辑 (opens new window)
上次更新: 2024/05/09, 12:51:17