Arduino profi gefragt

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

    #16
    AW: Arduino profi gefragt

    ich habe jetzt GND mit angeschlossen am Empfänger. Das scheint auch zu klappen . Mit diesem Sketsch kann ich die Schalterwerte Auslesen.
    Code:
    // Servo Pulslänge vom Empfänger in den Arduino einlesen
    //
    // Matthias Busse 20.07.2015 Version 3.0
    
    int empfaengerPin=2; // Empfänger Signalleitung
    int pulslaenge; // Pulslänge in Mikrosekunden
    
    void setup() {
      pinMode(empfaengerPin, INPUT);
      Serial.begin(38400);
    }
    
    void loop() {
      pulslaenge = pulseIn(empfaengerPin, HIGH);
      Serial.println(pulslaenge);
      delay(500);
    }
    Schalterstellung 0 = 1097-1098
    Schalterstellung 1 = 1497-1499
    Schalterstellung 3 = 1891-1898

    Das sollte ja stimmen.

    Wenn ich dann deinen Sketch hochlade, passiert nichts mit den Leds.
    MFG

    Kommentar

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

      #17
      AW: Arduino profi gefragt

      Habe das mal in deinen sketch eingebaut. da zeigt er mir im Servomonitor die gleichen werte an
      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];
      int empfaengerPin=2; // Empfänger Signalleitung
      int pulslaenge; // Pulslänge in Mikrosekunden
      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);
         pinMode(empfaengerPin, INPUT);
        Serial.begin(38400);
      }
      
      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);
      
      
        pulslaenge = pulseIn(empfaengerPin, HIGH);
        Serial.println(pulslaenge);
        delay(500);
      }

      Kommentar

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

        #18
        Arduino profi gefragt

        Deleted.
        Remote debugging ist so etwas schwierig.
        Zuletzt geändert von janK; 14.11.2017, 16:46.
        Der Clown ist die wichtigste Mahlzeit des Tages.

        TDR-2 Speeeeeed, TDF, Goblin 700

        Kommentar

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

          #19
          AW: Arduino profi gefragt

          Zitat von jumphigh Beitrag anzeigen
          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).
          Danke für den Hinweis, das wußte ich noch nicht. Zähle mich ja auch noch zu den Einsteigern...

          Kommentar

          • jumphigh
            Senior Member
            • 16.12.2009
            • 4143
            • Andreas
            • Allstedt

            #20
            AW: Arduino profi gefragt

            Also bei mir funktioniert es:

            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];
            unsigned long rcv_value = 0;
            
            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);
            
              Serial.begin(57600);
              Serial.println("Ready...");
            }
            
            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 value = getRcvValue(time);
                if(rcv_value != value)
                {
                  rcv_value=value;
                  Serial.println(value);
                }
                moveLedStripe(time);
            }
            Ich kann im seriellen Monitor der Arduino-GUI Werte zwischen 110 und 910 bei Mitte 504 lesen. Devo 10 mit Deviation an einem Clone-DSM2-Empfänger.

            Natürlich habe ich nicht deine LEDs angeschlossen. Wenn diese FastLED-Lib hohe Last erzeugt, könnte in der Loop der Servo-PWM-Impuls schon mal "übersehen" werden. In diesen Fällen sollte man wohl besser einen Change-Interrupt verwenden, anstatt manuell zu pollen.

            Die Lösung mit pulseIn() mag hier funktionieren, erzeugt aber trotzdem einen Jitter von 20ms (10%!) oder mehr. In dieser Funktion wird nichts anderes ausgeführt, also auch die LEDs nicht weitergeschaltet. Man kann nicht den Einwand mit dem delay-Problem bringen und dann durch die Hintertür mit dieser Funktion die selbe Einschränkung einbauen. Aber wie ich sehe, hat das Babbsack auch nicht bedacht.
            Zuletzt geändert von jumphigh; 14.11.2017, 18:19.
            Grüße von Andreas

            Kommentar

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

              #21
              AW: Arduino profi gefragt

              Zitat von jumphigh Beitrag anzeigen
              Aber wie ich sehe, hat das Babbsack auch nicht bedacht.
              Ne, habe ich nicht, da ich mich auch erst seit 2-3 Wochen mit dem Thema Arduino beschäftige.

              Zitat von jumphigh Beitrag anzeigen
              Ich kann im seriellen Monitor der Arduino-GUI Werte zwischen 110 und 910 bei Mitte 504 lesen. Devo 10 mit Deviation an einem Clone-DSM2-Empfänger.

              Natürlich habe ich nicht deine LEDs angeschlossen. Wenn diese FastLED-Lib hohe Last erzeugt, könnte in der Loop der Servo-PWM-Impuls schon mal "übersehen" werden. In diesen Fällen sollte man wohl besser einen Change-Interrupt verwenden, anstatt manuell zu pollen.
              Bei mir kommen auch keine wirklichen Werte heraus... Ich habe den Sketch mal auf das Wesentliche reduziert und im loop() eine Serielle Ausgabe gemacht:
              Code:
              const int RCV_INPUT_PIN = 3;
              unsigned long time;
              
              void setup() {
                pinMode(RCV_INPUT_PIN, INPUT);
                Serial.begin(9600);
              }
              
              unsigned long getRcvValue(unsigned long micros) {
                static unsigned long value = 0;
                static int last_state = LOW;
                static unsigned long last_time = 0;
                
                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;
                  }
                }
                delay(500);
                return value;
              }
              
              void loop() {S
                time = micros();
                unsigned long rcv_value = getRcvValue(time);
              
                Serial.print("getRcvValue: ");
                Serial.println(rcv_value);
              }

              Kommentar

              • jumphigh
                Senior Member
                • 16.12.2009
                • 4143
                • Andreas
                • Allstedt

                #22
                AW: Arduino profi gefragt

                Hier mein reduziertes Beispiel. Funktioniert mit meinem Nano-Clone und dem restl. Setup von oben:

                Code:
                const int RCV_INPUT_PIN = 2;
                
                unsigned long rcv_value=0;
                
                void setup()
                {
                  pinMode(RCV_INPUT_PIN, INPUT);
                  Serial.begin(57600);
                  Serial.println("Ready...");
                }
                
                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 loop()
                {
                    unsigned long time = micros();
                    unsigned long value = getRcvValue(time);
                    if(rcv_value != value)
                    {
                      rcv_value=value;
                      Serial.println(value);
                    }
                }
                Bei Bedarf mache ich auch gerne ein Video als Beweis. Sicher, dass auch die richtigen Pins (Signal auf D2, GND) verbunden wurden?
                Grüße von Andreas

                Kommentar

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

                  #23
                  AW: Arduino profi gefragt

                  Andreas, fehlen in der getRcvValue() bei den micros die ()?

                  Kommentar

                  • jumphigh
                    Senior Member
                    • 16.12.2009
                    • 4143
                    • Andreas
                    • Allstedt

                    #24
                    AW: Arduino profi gefragt

                    Nein. Ist der Parameter der Funktion. micros() wird bei mir nur in der loop aufgerufen.

                    Zumindest das reduzierte Beispiel muss funktionieren. Das ist normales SW-Polling (Digitalisierung eines Signals mittels periodischer Abtastung), wie es z.B. auch SoftSerial macht.
                    Zuletzt geändert von jumphigh; 14.11.2017, 18:33.
                    Grüße von Andreas

                    Kommentar

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

                      #25
                      AW: Arduino profi gefragt

                      Andreas, jetzt funktioniert es... Keine Ahnung, was das Problem gewesen ist.

                      Kommentar

                      • jumphigh
                        Senior Member
                        • 16.12.2009
                        • 4143
                        • Andreas
                        • Allstedt

                        #26
                        AW: Arduino profi gefragt

                        Kann der Thread-Starter bitte einen Admin fragen, ob das doch lehrreiche Problem nicht besser in "Sonstige Elektronik" anstatt hier im OT aufgehoben ist? Verschiebe-Wunsch.
                        Grüße von Andreas

                        Kommentar

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

                          #27
                          AW: Arduino profi gefragt

                          Zitat von jumphigh Beitrag anzeigen
                          Kann der Thread-Starter bitte einen Admin fragen, ob das doch lehrreiche Problem nicht besser in "Sonstige Elektronik" anstatt hier im OT aufgehoben ist? Verschiebe-Wunsch.
                          Habe ihm eine PN geschickt
                          Zitat von jumphigh Beitrag anzeigen
                          Ich kann im seriellen Monitor der Arduino-GUI Werte zwischen 110 und 910 bei Mitte 504 lesen. Devo 10 mit Deviation an einem Clone-DSM2-Empfänger.
                          Diese Werte habe ich mit einem Spektrum DSMX Empfänger auch. jetzt meine ganz bescheidene Frage. Was sollte sich an den leds ändern, wenn ich den Kanal schalte? Vieleicht ändert sich bei mir ja was und ich sehe es nicht. Aber Super das man sich hier solche Gedanken macht.

                          Kommentar

                          • Ralph S.
                            RC-Heli TEAM
                            • 07.07.2009
                            • 3316
                            • Ralph
                            • MSC OberauÃ?em-NiederauÃ?em

                            #28
                            AW: Arduino profi gefragt

                            Verschoben, hier passt das wohl besser rein.

                            Kommentar

                            • jumphigh
                              Senior Member
                              • 16.12.2009
                              • 4143
                              • Andreas
                              • Allstedt

                              #29
                              AW: Arduino profi gefragt

                              Zitat von DieterB Beitrag anzeigen
                              Was sollte sich an den leds ändern, wenn ich den Kanal schalte? Vieleicht ändert sich bei mir ja was und ich sehe es nicht.
                              Du erwartest zu viel von mir. Du wolltest einen Schaltkanal in den Arduino bekommen, den hast du nun. Was du mit den Werten anfängst, ist dein Bier. Du müsstest mir schon verraten, was sich wie bei welchem Wert ändern soll, denn bisher hat es keine Auswirkungen. Du kannst in der Tat keine ßnderung an den LEDs erkennen, nur die Testausgabe in der seriellen Konsole beweist das Vorhandensein des Wertes.
                              Grüße von Andreas

                              Kommentar

                              • jumphigh
                                Senior Member
                                • 16.12.2009
                                • 4143
                                • Andreas
                                • Allstedt

                                #30
                                AW: Arduino profi gefragt

                                Testweise sollte sich mit folgendem Code die Laufgeschwindigkeit in 9 Stufen ändern:

                                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_BASE_INTERVAL = 50000;
                                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 moveLedStrip(unsigned long micros, unsigned long speed)
                                {
                                  static int led = 0;
                                  static unsigned long last_time = 0;
                                  static int state = 1;
                                
                                  const unsigned long interval = LED_BASE_INTERVAL * speed;
                                  
                                  if(0 == state && 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 * 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 = min(9, max(1, getRcvValue(time) / 100)); //Truncate noise
                                    moveLedStrip(time, rcv_value);
                                }
                                Je höher der Kanal, desto langsamer ist das Lauflicht.
                                Zuletzt geändert von jumphigh; 15.11.2017, 10:17.
                                Grüße von Andreas

                                Kommentar

                                Lädt...
                                X