Neopixel Ansteuerung

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Danieldz
User
Beiträge: 4
Registriert: Samstag 22. Juni 2019, 08:00

Moin,
im Internet habe ich den Neopixel Strandtest für Python gefunden.

Code: Alles auswählen

#!/usr/bin/env python3
# NeoPixel library strandtest example
# Author: Tony DiCola (tony@tonydicola.com)
#
# Direct port of the Arduino NeoPixel library strandtest example.  Showcases
# various animations on a strip of NeoPixels.

import time
from neopixel import *
import argparse

# LED strip configuration:
LED_COUNT      = 30      # Number of LED pixels.
LED_PIN        = 18     # GPIO pin connected to the pixels (18 uses PWM!).
#LED_PIN        = 10      # GPIO pin connected to the pixels (10 uses SPI /dev/spidev0.0).
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 = 50     # 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



# Define functions which animate LEDs in various ways.
def colorWipe(strip, color, wait_ms=50):
    """Wipe color across display a pixel at a time."""
    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):
    """Movie theater light style chaser animation."""
    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):
    """Generate rainbow colors across 0-255 positions."""
    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):
    """Draw rainbow that fades across all pixels at once."""
    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=20, iterations=5):
    """Draw rainbow that uniformly distributes itself across all pixels."""
    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):
    """Rainbow movie theater light style chaser animation."""
    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)

# 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 = Adafruit_NeoPixel(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:

        while True:
            print ('Color wipe animations.')
            colorWipe(strip, Color(255, 0, 0))  # Red wipe
            colorWipe(strip, Color(0, 255, 0))  # Blue wipe
            colorWipe(strip, Color(0, 0, 255))  # Green wipe
            print ('Theater chase animations.')
            theaterChase(strip, Color(127, 127, 127))  # White theater chase
            theaterChase(strip, Color(127,   0,   0))  # Red theater chase
            theaterChase(strip, Color(  0,   0, 127))  # Blue theater chase
            print ('Rainbow animations.')
            rainbow(strip)
            rainbowCycle(strip)
            theaterChaseRainbow(strip)

    except KeyboardInterrupt:
        if args.clear:
            colorWipe(strip, Color(0,0,0), 10)

Bei Run bekomme ich dann folgende Fehlermeldung:
>>> %Run strandtest.py
Traceback (most recent call last):
File "/home/pi/rpi_ws281x/python/examples/strandtest.py", line 89, in <module>
strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)
NameError: name 'Adafruit_NeoPixel' is not defined
>>>
Wie kann ich dieses Problem lösen?
Ich habe auch bei einem anderen Programm (welches kürzer ist), das Problem, dass ich es nur über die Konsole starten kann (mittels sudo). Wenn ich es über python starte, dann kommt diese Meldung:
>>> %Run Neopixel_test.py
Can't open /dev/mem: Permission denied
Traceback (most recent call last):
File "/home/pi/Python/Einstieg/Neopixel/Neopixel_test.py", line 15, in <module>
strip.begin()
File "/home/pi/Python/Einstieg/Neopixel/neopixel.py", line 106, in begin
raise RuntimeError('ws2811_init failed with code {0} ({1})'.format(resp, message))
RuntimeError: ws2811_init failed with code -5 (mmap() failed)
>>>
Dass das irgendwas mit fehlenden Rechten zu tun, habe ich herausgefunden, aber leider keine Lösung dazu.

Vielen lieben Dank an alle hilfreichen Antworten :D
Schönes Wochenende

LG
Danieldz
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Danieldz: Für das erste Problem schreib mal an den Anfang bei den Importen folgendes:

Code: Alles auswählen

import neopixel
print(neopixel)
So kannst Du herausfinden welches Modul da importiert wird und wo das liegt. Und dann schau da mal rein, ob dass das richtige Modul ist, oder ein anderes das halt auch `neopixel` heisst.

Die Lösung beim zweiten Problem ist das über die Konsole zu starten. Mit ``sudo``.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Danieldz: ein typisches Beispiel, warum *-Importe schlecht sind. Denn so muß man raten, woher Python Adafruit_NeoPixel nicht kennt.

In `theaterChase` kannst Du statt selbst i+q zu rechnen, einfach den range bei q starten lassen. Hat zusätzlich den Vorteil, dass, falls die Anzahl der Pixel nicht durch 3 teilbar ist, der Index nicht zu groß wird.

Funktionen schreibt man wie Variablennamen nach Konvention klein_mit_unterstrich.
Danieldz
User
Beiträge: 4
Registriert: Samstag 22. Juni 2019, 08:00

Vielen Dank euch beiden für die schnellen Antworten.
Ich habe das mit der Print Anweisung ausprobiert. Er nimmt die richtige Datei und in dieser Datei wird auch Adafruit_NeoPixel definiert.

Über Sudo habe ich das auch geschafft. Die Frage war nur, ob es auch möglich ist, das direkt aus Python IDLE heraus zu starten. Aber dem scheint nicht so zu sein.

@Sirius3: Ich werde das mit i+q mal ausprobieren. Danke für den Tip.

Habt eine schöne Woche
LG
Danieldz
Antworten