Arduino profi gefragt

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • DieterB
    Member
    • 17.01.2016
    • 792
    • Dieter
    • Kamp-Lintfort

    #1

    Arduino profi gefragt

    Moin
    da das Wetter zum fliegen zu schlecht ist, habe ich mal ein bisschen mit einem Arduino nano rumgespielt. Ich möchte für einen Bixler ( ja nicht lachen, aber für den Winter der beste Flächen Flieger ) eine Beleuchtung anbringen mit RGB Leds WS2812. Eine Seite soll er ein rotes Lauflicht haben- Rot als Hauptfarbe und und Weiß als Lauflicht. Andere Seite soll dasselbe mit Grün/weiß sein.
    Ein Beispiel Sketch aus Fastled habe ich mir soweit zurecht gebogen, das eine Farbe auf 2 verschiedenen Led-Streifen läuft. Aber immer nur Rot oder Grün auf beiden Seiten. Jetzt habe ich schon den ganzen Sonntag rumprobiert, bekomme aber immer nur Fehlermeldungen wenn ich was dazu schreibe. Wie gesagt der folgen Sketch Funktioniert, aber wie bekomme ich es hin das eine rot und eine Grün leuchtet.
    Hier mal in Rot/Blau Wie sag ich dem Arduino das er eine Seite (LED_PIN2) grün anzeigt?

    Die rotmarkierten sachen habe ich als nicht wissender eingefügt, Klappt aber soweit


    Code:
    #include "FastLED.h"
    
    #define ANZAHL_LEDS 16
    #define LED_PIN1 3
    [COLOR="Red"]#define LED_PIN2 5[/COLOR]
    CRGB leds[ANZAHL_LEDS];
    
    void setup() {
      FastLED.addLeds<NEOPIXEL, LED_PIN1>(leds, ANZAHL_LEDS);
      [COLOR="red"] FastLED.addLeds<NEOPIXEL, LED_PIN2>(leds, ANZAHL_LEDS);[/COLOR]
    }
    
    void loop() {
      for (int i = 0; i < ANZAHL_LEDS; i++) {
        leds[i] = CRGB::Blue;
        FastLED.show();
        leds[i] = CRGB::DarkRed;
        delay(200  );
      }
    }
  • jumphigh
    Senior Member
    • 16.12.2009
    • 4248
    • Andreas
    • Allstedt

    #2
    AW: Arduino profi gefragt

    Du musst natürlich auch so viele leds-Arrays anlegen, wie du Streifen getrennt ansteuern willst. Im Moment weist du allen LEDs Blau zu, zeigst es über den FastLED-Treiber an beiden Pins/Streifen gleichzeitig an und überschreibst die gleichen LEDs mit Dunkelrot, ohne dass noch einmal der Show-Befehl dafür käme. Die Zuweisung mit Rot wirkt nie!

    Code:
    #include "FastLED.h"
    
    #define LED_COUNT 16
    #define LEDS_LEFT_PIN 3
    #define LEDS_RIGHT_PIN 5
    CRGB leds_left[LED_COUNT];
    CRGB leds_right[LED_COUNT];
    
    void setup()
    {
      FastLED.addLeds<NEOPIXEL, LEDS_LEFT_PIN>(leds_left, LED_COUNT);
      FastLED.addLeds<NEOPIXEL, LEDS_RIGHT_PIN>(leds_right, LED_COUNT);
      
      for(int i = 0; i < LED_COUNT; i++) leds_left[i] = leds_right[i] = CRGB::White;
      FastLED.show();
      delay(200);
    }
    
    void loop()
    {
      for(int i = 0; i < LED_COUNT; i++)
      {
        int next = (i + 1) % LED_COUNT;
        leds_left[next] = CRGB::Green;
        leds_rights[next] = CRGB::Red;    
        FastLED.show();
        delay(200);
    
        leds_left[i] = CRGB::White;
        leds_rights[i] = CRGB::White;    
        FastLED.show();
        delay(200);
      }
    }
    Das zeigt links Grün und rechts Rot. Es ist immer mind. eine LED mit der Lauffarbe belegt, für 200m sogar zwei nebeneinander.
    Grüße von Andreas

    Kommentar

    • DieterB
      Member
      • 17.01.2016
      • 792
      • Dieter
      • Kamp-Lintfort

      #3
      AW: Arduino profi gefragt

      Hallo Andreas
      Genial, Genau so sollte es sein.Danke Na ja wenn mans kann.
      Kleiner fehler war noch drin leds_rights Aber das habe sogar ich gefunde

      Kann man so ein Sketch erweitern? Z.b das man das auf eine Schalter von der FS legt und verschiedene Efekte erzeugen kann?
      MFG
      Dieter

      Kommentar

      • jumphigh
        Senior Member
        • 16.12.2009
        • 4248
        • Andreas
        • Allstedt

        #4
        AW: Arduino profi gefragt

        Zitat von DieterB Beitrag anzeigen
        Genial, Genau so sollte es sein.
        Es funktioniert so auf dem Arduino? Schön. Ich habe nur deine Angaben genutzt, von der FastLED-Bibliothek habe ich nämlich keine Ahnung.

        Zitat von DieterB Beitrag anzeigen
        Kleiner fehler war noch drin leds_rights Aber das habe sogar ich gefunde
        Jo, da habe ich das "_right" offenbar eins vor dem Ende des Variablennamens angehängt.

        Zitat von DieterB Beitrag anzeigen
        Kann man so ein Sketch erweitern? Z.b das man das auf eine Schalter von der FS legt und verschiedene Efekte erzeugen kann?
        Können kann man vieles. Du müsstest halt den Output deines Empfängers oder Flight-Controllers in den Arduino bekommen. Für Servo-PWM oder PPM gibt es Bibliotheken, die dir einen Schaltwert lesen.
        Grüße von Andreas

        Kommentar

        • Babbsack
          RC-Heli Team
          • 07.07.2001
          • 7449
          • Mike
          • CGN

          #5
          AW: Arduino profi gefragt

          Zitat von jumphigh Beitrag anzeigen
          Können kann man vieles. Du müsstest halt den Output deines Empfängers oder Flight-Controllers in den Arduino bekommen. Für Servo-PWM oder PPM gibt es Bibliotheken, die dir einen Schaltwert lesen.
          Ja, das geht. Schau Dir mal den Befehl pulseIn an, damit habe ich es realisiert. Dafür benötige zumindest ich keinerlei Bibliothek...

          Wenn Du mehr mit dem Arduino arbeiten möchtest, solltest Du eher Abstand von der Delay-Funktion nehmen, da der Controller während des Delays -stehen bleibt- und somit keine weiteren Aktionen ausführt. Schau Dir mal -Blink without Delay- an.

          Kommentar

          • janK
            Member
            • 07.01.2014
            • 504
            • Jan
            • Osnabrück

            #6
            Arduino profi gefragt

            Moin,

            FastLED rendert die Daten schon recht optimiert und ist sehr schnell. Wenn Du ohne die -parallele- Funktion renderst, kannst Du über 300 WS2812 LEDs ansteuern und hast noch genug Zeit über, um ein Signal aus dem Empfänger zu analysieren. Kommt natürlich auch ein wenig auf Deine Arduino Hardware an.

            Das Teensy 3.2 in Verbindung mit dem OctoWS2812 ist schon eine ziemlich gute Lösung von der Stange.

            Bitte beachte: Du steuerst 32 LEDs an, bei voll weißem Licht ziehen die 1,92A bei 5V. Da solltest Du Dir langsam Gedanken über die Stromversorgung machen.

            Wenn Du einen Empfänger anschließen möchtest und getrennte Stromquellen hast, ist ein Optokoppler oder ähnliches Pflicht, damit die Stromkreise getrennt bleiben.

            Wenn Du mehr mit LEDs machen möchtest, sag mir Bescheid. Ich habe mein Nachtflugbeleuchtungsprojekt auf Halde, das ich irgendwann, wenn mal Zeit ist [emoji6] , unter Open Source veröffentlichen werde. Das beinhaltet auch Lagesensorik, Beschleunigungssensoren, Höhensensor, Empfängeranschluss über PWM und noch einiges mehr.
            Auch Lauflichter

            Gruß Jan.
            Der Clown ist die wichtigste Mahlzeit des Tages.

            TDR-2 Speeeeeed, TDF, Goblin 700

            Kommentar

            • DieterB
              Member
              • 17.01.2016
              • 792
              • Dieter
              • Kamp-Lintfort

              #7
              AW: Arduino profi gefragt

              Moin
              Erstmals Danke für eure Antworten. Ich muss aber dazu sagen, das ich absoluter Anfänger bin. Ich denke das ich da mit meinen 66 Jahren auch nicht mehr viel in meine Birne bekommen.Das meiste ist in Englisch und da brauche ich schon meine zeit das zu Lesen und vor allem zu verstehen.Ich habe bis jetzt nur fertige Sketche benutz, in denen ich ein bisschen rum gefummelt habe.
              Also unter dem Motto"Was passiert wenn"
              Durch jumphigh bin ich erst mal drauf gekommen das man andere Bezeichnung nehmen muss, wenn man mehrere Sachen einbinden möchte. Da währe ich als Anfänger nie drauf gekommen. Aber damit habe ich dann die anderen Sketche von Fastled , auf 2 Ledstreifen -umgeschrieben�
              ßber pulsen, PWM und Unipwm habe ich schon einiges gelesen und auch von Sepp62 hier aus dem Forum eine gute Beleuchtung zusammen bekommen. Aber wie gesagt das waren mehr fertige Sketche. Ich denke das ich das mit dem Schalten per Sender eh nicht hin bekomme. Werde aber trotzdem weiter versuchen, Weils einfach Spaß macht bei dem Wetter

              P,S Dies Sketche von der OctoWS2812 habe ich schon versucht, aber da kommen auch Fehler weil der was nicht findet.
              C:\Arduinoold\libraries\OctoWS2811-master/OctoWS2811.h:32:24: fatal error: DMAChannel.h: No such file or directory

              #include "DMAChannel.h" dachte die währe bei Octo2812 dabei
              Zuletzt geändert von DieterB; 14.11.2017, 10:14.

              Kommentar

              • DieterB
                Member
                • 17.01.2016
                • 792
                • Dieter
                • Kamp-Lintfort

                #8
                AW: Arduino profi gefragt

                Hier mal Video von der Spielerei
                Zuletzt geändert von DieterB; 14.11.2017, 11:21.

                Kommentar

                • jumphigh
                  Senior Member
                  • 16.12.2009
                  • 4248
                  • Andreas
                  • Allstedt

                  #9
                  AW: Arduino profi gefragt

                  Zitat von Babbsack Beitrag anzeigen
                  Wenn Du mehr mit dem Arduino arbeiten möchtest, solltest Du eher Abstand von der Delay-Funktion nehmen, da der Controller während des Delays -stehen bleibt- und somit keine weiteren Aktionen ausführt.
                  Nun ja, dann passt aber pulseIn() auch nicht. Denn wenn ich darin die Pulsdauer messe, wird auch kein anderer Code mehr ausgeführt, insbesondere nicht die LEDs weitergeschaltet. Am einfachsten wird wohl eine manuelle Auswertung in loop() mittels Messung der vergangenen Zeit (millis).

                  ßbersetzt fehlerfrei, aber mangels LED ungetestet:

                  Code:
                  #include "FastLED.h"
                  
                  const int LED_COUNT =     16;
                  const int LED_LEFT_PIN =  3;
                  const int LED_RIGHT_PIN = 5;
                  const unsigned long LED_INTERVAL = 200;
                  const int RCV_INPUT_PIN = 2;
                  
                  CRGB led_left[LED_COUNT];
                  CRGB led_right[LED_COUNT];
                  
                  void setup()
                  {
                    pinMode(RCV_INPUT_PIN, INPUT);
                  
                    FastLED.addLeds<NEOPIXEL, LED_LEFT_PIN>(led_left, LED_COUNT);
                    FastLED.addLeds<NEOPIXEL, LED_RIGHT_PIN>(led_right, LED_COUNT);
                    
                    for(int i = 0; i < LED_COUNT; i++) led_left[i] = led_right[i] = CRGB::White;
                    FastLED.show();
                    delay(200);
                  }
                  
                  unsigned long getRcvValue(unsigned long time)
                  {
                    static unsigned long value = 0;
                    static int last_state = HIGH;
                    static unsigned long last_time = 0;
                  
                    //Read servo PPM signal
                    //HIGH to LOW starts timing interval, rise back to HIGH ends
                    int current_state = digitalRead(RCV_INPUT_PIN);
                    if(last_state != current_state)
                    {
                      if(HIGH == last_state)
                      {
                        last_time = time;
                        last_state = LOW; 
                      }
                      else
                      {
                        value = max(1000, time - last_time);
                        value = min(1999, value);
                        value -= 1000; //Restrict to [0, 999]
                        last_state = HIGH;
                      }
                    }
                    
                    return value;
                  }
                  
                  void moveLedStripe(unsigned long time)
                  {
                    static int led = 0;
                    static unsigned long last_time = 0;
                    static int state = 1;
                  
                    if(0 == state && LED_INTERVAL < (time - last_time))
                    {
                      int next = (led + 1) % LED_COUNT;
                      led_left[next] = CRGB::Green;
                      led_right[next] = CRGB::Red;
                      state = 1;
                      FastLED.show();
                    }
                    
                    if(1 == state && (2 * LED_INTERVAL) < (time - last_time))
                    {
                      led_left[led] = CRGB::White;
                      led_right[led] = CRGB::White;    
                      state = 0;
                      last_time = time;
                      led = (led + 1) % LED_COUNT;
                      
                      FastLED.show();
                    }
                  }
                  
                  void loop()
                  {
                      unsigned long time = millis();
                      unsigned long rcv_value = getRcvValue(time);
                      moveLedStripe(time);
                  }
                  Zuletzt geändert von jumphigh; 14.11.2017, 11:32.
                  Grüße von Andreas

                  Kommentar

                  • DieterB
                    Member
                    • 17.01.2016
                    • 792
                    • Dieter
                    • Kamp-Lintfort

                    #10
                    AW: Arduino profi gefragt

                    Hallo Andreas
                    Ich wollte jetzt wirklich keinem Arbeit aufhalsen. Danke für den Sketch.
                    Ich habe den Sketch mal Hochgeladen und Empfänger angeschlossen. Nur den Signal Pin auf D2
                    Die Leds laufen aber es Tut sich nichts beim Umschalten. Habe dann mal am Empfänger auf Gas angeschlossen. Aber auch da ändert sich nichts.
                    MFG
                    Dieter

                    Kommentar

                    • janK
                      Member
                      • 07.01.2014
                      • 504
                      • Jan
                      • Osnabrück

                      #11
                      AW: Arduino profi gefragt

                      Zitat von DieterB Beitrag anzeigen

                      #include "DMAChannel.h" dachte die währe bei Octo2812 dabei


                      Das gehört zur Teensy Erweiterung für Arduino. Dafür brauchst Fu ein Teensy Board.

                      Aber Du bist ja auf nem guten Weg

                      Gruß Jan
                      Der Clown ist die wichtigste Mahlzeit des Tages.

                      TDR-2 Speeeeeed, TDF, Goblin 700

                      Kommentar

                      • jumphigh
                        Senior Member
                        • 16.12.2009
                        • 4248
                        • Andreas
                        • Allstedt

                        #12
                        AW: Arduino profi gefragt

                        gelöscht
                        Zuletzt geändert von jumphigh; 14.11.2017, 15:07.
                        Grüße von Andreas

                        Kommentar

                        • jumphigh
                          Senior Member
                          • 16.12.2009
                          • 4248
                          • Andreas
                          • Allstedt

                          #13
                          AW: Arduino profi gefragt

                          Arg, es handelt sich ja um Mikrosekunden. Also noch einmal komplett - hoffentlich jetzt richtig:

                          Code:
                          #include "FastLED.h"
                          
                          const int LED_COUNT =     16;
                          const int LED_LEFT_PIN =  3;
                          const int LED_RIGHT_PIN = 5;
                          const unsigned long LED_INTERVAL = 200000;
                          const int RCV_INPUT_PIN = 2;
                          
                          CRGB led_left[LED_COUNT];
                          CRGB led_right[LED_COUNT];
                          
                          void setup()
                          {
                            pinMode(RCV_INPUT_PIN, INPUT);
                          
                            FastLED.addLeds<NEOPIXEL, LED_LEFT_PIN>(led_left, LED_COUNT);
                            FastLED.addLeds<NEOPIXEL, LED_RIGHT_PIN>(led_right, LED_COUNT);
                            
                            for(int i = 0; i < LED_COUNT; i++) led_left[i] = led_right[i] = CRGB::White;
                            FastLED.show();
                            delay(200);
                          }
                          
                          unsigned long getRcvValue(unsigned long micros)
                          {
                            static unsigned long value = 0;
                            static int last_state = LOW;
                            static unsigned long last_time = 0;
                          
                            //Read servo  PWM  signal
                            //LOW to HIGH starts timing interval, fall back to LOW ends
                            if(last_state != digitalRead(RCV_INPUT_PIN))
                            {
                              if(LOW == last_state)
                              {
                                last_time = micros;
                                last_state = HIGH; 
                              }
                              else
                              {
                                value = max(0, min(2000, micros - last_time) - 1000); //Range [0µs, 1000µs]
                                last_state = LOW;
                              }
                            }
                            
                            return value;
                          }
                          
                          void moveLedStripe(unsigned long micros)
                          {
                            static int led = 0;
                            static unsigned long last_time = 0;
                            static int state = 1;
                          
                            if(0 == state && LED_INTERVAL < (micros - last_time))
                            {
                              int next = (led + 1) % LED_COUNT;
                              led_left[next] = CRGB::Green;
                              led_right[next] = CRGB::Red;
                              state = 1;
                              FastLED.show();
                            }
                            
                            if(1 == state && (2 * LED_INTERVAL) < (micros - last_time))
                            {
                              led_left[led] = CRGB::White;
                              led_right[led] = CRGB::White;    
                              state = 0;
                              last_time = micros;
                              led = (led + 1) % LED_COUNT;
                              
                              FastLED.show();
                            }
                          }
                          
                          void loop()
                          {
                              unsigned long time = micros();
                              unsigned long rcv_value = getRcvValue(time);
                              moveLedStripe(time);
                          }
                          Der erste Impuls von getRcvValue() kann zu kurz sein. Falls das stört, Anfangszustand/Totzeit einbauen.
                          Zuletzt geändert von jumphigh; 14.11.2017, 15:09.
                          Grüße von Andreas

                          Kommentar

                          • DieterB
                            Member
                            • 17.01.2016
                            • 792
                            • Dieter
                            • Kamp-Lintfort

                            #14
                            AW: Arduino profi gefragt

                            Habe es gerade ausprobiert. Beim schalten passiert wieder nichts.Da ich ja nur Signal an d2 habe, muss da auch GND zum Empfänger? Ich hatte einen anderen Sketch hochgeladen. Da sehe ich das an D2 was ankommt.
                            MFG

                            Kommentar

                            • jumphigh
                              Senior Member
                              • 16.12.2009
                              • 4248
                              • Andreas
                              • Allstedt

                              #15
                              AW: Arduino profi gefragt

                              Zitat von DieterB Beitrag anzeigen
                              Da ich ja nur Signal an d2 habe, muss da auch GND zum Empfänger?
                              MFG
                              IMHO ja!
                              Grüße von Andreas

                              Kommentar

                              Lädt...
                              X