Forum: Mikrocontroller und Digitale Elektronik Interruptsteuerung Arduino


von Philipp H. (hansimglueck2)


Lesenswert?

Hallo ich bräuchte mal nen Schubser in die richtige Richtung.

Ich habe ein Arduino (Bitte nicht gleich verteufeln) mit dem ich einen 
Ws2812B
Led Strip ansteuere. nun habe ich mir ne Analoge Schaltung aufgebaut die 
mir bei einem Bass Ausschlag von ner externen Audioquelle eine Logische 
1 gibt die mit nem Transistor invertiert wird und nun einen Interrupt am 
Arduino Auslöst.

Nun die Frage: Wie geht man an sowas heran das der Interrupt quasi meine 
Led Effekte triggert?

habe schon versucht mit ner for-Schleife in der die Zählervariable mit 
dem Interrupt erhöht wird herum experimentiert aber so wirklich bin ich 
damit nicht zufrieden...

Könnt ihr mir bitte mal sagen wie ihr an sowas herangehen würdet?

Danke.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Philipp Hunger schrieb:
> Nun die Frage: Wie geht man an sowas heran das der Interrupt quasi meine
> Led Effekte triggert?

 Also, etwas mehr wäre schon nötig...
 Bei jedem Bass Ausschlag neuen Effekt starten ?
 Solange Bass ON ist, nur diesen Effekt fahren ?
 Was machst du mit LEDs wenn Bass OFF ist ?

von Philipp H. (hansimglueck2)


Lesenswert?

also der bass wird ja erkannt sozusagen ein Taktsignal.

Gedacht hätte ich da an sowas wie ein Schieberegister also wenn ein takt 
kommt Alles rot nächster takt alles Grün usw.

dann noch nen Strobo also wenn takt dann alles kurz blau ...


Die Frage ist ja wie geht man an sowas ran ich hätte halt gedacht das 
der Interrupt ein Flag setzt das der Effekt gestartet wird und dann beim 
nächsten zu nem anderen Effekt springt.

So ne art Lichtorgel halt mit den Digitalen LEDs.

: Bearbeitet durch User
von Thomas E. (thomase)


Lesenswert?

Philipp Hunger schrieb:
> Nun die Frage: Wie geht man an sowas heran das der Interrupt quasi meine
> Led Effekte triggert?

Dein Taktsignal verhält sich wie ein Taster. Grundsätzlich kann dieses 
Signal auch als solcher behandelt werden.
Du musst bei deinem Takt 4 Zustände erkennen:

- Taktflanke ein
- Taktsignal steht an
- Taktflanke aus
- Taktsignal bleibt aus

Wie beim Taster:

- Taster wurde gedrückt
- Taster wird gehalten
- Taster wurde losgelassen
- Taster bleibt in Ruhelage

Zwei dieser Zustände wertest du aus:

- Taktflanke ein
- Taktflanke aus

Bei "Taktflanke ein" wird ein Zähler erhöht. Entsprechend des 
Zählerstandes wird eine Lichtfarbe eingeschaltet. Bei "Taktflanke aus" 
werden die LEDs abgeschaltet oder die "Ruhefarbe" eingeschaltet.

mfg.

von Steffen (Gast)


Lesenswert?

Philipp Hunger schrieb:
> nun habe ich mir ne Analoge Schaltung aufgebaut die
> mir bei einem Bass Ausschlag von ner externen Audioquelle eine Logische
> 1 gibt die mit nem Transistor invertiert wird und nun einen Interrupt am
> Arduino Auslöst.

Am einfachsten ist es den Bass per ADC als Spannung einlesen und dann je 
nach Ausschlag die LED´s ein/aus/dimmen

von Jürgen S. (jurs)


Lesenswert?

Philipp Hunger schrieb:
> Könnt ihr mir bitte mal sagen wie ihr an sowas herangehen würdet?

Wenn Du an Pin-2 einen Push-Pull-Ausgang anschließt, der 
HIGH/LOW-Signale erzeugt, kannst Du mit einem Hardware-Interrupt auf 
Änderungen des Signals triggern:
- auf steigende Flanke (RISING)
- auf fallende Flanke (FALLING)
- auf Flankenwechsel (CHANGE)

Beispielcode für UNO- und MEGA-Boards mit Verwendung von Pin-2 für das 
Signal mit einer Aktion auf "steigende Flanke":
1
// Für Arduino UNO oder MEGA Boards
2
#define BASSPIN 2
3
#define BASSINTERRUPT 0
4
5
void setup() {
6
  Serial.begin(9600);
7
  pinMode(BASSPIN,INPUT);
8
  attachInterrupt(BASSINTERRUPT, bassISR, RISING);
9
}
10
11
volatile boolean bassDetected=false;
12
13
void bassISR()
14
{
15
  bassDetected=true;
16
}
17
18
void loop() {
19
  if (bassDetected)
20
  {
21
    Serial.println("Bass");
22
    bassDetected=false;
23
  }
24
}

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Philipp Hunger schrieb:
> Die Frage ist ja wie geht man an sowas ran ich hätte halt gedacht das
> der Interrupt ein Flag setzt das der Effekt gestartet wird und dann beim
> nächsten zu nem anderen Effekt springt.

 Ungefähr so, wie der Thomas sagt:

Thomas Eckmann schrieb:
> Zwei dieser Zustände wertest du aus:
>
> - Taktflanke ein
> - Taktflanke aus

 ISR auf steigende Flanke, Flag setzen.
 Beim Eintritt in die ISR prüfen, ob Flag gesetzt ist.
 Wenn ja:
   Effekt starten und Zähler erhöhen.
   ISR auf fallende Flanke, Flag zurücksetzen.

 Wenn nein:
   Effekt aus, Ruhezustand herstellen.
   ISR wieder auf steigende Flanke, Flag setzen.

: Bearbeitet durch User
von Philipp H. (hansimglueck2)


Lesenswert?

Super Danke da hab ich mal ein super Beispiel.

von Jürgen S. (jurs)


Lesenswert?

Philipp Hunger schrieb:
> Super Danke da hab ich mal ein super Beispiel.

Interrupts reagieren allerdings extrem schnell auf Signalwechsel.
Ob das praktikabel ist zur Bassschlaganzeige, hängt vom Signal Deiner 
Schaltung ab.

Wenn Deine "Analoge Schaltung" bei jedem Bassschlag das Signal in 
schneller Folge wechseln sollte, sagen wir mal im Mikro- oder 
Millisekundenbereich HIGH/LOW ("prellen"), dann wird die 
Interrupt-Behandlungsroutine daraus auch gnadenlos mehrere Signale 
machen.

Das würdest Du dann mit obenstehendem Sketch sehen, wenn im seriellen 
Monotor mehr Ausgaben als tatsächliche Bassschläge erfolgen.

Falls Deine analoge Schaltung also öfter einen Signalwechsel anzeigt als 
es tatsächlich Bassschläge gibt, wirst Du womöglich noch einen Tiefpass 
einbauen wollen. Also mal angenommen das schnellste Techno-Stück hat nie 
mehr als 300 Beats per Minute, also ca. 300/60 = 5 Bassschläge pro 
Sekunde, würdest Du einen Filter benötigen, der nachfolgende 
Signalwechsel innerhalb von 200 Millisekunden einfach nicht beachtet.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.