Calliope Mini und das Mikrofon

           
Elektronik-Labor   Projekte   Microbit 


Der Calliope besitzt ein Mikrofon. Es handelt sich um ein MEMS-Mikrofon, also ein ganz aktuelles Bauteil. Es kann über einen analogen Eingang ausgelesen werden.



In der JavaScript-Darstellung:

let micwert = 0
basic.forever(() => {
    micwert = pins.analogReadPin(AnalogPin.MIC)
    serial.writeNumber(micwert)
    serial.writeLine("")
})

Man sieht nun eine mittlere Spannung (517), aber fast keine Reaktion auf Schall. Man muss schon erheblichen Krach machen, damit sich etwas ändert. Dann erreicht man einen Unterschied von einem oder zwei Bit. Nur wenn man direkt auf das Mikrofon klopft, entsteht ein deutliches Signal.



Auf der Platine sieht man nahe am Mikrofon einen kleinen Operationsverstärker im Gehäuse SOT-23-5. Mit einer Nadel habe ich da ein kleines Signal eingespeist und am Ausgang mit dem Oszi gemessen. Ergebnis: Die Verstärkung ist entweder zweifach oder einfach, je nachdem wohin ich den Eingang lege.


Ein Blick durch die Lupe offenbart die Schaltung.  Und mein Multimeter kann einigermaßen zuverlässig die Bauteile auch im eingebauten Zustand messen (löten darf ich ja nicht...). Der OPV wurde offenbar als Inverter mit der Verstärkung 1 eingesetzt.  Ich hoffe nicht, dass das eine geplante Entscheidung war, die dem Lärm der Grundschulkinder Rechnung trägt. Eher vermute ich, dass es ein Ergebnis der Teamarbeit ist. Einer hat schon mal der Prinzip gezeichnet, ein anderer wollte noch die richtige Verstärkung herausfinden, kam aber dann nicht mehr dazu. 

Ist aber kein Problem, die Verstärkung kann ohne Änderung der Platine angepasst werden. Ich schlage einen Verstärkungsfaktor von 100 vor. Man könnte R1 = 1 k und R2 = 100 k wählen, aber dann wäre die untere Grenzfrequenz 1,6 kHz. Besser ist es vielleicht, R1 bei 10 k zu lassen und R2 auf 1 M zu ändern, dann läge die untere Grenzfrequenz wie jetzt auch bei 160 Hz. Man müsste mal testen, ob der verwendete OPV dafür geeignet ist, oder ob er dann zu viel Offset hat. Wer schon einen eigenen Callope und damit die Lizenz zum Löten hat, kann es ja mal testen.


Schaltplan-Details

Inzwischen habe ich ja den Schaltplan des Calliope gefunden, und er bestätigt weitgehend die Messungen am Mikrofonverstärker. Da zeichnet sich übrigens ein Weg ab, wie man die Verstärkung minimalinvasiv erhöhen kann. Es sollte reichen, R40 (= R1 in meiner Skizze) mit einem Drähtchen zu überbrücken. Das Mikrofon hat einen Innenwiderstand von rund 100 Ohm. So kommt man auch auf eine 100-fache Verstärkung, allerdings auf Kosten der unteren Grenzfrequenz. Besser wäre es also, R41 durch 1 MOhm zu ersetzen. 

Ein weiteres Detail fällt ins Auge. Ich hatte zwar auf der Platine schon einen Kondensator zwischen OPV-Ausgang und GND gesehen, hatte aber vermutet, dass er sehr klein ist. Im Schaltplan ist er dagegen mit 100 nF angegeben. Das ist ungewöhnlich, die meisten OPVs darf man nicht stark kapazitiv belasten. Bei höheren Frequenzen stellt der Kondensator eine geringe Impedanz dar, die den OPV zu einer starken Strom-Aussteuerung zwingt. Sobald die Ausgangsströme in ihre Sättigung gehen, wird der Strom rechteckförmig und die Ausgangsspannung dreieckförmig. Dieses Verhalten konnte auch nachgewiesen werden, indem am invertierenden Eingang ein Signal vom NF-Generator eingespeist wurde. Durch Parallelschalten eines weiteren Kondensators mit 100 nF  wurde bei sehr hohen Frequenzen die Amplitude halbiert. Damit ist klar, dass tatsächlich 100 nF bestückt wurde.

Man sieht sozusagen, wie der OPV sich quälen muss, den Kondensator umzuladen. Bei einer geringeren Frequenz wird dagegen noch ein fast sauberer Sinus übertragen. 

Erstaunlich ist, dass der OPV noch bis etwa 20 kHz gegen den Kondensator von 100 nF ankommt. Kurz nachgerechnet, der kapazitive Widerstand bei 20 kHz beträgt 80 Ohm. Offensichtlich kommt der MCP6001 damit noch klar. Trotzdem, der Kondensator sollte nicht bestückt werden. Falls das ein Kampf gegen vagabundierende HF war, dürfte ein kleiner Kondensator von 1 nF reichen.



Minimal-Umbau des Verstärkers



Hier ein Testaufbau für eine kalibrierte Messung der Empfindlichkeit. Der kleine Lautsprecher liegt direkt auf dem Calliope und wird mit meinem Sinusgenerator mit 1 kHz angesteuert. Einfach mit voller Aussteuerung, aber das Gerät ist eigentlich nicht für die Ansteuerung eines Lautsprechers gemacht und hat einen Innenwiderstand von 600 Ohm. Im Endergebnis kommt so etwas ähnliches wie Zimmerlautstärke heraus, allerdings gut reproduzierbar.



Man sieht die fehlende Verstärkung. Direkt am Lautsprecher reicht die gemessene Amplitude nur 10 LSB von der Mitte.

Inzwischen habe ich doch noch die Erlaubnis zum Löten. Aber ich darf kein Bauteil entfernen. Es bleibt nur, R40 zu überbrücken, denn das lässt sich leicht wieder rückgängig machen. Man sieht allerdings, dass die Löterei bei diesen kleinen Bauteilen nicht einfach ist. Die Lötspitze ist da schon deutlich dicker als der Widerstand.




Minimalumbau mit Überbrückung eines Widerstands R40.


#

Schon besser, bis etwa 30 LSB bei 1 kHz. Allerdings liegt jetzt die untere Grenzfrequenz sehr hoch bei ca. 16 kHz. Aber das Mikro reagiert schon besser auf Umweltgeräusche. Besser als nichts.


Nachbau mit dem Micro:bit von RainerR




Hier wurde der Micro:bit zusammen mit einem MEMS-Mikrofon von Adafruit verwendet. Der Vorverstärker hat einen LM358 und ist dimensioniert wie oben vorgeschlagen. Die Verstärkung beträgt also 100. Das Ergebnis überzeugt. Mit dem Testlautsprecher droht schon Übersteuerung, deshalb musste der Pegel reduziert werden. Das Signal reicht jetzt praktisch für eine volle Aussteuerung des AD-Wandlers. Und auch die Reaktion auf normale Umweltgeräusche ist sehr deutlich. Der Versuch zeigt, so geht es auch mit dem Calliope.





Calliope Mic-Umbau mit 1 MOhm



Heureka! Heute kam mein Calliope an! Es handelt sich um eine Platine der neuesten Generation, was man an einer kleinen Korrektur auf der Rückseite erkennt. Eine Leiterbahn wurde mit dem Bohrer durchtrennt. Calliope berichtete davon.



Nur der Mikrofonverstärker ist geblieben wie bisher. Aber jetzt darf gelötet werden!



Also erstmal 10 kOhm und 100 nF auslöten. Die Bauteile sind so klein, dass sie sich im Lötzinn der Lötspitze verstecken können.



Einen SMD-Widerstand mit 1 MOhm (1004)  hatte ich nur in "normaler" Größe, weil er im Sparrow eingebaut wird. Er passte dann nur seitlich hochkant und diagonal auf die Platine. Bei der Löterei ist auch der zweite 10-k-Widersatnd warm geworden und etwas verrutscht. Das zu korrigieren traue ich mich nicht, denn ich bin froh, dass die Verbindungen stehen. Und ein Test zeigt, es funktioniert genau wie gewünscht!

Hier das Krachometer für lebhafte Grundschulkinder:

let leds = 0
let krach = 0
let micwert = 0
let min = 0
let max = 0
basic.forever(() => {
max = 0
min = 1023
for (let index = 0; index <= 500; index++) {
micwert = pins.analogReadPin(AnalogPin.MIC)
if (max < micwert) {
max = micwert
}
if (min > micwert) {
min = micwert
}
}
krach = max - min
if (krach < 10) {
leds = 0
}
if (krach > 10) {
leds = 1
}
if (krach > 20) {
leds = 2
}
if (krach > 40) {
leds = 3
}
if (krach > 80) {
leds = 4
}
if (krach > 160) {
leds = 5
}
if (krach > 320) {
leds = 6
}
if (krach > 640) {
leds = 7
}
basic.showNumber(leds)
})


In einer Schleife mit 500 Messungen werden die Minima und Maxima der Mikrofonsignale gesucht. Die Differenz Max-Min ist die Spitze-Spitze-Amplitude. Durch Vergleiche mit jeweils doppelten Grenzwerten wird daraus eine logarithmische Skala mit 6-dB-Stufen. Dieser Level wird in der LED-Anzeige ausgegeben. Der Anzeigeumfang beträgt also mehr als 40 dB

Wenn jemand den Calliope ohne Umbau verwenden will, sollte er die Schwellen verkleinern, 1,2,4,8,16. Insgesamt werden trotzdem erst 20 dB höhere Lärmpegel sichtbar, weil die zusätzliche Verstärkung mit 40 dB angesetzt wurde.


Krachometer-2 mit LED-Zeiger



Video:  https://youtu.be/PDaeMrlKl4U

let leds = 0
let krach = 0
let micwert = 0
let min = 0
let max = 0
basic.forever(() => {
max = 0
min = 1023
for (let index = 0; index <= 500; index++) {
micwert = pins.analogReadPin(AnalogPin.MIC)
if (max < micwert) {
max = micwert
}
if (min > micwert) {
min = micwert
}
}
krach = max - min
if (krach < 10) {
leds = 0
}
if (krach > 10) {
leds = 1
}
if (krach > 20) {
leds = 2
}
if (krach > 40) {
leds = 3
}
if (krach > 80) {
leds = 4
}
if (krach > 160) {
leds = 5
}
if (krach > 320) {
leds = 6
}
if (krach > 640) {
leds = 7
}
if (leds == 0) {
basic.showLeds(`
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
`)
}
if (leds == 1) {
basic.showLeds(`
. . . . .
. . . . .
. . . . .
. . . . .
. . # . .
`)
}
if (leds == 2) {
basic.showLeds(`
. . . . .
. . . . .
. . . . .
. . # . .
. # # # .
`)
}
if (leds == 3) {
basic.showLeds(`
. . . . .
. . . . .
. . # . .
. # # # .
# # # # #
`)
}
if (leds == 4) {
basic.showLeds(`
. . . . .
. . # . .
. # # # .
# # # # #
# # # # #
`)
}
if (leds == 5) {
basic.showLeds(`
. . # . .
. # # # .
# # # # #
# # # # #
# # # # #
`)
}
if (leds == 6) {
basic.showLeds(`
. # # # .
# # # # #
# # # # #
# # # # #
# # # # #
`)
}
if (leds == 7) {
basic.showLeds(`
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
`)
}
})



Calliope Klatschschalter



Auswertung des Mikrofonsignals mit größter Empfindlichkeit für nicht umgebaute Platinen mit Verstärkung 1. Zum Auslösen reicht ein Spitze-Spitze-Wert von 2. Bei jedem Klatschen gehen die LEDs für eine Sekunde an. (Auf Wunsch eines Lehrers stelle ich dieses Programm und alle anderen Microbit- und Calliope-Beispiele auf dieser Homepage unter die CC-Lizenz CC BY-SA. Das bedeutet kurz gesagt, dass jeder die Beispiele weiterverbreiten und verändern darf.)

let krach = 0
let micwert = 0
let min = 0
let max = 0
basic.forever(() => {
max = 0
min = 1023
for (let index = 0; index <= 100; index++) {
micwert = pins.analogReadPin(AnalogPin.MIC)
if (max < micwert) {
max = micwert
}
if (min > micwert) {
min = micwert
}
}
krach = max - min
if (krach > 1) {
basic.showLeds(`
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
`)
basic.pause(1000)
basic.showLeds(`
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
`)
}
})


Die Auswertung verwendet dasselbe Verfahren wie das Krachometer. Es beruht auf einer Methode, die schon bei andern Mikrocontrollern für die Messung kleiner Wechselspannungen verwendet wurde. Weil man ja die Frequenz nicht kennt und deshalb nicht phasenrichtig auf den Spitzenwert einer Schwingung zugreifen kann, verlässt man sich auf die Statistik. Bei 100 Messungen werden einige die positiven Spitzen und einige die negativen Spitzen treffen. So findet das Programm die Minima und Maxima im Signalverlauf. Deren Differenz ist die Spitze-Spitze-Amplitude.

Beim Calliope liegt die Ruhespannung des Mikrofonverstärkers bei der halben Betriebsspannung und wird mit etwa 512 gemessen. Die Mittenspannung wird mit dem Spannungsteiler R42/R43  mit zweimal 100 k bei einer Genauigkeit von 1% hergestellt. Man muss also mit einem Fehler bis 2% rechnen, weil die Widerstände in unterschiedlichen Richtungen abweichen könnten. Außerdem wird die Abweichung durch den Offsetfehler des OPV vergrößert. Typische Abweichungen vom theoretischen Ruhewert könnten im Bereich bis +/-10 liegen. Tatsächlich wurde eine Ruhespannung von 517 gefunden.

Wenn man sich auf den Nullwert 512 verlässt (micwert = pins.analogReadPin(AnalogPin.MIC) - 512), hätte man also schon einen Pegel von 5 LSB, was einem sehr lauten Geräusch beim ursprünglichen Verstärker entspricht. Das bedeutet, mit einem festen Mittelwert müsste man jede Platine individuell anpassen. Bei dem vorgestellten Verfahren der Spitze-Spitze-Messung spielt die Mittenspannung dagegen überhaupt keine Rolle. Sie dürfte sich sogar während der Betriebsdauer stetig ändern. Deshalb läuft diese Software ohne besonderen Abgleich auf allen Platinen gleich gut.



Krachometer mit LED-Bar-Graph  von  Andreas Brusinsky



Inspiriert durch Ihren Calliope mini Krachometer-Artikel wollte ich das Mikrofon meines Calliope mini testen. Erfreulich war das in meiner Version 1.0(August 2017) das Widerstands-Problem bereits behoben scheint (hohe Dynamik?).

(Dazu gibt es hier einen Hinweis: https://calliope-mini.github.io/v10/  Errata / Fehler:  Die Mikrofonschaltung hat eine sehr geringe Verstärkung. Dieser Fehler wurde durch den Tausch eines Widerstands in der laufenden Produktion behoben.)

Irgendwie scheint allerdings im pxt-Editor die Ausgabe über basic.showLeds eine im Vergleich zum openRoberta und auch MicroPython große Wartezeit zwischen wiederholten LED-Matrix Ausgaben zu besitzen. Daher habe ich die Latenz anderer Ausgabefunktionen des PXT-Editors getestet und glaube festgestellt zu haben, dass die (Farb-)Ausgabe über die RGB-Led, die Einzel-Punkt-LED-Ausgabe und auch der 15-Stufen ermöglichende LED-Bar-Graph geringere Wartezeiten zwischen wiederholten Einzelaufrufen verursachen.

Download: Krachometer2.zip


Krachometer mit Dezibel-Anzeige

Auch diese Version verwendet die Balkenanzeige, aber diesmal für eine zuverlässige Dezibel-Anzeige. Die Signalspannung U muss dazu logarithmiert werden. Dazu wird ein auf Ganzzahlen optimiertes Näherungsverfahren verwendet, das passend zur Balkenanzeige  jeweils drei Stufen als 10 dB darstellt. Das Messgerät hat damit einem Messumfang von 50 dB. Das Programm enthält einen Faktor 10, den man ändern kann, um die Anzeige zu kalibrieren. 

let krach2 = 0
let L1 = 0
let L = 0
let U = 0
let micwert = 0
let min = 0
let max = 0
let N = 0
basic.forever(() => {
max = 0
min = 1023
for (let N = 0; N <= 500; N++) {
micwert = pins.analogReadPin(AnalogPin.MIC)
if (max < micwert) {
max = micwert
}
if (min > micwert) {
min = micwert
}
}
U = max - min
U = U * 10
L = 0
for (let N = 0; N <= 15; N++) {
L1 = N % 3
if (L1 == 0) {
U = U * 10
U = U / 31
}
if (U > L1) {
L = N
}
}
led.plotBarGraph(
L,
14
)
})

So funktioniert die angenäherte Logarithmierung: L1 wird in 15 Schritten immer wieder erhöht und die gemessene Spannung U nach jeweils drei  Stufen verkleinert, bis L1 die Spannung U erreicht. Jeweils 3 Schritte sollen für 10 dB stehen. 20 dB bedeuten ja 10-fache Spannung, für 10 dB muss man also den Faktor Wurzel aus 10 = 3,1 rechnen. Nach jeweils drei Stufen wird deshalb U durch 3,1 dividiert. Das funktioniert noch sehr genau. Aber die weitere Unterteilung mit zwei weiteren Stufen (+1 und +2) zwischen den 10-dB-Stufen kann nur linear angenähert werden. Das wird aber nicht so stark empfunden, weil die 10-dB-Stufen stärker ins Auge fallen. Man könnte die Messung durch einzelne Vergleiche mit Konstanten noch genauer machen, aber dann würde das Programm viel länger. Das Näherungsverfahren habe ich übrigens von Thomas Baum übernommen und schon mal für eine Feuchtigkeitsmessung verwendet. Die folgende Tabelle zeigt ganz grob die Umsetzung der Mikrofonspannung in dB-Stufen.


StufeUdB
000
113
226
3310genau
4413
5616
6102ogenau
71123
82026
93030genau
103333
116036
1210040genau
1311043
1420045
1530050genau


In diesem Zusammenhang kam auch die Frage auf, ob man mit dem System Sound aufnehmen und abspielen kann. Nach meinem Eindruck ist das zumindest mit PXT kaum möglich. Die Abtastrate ist zu klein, und es können nicht genügend Daten gespeichert werden. Aber in C könnte man vielleicht eine sehr kurze Sequenz aufnehmen.


Angepasste Verstärkung in der Serie




In der neuesten Serie wurde die Verstärkung des Mikrofonverstärkers angepasst. Ein Widersatnd wurde von 10 k auf 1 M geändert. Die Widerstände sind zwar nicht beschriftet, aber man sieht den Unterschied. Drei Widerstände im Foto sind schwarz, einer eher grau. Und der Kondensator am Ausgang des Verstärkers ist nicht bestückt. Wunderbar, jetzt arbeitet das Mikrofon perfekt.



Elektronik-Labor   Projekte   Microbit