BoxtecSupportShopKontaktPlaygroundSitemap

Author Topic: Längere Rotphase bei Neopixelregenbogen - Bitte um Hilfe  (Read 385 times)

Daniel M.

  • Newbie
  • *
  • Posts: 2
  • Karma: +0/-0
Längere Rotphase bei Neopixelregenbogen - Bitte um Hilfe
« on: August 02, 2017, 04:11:53 PM »
Salü Zusammen

Gerne wollte ich mein erstes "brauchbares" Projekt in Angriff nehmen.
Die Idee stammt von hier:
https://www.instructables.com/id/Rainbow-LED-Headband-WS2812-ATTiny85/

Ich würde das ganze gerne für mein Götti-Meitli zum Geburtstag basteln.

Den vorgeschlagenen Sketch "strandtest" habe ich durch einen anderen ausgetauscht.
Ein laufender Regenbogen sollte für den Anfang reichen.

Auf dem Breadboard hat alles auch prima geklappt.
Nun steh ich aber definitiv an. Mir erscheint die "Rotphase" des Regenbogens
in "meinem" Sketch doch recht, wenn nicht sogar verschwindend kurz.
Wie kann ich die verlängern damit auch rot besser zur Geltung kommt
und nicht nur Blau/Grün. Geht das mit diesem Sketch überhaupt?
Ich probier seit bald 4 Tagen erfolglos herum und komme nicht weiter.
Der Code sieht somit auch entsprechend verbastelt aus.

Zugegeben, ich versteh noch recht wenig vom programmieren.
Bisher reichte es für meine Breadboardexperiment immer eines meiner
sieben Bücher zum Thema Arduino zur Hand zu nehmen oder aber die
Suchmaschine anzuwerfen. Diesmal haben mich beide im Stich gelassen.
Es würde mir vorerst auch schon reichen, wenn mir Jemand einen
Wink mit dem Zaunpfahl gibt, wo ich ansetzen muss. Wenn ich's selbst
herausfinde habe ich mehr gelernt, als wenn mir Jemand die Lösung
meines Problems vorkaut. Dankbar wäre ich für beide Arten von Hilfe..

Zum Technischen:
Die Neopixel sind probeweise mit 0.05 mm² Litzen zusammengelötet.
Zwischen ATtiny85 und dem ersten Pixel habe ich einen 470 Ohm-Widerstand gesetzt,
und an +5V und Gnd einen 1000µF-Kondensator.


Der ganze Code:

Code: [Select]

#include <Adafruit_NeoPixel.h>

#ifdef __AVR__                  //Wird benötigt für ATtiny85, weglassen für normalen Arduino
#include <avr/power.h>          //Wird benötigt für ATtiny85, weglassen für normalen Arduino
#endif                          //Wird benötigt für ATtiny85, weglassen für normalen Arduino


const int steuerpin =               1; // physischer Pin5
const int anzahlNeopixel =         11; // z.Z. nur 11 verfügbar
const int helligkeit =            100;
const int Pause1 =                  1;
const int Pause2 =                 11;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(anzahlNeopixel, steuerpin, NEO_GRB + NEO_KHZ800);

void setup() {

#if defined (__AVR_ATtiny85__)                          //Wird benötigt für ATtiny85, weglassen für normalen Arduino
if (F_CPU == 8000000) clock_prescale_set(clock_div_1);  //Wird benötigt für ATtiny85, weglassen für normalen Arduino
#endif                                                  //Wird benötigt für ATtiny85, weglassen für normalen Arduino

strip.begin();
strip.setBrightness(helligkeit);

}

void loop() {
 
    rainbow(50);
  delay(Pause1);
 
}

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

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


// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  if(WheelPos < 85) {
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  }
  else if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  else {
    WheelPos -= 170;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}


Zum Schluss noch dies:
Ich hab nirgends gesehen, das sich Forenmitglieder vorgestellt haben, falls gewünscht stell ich mich kurz vor, wenn mir gesagt wird, wo ich das tun soll und darf. ;)

Liebe Gruess Daniel

pylon

  • freakyfriday
  • Full Member
  • *
  • Posts: 131
  • Karma: +15/-0
Re: Längere Rotphase bei Neopixelregenbogen - Bitte um Hilfe
« Reply #1 on: August 02, 2017, 05:05:40 PM »
Quote
Mir erscheint die "Rotphase" des Regenbogens
in "meinem" Sketch doch recht, wenn nicht sogar verschwindend kurz.

Um Dir eine zufriedenstellende Antwort zu geben, müsstest Du definieren, was Du vom Sketch erwartest. Regenbogen (rainbow) ist etwas hoch gegriffen, da gar nicht alle Farben des Regenbogens dargestellt werden. Der Sketch geht in 256 Schritten die berechneten Farben durch. Dabei wird für das untere Drittel der Schritte Der Farbanteil von Rot von 0 auf 255 geändert, der Grünanteil von 255 runter auf 0. Im zweiten Drittel passiert das Gleiche, aber diesmal mit blau/rot, im letzten Drittel sind es dann grün/blau. Da die Werte linear verändert werden, sind die wichtigsten additiven Mischfarben vertreten. Allerdings wird ausser Acht gelassen, dass das menschliche Auge die Farben linear verarbeitet. Wenn einem Rotton kleine Mengen grün oder blau zugemischt werden, so wird schnell nicht mehr rot erkannt, sondern orange oder violett. Das wird noch verstärkt durch die Tatsache, dass die drei Grundfarben-LEDs in diesen Produkten schon aus physikalischen Gründen nicht gleich stark leuchten, selbst wenn der selbe Wert vorgegeben ist.
Wenn Du also einen Farbwechsel wie ein Regenbogen haben willst, wirst Du wahrscheinlich um eine Farbtabelle und angepasste Algorithmen nicht herumkommen. Wenn das wirklich glatt (smooth) sein soll, dürfte der Tiny85 schnell an seine Speichergrenzen kommen. Mit etwas Herumprobieren könntest Du aber die Werte für die "Festpunkte" auf solcher einer Farbraum-Tour herausfinden (ich würde das aber mit einem Arduino o.ä. machen, der Tiny ist zuwenig flexibel dafür). Dann passt Du den Algorithmus einfach so an, dass zwischen diesen Fest-Farben linear gewechselt wird.

boxtec-support

  • Moderator
  • Hero Member
  • *****
  • Posts: 680
  • Karma: +14/-0
    • Boxtec Web
Re: Längere Rotphase bei Neopixelregenbogen - Bitte um Hilfe
« Reply #2 on: August 02, 2017, 05:32:15 PM »
Hallo Daniel,

Danke für Deinen Post.

Ich möchte gerne pylons Ausführungen folgende beiden hilfreichen Links hinzufügen:

https://diarmuid.ie/blog/pwm-exponential-led-fading-on-arduino-or-other-platforms/

https://learn.adafruit.com/led-tricks-gamma-correction/the-quick-fix


...

Zum Schluss noch dies:
Ich hab nirgends gesehen, das sich Forenmitglieder vorgestellt haben, falls gewünscht stell ich mich kurz vor, wenn mir gesagt wird, wo ich das tun soll und darf. ;)


Natürlich darfst Du das, wir sind gespannt  :)
Wir haben dafür kein eigenes Board, aber das ChitChat Board  würde wohl am ehesten geeignet sein.

Grüsse - Christoph

dinoi

  • freakyfriday
  • Sr. Member
  • *
  • Posts: 364
  • Karma: +6/-0
    • Dinoi
Re: Längere Rotphase bei Neopixelregenbogen - Bitte um Hilfe
« Reply #3 on: August 03, 2017, 09:41:49 PM »
Hallo Daniel,

herzlich Willkommen in unserer Runde. Pylon hat die rainbow Funktion schon schön beschrieben. Wenn ich Dich jedoch richtig verstehe willst du nur die Zeit vom reinen Rot verlängern. Wenn es dir somit egal ist, dass es kein exakter Regenbogen ist, dann würde ich folgende Pause bei Rot einbauen und die rainbow Funktion mit einem IF ergänzen.
Das ist dann nicht smooth aber der Attiny ist dafür immer noch gut geeignet  ;)

Quote
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();
    if ( j == 0 ){
      delay(2000);
    }
    delay(wait);
  }
}

Falls Du auch die anderen Farben (Grün und Blau) auch mehr betonen möchtest, dann das if so umbauen:

Quote
   
    if ( j == 0 || j == 85 || j == 170 ){
      delay(2000);
    }

Viel Erfolg
Gruss Reto
« Last Edit: August 03, 2017, 09:43:27 PM by dinoi »

Daniel M.

  • Newbie
  • *
  • Posts: 2
  • Karma: +0/-0
Der Lösung etwas näher
« Reply #4 on: August 04, 2017, 01:55:06 PM »
Guten Tag  ;D

Herzlichen Dank für eure Antworten! Das hat mich schon sehr viel weiter gebracht. Genau die Art von Input, welche ich gebraucht habe. Ich bin schon fleissig am probieren und testen.
Offenbar habe ich viel geschrieben aber wenig damit ausgesagt bzw. mich undeutlich ausgedrückt. Ziel war es, dass beim faden der Pixel nicht nur eine LED deutlich von gelb->orange->rot-etc.
wechselt sondern über die Länge von mehreren Pixeln und vor allem nicht so schnell. Eben etwas mehr ausgedehnt beim rot.

Quote
Allerdings wird ausser Acht gelassen, dass das menschliche Auge die Farben linear verarbeitet. Wenn einem Rotton kleine Mengen grün oder blau zugemischt werden,
so wird schnell nicht mehr rot erkannt, sondern orange oder violett. Das wird noch verstärkt durch die Tatsache, dass die drei Grundfarben-LEDs in diesen Produkten schon
aus physikalischen Gründen nicht gleich stark leuchten, selbst wenn der selbe Wert vorgegeben ist.

Das hätte mir eigentlich bekannt sein müssen, oder zumindest durch meine Beobachtung auffallen müssen. Dass ein echter Regenbogen nicht simuliert werden kann war mir auch klar.
Er muss auch nicht perfekt sein.
Wie erwähnt, bin ich munter am experimentieren und anpassen. Zufrieden bin ich noch nicht, aber scheinbar auf dem richtigen Weg.
Mit Hilfe von Christoph's Links bin ich über Umwege auf eine interessante Libary gestossen: FastLED.h  Ich glaube, die ist des Rätsels Lösung. Dort lässt sich, wie von
pylon vorgeschlagen,  eine Farbtabelle einrichten, Stichwort "PROGMEM".

Zur Frage, warum ein ATtiny85? Ganz einfach, den gibts auch im SOIC8-Gehäuse. Das braucht weniger Platz als ein ATmega328. Ausserdem kann ich SOIC8 gerade noch so
löten. Einen ATmega328 im TQFP-Gehäuse möchte ich mir nicht zumuten und die PU-Ausführung ist nun wirklich riesig.
Wie erwähnt, das ganze soll in einem Haarband für ein 6j. Mädchen untergebracht werden und da ist wenig Platz und einigermassen robust sollte es auch sein.
Der Tip mit dem delay(2000) von Reto werde ich auch noch ausprobieren, obwohl ich bereits jetzt vermute, dass mir das nicht gefallen wird. Es wäre allerdings unhöfich,
es nicht auszuprobieren.

Ich melde mich wieder, wenn ich was brauchbares habe. Inkl. Code, wenn dafür Interesse besteht.

Liebe Gruess Dani

PS: Vorstellung wird folgen   ;)

 

anything