Strobolicht für Paintball tactical Shield

Hallo Zusammen,

nach sorgfältiger Durchsicht des Forums auf Stichworte wie Strobolicht, bin ich nur auf verwandte Fragen gestoßen bzw. Fehlerbeschreibungen. Keine dieser Beiträge war für mich geeignet.
Da auch fremdsprachige Artikel mir nicht weitergeholfen haben, eröffne ich einen neuen Beitrag.

Ich möchte unser Paintbal Schild mit Licht/Strobolicht ausstatten.
Die Idee ist es mit 1 Drucktaster normales Licht ein-/auszuschalten. Bzw. bei gleichem Taster gedrückt, dass Strobolicht zu aktivieren.

Ich verwende den Arduino UNO sowie noch zwei vorhandene LED Fahrradlampen die ich dazu verwenden möchte.

LED Fahrradlampen (keine Daten vorhanden, daher aus dem Internet nach bestem Wissen u. Gewissen recherchiert):

  • SMD Led weiß XLamp XP-E / 350mA bei (3,0 - 3,5V)
  • Parallel geschaltet? (so deute ich die Platine) da auch die Fahrradlampe mit 5V läuft kann nur so die Spannung zur Verfügung gestellt werden.

Gleichzeitig soll ein zweiter Sketch auf dem Arduino Musik wiedergeben (bereits implementiert).

GIbt es hier im Forum Hobby-Mentoren, die mich in meinem Projekt unterstützen wollen und für Fragen dies bzgl. offen sind?

Besten Gruß,
Alexander

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Zur Hardware - den Fahrradscheinwerfern - vielleicht nicht gerade was beitragbares, aber zum Codebasteln gehts immer.

Nö.
Das ist alles in einem Sketch - aber in unterschiedlichen Funktionen.
Geht, ist machbar und keine Hexerei, wenn klar ist wie die Lämpchen angesteuert werden sollen.
Dafür brauchts dann eine Leistungstufe - irgendwas mit Mosfet, dafür gibts hier aber auch Spezialisten, die da mnchmal sogar schon fertige Schaltungen haben....

Woher stammt diese Aussage?

Oder andersrum: Geht es dir drum, Tasterbetätigungen in Dauer- oder Blitz-Signale umzusetzen oder um die elektrischen Fragen der Ansteuerung von 350 mA LED mit kurzen Impulsen?

Die cree XLAMP XP-E in weiß verträgt übrigens bis 1000 mA, habe ich gelesen.

Die Platine, die aus der Led eine Fahrradbeleuchtung macht, ist vermutlich weniger geeignet, da dort die Aufgabenstellung entgegengesetzt ist: Trotz wechselnder Stromversorgung möglichst gleichmäßige Beleuchtung.

Auch übliche Konstantstromquellen für Leistungs-LED sind eventuell nicht zur Ansteuerung von Stroboskop-Blitzen gedacht/optimiert.

Da sehe ich also auf der elektrischen Seite die größere Herausforderung als beim Arduino - Sketch

Das Fahrradboard, auf dem alles miteinander verknüpft war, kann man vergessen. Tatsächlich werde ich alles selber auf eine Platine bringen. Die Fahrradlampe hat out of the box schon mehrere Zustände: niedrige, mittlere, hohe Leuchtkraft, SOS, blinken.

Es sind 2 LEDs, wo ich vermute, dass sie parallel geschaltet sind. Und zwar diese LED hier: Highpower SMD Led weiß Cree XLamp XP-E / 350mA 114lm / XPEWHT-L1-WD0-R2-0-06

Die LEDs stammen aus dieser Fahrradlampe (wie gesagt, gibts hier keine Infos über die LED selber):
https://www.kaufland.de/product/400147080/?kwd&source=pla&sid=31955596&gclid=Cj0KCQiAm5ycBhCXARIsAPldzoVEuVQfx-gxYolvqH9AAZlwruQqFRnn_KH8Bfvk0yAy6Og9BzKdtbQaAjNfEALw_wcB

Das Ziel wird sein, 1 Drucktaster zu haben, der 3 Zustände kennt:

  1. Gedrückt halten = Strobo
  2. 1x drücken = Dauerleuchten
  3. 1x erneutes Drücken = Dauerleuchten aus

wie man das ganze in einen sketch packt ist eben die Frage - Vorlagen bzw. Rezepte habe ich leider nicht gefunden. Daher die Frage nach einem Tutor.

Vorgefertigtes Bord der Fahrradlampe:


LED in Parallelschaltung(?):

Hallo longdrink

Am Besten zu zeigst deinen aktuellen Sketch, damit wir sehen können, wie wir dir helfen können.

Hast du bereits Erfahrung in der Programmierung in C++?

Zum testen mach einen Taster zwischen PIN 2 und GND.
Auf dem Board ist eine LED, die je nach Tastendruck ihr Verhalten ändert.
Der lange Tastendruck ist auf 600ms gesetzt. Alsobraucht es schon einen Moment.
Um das prellen des Tasters auszublenden habe ich 40ms gewählt, die reichen eigentlich.
Alles was Tastendrücke zwischen 41 und 599ms sind, wird als kurzer Tastendruck gewertet.

Ich hoffe es ausreichend kommentiert zu haben

// Forensketch - kurzer / langer Tastendruck mit Ereignisanzeige ohne lib
// https://forum.arduino.cc/t/strobolicht-fur-paintball-tactical-shield/1059828/7
// ungetestet - kompiliert fehler und warnungsfrei

enum licht {an, aus, strobo};                        // mögliche Zustände
byte myLicht = licht::aus;                           // Startzustand setzen

constexpr byte tasterPin {2};                        //
constexpr byte ledPin {LED_BUILTIN};                 // OnBoard-LED

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start...."));
  pinMode(tasterPin, INPUT_PULLUP);                  // Taster schaltet nach GND!
  pinMode(ledPin, OUTPUT);
}

void  loop()
{
  getTaster();                                       // Taste abfragen
  setLicht();                                        // Action setzen
}

void getTaster()
{
  uint32_t zeit = millis();                          // aktuelle Zeit
  static bool lastRead = false;                      // Merker für letzten Zustand
  static uint32_t startZeit = 0;                     // Merker für Auslösezeit
  if (!digitalRead(tasterPin))                       // Taster gedrückt?
  {
    if (lastRead == false)                           // und vorher nicht gedrückt?
    {
      startZeit = zeit;                              // Auslösezeit merken
      lastRead = true;                               // sperre setzen
    }
    if (zeit - startZeit > 600)                      // Taste lange gedrückt?
    {
      myLicht = licht::strobo;                       // dann ...
    }
  }
  else                                               // Taste nicht gedrückt?
  {
    if (zeit - startZeit > 40)                       // Prellzeit abgelaufen?
    {
      lastRead = false;                              // merker löschen
      if (myLicht == licht::strobo ||                // Licht war vorher nicht aus?
          myLicht == licht::an)
      {myLicht = licht::aus;}                        // dann maches aus
      else                                           // licht war vorher aus
      {myLicht = licht::an;}                         // dann mach es an
    }
  }
}

void setLicht()
{
  static byte lastLicht = 99;                        // Merker für letzten Zustand
  static uint32_t lastTime = 0;                      // Merker für letzten Umschaltzeitpunkt
  const uint32_t strobeTime = 50;                    // Blitzerzeit in ms
  if (myLicht == licht::strobo &&                    // Aktuell strobo ausgelöst?
      lastLicht != licht::strobo)                    // und vorher nicht?
  {
    lastLicht = licht::strobo;                       // dann merken
    lastTime = millis();                             // Auslösezeit merken
    digitalWrite(ledPin, HIGH);                      // immer mit Licht an starten
  }
  switch (myLicht)                                   // Auswahl
  {
    case licht::an:
      digitalWrite(ledPin, HIGH);
      break;
    case licht::aus:
      digitalWrite(ledPin, LOW);
      break;
    case licht::strobo:
      if (millis() - lastTime > strobeTime)          // Zeit abgelaufen?
      {
        digitalWrite(ledPin, !digitalRead(ledPin));  // toggle PIN
        lastTime = millis();                         // neue Zeit merken
      }
      break;
  }
}

Für die Verwendung auf Deiner Platine würde ich evtl. versuchen den Taster gegen einen Optokoppler zu tauschen - dann bist den ganzen Kram um Trennung der Potentiale los.

Ob der Akku den Arduino dann noch mitversorgen kann, dürfte fraglich sein....

Hallo longdrink

Hier kommt ein einfaches Beispiel mit verketteten und ereignisgesteuerten Timern.

struct STROBOLIGHT
{
  const byte LedPin;
  const byte ButtonPin;
  int   stateOld;
  unsigned long debounceStamp;
  const unsigned long debounceDuration;
  unsigned long flashTimerStamp;
  const unsigned long flashTimerDuration;
  int flashTimerOnOff;
  unsigned long flashStamp;
  const unsigned long flashDuration[2];
  int flashOnOff;
};
STROBOLIGHT stroboLight
{
  8, A0, false,         // LedPin, ButtonPin schaltet GND und aktueller Button Status
  0, 20,                // Zeitwerte für Entprellen 
  0, 1000, false,       // Zeitwerte für das Warten bevor das "Strobo" eingeschaltet wird
  0, {100, 5}, false,   // Zeitwerte für das "Strobo" 100=OFF und 5=ON, alle Zeiten in msec.
};
void setup()
{
  pinMode(stroboLight.ButtonPin, INPUT_PULLUP);
  pinMode(stroboLight.LedPin, OUTPUT);
}
void loop()
{
  unsigned long currentTime = millis();
  // Timer zum Entprellen der Taste 
  if (currentTime - stroboLight.debounceStamp >= stroboLight.debounceDuration)
  {
    stroboLight.debounceStamp = currentTime;
    int stateNew = !digitalRead(stroboLight.ButtonPin);
    // ist die Taste betätigt worden ? 
    if (stroboLight.stateOld != stateNew) {
      // Sketch verriegeln
      stroboLight.stateOld = stateNew;
      // Taste gedrückt=? 
      if (stateNew)
      {
        // Schalte LED ein oder aus
        digitalWrite(stroboLight.LedPin, !digitalRead(stroboLight.LedPin));
        // Wenn die LED eingschaltet ist, dann starte den Wartetimer
        if (digitalRead(stroboLight.LedPin))
        {
          stroboLight.flashTimerStamp = currentTime;
          stroboLight.flashTimerOnOff = true;
        }
      }
      else // Taste losgelassen
      {
        // die Timer anhalten 
        stroboLight.flashTimerOnOff = false;
        stroboLight.flashOnOff = false;
      }
    }
  }
  // ist der Wartetimer abgelaufen? 
  if (currentTime - stroboLight.flashTimerStamp >= stroboLight.flashTimerDuration && stroboLight.flashTimerOnOff)
  {
    // Wartetimer anhalten 
    stroboLight.flashTimerOnOff = false;
    // Strobetimer starten
    stroboLight.flashStamp = currentTime;
    stroboLight.flashOnOff = true;
  }
 // ist der StrobeTimer abgelaufen? 
  if (currentTime - stroboLight.flashStamp >= stroboLight.flashDuration[digitalRead(stroboLight.LedPin)] && stroboLight.flashOnOff)
  {
    // Lade die aktulle Zeit für das nächste Zeitereignis
    stroboLight.flashStamp = currentTime;
    // Wartetimer anhalten;
    stroboLight.flashTimerOnOff = false;
    // und LEDs blitzen lassen
    digitalWrite(stroboLight.LedPin, !digitalRead(stroboLight.LedPin));
  }
}

Nabendynamo, auch normal Dynamo darf in D nicht mehr als 6V und 3W liefern nach StVZO, warum frag nicht, deshalb könnte der TO recht haben.

Da darf man sich keinesfalls drauf verlassen. So ein Dynamo ist eher eine Stromquelle, die bei zu hohem Lastwiderstand also auch höhere Spannungen induzieren kann.
Dass die klassischen Fahrrad-Glühbirnchen auf 6V ausgelegt sind, ist schon richtig, damit Elektronik überlebt, muss man was machen, ist meine leidvolle Erfahrung.

Aber hier gehts ja zum Glück gar nicht um Fahrrad-Beleuchtung

Vielen Dank für die bisherigen Rückmeldungen. Leider bin ich noch nicht dazu gekommen eure Tipps anzuwenden, da ich derzeit dabei bin die Gehäuse für das Audiosystem zu drucken.
Beim finalen System Check ist mir aufgefallen, dass es mit USB vom PC einwandfrei läuft.

Da das ganze ja tragbar sein soll, habe ich mir eine Powerbank bestellt, die meine Spannungsquelle darstellen soll. Sobald ich diese jedoch anschließe, wird nur ganz kurz Sound angespielt. Danach nicht mehr.
Woran kann das liegen?

Da der Arduino 7-9V benötigt, hab ich mir eine powerbank bestellt, die das u.a. auch bereitstellen kann (https://www.amazon.de/reVolt-Powerbank-12V-USB-Powerbank-Delivery/dp/B09WNBXLHQ/ref=asc_df_B09WNBXLHQ/?tag=googshopde-21&linkCode=df0&hvadid=590879599827&hvpos=&hvnetw=g&hvrand=183672026130790879&hvpone=&hvptwo=&hvqmt=&hvdev=m&hvdvcmdl=&hvlocint=&hvlocphy=9042247&hvtargid=pla-1649258711907&psc=1&th=1&psc=1).

USB = funktioniert

Powerbank = geht nicht

Die Powerbank stellt nicht stur 500mA zur Verfügung sondern hat neben einer USB-PD auch eine Abschaltautomatik.
Auf dem USB wird ein Protokoll gefahren, bei dem die Anforderungen ausgehandelt werden. Der Arduino ist aber stumm.

was bedeutet das?
Ichbrauche aber eine mobile Spannungsquelle. Was für Alternativen habe ich?

Mit Powerbank bis 5000mAh, sollte funktionieren, wie groß ist deine?
Versuchen um die 100mA mit irgend was verbraten.

ich habe die hier.

Was bedeutet für Dich mobil? Wie lange soll die halten? Was hängt da an Verbrauchern noch am Arduino?

Ansonsten lektüre Automatische Abschaltung von Powerbanks als Arduino-Stromversorgung bei geringer Grundlast verhindern – APFELHIRN.de
Wenn die Bank wegen "Unterforderung" abschaltet, kann das Dein Problem lösen.
Wenn das Ding aber zwingend erst aushandelt, dann eine andere Bank oder ggfls. mal hier querlesen: Arduino Lektion 83: Stromversorgung - Technik Blog

Keine schanzen mit dem was du verbrauchst, so wie habe geschrieben habe, zusätzlich belasten

Welche Erfahrung habt ihr denn bei den tragbaren Optionen?
In meinem Fall wird das Schild mit aufs SPielfeld genommen. Und soll das hier erwähnte Audiosystem und o.g. Strobosystem versorgen. Natürlich nicht alles im Dauereinsatz. Aber unabh. voneinander bzw. hin und wieder auch beides zusamnmen.

Da bin ich raus.
Überall, wo ich 5V brauche, hab ich ne Versorgung - manchmal reicht auch ein USB unter einer Bank im Bahnhof der DB...
Mein Tablet lädt damit auch... :wink:
Ansonsten: Es gibt LiPo Module, die auch aufgesteckt werden können. Folge dem zweiten Lektürehinweis...

kurze Rückmeldung und Info: Das Problem mit dem zu geringen Strom kann man über USB-C ganz easy umgehen. Hab im Interet den Hinweis gefunden.

Jetzt kann ich mich wieder dem ursprünglichen Strobolicht widmen.