跳转至

树莓派

官网镜像

https://www.raspberrypi.com/software/operating-systems/

引脚定义

看这个 https://pinout.vvzero.com/

换源

sudo vim /etc/apt/sources.list
# 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
sudo apt-get update
sudo apt-get upgrade

无线(热点)IP固定方法

sudo vim /etc/dhcpcd.conf

在这里插入图片描述

其中:wlan0代表无线,也就是指定接口 ip_address代表设置的静态ip地址 routers代表路由器/网关IP地址

管脚图

img

WS2812像素灯

CSDN教程:https://blog.csdn.net/cv7xz/article/details/123674270

库安装

sudo pip install rpi_ws281x

库函数介绍

setGamma

image-20220823232828202

show

刷新led buffer

image-20220823232928173

setPixelColor

设置指定像素位置的颜色

color参数

image-20220823233058211

image-20220823233017307

setPixelColorRGB

image-20220823233136350

getBrightness

获取当前led亮度

image-20220823233204655

setBrightness

亮度范围0 - 255

image-20220823233218897

getPixels

获取所有led的color列表,可以通过遍历此值还原某一帧画面

image-20220823233311149

numPixels

获取当前显示的像素点的个数

image-20220823233549532

getPixelColor

获取指定位置像素点的color

image-20220823233842447

getPixelColorRGB

获取指定位置像素点的color

image-20220823233957453

getPixelColorRGBW

image-20220823234010013

一些思路

实现物体在彩色背景移动

  1. 使用getPixels()保存当前画面为背景
  2. 开始绘制每一帧
  3. 使用setPixelColor先把背景写入buffer
  4. 使用setPixelColor先把动画对象写入buffer
  5. 使用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)

评论