WS2812B - Rainbow Cycle Effekt

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • WS2812B - Rainbow Cycle Effekt

      Ich versuche gerade, den Rainbow Cycle Effekt (siehe Rainbow Cycle oder WS2812B Rainbow) hin zu bekommen. Im ersten Link ist sogar der Code dabei, allerding in C (oder was auch immer) a_28_2c02f089 . Da versteh ich nix.

      Bis jetzt hab ich es geschafft, die Farben auf den Strip zu verteilen und auch zu bewegen, allerdings sieht es bei mir nicht wie "durchgefadet" sondern eher "durchgeshifted" aus, also ziemlich ruppig.


      BASCOM-Quellcode

      1. 'Rainbow Cycle WS2812-Leds
      2. 'Bascom Version 2.0.8.0
      3. '$sim
      4. $regfile = "attiny85.dat"
      5. $crystal = 8000000
      6. $hwstack = 32
      7. $swstack = 10
      8. $framesize = 40
      9. Const Num_leds = 30
      10. Const Num_leds_1 = Num_leds - 1
      11. Config Rainbow = 1 , Rb0_len = Num_leds , Rb0_port = Portb , Rb0_pin = 2
      12. Rb_selectchannel 0
      13. Dim Farbe(3) As Byte
      14. Rot Alias Farbe(_base)
      15. Gruen Alias Farbe(_base + 1)
      16. Blau Alias Farbe(_base + 2)
      17. Dim A As Word
      18. Dim N As Byte
      19. Dim Position As Word
      20. Const Alignment = 768 / Num_leds 'Aufteilung des Farbspektrums auf die Anzahl der LEDs
      21. Do
      22. For N = 0 To Num_leds_1
      23. Select Case Position
      24. Case 0 To 255
      25. Rot = Position '0-255
      26. Gruen = 255 - Position '255-0
      27. Blau = 0
      28. Case 256 To 511
      29. A = Position - 256 '0-255
      30. Rot = 255 - A '255-0
      31. Gruen = 0
      32. Blau = A '0-255
      33. Case 512 To 767
      34. A = Position - 512 '0-255
      35. Rot = 0
      36. Gruen = A '0-255
      37. Blau = 255 - Gruen '255-0
      38. End Select
      39. Rb_setcolor N , Farbe()
      40. Position = Position + Alignment 'Farbspektrum für die nächste LED verschieben
      41. Position = Position - 1 'noch einen kleinen Tick abweichen, um eine Bewegung zu erzeugen
      42. If Position > 767 Then Position = 0
      43. Next N
      44. Rb_send
      45. Waitms 50
      46. Loop
      47. End
      Alles anzeigen

      Könnte mir jemand einen Tipp geben, wie ich das Faden hinbekomme?

      Gruß
      Robert
    • Da gibt's doch die Überblendung im Farbkreis: 100% rot, jetzt stufenweise grün von 0 bis 100%, jetzt stufenweise rot auf 0 bringen, jetzt stufenweise blau dazu, grün auf 0 bringen, stufenweise rot dazu, blau auf 0 bringen. Fertig 1x im Farbkreis rum. Jetzt halt bei x Schritten die Leds 'weiterschieben'.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hatte ich auch schon probiert, da sah das Programm dann so aus (Farbverlauf noch fehlerhaft, war aber auch nur zum kurzen Testen)

      BASCOM-Quellcode

      1. 'Rainbow Cycle WS2812-Leds
      2. 'Bascom Version 2.0.8.0
      3. '$sim
      4. $regfile = "attiny85.dat"
      5. $crystal = 8000000
      6. $hwstack = 32
      7. $swstack = 10
      8. $framesize = 40
      9. Const Num_leds = 30
      10. Config Rainbow = 1 , Rb0_len = Num_leds , Rb0_port = Portb , Rb0_pin = 2
      11. Rb_selectchannel 0
      12. Dim Farbe(3) As Byte
      13. Rot Alias Farbe(_base)
      14. Gruen Alias Farbe(_base + 1)
      15. Blau Alias Farbe(_base + 2)
      16. Const Num_leds_1 = Num_leds - 1
      17. Dim N As Word
      18. Dim Position As Word
      19. Const Alignment = 1280 / Num_leds
      20. Dim A As Word
      21. Dim B As Word
      22. Do
      23. For N = 0 To Num_leds_1
      24. Select Case Position
      25. Case 0 To 255
      26. Rot = Position '0-255
      27. Gruen = 255 '255
      28. Blau = 0
      29. Case 256 To 511
      30. A = Position - 256 '0-255
      31. Rot = 255 '255
      32. Gruen = 255 - A
      33. Blau = 0 '0-255
      34. Case 512 To 767
      35. A = Position - 512 '0-255
      36. Rot = 255 - A
      37. Gruen = 0
      38. Blau = A '255-0
      39. Case 768 To 1023
      40. A = Position - 768 '0-255
      41. Rot = 0
      42. Gruen = 0
      43. Blau = 255 '255
      44. Case 1024 To 1279
      45. A = Position - 1024 '0-255
      46. Rot = 0
      47. Gruen = A
      48. Blau = 255 - A '255-0
      49. End Select
      50. Rb_setcolor N , Farbe()
      51. Position = Position + Alignment 'Farbspektrum für die nächste LED verschieben
      52. Position = Position - 1 'noch einen kleinen Tick abweichen, um eine Bewegung zu erzeugen
      53. If Position > 1279 Then Position = 0
      54. Next N
      55. Rb_send
      56. Waitms 200
      57. Loop
      58. End
      Alles anzeigen
      Ändert aber nichts an der ruppigen Bewegung. Sie ist einfach nicht fließend.

      Gruß
      Robert
    • Wenn du nur die Farbe der 1. Led neu berechnest und die restlichen nur verschiebst? Led 0 rechnen, anzeigen, Farben von letzten Led zur Led1 um eine Ledstelle verschieben (getcolor) und Led1 bekommt Farbe von Led0. Jetzt wieder Led0 berechnen, anzeigen...
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Der Farbunterschied von 2 benachbarten LEDs ist bei meinem Code 768/30 Leds = rund 26. Daher kommt ja die hakelige Bewegung. Ich kann die LEDs also nicht einfach verschieben.
      Wenn Du alledings gemeint hast, die Farbpalette/den Farbkreis nur etwas zu verschieben und die neuen Farbwerte an die LEDs zu senden - das war mein ursprünglicher Gedankengang mit Position = Position - 1 (wobei minus oder plus lediglich die Bewegungsrichtung vorgibt).

      Ich hab Position = Position - 1 auch schon aus der der For/Next Schleife rausgenommen und dahinter gesetzt, brachte aber auch kein brauchbares Ergebnis.
    • Du rechnest jetzt an jeder Ledfarbe rum, das würde ich nicht. Nur an einer Led wird gerechnet, die Led daneben hat die Farbe von der vorhergehenden Berechnug, die nächste Led die Farbe von vor 2 Berechnungen. Das sind aber nur Kopien.

      (ich weiß natürlich nicht, ob meine Gedanken das gelbliche vom Ei ist)
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Ja, aber mein Fliegerchen hat noch nicht längere Flügel bekommen :D , daher die 30 LEDs.

      Meine Überlegungen zu Beginn waren: Eine einzelne LED kann man wunderbar (scheinbar stufenlos) durch das Farbspektrum faden lassen. Die nächste LED soll das gleichen machen, nur eben um die 26 Schritte versetzt, damit das ganze Farbspektrum auf 30 LEDs passt. Nun nur noch die Farbwerte alle paar Millisekunden leicht verschieben und gut is. Als ich dann die paar Codezeilen aus dem ersten Link sah, dacht ich, dass kann nicht so schwer sein :rolleyes:

      Ich werd mal einen neuen Versuch starten mit Deiner vorgeschlagenen Methode.

      Gruß
      Robert
    • Die wird nicht besser sein. Jeder Led eine Position im 'Farbrad zuweisen, von Led zu Led 26 Stufen Differen, und dann an allen Rädern drehen.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • R2D2 Bastler schrieb:

      Der Farbunterschied von 2 benachbarten LEDs ist bei meinem Code 768/30 Leds = rund 26. Daher kommt ja die hakelige Bewegung. Ich kann die LEDs also nicht einfach verschieben.
      eine LED wird schön sanft gefadet. Die Nachbar-LED bekommt einen um 26 verschiedene Farbe usw. reihum.
      Erster Schritt:
      LED1 = 0
      LED2 = LED1 + 26 (=26)
      LED3 = LED1 + 52 (=52)
      usw

      15. Schritt:
      LED1 = 14
      LED2 = LED1 + 26 (=40)
      LED3 = LED1 + 52 (=66)
      usw
    • So, wollt schon Feierabend machen, hab aber nochmal kurz mein ursprüngliches Programm umgerüht. Siehe da, jetzt gehts a_170_58e0202d

      Zunächst habe ich

      BASCOM-Quellcode

      1. If Position > 767 Then Position = 0
      ersetzt duch

      BASCOM-Quellcode

      1. If Position > 767 Then
      2. Position = Position - 768
      3. End If
      da sonst der Rest (der Wert über 768) immer verschleudert wurde.

      Auch mein Ansatz, den "Verschiebewert" hinter die For/Next Schleife zu setzen, war richtig. Nun kann das Farbspektrum auch ganz langsam geschoben werden.

      Hier noch der fertige Code

      BASCOM-Quellcode

      1. 'Rainbow Cycle WS2812-Leds
      2. 'Bascom Version 2.0.8.0
      3. '$sim
      4. $regfile = "attiny85.dat"
      5. $crystal = 8000000
      6. $hwstack = 32
      7. $swstack = 10
      8. $framesize = 40
      9. Const Num_leds = 30
      10. Const Num_leds_1 = Num_leds - 1
      11. Config Rainbow = 1 , Rb0_len = Num_leds , Rb0_port = Portb , Rb0_pin = 2
      12. Rb_selectchannel 0
      13. Dim Farbe(3) As Byte
      14. Rot Alias Farbe(_base)
      15. Gruen Alias Farbe(_base + 1)
      16. Blau Alias Farbe(_base + 2)
      17. Dim A As Word
      18. Dim N As Word
      19. Dim Position As Word
      20. Const Alignment = 768 / Num_leds 'Aufteilung des Farbspektrums auf die Anzahl der LEDs
      21. Do
      22. For N = 0 To Num_leds_1
      23. Select Case Position
      24. Case 0 To 255
      25. Rot = Position '0-255
      26. Gruen = 255 - Position '255-0
      27. Blau = 0
      28. Case 256 To 511
      29. A = Position - 256 '0-255
      30. Rot = 255 - A '255-0
      31. Gruen = 0
      32. Blau = A '0-255
      33. Case 512 To 767
      34. A = Position - 512 '0-255
      35. Rot = 0
      36. Gruen = A '0-255
      37. Blau = 255 - Gruen '255-0
      38. End Select
      39. Rb_setcolor N , Farbe()
      40. Position = Position + Alignment 'Farbspektrum für die nächste LED verschieben
      41. If Position > 767 Then
      42. Position = Position - 768
      43. End If
      44. Next N
      45. Position = Position - 7 'hier Richtung und Geschwindigkeit einstellen
      46. Rb_send
      47. Waitms 20
      48. Loop
      49. End
      Alles anzeigen


      btw, mit welchem Wert rechnet Bascom eigentlich weiter, wenn das Ergebnis einer Berechnung eine Kommazahl ist, wie hier:

      BASCOM-Quellcode

      1. Const Alignment = 768 / Num_leds


      Gruß
      Robert