Pro Trinket 5V: LED Stripe und FX SounfBord parallel betrieben

Hallo,

ich habe ein kleines Problem wenn ich ein LED Strip und ein Soundboard (Adafruit Audio FX Sound Board + 2x2W Amp - WAV/OGG Trigger - 2MB) Parallel an einem Pro Trinket betreiben möchte.

Die Schaltung hat zusätzlich zwei Taster, mit denen zwei unterschiedliche Programmvarianten ausgeführt werden, der Schaltplan ist im Attachment (Am PowerBoost fehlt im Schaltplan der Schalter zw. EN und GND).

Beide Schaltungen (LEDs und Sound) funktionieren getrennt voneinander, zusammen leuchten nur die LEDS, es kommt aber kein Sound aus dem Lautsprecher (leises Rauschen während die LED leuchtet).

Der Sketch ist ebenfalls im Anhang beigefügt.

Wie bekomme ich Sound und Licht paralell zum Laufen?

Vielen Dank für eure Lösungsvorsschläge schon mal im Voraus.

Lieb Grüße
Marcus

e

taster_test_2.ino (2.93 KB)

Ok …

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif

#define LED_PIN_1 6 // PIN-Definition
#define NUM_PIXELS_1  16 // Anzahl LED

Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(NUM_PIXELS_1, LED_PIN_1, NEO_GRB + NEO_KHZ800);

const int buttonPin1 = 8; // Taster 1
const int buttonPin2 = 9; // Taster 2
const int SoundPin1 = 4; // Auf Pin 0 Soundboard
const int SoundPin2 = 5; // Auf Pin 1 Soundboard
int buttonState1 = 0;
int buttonState2 = 0;

void setup() {
  // ---------------------------------------------------------------------------
  // These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
  // Any other board, you can remove this part (but no harm leaving it):
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif
  // END of Trinket-specific code.
  strip1.begin();
  strip1.show();
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(SoundPin1, OUTPUT);
  pinMode(SoundPin2, OUTPUT);
  digitalWrite(SoundPin1, HIGH);
  digitalWrite(SoundPin2, HIGH);
} // Ende setup

void loop() {
  buttonState1 = digitalRead(buttonPin1);
  buttonState2 = digitalRead(buttonPin2);
  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState1 == HIGH) { //Taster 1 gedrückt
    digitalWrite(SoundPin1, LOW);
    delay(10);
    digitalWrite(SoundPin1, HIGH);
    // delay(5000); // Pause zum Testen
    AlleLedAn(strip1.Color(0, 150, 0), 2000, 500);
  } // IF Ende
  if (buttonState2 == HIGH) {  // Taster 2 gedrückt
    digitalWrite(SoundPin2, LOW);
    delay(10);
    digitalWrite(SoundPin2, HIGH);
    // delay(5000); // Pause zum Testen
    AlleLedAn(strip1.Color(150, 0, 0), 2000, 500);
  }  else {   // IF Ende
    digitalWrite(SoundPin1, HIGH);
    digitalWrite(SoundPin2, HIGH);
    // Led ausschalten
    for ( int i = 0; i < NUM_PIXELS_1; i++) {
      strip1.setPixelColor(i, strip1.Color(0, 0, 0));
      strip1.show();
    }
  }  // ELSE Ende
} // Ende loop

// *** FUNKTIONEN ***

// Funktion "AlleLedAn"
void AlleLedAn(uint32_t farbe, uint16_t DauerAn, uint16_t DauerAus) {
  // Led anschalten
  for ( int i = 0; i < NUM_PIXELS_1; i++) {
    strip1.setPixelColor(i, farbe);
    strip1.show();
  }
  delay(DauerAn);
  // Led ausschalten
  for ( int i = 0; i < NUM_PIXELS_1; i++) {
    strip1.setPixelColor(i, strip1.Color(0, 0, 0));
    strip1.show();
  }
  delay(DauerAus);
} // Ende Funktion "AlleLedAn"

Nachdem ich gefühlt 2 Millionen ---- gelöscht habe (und zwei drei Leerzeilen - Schwamm drüber) - WAS funktioniert nicht?
Da Du .show() nur in den FOR-Schleifen ausführst, wo der Stripe geleert wird, wundert mich nicht, daß der Stripe Seine Farbe nicht wirklich ändert - und wenn, Das recht lahm-arschig macht.
JEDES .show() schickt an SÄMTLICHE LEDs die Daten … vll. ganz ‘nett’, wenn VORHER alle LEDs neue Farben zugewiesen bekommen haben?

Vll. ist Das auch schon Dein Problem - das fehlende .show(), damit die LEDs auch eine neue Farbe annehmen.

MfG

Hallo,

Danke erstmal für die schnelle Rückmeldung.

Die Antwort auf deinen Frage "WAS funktioniert nicht?" lautet: der parallele Betrieb des LED-Strip und Soundboard gemeinsam an einem Trinklet.

Beide Schaltungen für sich genommen machen genau das was sie sollen nur gemeinsam kommt kein Sound aus dem Lautsprecher.

Wenn ich das Soundboard aus der Schaltung nehme und im Code alle Zeilen, die mit dem Soundboard zu tun haben auskommentiere, leuchten bei Betätigung von Taster 1 die LEDs grün und bei Taster 2 rot.

Entferne ich die LEDs aus der Schaltung und kommentiere den Code für die LEDs aus, dann wird bei Betätigung von Taster 1 der Sound Nr. 1 (T01.wav) abgespielt und bei Betätigung von Taster 2 Sound Nr. 2 (T02.wav). Soweit alles gut.

Habe ich LEDs und Soundboard in der Schaltung, dann leuchten bei Betätigung der Taster nur die LEDs in den jeweiligen Farben, der Sound wird aber nicht abgespielt. Solange die LED-leuchtet ist im Lautsprecher ein ganz leises Rauschen zu hören.

Da die beiden Einzelschaltungen funktionieren vermute ich den Fehler in der Schaltung, benötige ich da noch irgendwelche Kondensatoren oder Wiederstände, um Störsignale auszufiltern?

LG Marcus

Nur mal so zur Info. Wenn du uns Hyperlinks (die zum Anklicken) deiner Teile postest, hättest du deutlich mehr Helfer. So kennen wir noch nicht einmal deine Teile.

Außer wir würden für dich suchen. Allerdings auch dann ist nicht sicher, dass wir auch das richtige gefunden haben.

Die Ansteuerung der Neopixel (WS2812) braucht eine sehr genaues Timing. Darum wird während der Datenübertragung zu den LED alle Interrupts ausgeschaltet und der Arduino macht nur die Übertragung. Während dieser Zeit funktioniert das Audio nicht. Du brauchst 2 getrennte Microcontroller um beides getrennt machen zu können. Grüße Uwe

uwefed: Du brauchst 2 getrennte Microcontroller um beides getrennt machen zu können.

Oder einen richtigen MP3-Player, z.B. den DFPlayer mini, der spielt dann auch weiter. Aber auch hier, kein schalten möglich, wenn Leds leuchten.

Hallo,

vielen Dank für die Rückmeldungen. Das ist zwar nicht die Antwort die ich erhofft hatte, aber immerhin muss ich jetzt nicht mehr weiter nach dem Problem suchen.

uwefed: Die Ansteuerung der Neopixel (WS2812) braucht eine sehr genaues Timing. Darum wird während der Datenübertragung zu den LED alle Interrupts ausgeschaltet und der Arduino macht nur die Übertragung. Während dieser Zeit funktioniert das Audio nicht. Du brauchst 2 getrennte Microcontroller um beides getrennt machen zu können. Grüße Uwe

Für mich zum Verständnis: Obwohl ich den Ausgang für den Sound vor dem Licht ansteure weiss der Microcontroller was da auf ihn zukommt blockt schon mal alle anderen Interrupts?

Als schnelle Lösung werde ich jetzt eben mit 4 Tastern arbeiten, wobei immer zwei gleichzeitig gedrückt werden müssen um Licht und Sound parallel zu starten. Da in dem Requisit in der nächsten Ausbaustufe auch noch eine kleine Nebelmaschine gestartet werden soll kommt dann eben ein zweiter Microcontroller mit rein.

LG Marcus