Forum: Mikrocontroller und Digitale Elektronik PC-Speaker an Arduino Mega geht nicht


von Tom L. (tlin)


Lesenswert?

Hallo,

ich bin neu hier, daher erstmal Hallo in die Runde!

Also mein Problem ist folgendes: ich habe einen PC Speaker an einem 
Arduino Mega 2560 angeschlossen und er macht keinen Pieps.

Konkret sieht es so aus: Ich habe mir einen Controller für mein 
Terrarium gebaut, gesteuert von dem erwähnten Arduino Mega mit 
Relaisboard, Sensoren, Schaltern etc. Und dem PC-Speaker für Warntöne. 
Ich habe für jede einzelne Funktion einen Unittest geschrieben (ein 
kleiner Sketch, der NUR die Einzelfunktion testet). Der Unittest für den 
PC-Speaker funktioniert wunderprächtig, er spielt eine kurze Melodie ab.

Aber mit dem kompletten Produktions-Sketch macht der Speaker keinen 
Mucks. Ich habe schon versucht, den auf eine andere PIN zu stecken 
(vorher 23, jetzt 17), aber das bringt nix. Ich bin echt ratlos und 
könnte gut Hilfe brauchen.

Der komplette Code ist bei Github einsehbar: 
https://github.com/TLINDEN/TerraDuino.

Der Produktionssketch ist hier: 
https://github.com/TLINDEN/TerraDuino/blob/master/Terraduino/Terraduino.ino

Dazugehörige Libraries: 
https://github.com/TLINDEN/TerraDuino/tree/master/libraries

und der funktionierende Unittest ist hier: 
https://github.com/TLINDEN/TerraDuino/blob/master/unittests/UnitTestSpeaker/UnitTestSpeaker.ino

Schaltplan meiner Platine (der Widerstand am PC-Speaker fehlt in dem 
Plan, der ist aber eingebaut!): 
https://github.com/TLINDEN/TerraDuino/blob/master/Images/terraduino-img.png

und Erklärung dazu: 
https://github.com/TLINDEN/TerraDuino/blob/master/Schaltplan.txt.

Ich weiss, das ist vielleicht alles ein wenig umfangreich, sorry. Aber 
eventuell hat ja jemand schonmal ein ähnliches Problem gehabt und kann 
mir weiterhelfen.

Ansonsten noch zum Produktionssketch: der funktioniert vollständig, NUR 
der Speaker geht nicht.



besten Gruss,
Tom

PS: ich möchte auch noch erwähnen, dass das mein erstes 
Elektronikprojekt ist, ich bis dato noch nie mit sowas zu tun hatte und 
auch eigentlich kein C/C++ Programmierer, sondern eher der Perl/Python 
Mensch bin. Falls sich da jemand über sicherlich kritisierbare 
Konstrukte in meinem Code wundern sollte :)

von Jasch (Gast)


Lesenswert?

Tom L. schrieb:
> Hallo,
>
> ich bin neu hier, daher erstmal Hallo in die Runde!
>
> Also mein Problem ist folgendes: ich habe einen PC Speaker an einem
> Arduino Mega 2560 angeschlossen und er macht keinen Pieps.
>
> Konkret sieht es so aus: Ich habe mir einen Controller für mein
> Terrarium gebaut, gesteuert von dem erwähnten Arduino Mega mit
> Relaisboard, Sensoren, Schaltern etc. Und dem PC-Speaker für Warntöne.
> Ich habe für jede einzelne Funktion einen Unittest geschrieben (ein
> kleiner Sketch, der NUR die Einzelfunktion testet). Der Unittest für den
> PC-Speaker funktioniert wunderprächtig, er spielt eine kurze Melodie ab.

Schonmal gut.

> Aber mit dem kompletten Produktions-Sketch macht der Speaker keinen
> Mucks.

Logischerweise macht das fertige Programm dann etwas anders als der 
Test.

Entweder hast Du (oder eine der benutzten Libs) den Timer 
umkonfiguriert.

Oder der Ton ist zu kurz um ihn hoeren zu koennen. Im fertigen Programm 
scheint mir der nur 4 ms lang zu sein (entgegen min. 125 ms im Test) - 
also das halte ich ja für etwas überoptimistisch, sind das überhaupt 
zwei volle Schwingungen?... ;-)

von Tom L. (tlin)


Lesenswert?

In der Tat sind 4ms arg kurz :)

Also ich habs mal erhöht aber das bringt auch nix. Ich hab mal diese 
Funktion hier aufgerufen:
1
void beep() {
2
  Serial << "beep start: " << millis() << endl;
3
  tone(speaker, NOTE_C4, 10000);
4
  noTone(speaker);
5
  Serial << "beep stop: " << millis() << endl;
6
}

Der sollte eigentlich für 10 Sekunden piepen. Aber die Ausgabe sieht so 
aus:
1
beep start: 1863
2
beep stop: 1864

Der hält sich in tone() also nur 1ms auf. Da muss also was anderes faul 
sein.

von Tom L. (tlin)


Lesenswert?

Ich hab das Problem gelöst, ich verwende jetzt nicht mehr die eingebaute 
tone() Funktion, sondern mache es manuell mithilfe dieser Methode: 
https://github.com/rynet/Arduino-Tone-Library/blob/master/toneLibrary.pde

Das Problem mit tone() ist wohl, dass es die Hardware Timer benutzt, die 
in meinem Code auch von anderem Kram benutzt werden wie z.b. millis() 
etc.

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.