Forum: Mikrocontroller und Digitale Elektronik Schloss öffnen durch Musiktöne


von Bernhard R. (b-r)


Lesenswert?

Hallo,

ich möchte für ein Kinderspiel eine Art musikalisches Codeschloss bauen.
Eine Kiste soll sich öffnen, wenn eine bestimmte (möglichst einfache, 
max. 5 verschiedene Töne) Melodie auf einer Flöte gespielt wird.
Für die Auswertung der Töne bin ich jetzt auf folgende Schaltung 
gestoßen:

http://www.myplace.nu/avr/gtuner/index.htm

Was meint Ihr? Könnte das damit hinhauen?
In der Software könnte man ja die Hysterese deutlich größer machen um 
einen Ton sicher zu erkennen.

Wie gesagt, keine Profianwendung, nur ein Spiel.

Wenn jemand andere Vorschläge hat die nicht auf einer kompliziert FFT - 
Analyse beruhen, gerne her damit ;-) Bin wirklich dankbar für weitere 
Ideen, bevor ich mir die Teile besorge.

Gruß,

Bernhard

von Tux (Gast)


Lesenswert?

Goetzel-Algorithmus/Filter wäre mein Vorschlag.

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

Tux schrieb:
> Goetzel-Algorithmus/Filter wäre mein Vorschlag.
Das wäre aber Kanonen auf Spatzen gerichtet :-)

Die Fötentöne können / sollen ja durch die Grundtöne identifiziert 
werden und da reicht der Vergleich mit jeweils einer einzigen der 
jeweils bekannten 5 Frequenzen. Das funktioniert dann, wenn die Töne 
genügend lange gepielt werden, also z.B. 32 Phasen, was auch bei tiefen 
Tönen leicht übertroffen wird. Man baut eine Art AGC mit einem Opamp und 
einen Rechteckkomparator der mit dem Sollton gespeist wird. Müsste jeder 
Micki-AVR locker schaffen. Wenn bei der Koerrelation des Signals ein 
genügend grosser Wert erzielt wird, ist die Bedingung erfüllt und die 
state machine wartet das Tonende ab - hüpft in die Warteschleife für den 
nächste Ton. Wenn Du es Dir mit dem Triggern der Phase ganz einfach 
machen willst, prozessierts Du komplex (IQ) indem Du ein 90° 
verschobenens Rechteck ausgibt. Dann halt auf zwei Komparatoren. Der 
Rest ist Mathe im AVR.

von Alex B. (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite


Lesenswert?

Guck dir mal den NE567 an, ist zwar schon alt, könnte bei deiner 
Anwendung aber reichen.

Gruß,
Alex

von c-hater (Gast)


Lesenswert?

Jürgen Schuhmacher schrieb:

> Tux schrieb:
>> Goetzel-Algorithmus/Filter wäre mein Vorschlag.
> Das wäre aber Kanonen auf Spatzen gerichtet :-)

Nicht wirklich. Goertzel ist doch wirklich recht einfach zu 
implementieren und arbeitet erheblich zuverlässiger als alles, was auf 
der Analyse von Nulldurchgängen beruht. Man spart sich viel Ärger, wenn 
man sich gleich für Goertzel entscheidet und den einmalig etwas höheren 
Aufwand in Kauf nimmt.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Alex Bürgel schrieb:
> Guck dir mal den NE567 an, ist zwar schon alt, könnte bei deiner
> Anwendung aber reichen.

Leider geht der nur für eine Frequenz. Um 5 Tonhöhen auszuwerten, 
bräuchte man also 5 Stück und entsprechend viele Portpins.
Der Gitarrentuner ist doch schon ganz gut, muss bloss erweitert werden.

von Dominik S. (dasd)


Lesenswert?

Bernhard R. schrieb:
> für ein Kinderspiel

Jürgen Schuhmacher schrieb:
> Die Fötentöne

Ahh ja :D

Aber im Ernst...
Bevor man da irgendwelche "komplizierten" Hardwareaufbauten anfängt 
(OpAmps, etc.) würde ich das dann doch auch eher in Software lösen.
Dann hast du auch den Vorteil, dass du leicht verschiedene Möglichkeiten 
testen kannst.

Entweder du wandelst tatsächlich das o.g. Stimmgerät ab
oder
du nimmst wirklich den Goertzel :)

Bernhard R. schrieb:
> Wenn jemand andere Vorschläge hat die nicht auf einer kompliziert FFT -
> Analyse beruhen, gerne her damit ;-)

Den Algorithmus in C findet man bei Google, dann musst du eigentlich nur 
noch die Funktion aufrufen.
Ich würde behaupten, dass das auch nicht viel komplizierter ist als die 
andere Option. :)

Edit:
http://www.embedded.com/design/configurable-systems/4024443/The-Goertzel-Algorithm

von Tom P. (booner)


Lesenswert?

Hei,

da ich das nicht softwaremäßig lösen könnte,
würde ich einen billigen Gitarrentuner (<15 Euro)
nehmen und dessen Anzeige mit einem analogen Eingang
eines µC verheiraten.


Grüße,

Tom

von Bernhard R. (b-r)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

bin jetzt soweit, dass ich das Mikrofonsignal auf einen Pegel von ca. 
50mV bekommen habe.
Laut der Seite http://www.myplace.nu/avr/gtuner/index.htm passt das ja 
zur Auswertung.
Ich habe das Ausgangssignal jetzt mal über die Soundkarte mitgeschrieben 
und bekomme folgendes Signal für den Kammerton A angezeigt (siehe 
Anhang).
Leider habe ich kein richtiges Oszi um mir das Audiosignal mal genauer 
anzuschauen.
Jetzt wo ich dieses Signal sehe, verstehe ich den C-Code nicht mehr.
Wie kann ich durch zählen der Flankenübergänge auf die Grundfrequenz 
440Hz kommen?
Hab ich irgendwo einen Denkfehler oder kann mir jemand folgenden 
Code-Schnipsel erklären:
1
    for (i=0;i<32;i++)
2
    {
3
      while (bit_is_set(PINB,1))    // ignore hi->lo edge transitions
4
        if (count_hi > 80)      // skip if no edge is seen within
5
          break;          // a reasonable time
6
7
      while (bit_is_clear(PINB,1))  // wait for lo->hi edge
8
        if (count_hi > 80)      // skip if no edge is seen within
9
          break;          // a reasonable time
10
11
      count += (count_hi << 8) + inp(TCNT0); // get counter value
12
      outp(0,TCNT0);          // clear counter     
13
14
      if (count_hi > 80)        // skip if counter has accumulated a
15
        break;            // too high value
16
17
      count_hi = 0;          // clear hi count
18
    }
19
20
21
22
23
    // initially turn off both leds
24
    sbi(PORTB,0);
25
    sbi(PORTB,2);
26
27
    if (count_hi <= 80)          // if count is reasonable
28
    {
29
30
      count = count >> 5;        // average accumulated count by dividing with 32

Ich habe das so verstanden:
In der If Schleife wird 32mal ein Flankenwechsel abgefragt, die 
verstrichene Zeit zu einer Variablen hinzugefügt und danach die Variable 
durch 32 geteilt um einen Durchschnittswert zu bekommen. Wenn der 
Abstand zwischen zwei Flanken zu lange ist, wird die Messung 
unterbrochen.

Das passt aber nicht zu meinem aufgenommenen Signal.

Kann mich mal jemand erleuchten? Ich möchte das auf einem Attiny44 oder 
2323 umsetzten und den Code und die Funktionsweise verstehen.

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.