auf der FaMoBa 2016 in Sinsheim habe ich ein paar von euch schon von meinem Soundmodulprojekt erzählt und ein kleines Demo-Modul vorgeführt (was ziemlich schief ging, weil es so mega laut war in der Halle).
Jetzt ist die erste vorführbare Version fertig und in meinem URAL eingebaut.
Was kann es? Neben dem üblichen Abspielen eines Motorgeräuschs entsprechend der Geschwindigkeit ("Standardmodus") kann es auch einen echt wirkenden Fahrbetrieb simulieren ("Schaltmodus").
Schaut euch einfach mal das Video an (ev. Lautstärke hochdrehen):
Ja, alle files sind direkt im flash Speicher. Der ist zwar klein, aber zum Auslesen einer SD war kein Timer mehr frei. Zum Schluss sind sogar noch 12kB frei geblieben.
Gut, "modifiziert" hört sich etwas hochtrabend an. Ich hab den Spannungsregler ausgebaut, v.a. weil der viel Verlustleistung produziert. Der Resetknopf musste für die Bauhöhe weichen und an den Seiten wurde ca. 5mm von der Platine abgefeilt.
Die soundfiles sind selber zusammengebastelt aus Tonspuren von youtube Videos und aus einem Computerspiel. Ich musste da aber noch stark dran feilen (u.a. mit Audacity) bis alles so schön harmoniert. Im Video kommt es nicht ganz so toll raus wie beim echten Hörerlebnis. Vielleicht mach ich noch ein zweiten, wo der Wagen aufgebockt ist und die Kamera direkt daneben.
die Töne (.wav-Datei) muss man in einen hex-Code umwandeln, den man dann in den C++-Code vom Arduino einbetten kann. Der wird dann sozusagen mitcompiliert.
@Nils hast Recht, aber in der Arduino IDE wird mit C programmiert.
Ich hab noch ein zweites Video gemacht, in dem die implementierten Situationen des Fahrbetriebs separat vorgeführt werden. (Die Lautstärke ist jetzt gut, es klingt aber immer noch deutlich blecherner, als es wirklich ist)
will nicht klug schei****, aber der Arduino kann sowohl in C als auch C++ (was ja letztlich eine Erweiterung von C ist, z.B. durch die Objektorientierung) programmiert werden. Siehe auch die Arduino FAQ.
Wenn ich das jetzt aber richtig sehe, ist dein Arduino-Projekt auch ein Fahrtregler, oder steuerst Du über den ATMega dann einen anderen Fahrtregler an?
Ich finde das witzig, weil ich selbst an so etwas arbeite (mangels Zeit aber noch in einer sehr frühen Phase bin).
Zur Notbremse: die würde ich schon früher als 95% in umgekehrter Richtung ansprechen lassen. Falls jemand den "Servoweg" in der Funke begrenzt hat. Weiterhin: hat das Modul einen Rückwärtsgang? Und wie schnell wird das Fahrzeug dort maximal? Ich finde das bei meinem Modell etwas doof, dass es rückwärts so schnell fahren kann, wie vorwärts. Klar, mit Disziplin macht es das dann nicht.
ok, das wusste ich nicht. Alles was ich bisher gemacht habe, ist meiner Meinung nach C Code. Aber ich bin auch kein Profi.
Das Soundmodul hat einen Servoausgang. An dem hängt bei mir ein MotorTinyII (Ein tolles Teil und dem ER100, den ich auch getestet habe, bzgl. des Anfahrverhaltens deutlich überlegen).
Das mit der Notbremse ist schon ok. Die soll ja nur aktiviert werden, wenn man den Knüppel voll zieht. Sonst besteht die Gefahr, das man sie bei starkem Bremsen aus versehen aktiviert.
Ein Rückwärtsgang ist natürlich auch drin, siehe letztes Video. Im Rückwärtsgang erreicht er 44% der Vorwärtsmaximalgeschwindigkeit. Das ist zwar nicht realistisch, aber man muss den Gang ja nicht voll ausdrehen.
44%? Ich würde da noch weiter runtergehen... wahrscheinlich langsamer als der 1. Gang vorwärts... aber ok, ist ein Modell, manchmal will man halt auch Platz machen und das sollte auch zügig gehen können. Bist Du mal mit 'nem richtigen Auto (auf einem großen, freien, asphaltierten Platz) schnell rückwärts gefahren? Die kleinste Lenkbewegung und das Auto bricht aus... so war's mit meinem Golf damals (Frontantrieb). gefühlt ca. 30 km/h... schon heftig.
Bremse: ok. Du hast dann im Prinzip ein Ausrollen eingebaut, wenn man auf Neutralstellung geht... bzw. ein leichtes Bremsen. Und eine stärkere Bremswirkung, je mehr man in die andere Richtung steuert.
Ja, einen ER100 hatte ich auch mal in meinem Unimog drin, allerdings war die erste Funke (DX5E) nicht in der Lage, in der Neutralstellung 1500us zu senden... somit konnte der LKW nicht still stehen. Alleine die automatisch Nullpunkterkennung des MotorTinys ist schon Gold wert.
Klasse Arbeit die du da vollbracht hast und hab mir gedacht: Sowas kann man ja auch in meine selbstentwickelte Modellbahn Digitalsteuerung einbringen . Nur ich finde nirgends Informationen wie die wav-Dateien aussehen müssen (den Sound für die Loks hab ich schon) bzw wie ich die in hex umwandle geschweige denn wie ich die im Arduino-code abspiele. Deshalb wäre ich dir sehr dankbar wenn du mir/uns mal erklären könntest wie du das genau gemacht hast.
Bevor ich mich in den Details zu meiner Lösung verliere erst noch ein Tipp vorweg: Wenn du es dir platzmäßig leisten kannst, versuche mit dem Arduino wav-Dateien direkt von einer (Mikro-)SD Karte zu lesen oder mit einem mp3-Player Shield (z.B. https://www.adafruit.com/products/1788) wiederzugeben. Das spart sicher eine Menge Arbeit und ergibt einen besseren Sound. Wahrscheinlich wirst du aber mit Einschränkungen bei der "Steuerung" der Soundfiles leben müssen.
Ich wollte volle Kontrolle über die Soundwiedergabe, um diesen Gangschaltungsmodus zu realisieren und hatte keinen Platz für eine SD Karte. Muss aber Nachteile in Kauf nehmen.
Was war alles nötig: Erstmal mussten die Sounddateien zurechtgeschnitten werden. Aufgrund der beschränkten Rechenpower im Arduino kam nur eine Sample Frequenz von 8000Hz in Frage, natürlich mono und in 8bit. Da die Sounddateien mit auf den 32kB Flashspeicher musste, liegt die Wiedergabedauer trotz dieser Maßnahmen bei nur wenigen Hundert Millisekunden. Mir kam dabei entgegen, dass so ein Diesel dieses typische periodische brumbrumbrum Geräusch macht (schwierig zu beschreiben, aber du weißt was ich meine). So besteht die Datei für den Motorsound also nur aus einem dieser "Brums" im Leerlauf, das dann immer wieder ohne Zwischenpause wiederholt wird. Anschließend wurde die wav-Datei mit einem Skript in eine Textdatei umgewandelt, in der die einzelnen Bytes in einem Array gespeichert sind. Dieses Array wiederum kann in den Arduinocode eingebaut oder die Datei selbst eingebunden werden, was das schnelle Ändern der Sounddatei erleichtert. Zu Abspielen werden die byte-Werte nacheinander an einen der DA-Wandler geschickt. Wie schnell der DA-Wandler aktualisiert wird bestimmt dann die Wiedergabefrequenz und damit den Drehzahleindruck. Außerdem kann man die byte-Werte in gewissen Grenzen verändern, um auch die Lautstärke zu beeinflussen.
Diese Methode zur Tonerzeugung wird eigentlich nur für Signaltöne verwendet. Das Problem ist, dass der DA-Wandler keine negativen Spannungen erzeugen kann. Deshalb schwingt der Lautsprecher nicht um seine Mittellage, sondern mit einem Offset zwischen Mittellage und einem Endpunkt. Das geht zum einen auf die Tonqualität, zum anderen führt die Offsetspannung auch zu einem Offsetstrom im Lautsprecher (was vermutlich den hohen Stromverbrauch meines URAL und die Wärmeentwicklung unter dem Koffer erklärt). Die Mittellage der Tonspur kann zuvor noch z.B. mit Audacity angepasst werden. Ganz weg kann man den Offset aber nicht nehmen, sonst bleibt nur Rauschen. Da ist viel Probieren gefragt.
Aber wie schon erwähnt: Nur so hatte ich (mit meinen laienhaften µC Kenntnissen!) sehr gute Macht über die Tonerzeugung.
Falls du noch liest oder jetzt erst richtig Lust hast, sowas auch umzusetzen, kann ich dir noch folgende Referenzen empfehlen (denn natürlich habe ich mir das nicht alles selbst ausgedacht, sondern schon vorhandenen Code genutzt, ergänzt, umgebaut etc.): Wenn du nach damellis pcm und TMRpcm bei GitHub schaust, findest du Code-Beispiele für die Wiedergabe von byte-Werten über die DA-Wandler. Mit dem wav2c Skript - auch bei GitHub zu finden - habe ich meine wavs kovertiert.
Ich würde mich freuen, wenn du dich in die Sache reinstürzt und dein Projekt hier vorstellst. Meine Umsetzung ist sicher nicht der einzige oder gar der goldene Weg. Ich bin gespannt.
Zum Schluss: Bin morgen auch in Friedrichshafen zur FMB.
danke für die schnelle Antwort. Im Dieseltriebwagen hab ich genug Platz für nen Micro-SD slot :) ich werde mal bisschen rumprobieren und dann mal meine Ergebnisse posten.
Theoretisch könnte man ja auch Flash-Chips nehmen oder? Ich meine Micro-SDs sind ja für ihren enormen Speicherplatz nicht grade groß. Nur mal als Anregung ;)