Fehler in Adafruit Neopixel-Code?

LinuxWindows

Cadet 3rd Year
Registriert
Okt. 2018
Beiträge
39
Ich möchte einen Neopixel RGB-Strip mit dem Raspberrypi steuern. Da bin ich auf die Adafruit-Lösung gestoßen. Ich habe die Anleitungen befolgt, doch wenn ich den Test-Code ausführen möchte gibt es einen Fehler:
Code:
pi@raspberrypi:~/Downloads $ python3 blinkatest.py
Hello blinka!
Digital IO ok!
Traceback (most recent call last):
  File "blinkatest.py", line 12, in <module>
    i2c = busio.I2C(board.SCL, board.SDA)
  File "/home/pi/.local/lib/python3.5/site-packages/busio.py", line 15, in __init__
    self.init(scl, sda, frequency)
  File "/home/pi/.local/lib/python3.5/site-packages/busio.py", line 24, in init
    from machine import I2C as _I2C
ImportError: No module named 'machine'
Die betreffende Stelle im Code ist:
Code:
else:
            from machine import I2C as _I2C //Zeile 24!!

        from microcontroller.pin import i2cPorts
        for portId, portScl, portSda in i2cPorts:
            if scl == portScl and sda == portSda:
                self._i2c = _I2C(portId, mode=_I2C.MASTER, baudrate=frequency)
                break
kompletter code der DAtei.
Code:
"""
`busio` - Bus protocol support like I2C and SPI
=================================================

See `CircuitPython:busio` in CircuitPython for more details.

* Author(s): cefn
"""

from adafruit_blinka import Enum, Lockable, agnostic
from adafruit_blinka.agnostic import board_id

class I2C(Lockable):
    def __init__(self, scl, sda, frequency=400000):
        self.init(scl, sda, frequency)

    def init(self, scl, sda, frequency):
        self.deinit()
        if board_id == "raspi_3" or board_id == "raspi_2":
            from adafruit_blinka.microcontroller.raspi_23.i2c import I2C as _I2C
        if board_id == "beaglebone_black":
            from adafruit_blinka.microcontroller.raspi_23.i2c import I2C as _I2C
        else:
            from machine import I2C as _I2C //Zeile 24!!

        from microcontroller.pin import i2cPorts
        for portId, portScl, portSda in i2cPorts:
            if scl == portScl and sda == portSda:
                self._i2c = _I2C(portId, mode=_I2C.MASTER, baudrate=frequency)
                break
        else:
            raise NotImplementedError("No Hardware I2C on (scl,sda)={}\nValid UART ports".format(
        (scl, sda), i2cPorts))

    def deinit(self):
        try:
            del self._i2c
        except AttributeError:
            pass

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        self.deinit()

    def scan(self):
        return self._i2c.scan()

    def readfrom_into(self, address, buffer, *, start=0, end=None):
        if start is not 0 or end is not None:
            if end is None:
                end = len(buffer)
            buffer = memoryview(buffer)[start:end]
        stop = True  # remove for efficiency later
        return self._i2c.readfrom_into(address, buffer, stop=stop)

    def writeto(self, address, buffer, *, start=0, end=None, stop=True):
        if isinstance(buffer, str):
            buffer = bytes([ord(x) for x in buffer])
        if start is not 0 or end is not None:
            if end is None:
                return self._i2c.writeto(address, memoryview(buffer)[start:], stop=stop)
            else:
                return self._i2c.writeto(address, memoryview(buffer)[start:end], stop=stop)
        return self._i2c.writeto(address, buffer, stop=stop)

    def writeto_then_readfrom(self, address, buffer_out, buffer_in, *, out_start=0, out_end=None, in_start=0, in_end=None, stop=False):
        return self._i2c.writeto_then_readfrom(address, buffer_out, buffer_in,
                                               out_start=out_start, out_end=out_end,
                                               in_start=in_start, in_end=in_end, stop=stop)

class SPI(Lockable):
    def __init__(self, clock, MOSI=None, MISO=None):
        print("SPI(): __init()")
        self.deinit()
        if board_id == "raspi_3" or board_id == "raspi_2":
            from adafruit_blinka.microcontroller.raspi_23.spi import SPI as _SPI
        elif board_id == "beaglebone_black":
            print("SPI(): beaglebone_black: from adafruit_blinka.microcontroller.raspi_23.spi import SPI as _SPI")
            from adafruit_blinka.microcontroller.raspi_23.spi import SPI as _SPI
        else:
            from machine import SPI as _SPI
        from microcontroller.pin import spiPorts
        print("spiPorts: {0}".format(spiPorts))
        print("for:")
        for portId, portSck, portMosi, portMiso in spiPorts:
            print(portId, portSck, portMosi, portMiso)
            if ((clock == portSck) and                   # Clock is required!
                (MOSI == portMosi or MOSI == None) and   # But can do with just output
                (MISO == portMiso or MISO == None)):      # Or just input
                print("Line 91")
                print(_SPI)
                print(_SPI(portId))
                self._spi = _SPI(portId)
                self._pins = (portSck, portMosi, portMiso)
                break
        else:
            raise NotImplementedError(
                "No Hardware SPI on (SCLK, MOSI, MISO)={}\nValid SPI ports:{}".
                format((clock, MOSI, MISO), spiPorts))

    def configure(self, baudrate=100000, polarity=0, phase=0, bits=8):
        if board_id == "raspi_3" or board_id == "raspi_2":
            from adafruit_blinka.microcontroller.raspi_23.spi import SPI as _SPI
            from adafruit_blinka.microcontroller.raspi_23.pin import Pin
        elif board_id == "beaglebone_black":
            # reuse the raspberry pi class as both boards use Linux spidev
            from adafruit_blinka.microcontroller.raspi_23.spi import SPI as _SPI
            from adafruit_blinka.microcontroller.beaglebone_black.pin import Pin
        else:
            from machine import SPI as _SPI
            from machine import Pin

        if self._locked:
            # TODO check if #init ignores MOSI=None rather than unsetting, to save _pinIds attribute
            self._spi.init(
                baudrate=baudrate,
                polarity=polarity,
                phase=phase,
                bits=bits,
                firstbit=_SPI.MSB,
                sck=Pin(self._pins[0].id),
                mosi=Pin(self._pins[1].id),
                miso=Pin(self._pins[2].id)
            )
        else:
            raise RuntimeError("First call try_lock()")

    def deinit(self):
        self._spi = None
        self._pinIds = None

    def write(self, buf, start=0, end=None):
        return self._spi.write(buf, start, end)

    def readinto(self, buf, start=0, end=None, write_value=0):
        return self._spi.readinto(buf, start, end)

    def write_readinto(self, buffer_out, buffer_in,  out_start=0, out_end=None, in_start=0, in_end=None):
        return self._spi.write_readinto(buffer_out, buffer_in, out_start, out_end, in_start, in_end)


class UART(Lockable):
    class Parity(Enum):
        pass

    Parity.ODD = Parity()
    Parity.EVEN = Parity()

    def __init__(self,
                 tx,
                 rx,
                 baudrate=9600,
                 bits=8,
                 parity=None,
                 stop=1,
                 timeout=1000,
                 receiver_buffer_size=64,
                 flow=None):
        from machine import UART as _UART
        from microcontroller.pin import uartPorts

        self.baudrate = baudrate

        if flow is not None:  # default 0
            raise NotImplementedError(
                "Parameter '{}' unsupported on {}".format(
                    "flow", agnostic.board))

        # translate parity flag for Micropython
        if parity is UART.Parity.ODD:
            parity = 1
        elif parity is UART.Parity.EVEN:
            parity = 0
        elif parity is None:
            pass
        else:
            raise ValueError("Invalid parity")

        # check tx and rx have hardware support
        for portId, portTx, portRx in uartPorts:  #
            if portTx == tx and portRx == rx:
                self._uart = _UART(
                    portId,
                    baudrate,
                    bits=bits,
                    parity=parity,
                    stop=stop,
                    timeout=timeout,
                    read_buf_len=receiver_buffer_size
                )
                break
        else:
            raise NotImplementedError(
                "No Hardware UART on (tx,rx)={}\nValid UART ports".format(
                    (tx, rx), uartPorts))

    def deinit(self):
        self._uart = None

    def read(self, nbytes=None):
        return self._uart.read(nbytes)

    def readinto(self, buf, nbytes=None):
        return self._uart.readinto(buf, nbytes)

    def readline(self):
        return self._uart.readline()

    def write(self, buf):
        return self._uart.write(buf)
Ich nerve wirklich....:rolleyes:
 
Jetzt kommt keine Fehler-Meldung mehr, aber wenn ich einen richtigen Code ausführe, passiert nichts!
Code:
python3 blink.py
hello blinky!
Gesamter Code:
Code:
import time
import board
import digitalio

print("hello blinky!")

led = digitalio.DigitalInOut(board.D18)

while True:
    led.value = True
    time.sleep(0.5)
    led.value = False
    time.sleep(0.5)
Alles ist nach Anleitung angeschlossen.
 
Ich habe das Ganze geändert und will es nun mit dem Arduino steuern.
Aber der Code spinnt. Die Funktionen sind Weis() soll einen einen weißen Streifen hervorrufen, ColorWipe() ein ablaufen den Bandes, Rot() rotes Licht, Grun() grünes, Blau() Blaues; Rainbow(), RainbowCyle() u. TheaterChaseRainbow() Regenbogeneffekte, sowie TheaterChase() ein Flackern.
Per Knopfdruck soll zwischen den Funktionen gewechselt werden.
Code:
#include <Adafruit_NeoPixel.h>
#define PIN 2
#define NUMPIXELS 15
const int ButtonPin = 0;
int ButtonState;
int Licht = 7;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  // put your setup code here, to run onc.begin();
  strip.begin();
  pinMode(ButtonPin, INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  ButtonState = digitalRead(ButtonPin);
 
  if (Licht = 1){
    Weis();
  }
   if (Licht = 2){
    ColorWipe();
  }
   if (Licht = 3){
    Rot();
  }
   if (Licht = 4){
    Blau();
  }
   if (Licht = 5){
    Grun();
  }
   if (Licht = 6){
    TheaterChase();
  }
   if (Licht = 7){
    Rainbow();
  }
   if (Licht = 8){
    RainbowCyle();
  }
   if (Licht = 9){
    TheaterChaseRainbow();
  }
  strip.show();
}
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}
void ColorWipe(){
  colorWipe(strip.Color(255, 0, 0), 50); // Red
colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue
  delay (0.5);
}

void TheaterChase(){
  theaterChase(strip.Color(127, 127, 127), 50); // White
  theaterChase(strip.Color(127, 0, 0), 50); // Red
  theaterChase(strip.Color(0, 0, 127), 50); // Blue
  theaterChase(strip.Color(0, 127, 0), 50); // Blue

}

void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}
void Rainbow(){
  rainbow(20);
}

void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

void RainbowCyle(){
  rainbowCycle(20);
}

void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

void TheaterChaseRainbow(){
  theaterChaseRainbow(50);
}

void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

void Weis(){
  strip.Color(225, 225, 225);
}

void Rot(){
   strip.Color(225, 0, 0);
}

void Grun(){
   strip.Color(0, 225, 0);
}

void Blau(){
   strip.Color(0, 0, 225);
}


uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
Sorry...
Kann mir jemand helfen? Einiges hätte Ich anders geschrieben, aber ich war am Experiementieren, wie es funktioniert. Gruß;)
 
Keine Ahnung was Du möchtest , wie es sich der Code verhält.

Aber beim kurzen drüber schauen kommt mir einiges seltsam vor:
In loop verwendest Du "ButtonState" - wir wird denn die Variable "ButtonState" in "Licht" übernommen?
Gibt es da einen Zusammenhang.

Und deine If abfragen - nein so geht das gar nicht!
if (b = 5) ist FALSCH (Das ist eine Zuweisung innerhalb einer Klammer b = 5, wobei es immer wahr ist)
If (b == 5) ist richtig.
 
Es geht Vor allem darum, dass ich nicht weiß, wie ich zwischen den Modi wechseln kann und wie ich reine Farben erzeuge. Die Anderen Funktionen sind übernommen und Funktionieren.
 
Ich habe es so weit geschafft, aber man muss bei bestimmten Effekten Ewigkeiten drücken bis Sie kommen. Kann ich das beschleunigen?
 
Zurück
Oben