Ich versteh's einfach nicht

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • moinsen,

    ich sitze mal wieder auf dem schlauch. Ich bin gerade dabei, das micropython tutorial unter anderem zwecks neopixel durchzuarbeiten, und hänge dabei fest. dies ist aber grundsätzlich eine python-angelegenheit und nicht speziell auf mpython zu beziehen. folgende code-zeilen als basisblock (so weit, so klar) :

    Python
    from machine import Pin
    from neopixel import NeoPixel
    pin = Pin(14, Pin.OUT) # setzt GPIO14 auf output zur steuerung der neopixels
    np = NeoPixel(pin, 8)  # erstellt neopixel-objekt an GPIO14 für 8 pixels
    
    np[0] = (255, 0, 0)   # rot an erstes pixel
    np.write()            # übermittelt farbe an led

    nun ein beispielcode :

    ich verstehe das hier nicht :

    Code
    n = np.n

    speziell das .n. wer kann mir auf die sprünge helfen beziehungsweise mir das erklären ?

    besten dank im voraus ...

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

  • Das ist das Attribut n des Objektes das am Namen np haengt. So wie os.path das Attribut path vom Objekt os ist. os ist ein Modul, und os.path ist auch ein Modul, aber das hat damit erstmal nix zu tun.

    Was das *konkret* ist - da wuerde ich mal in die neopixel Doku schauen. Ich vermute mal es ist die Nummer der LEDs, weil n gerne als Bezeichner fuer eine solche Anzahl genommen wird. Aber das ist nur geraten. Und es ist auch IMHO eine schlechte Idee, weil es eben so obskur ist. Das hat man davon, das man schlechte, zu kurze Namen waehlt - Verwirrung.

  • Hofei :

    siehste mal, print(np.n) habe ich gar nicht ausprobiert. werde ich nachher mal testen. auch wenn's die anzahl der pixel des led-streifens wäre, finde ich es trotzdem verwirrend, weil man diese ja bereits vorher gesetzt hat (np = ... ).

    @__deets__ :

    ja, klar, es handelt sich ja immerhin um objektorientiertes programmieren, da ist mit schon klar, dass bei blablub.xxx xxx beispielsweise eine methode der funktion blablub, falls blablub eine funktion wäre, oder eben eom klassenobjekt, falls blablub eine klasse wäre, analog dazu natürlich module, etc, pp.

    ja, sch#### abkürzungen. das bisschen zeit, das man beim tippen einspart kostet anderen (lesern) unnötig viel davon UND stiftet - wie du gesagt hast - unnötig verwirrung. gerade in tutorials sollte dies eigentlichg vermieden werden .

    Aber es freut mich, dass ich nicht mehr an meinem verstand zweifle :thumbup: ... danke euch beiden dafür !

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

  • Hallo,

    IMHO ist das ein grundsätzliches Problem von Adafruit bzw. deren Python Modulen, dass die komische dokumentiert sind und teilweise komische Namen für Attribute und Methoden haben. Außerdem ist `np` als Name denkbar schlecht, weil das landläufig mit NumPy assoziiert wird. `import numpy as np` ist nun mal DER Standard, den man auch so flächendeckend im Netz findet.

    Egal. Wie von Hofei schon gesagt: das Attribut `n` einer Instanz von der Klasse NeoPixel gibt die Anzahl der NeoPixel (LEDS) in der Kette an. Der Rückgabewert ist ein Integer.

    Eigentlich auch ein schönes Beispiel, warum Namen wie `n` eine schlechte Idee sind. Wenn das Attribut `number_of_neopixels` oder `neopixel_count`hieß, wäre es eindeutiger.

    Gruß, noisefloor

  • Mich irritiert ehrlich gesagt schon

    Code
    43    demo(np)

    Was ist denn das np, das hier an die Funktion übergeben wird? Das ist die erste Zeile in main - es wurde weder eine Variable noch ein Objekt erzeugt... Wo kommt dieses np her? Oder fehlt hier die Hälfte vom Code?

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • @alle

    ja, np.n gibt die anzahl der zu steuernden leds an, also die anzahl der leds des led-streifens

    Gnom :

    siehe basisblock #4

    was mich vor allen dingen immer wieder nervt :

    es werden ausdrücke/methoden/etc. in code-beispielen verwendet, die zuvor gar nicht angesprochen worden sind :@

    und dass mpython die adafruit neopixel bibliothek benutzt, wurde auch nicht erwähnt ... (könnte ja sein, dass die neopixel-bibliothek auf mpython zugeschnitten wurde ...)

    es tauchen auf einmal parameter/argumente auf, die nicht erwähnt worden sind - da soll sich dann der spass einstellen :D

    => also cross-reading ist angesagt :cursing: und dies ohne hinweise (links) auf die entsprechenden seiten, na suuuper ...

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

  • bereits der erste teil der demo (cycling) ist brutal langssam, auch OHNE sleep_ms(25). hat jemand eine idee, wie man dies beschleunigen könnte ?

    auch der folgende versuch ...

    Code
    def cycling(np):
        for i in range(n):
            np[i] = (0, 0, 255)
            if i > 0:
                np[i – 1] = (0, 0, 0)
            np.write()

    ... ist nicht schneller (à propos: welcher code von den beiden ist eigentlich smarter bzw. kann man dies noch smarter machen ?)

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

  • Aber das müsste doch in der Lib leicht erkennbar sein, dass der Konstruktor als Argument das Attribut n (=Anzahl Pixel) erwartet... dann ist doch auch klar, dass np.n eben das Attrbut n deines Objektes np ist.

    Natürlich wird in den Beispielcodes nicht immer noch die Konstruktion der Methoden dargestellt. Die Mühe muss man sich dann schon machen, mal in den Code der Bibliothek zu schauen.

    Was heißt brutal langsam? Das kann doch gar nicht sein, bei den paar Befehlen...

    Ich würds ggf. mal ungefähr (hab den Code nicht getestet) so versuchen (kommt ungefähr auf das raus, was du versucht hast):

    Code
    for i in range(n):
        np[n] = (0, 0, 0)
        np[0] = (0, 0, 0)
        np.write()
    for i in range(4*n):
        np[i % n] = (0, 0, 0)
        np[(i+1) % n] = (255, 255, 255)
        np.write()

    Alle LEDs mit 0 vorbelegen. Die erste auf 255 vorbelegen. (Wenn nicht noch Belegungen aus vorherigem Code in den LEDs ist, ist das nicht mal nötig.(

    Dann immer nur die aktuelle löschen und die folgende auf 255 setzen, statt wie im vorherigen Code alle LEDs neu zu belegen.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

    3 Mal editiert, zuletzt von Gnom (11. Juni 2020 um 12:06)

  • Das das extrem langsam ist, ist ja auch kein Wunder. Du setzt alle Pixel, und nach jedem gesetzten Pixel schreibst du sie alle erstmal raus.

    Du musst schon auf deine Einrueckungen achten:

    Code
    def cycling(np):
        for i in range(np.n): # Bei dir nur n, ist das nicht ein Fehler? Oder benutzt du globale Variablen?
            np[i] = (0, 0, 255)
            if i > 0:
                np[i – 1] = (0, 0, 0)
        np.write() # <- EINRUECKUNGEN WICHTIG!
  • Aber das müsste doch in der Lib leicht erkennbar sein, dass der Konstruktor als Argument das Attribut n (=Anzahl Pixel) erwartet...

    wenn's denn auch vorher erwähnt worden wäre, dann natürlich ... aber dies sollte eigentlich ja ein unabhängiges Tutorial sein ... nun denn ...

    du hast in deinem code 2 schleifen. sollte eigentlich langsamer (?) sein als nur eine mit einer if-abfrage, oder ?

    => ist auf einmal schneller - weiß nicht warum ... aber gut

    und das 4 * n braucht's eigentlich hierbei auch nicht, und das modulo ja auch nicht (oder übersehe ich da was), da reicht ein simples n und n-1 doch vollkommen aus, odda ?

    also :

    Code
    for i in range(n):
        np[i] = (255, 255, 255)
        if i > 0:
            np[i-1] = (0, 0, 0)
        np.write()

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

  • Auch hier wieder schreibst du jedes mal. Du musst erst alle Pixel setzten, und *dann* schreiben.

  • Stimmt - die Einrückung von np.write und sleep ist falsch...

    Meine erste Schleife ist nur für die Vorbelegung.

    Das Lauflicht selbst wird nur in der zweiten Schleife gemacht.

    n*4 sorgt nur dafür, dass es viermal durchläuft.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • @__deets__ :

    ich hatte #10 gar nicht gesehen ...

    EDIT: aber ich muss doch immer sofort schreiben (np.write()), sonst erziele ich doch keinen lichteffekt !

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

    Einmal editiert, zuletzt von Perlchamp (11. Juni 2020 um 12:46)

  • Die LEDs leuchten so lange in der ursprünglichen Anordnung, bist du ein np.write machst. Also, du kannst in aller Ruhe alle LEDs neu setzen und dann np.write machen.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Also, du kannst in aller Ruhe alle LEDs neu setzen und dann np.write machen.

    NEIN !

    guckst du :

    Code
    def cycling_on(np, r, g, b):
        for i in range(n):
            np[i] = (r, g, b)
            if i > 0:
                np[i-1] = (0, 0, 0)
            np.write()

    => lauflicht, d.h. ein on-pixel durchläuft den kompletten led-streifen

    verhält sich völlig anders im gegensatz zu :

    Code
    def cycling_on(np, r, g, b):
        for i in range(n):
            np[i] = (r, g, b)
            if i > 0:
                np[i-1] = (0, 0, 0)
        np.write()

    alle leds (bis auf die letzte) bleiben dunkel !

    ist etwas KOMPLETT ANDERES ! (so viel zum thema 'symantischer fehler')

    falls du's nicht glauben solltest, probiere es aus ...

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

  • Der Code ist ja auch Schwachsinn. Wenn schon, dann mit zwei Schleifen. Aber der andere Code, wo nur jeweils die betreffenden zwei LEDs geändert werden, ist schneller.

    Hier werden 8 mal (Laufindex i) alle LEDs (Laufindex j) neu geschrieben, wobei jedes mal nur die LED np[j] mit der Nummer von i (=Nummer des Durchlaufs) farbig wird. Alle anderen werden dunkel. np.write wird nur nach jedem Durchlauf von i, also 8 mal ausgeführt, nicht nach dem Setzetn jeder einzelnen LED.

    Code
    def cycling_on(np, r, g, b):
        for i in range(n):
            for j in range(n)
                if i == j:
                    np[j] = (r, g, b)
                else:
                    np[j] = (0, 0, 0)
            np.write()

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • warum ist der code schwachsinn ? er funzt ja ;) ...

    aber auch für deinen code gilt :

    rückst du np.write() eins raus (also in erste schleife), dann hast du ein komplett anderes ergebnis ! und NUR DARUM ging es ...

    aber egal, wissen wir ja beide ...

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

  • Na faktisch ist das, was passiert. Jedes schreiben beschreibt notwendigerweise IMMER alle LEDs. Wenn der gewuenschte Effekt so zu erzielen ist, dass du nur eine LED aenderst, und dann wieder alle schreibst - gut fuer dich.

  • Gnom :

    dass man dies normalerweise mit zwei schleifen ausführt, leuchtet mir natürlich ein ...

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!