Regenbogenfarben auf 68 LED's mit APA102-Stripe

    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!

    • Regenbogenfarben auf 68 LED's mit APA102-Stripe

      Habe gerade die Anforderung Regenbogenfarben auf einen Stripe mit 68 LED's zu verteilen. Bislang habe ich kein Schema gefunden, nach welchem man eine solche Verteilung einstellen kann. Bevor ich dieses selbst per Trial and Error komponiere, frage ich an, ob eine Bearbeitungsvorschrift für die Aufteilung der RGB-Farben bekannt ist, oder ob solches schon jemand realisiert hat. Die Rainbow.lib aus dem Lexikon ist wohl nur für WS2812 gedacht.

      Gruß
      Ulrich

      Edit: Habe da was gefunden. wisotop.de/hsl-to-rgb.php

      Vielleicht komme ich damit weiter

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Ulrich ()

    • Hallo Ulrich,

      was genau ist dein Problem?
      Regenbogenfarben sind doch eindeutig und fangen bei Ultraviolett an und enden in Infrarot-Bereich.
      Dazwischen sind dann die Abstufungen von Blau über Türkis, Grün, Gelb, Orange bis hin zum Rot.

      Ulrich schrieb:

      Die Rainbow.lib aus dem Lexikon ist wohl nur für WS2812 gedacht.
      Ja so ist es und für die APA102 musst du selbst in die Tasten hauen...
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • @Ulrich schau mal hier de.wikipedia.org/wiki/Farbkreis und da unter 'Farbkreis nach Hering'
      Da sieht man gut, wie die Farben gemischt werden, im Prinzip musst du nur einen 68-eckigen Stern drauf legen und die RGB-Werte unter den Spitzen der Zacken ermitteln. Es leuchten maximal 2 Leds gleichzeitig.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Habe meine Regenbogen-Ansteuerung für APA102 jetzt fertig. Es ist so ausgelegt, dass man quasi für jede beliebige (sinnvolle) Anzahl von LEDs eines Stripes eine gleichmäßige Regenbogenfarbenverteilung einstellen kann. Bei mir sind es 68 LEDs. Das Bild meines Prototypen zeigt, was ich damit gemeint hatte.

      Mit dem HSL-Farbchema kann man eine lineare Verteilung, d.h. konstante Schritte auf dem Farbkreis von 360° auswählen und diese anschließend in die RGB-Werte umrechnen, die für die Ansteuerung eines APA102 Stripes benötigt werden.
      html-seminar.de/css3-farbmodell-hsl.htm
      Dateien
    • Hier kommt mein Quellcode zu Regenbogenbild in Post #4

      BASCOM-Quellcode

      1. '(
      2. Datum : 01.11.2019 / 11 : 00h
      3. Funktion: Unendlichkeitsspiegel.bas
      4. /Prototyp-Ausführung zum Spielen/
      5. Bascom Version 2.0.8.2
      6. Atmegatyp : 328p
      7. Das Programm berechnet und steuert einen Apa-102 Led-stripe via SPI zur
      8. Darstellung von Regenbogenfarben. Dabei kann die Anzahl der LEDs, über welche
      9. sich der Regenbogen erstrecken soll, definiert werden. (Variable=>Anzahl_leds)
      10. z.B. 20 Leds oder auch 100 Leds.
      11. Farbwerte sind im HSL-Format vorzugeben, da sich dieses Format sehr leicht
      12. für einen kontinuierlichen Farbwertewechsel eignet.
      13. (siehe auch folgendes Tutorial)
      14. "https://www.html-seminar.de/css3-farbmodell-hsl.htm"
      15. Es wird eine Umrechnung der HSL-Farbwerte nach RGB durchgeführt
      16. Als Ergebnis liegen die Bytes für Rot, Grün und Blau vor.
      17. Grundlage der Umrechnung ist:
      18. "wisotop.de/hsl-to-rgb.php"
      19. Berechnete Werte für R, G und B können z.B. überprüft werden mit:
      20. "https://www.rapidtables.com/convert/color/hsl-to-rgb.html"
      21. Zu Definierende Variablen:
      22. Hier: Anzahl_leds=68
      23. Start-und Endfarbwert können definiert werden :
      24. Hier: Start-Farbwert=> Hue_cnt=0
      25. End-Farbwert=> Hue_max=359
      26. Farb-Sättigung von 0 bis 100%
      27. Hier: Saturation=99
      28. Helligkeit von 0 bis 100%
      29. Hier: Luminance=49
      30. verwendete Hardware:
      31. Hier: 328p auf Arduino-NANO
      32. SPI-Clock (SCK) für Stripe: PB5 bzw. D13 an NANO
      33. SPI-Data (MOSI) für Stripe: PB3 bzw. D11 an NANO
      34. Hinweis: Befinden sich mehr LEDs im Stripe als zuvor definiert, können
      35. die übrigen LEDs als aktiv leuchtende (blau?) übrig bleiben.
      36. Hintergrund ist, dass während der Programmierung SCK und MOSI
      37. gesteuert werden, wodurch undefinierte Zustände im gesamten Stripe
      38. entstehen können.
      39. #################################################################################
      40. ')
      41. $regfile = "m328pdef.dat"
      42. $crystal = 16000000
      43. $hwstack = 100
      44. $swstack = 100
      45. $framesize = 100
      46. $baud = 115200
      47. '$sim
      48. Dim Stripe_byte(300) As Byte 'APA102 Bytes, hier für 68 LEDs=>280 Plätze
      49. ''(4 Startbytes + 68x4 Ledbytes + 4 Endbytes)
      50. Dim I As Word
      51. Dim N_leds As Word
      52. Dim Anzahl_leds As Word
      53. Dim Hue_steps As Single 'Schrittweite der HSL Farbwerte
      54. Dim Hue As Single
      55. Dim Luminance_prozent As Word 'Eingabewert
      56. Dim Saturation_prozent As Word 'Eingabewert
      57. Dim Lum As Single 'Rechenwert
      58. Dim Sat As Single 'Rechenwert
      59. Dim T1 As Single
      60. Dim T2 As Single
      61. Dim T12_diff As Single 'Zwischenwerte
      62. Dim 0666_temp_r As Single 'Zwischenwerte
      63. Dim 0666_temp_g As Single 'Zwischenwerte
      64. Dim 0666_temp_b As Single 'Zwischenwerte
      65. Dim Temp_r As Single 'Zwischenwerte
      66. Dim Temp_g As Single 'Zwischenwerte
      67. Dim Temp_b As Single 'Zwischenwerte
      68. Dim 6_temp_r As Single 'Zwischenwerte
      69. Dim 3_temp_r As Single 'Zwischenwerte
      70. Dim 2_temp_r As Single 'Zwischenwerte
      71. Dim 6_temp_g As Single 'Zwischenwerte
      72. Dim 3_temp_g As Single 'Zwischenwerte
      73. Dim 2_temp_g As Single 'Zwischenwerte
      74. Dim 6_temp_b As Single 'Zwischenwerte
      75. Dim 3_temp_b As Single 'Zwischenwerte
      76. Dim 2_temp_b As Single 'Zwischenwerte
      77. Dim Red As Single
      78. Dim Green As Single
      79. Dim Blue As Single
      80. Dim R As Single
      81. Dim G As Single
      82. Dim B As Single
      83. Dim R_byte As Byte 'Ergebniswert Red
      84. Dim G_byte As Byte 'Ergebniswert Green
      85. Dim B_byte As Byte 'Ergebniswert Blue
      86. Dim Led_cnt As Word 'LED-Counter
      87. Dim Hue_cnt As Single
      88. Dim Hue_max As Single
      89. Dim Last_led As Word 'letzte LED im Stripe, die zu blanken ist
      90. '############################################################################
      91. '---------------Hier Vorgabewerte definieren---------------------------
      92. Anzahl_leds = 68 'Vorgabe der anzusteuernden RGB-LED's
      93. Saturation_prozent = 98 'Vorgabe Sättigungswert in %
      94. Luminance_prozent = 49 'Vorgabe Helligkeitswert in %
      95. Hue_cnt = 0 'Start-Farbwert :min:=0
      96. Hue_max = 359 'End-Farbwert :max:=359
      97. '############################################################################
      98. '------- SPI extended (mehr als 255 Bytes können übertragen werden -----
      99. Config Spi = Hard , Interrupt = Off , Data_order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 4 , Extended = 1
      100. Spsr.0 = 0 '1=double SPI Speed
      101. Spiinit
      102. '--------------------------------------------------------------
      103. 'Ermittlung der benötigten APA102-Stripe Byte-Plätze
      104. N_leds = Anzahl_leds * 4 '4 bytes pro LED
      105. N_leds = N_leds + 8 'plus 4 Start-Bytes und 4 Ende-Bytes
      106. Gosub Blank_leds 'alle definierten LEDs zuvor mal ausschalten
      107. Waitms 100
      108. '----------- Vorbereitung für RGB-LEDs, APA102-Start-Bytes füllen
      109. Stripe_byte(1) = 0
      110. Stripe_byte(2) = 0
      111. Stripe_byte(3) = 0
      112. Stripe_byte(4) = 0
      113. Spiout Stripe_byte(1) , 4
      114. '-------------- Beginn Main ---------------------------------------
      115. Hue_steps = Hue_max / Anzahl_leds 'Anzahl der Helligkeitssteps
      116. 'Hue_steps = 360 / Anzahl_leds 'Anzahl der Helligkeitssteps
      117. Led_cnt = 0 'Led-Counter, für Vergleich mit Anzahl_leds
      118. I = 5 'Index für erstes LED-Byte im APA102-Stripe
      119. Do
      120. If Hue_cnt > Hue_max Then Hue_cnt = Hue_max 'Farb-Überlaufbegrenzung
      121. Hue = Hue_cnt 'HSL-Farbschritt an Farbwert
      122. Gosub Hsl_nach_rgb 'HSL-Farbwerte nach RGB-Farbbytes wandeln
      123. Stripe_byte(i) = &B1111_1111 'APA102-Led Grundhelligkeit '
      124. Stripe_byte(i + 1) = B_byte 'blue
      125. Stripe_byte(i + 2) = G_byte 'green
      126. Stripe_byte(i + 3) = R_byte 'red
      127. Spiout Stripe_byte(i) , 4 'Farb-bytes an Stripe-Leds senden
      128. Hue_cnt = Hue_cnt + Hue_steps 'nächster Farbwert
      129. I = I + 4 'nächste APA102-LED
      130. Incr Led_cnt
      131. Loop Until Led_cnt > Anzahl_leds
      132. End
      133. '------------------------Subroutinen: ----------------------------------
      134. '-------Umrechnung von HSL nach RGB, Basis "wisotop.de/hsl-to-rgb.php" ------
      135. Hsl_nach_rgb:
      136. Lum = Luminance_prozent / 100
      137. Sat = Saturation_prozent / 100
      138. Hue = Hue / 360
      139. If Lum >= 0.5 Then
      140. Gosub Luminance_greater_50
      141. Gosub Verify_with_tests
      142. Else
      143. Gosub Luminance_lower_50
      144. Gosub Verify_with_tests
      145. End If
      146. R = Red * 255 ': Print "Red=" ; Red
      147. G = Green * 255 ': Print "green=" ; Green
      148. B = Blue * 255 ': Print "Blue=" ; Blue
      149. R_byte = Round(r) ': Print "Red= " ; R_byte
      150. G_byte = Round(g) ': Print "Green= " ; G_byte
      151. B_byte = Round(b) ': Print "Blue= " ; B_byte
      152. Return
      153. Luminance_lower_50:
      154. T1 = 1 + Sat
      155. T1 = Lum * T1 ' temp1= Luminance*(1 + Saturation)
      156. T2 = 2 * Lum
      157. T2 = T2 - T1
      158. Return
      159. Luminance_greater_50:
      160. T1 = Lum * Sat
      161. T1 = Sat - T1
      162. T1 = T1 + Lum 'temp1=Luminance+Saturation-Luminance*saturation
      163. T2 = 2 * Lum
      164. T2 = T2 - T1 ' temp2= 2 x Luminance - temp1
      165. Return
      166. Verify_with_tests:
      167. Temp_r = Hue + 0.333 ' : Print "Temp_r= " ; Temp_r
      168. Temp_g = Hue ' : Print "Temp_g= " ; Temp_g
      169. Temp_b = Hue - 0.333 ' : Print "Temp_b= " ; Temp_b
      170. ' ' Print
      171. If Temp_r < 0 Then
      172. Temp_r = Temp_r + 1
      173. End If
      174. If Temp_r > 1 Then
      175. Temp_r = Temp_r - 1
      176. End If
      177. If Temp_g < 0 Then
      178. Temp_g = Temp_g + 1
      179. End If
      180. If Temp_g > 1 Then
      181. Temp_g = Temp_g - 1
      182. End If
      183. If Temp_b < 0 Then
      184. Temp_b = Temp_b + 1
      185. End If
      186. If Temp_b > 1 Then
      187. Temp_b = Temp_b - 1
      188. End If
      189. 6_temp_r = 6 * Temp_r ': Print "6 x Temp_r= " ; 6_temp_r
      190. 2_temp_r = 2 * Temp_r ': Print "2 x Temp_r= " ; 2_temp_r
      191. 3_temp_r = 3 * Temp_r ': Print "3 x Temp_r= " ; 3_temp_r
      192. ' ' Print
      193. 6_temp_g = 6 * Temp_g ': Print "6 x Temp_g= " ; 6_temp_g
      194. 2_temp_g = 2 * Temp_g ': Print "2 x Temp_g= " ; 2_temp_g
      195. 3_temp_g = 3 * Temp_g ': Print "3 x Temp_g= " ; 3_temp_g
      196. ' ' Print
      197. 6_temp_b = 6 * Temp_b ': Print "6 x Temp_b= " ; 6_temp_b
      198. 2_temp_b = 2 * Temp_b ': Print "2 x Temp_b= " ; 2_temp_b
      199. 3_temp_b = 3 * Temp_b ': Print "3 x Temp_b= " ; 3_temp_b
      200. ' ' Print
      201. 'Zwischen-Berechnungen für nachfolgende tests
      202. T12_diff = T1 - T2 ': Print "T1= " ; T1 ; " T2= " ; T2 ; " T-Diff= " ; T12_diff
      203. ' ' Print
      204. 0666_temp_r = 0.666 - Temp_r ': Print "0666 x temp_r= " ; 0666_temp_r
      205. 0666_temp_g = 0.666 - Temp_g ': Print "0666 x temp_g= " ; 0666_temp_g
      206. 0666_temp_b = 0.666 - Temp_b ': Print "0666 x temp_b= " ; 0666_temp_b
      207. ' ' Print
      208. 'Test for Red
      209. 'test1
      210. If 6_temp_r < 1 Then
      211. Red = T12_diff * 6_temp_r
      212. Red = T2 + Red
      213. 'test2
      214. Elseif 2_temp_r < 1 Then
      215. Red = T1
      216. 'test3
      217. Elseif 3_temp_r < 2 Then
      218. Red = T12_diff * 0666_temp_r
      219. Red = Red * 6
      220. Red = T2 + Red
      221. Else
      222. Red = T2
      223. End If
      224. 'Test for Green
      225. 'test1
      226. If 6_temp_g < 1 Then
      227. Green = T12_diff * 6_temp_g
      228. Green = T2 + Green
      229. 'test2
      230. Elseif 2_temp_g < 1 Then
      231. Green = T1
      232. 'test3
      233. Elseif 3_temp_g < 2 Then
      234. Green = T12_diff * 0666_temp_g
      235. Green = Green * 6
      236. Green = T2 + Green
      237. Else
      238. Green = T2
      239. End If
      240. 'Test for Blue
      241. 'test1
      242. If 6_temp_b < 1 Then
      243. Blue = T12_diff * 6_temp_b
      244. Blue = T2 + Blue
      245. 'test2
      246. Elseif 2_temp_b < 1 Then
      247. Blue = T1
      248. 'test3
      249. Elseif 3_temp_b < 2 Then
      250. Blue = T12_diff * 0666_temp_b
      251. Blue = Blue * 6
      252. Blue = T2 + Blue
      253. Else
      254. Blue = T2
      255. End If
      256. Return
      257. '-----------------alle LEDs ausschalten ---------------
      258. Blank_leds:
      259. Last_led = N_leds + 3 'eine LED zusätzlich
      260. Stripe_byte(1) = 0
      261. Stripe_byte(2) = 0
      262. Stripe_byte(3) = 0
      263. Stripe_byte(4) = 0
      264. For I = 5 To Last_led Step 4
      265. Stripe_byte(i) = &B11100000 'alle LEDs ausschalten
      266. Next I
      267. Spiout Stripe_byte(1) , Last_led
      268. Return
      Alles anzeigen
    • Hinweis:

      Im Programm aus Post#7 habe ich ein Steckernetzteil für 12V/2A eingesetzt um erstens den Arduino Nano ( für die SPI-Übertragung) zu versorgen und um zweitens den DC/DC-Converter (Output 5V/5Amax.) für den LED-Strom zu versorgen.

      Dabei kam es immer wieder mal vor, dass die LED's nicht erleuchteten, welches daran lag, dass die LED-Stromversorgung nicht rechtzeitig den 5V-Pegel erreicht hatte. Ein Wait von 1sec nach Zeile 115 im Programm aus Post#7 löst das Problem. Damit ist sichergestellt, dass die APA102 LED-Stromversorgung stabil steht, bevor die SPI-Ansteuerung für die LED-Farben beginnt.

      Anbei zwei Bilder von meinem Unendlichkeitsspiegel mit Regenbogenfarben.
      Dateien