06.06.2020, 21:50
Moin!
Heute war Zappeltag. Es hätte so einfach sein können - aber auch mit Gleichrichter kam nur ein marginaler Ausschlag der VU-Meter zu Stande.
Das Bild zeigt, dass der Gleichrichter macht, was er soll und das Signal 1V nicht übersteigt. 1V wäre auch der Maximalausschlag des Instruments; offensichtlich ist das Verhältnis Spannung/Zeit nicht ausreichend um das recht träge Zeigerinstrument voll auszulenken.
Option 1: Das Signal verstärken,
Option 2: Das Signal digitalisieren und dann wieder ausgeben.
Option 2 hat den Charme, auch andere Anzeigen auf das VU-Meter zu bringen.
Eine kleine Recherche war notwendig: Der Arduino kann kein "echtes" Analogsignal ausgeben. Ein AnalogWrite erzeugt ein PWM -Signal. Dabei handelt es sich um hochfrequente Rechteckimpulse bei denen das Verhältnis von high zu low den gewünschten Wert abbilden. Auf diese Art und Weise lassen sich LEDs ganz gut dimmen - aber ein VU-Meter? Meine Suche ergab: es geht. Also habe ich ein kleines Testprogramm geschrieben:
Der maximale Wert der Ausgabe wäre 255, das wären aber 5V "steady". Da ich mir nicht sicher war, ob eine Verringerung linear wirkt, habe ich die "Versuchsreihe" mit dem Wert 10 gestartet um festzustellen, dass eine Maximale Auslenkung mit dem Wert 20 erreicht wird.
int vuRpin = 11;
void setup(){[size=8]}[/size]
void loop(){
for (int auslenkung =1; auslenkung <= 20; auslenkung = auslenkung +1){
analogWrite(vuRpin, auslenkung);
delay(50);
}
analogWrite(vuRpin, 0);
delay(500);
}
Kurze Erklärung für Nichtprogrammierer: Der Pin 11 des Arduinos wird zur Ausgabe bestimmt. In der Dauerschleife (loop) wird immer wieder bis 20 gezählt und dabei die Ausgabe um 1 erhöht. Nach jeder Erhöhung wird 1/20 Sekunde (50ms) Pause gemacht. Wenn 20 erreicht wird kommt eine Pause von 1/2 Sekunde.
Das Ergebnis im Video .
Im nächsten Schritt ging es dann darum, die Eingangssignale - ab Ausgang Gleichrichter - zu digitalisieren. Der Arduino Uno verfügt über 5 Analog-In-Eingänge mit einer Auflösung von 10 Bit. Das bedeutet, dass die Werte von 0-5V als Zahlen zwischen 0 und 1023 ausgegeben werden. Da das maximale Eingangssignal bei etwa 1V liegen ist mit einen Wert von 1023 nicht zu rechnen. Ich habe einfach ein paar millionen Werte gesammelt und es war nie mehr als 300. So habe ich dann folgendes Programm geschrieben:
const int analogInPinR = A4; // Analog input pin rechter Kanal
const int analogInPinL = A5; // Analog input pin linker Kanal
int sensorValueR = 0; // Ausgelesener Wert rechter Kanal
int outputValueR = 0; // Ausgabewert zum VU-Meter
int sensorValueL = 0; // Ausgelesener Wert linker Kanal
int outputValueL = 0; // Ausgabewert zum VU-Meter
int vuRpin = 11;
int vuLpin = 10;
void setup() {}
void loop() {
sensorValueR = analogRead(analogInPinR);
sensorValueL = analogRead(analogInPinL);
if (sensorValueR>maxwert) {maxwert=sensorValueR;}
if (sensorValueL>maxwert) {maxwert=sensorValueL;}
outputValueR = map(sensorValueR, 0, 1023, 0, 200);
outputValueL = map(sensorValueL, 0, 1023, 0, 200);
if (outputValueR>20) {outputValueR=20;}
if (outputValueL>20) {outputValueL=20;}
analogWrite(vuRpin, outputValueR);
analogWrite(vuLpin, outputValueL);
delay(1);
}
Wer noch nicht Programmiert hat, sich aber für die Materie interessiert - da helfe ich gerne weiter. Parallel arbeite ich auch an einen Online-Programmierkurs, den ihr gerne als Testteilnehmer durchlaufen könnt ;-)
Das Ergebnis: Video
Ich bin begeistert und könnte den Zeigern stundenlang zuschauen...
Morgen möchte ich die Schalter mit dem Arduino verbinden und den Zustand abfragen...
Heute war Zappeltag. Es hätte so einfach sein können - aber auch mit Gleichrichter kam nur ein marginaler Ausschlag der VU-Meter zu Stande.
Das Bild zeigt, dass der Gleichrichter macht, was er soll und das Signal 1V nicht übersteigt. 1V wäre auch der Maximalausschlag des Instruments; offensichtlich ist das Verhältnis Spannung/Zeit nicht ausreichend um das recht träge Zeigerinstrument voll auszulenken.
Option 1: Das Signal verstärken,
Option 2: Das Signal digitalisieren und dann wieder ausgeben.
Option 2 hat den Charme, auch andere Anzeigen auf das VU-Meter zu bringen.
Eine kleine Recherche war notwendig: Der Arduino kann kein "echtes" Analogsignal ausgeben. Ein AnalogWrite erzeugt ein PWM -Signal. Dabei handelt es sich um hochfrequente Rechteckimpulse bei denen das Verhältnis von high zu low den gewünschten Wert abbilden. Auf diese Art und Weise lassen sich LEDs ganz gut dimmen - aber ein VU-Meter? Meine Suche ergab: es geht. Also habe ich ein kleines Testprogramm geschrieben:
Der maximale Wert der Ausgabe wäre 255, das wären aber 5V "steady". Da ich mir nicht sicher war, ob eine Verringerung linear wirkt, habe ich die "Versuchsreihe" mit dem Wert 10 gestartet um festzustellen, dass eine Maximale Auslenkung mit dem Wert 20 erreicht wird.
int vuRpin = 11;
void setup(){[size=8]}[/size]
void loop(){
for (int auslenkung =1; auslenkung <= 20; auslenkung = auslenkung +1){
analogWrite(vuRpin, auslenkung);
delay(50);
}
analogWrite(vuRpin, 0);
delay(500);
}
Kurze Erklärung für Nichtprogrammierer: Der Pin 11 des Arduinos wird zur Ausgabe bestimmt. In der Dauerschleife (loop) wird immer wieder bis 20 gezählt und dabei die Ausgabe um 1 erhöht. Nach jeder Erhöhung wird 1/20 Sekunde (50ms) Pause gemacht. Wenn 20 erreicht wird kommt eine Pause von 1/2 Sekunde.
Das Ergebnis im Video .
Im nächsten Schritt ging es dann darum, die Eingangssignale - ab Ausgang Gleichrichter - zu digitalisieren. Der Arduino Uno verfügt über 5 Analog-In-Eingänge mit einer Auflösung von 10 Bit. Das bedeutet, dass die Werte von 0-5V als Zahlen zwischen 0 und 1023 ausgegeben werden. Da das maximale Eingangssignal bei etwa 1V liegen ist mit einen Wert von 1023 nicht zu rechnen. Ich habe einfach ein paar millionen Werte gesammelt und es war nie mehr als 300. So habe ich dann folgendes Programm geschrieben:
const int analogInPinR = A4; // Analog input pin rechter Kanal
const int analogInPinL = A5; // Analog input pin linker Kanal
int sensorValueR = 0; // Ausgelesener Wert rechter Kanal
int outputValueR = 0; // Ausgabewert zum VU-Meter
int sensorValueL = 0; // Ausgelesener Wert linker Kanal
int outputValueL = 0; // Ausgabewert zum VU-Meter
int vuRpin = 11;
int vuLpin = 10;
void setup() {}
void loop() {
sensorValueR = analogRead(analogInPinR);
sensorValueL = analogRead(analogInPinL);
if (sensorValueR>maxwert) {maxwert=sensorValueR;}
if (sensorValueL>maxwert) {maxwert=sensorValueL;}
outputValueR = map(sensorValueR, 0, 1023, 0, 200);
outputValueL = map(sensorValueL, 0, 1023, 0, 200);
if (outputValueR>20) {outputValueR=20;}
if (outputValueL>20) {outputValueL=20;}
analogWrite(vuRpin, outputValueR);
analogWrite(vuLpin, outputValueL);
delay(1);
}
Wer noch nicht Programmiert hat, sich aber für die Materie interessiert - da helfe ich gerne weiter. Parallel arbeite ich auch an einen Online-Programmierkurs, den ihr gerne als Testteilnehmer durchlaufen könnt ;-)
Das Ergebnis: Video
Ich bin begeistert und könnte den Zeigern stundenlang zuschauen...
Morgen möchte ich die Schalter mit dem Arduino verbinden und den Zustand abfragen...
