Hallo Zusammen,
dank der Dauerleigabe des Sound Moduls JQ6500 von Ingo konnte ich die MobaLedLib so erweitern, dass auch dieses Modul (JQ6500) unterstützt wird:
Bisher wurde nur das MP3-TF-16P Sound Modul unterstützt:
Damit gibt es jetzt eine weitere Möglichkeit wie man mit der MobaLedLib Sounds auf der Anlage erzeugt. Diese Geräusche können genau an der Stelle der Anlage erzeugt werden wo sie erscheinen sollen. Mit einem Surround System ist das nicht so genau möglich, weil dieses abhängig von der Zuhörerposition ist. Allerdings kann man damit keine bewegten Geräusche simulieren (Fahrendes Auto). Die Sound Module und der entsprechende Lautsprecher können z.B. direkt in die Kirche integriert werden. Dabei ist darauf zu achten, dass der Lautsprecher einen Resonanzkörper benötigt sonst kommt es zu einem „Akustischen Kurzschluss“ der die Tiefen Frequenzen auslöscht.
Beispiel Programm:
Diese Sounds können jetzt über DCC Kommandos abgerufen werden. Dazu könnt Ihr das Beispielprogram „24.DCC_and_Sound“ der neuen Version der Bibliothek (0.7.7) benutzen (Installation siehe #14 https://stummiforum.de/viewtopic.php?p=1913636#p1913636).
In dem Beispiel müsst Ihr die Zeile
1
2
3
4
#define USE_MP3_TF_16P_SOUND_MODULE // Enable this line to use the MP3-TF-16P sound module
// If the line is disabled the JQ6500 sound module is used
auskommentieren wenn Ihr das JQ6500 Modul verwenden wollt.
Natürlich können mit der MobaLedLib mehrere Sound Module (auch gemischt) angesteuert werden. Dazu müssen nur die entsprechenden Makros angepasst werden. Das Ganze geht parallel zu Ansteuerung der LEDs. Man benötigt nur einen Arduino mit dem man alle Funktionen über ein einziges Kabel steuern kann.
Das Beispiel Programm empfängt seine Befehle über das DCC Protokoll. Dazu werden mehrere DCC Adressen verwendet. Im Beispiel definiert man die erste DCC Adresse über die Konstante „DCC_FIRST_LOC_ID“. Die Sounds werden über Momentfunktionen angesteuert. Mit jedem Tastendruck wird ein Sound generiert. Das bedeutet das man mit jeder DCC Adresse zwei Sounds abrufen kann. Die Adresse 1 „Rot“ aktiviert den ersten Sound, „Grün“ den zweiten Sound…
Die Bibliothek unterstützt neben solchen Momentfunktionen auch Umschaltfunktionen. Bei diesen wird die Funktion mit „Grün“ aktiviert und mit „Rot“ deaktiviert. Diese werden bei dem Sound Beispiel nicht genutzt. In dem Programm bestimmen die folgenden Konstanten die Benutzen Adressen:
1
2
3
4
5
6
7
8
// Define which accessorie CAN messages should be used.
#define DCC_FIRST_LOC_ID 1 // First local ID which should be copied to the InpStructArray[] of the MobaLedLib
#define DCC_FIRST_TOGGLE_ID 23 // DCC addresses greater equal this number are used to toggle an entry in the InpStructArray[]
// The DCC adresses smaller than this number are treated as momentarry events.
#define DCC_LAST_LOC_ID 30 // Last local ID which should be copied to the InpStructArray[] of the MobaLedLib
#define DCC_INPSTRUCT_START 0 // Start number in the InpStructArray[]
Wenn das JQ6500 Sound Modul verwendet wird, dann werden die Adressen 1 bis 6 belegt. Das wird im Programm mit diesen Zeilen festgelegt:
1
2
3
4
5
6
7
8
9
10
11
12
13
Sound_JQ6500_Seq1( 0, 0) // Play sound file 1 if the red button of DCC address 1 is pressed.
Sound_JQ6500_Seq2( 0, 1) // " " 2 green " " 1 "
Sound_JQ6500_Seq3( 0, 2) // " " 3 red " " 2 "
Sound_JQ6500_Seq4( 0, 3) // " " 4 green " " 2 "
Sound_JQ6500_Seq5( 0, 4) // " " 5 red " " 3 "
Sound_JQ6500_Prev( 0, 6) // Play the previous sound file the red button, addr 4 is pressed.
Sound_JQ6500_Next( 0, 7) // Play the next sound file if green button, addr 4 is pressed.
Sound_JQ6500_Next_of_N( 0, 8, 3) // Play the next sound file of N if the red button, addr 5 is pressed. The 5 defines the maximal played sound number in the range of 1..5.
Sound_JQ6500_PlayRandom(0, 9, 5) // Play a random sound file if the green button, addr 5 is pressed. The 14 defines the maximal played sound number in the range of 1..5.
Sound_JQ6500_DecVol( 0, 10, 1) // Decremet the volume if the red button, addr 6 is pressed.
Sound_JQ6500_IncVol( 0, 11, 1) // Increment the volume if the green button, addr 6 is pressed.
Wenn man andere DCC Adressen benutzen will, dann muss man die Konstanten entsprechend anpassen. Hier ein Beispiel bei dem die Adressen 35 bis 40 benutzt werden:
1
2
3
4
5
6
7
8
// Define which accessorie CAN messages should be used.
#define DCC_FIRST_LOC_ID 35 // First local ID which should be copied to the InpStructArray[] of the MobaLedLib
#define DCC_FIRST_TOGGLE_ID 41 // DCC addresses greater equal this number are used to toggle an entry in the InpStructArray[]
// The DCC adresses smaller than this number are treated as momentarry events.
#define DCC_LAST_LOC_ID 40 // Last local ID which should be copied to the InpStructArray[] of the MobaLedLib
#define DCC_INPSTRUCT_START 0 // Start number in the InpStructArray[]
Vergleich der Module
Das JQ6500 Modul ist unter dem Strich etwas günstiger, weil man hier keine zusätzliche SD Karte benötigt. Allerdings bedeutet das auch einen gewissen Zusatzaufwand. Zum Aufspielen der Sounds benötigt man eine Software welche eigentlich auf dem Modul installiert sein sollte. Leider ist das bei vielen Modulen nicht so. In dem Fall muss man sich die entsprechende Software aus dem Internet herunterladen und auf dem Modul installieren. In diesem Video wird erklärt wie das gemacht wird:
https://www.youtube.com/watch?v=9h_RWsfRnY4
Das benötigte Image kann man von hier herunterladen:
https://github.com/NikolaiRadke/JQ6500-rescue-tool
Dann hat man ein kleines chinesisches Tool mit dem man die Sound Dateien auf das Modul kopieren
kann. Das ist etwas Abenteuerlich, weil man nicht weiß was auf den Buttons steht auf die man klickt. Aber es hat funktioniert und meine Festplatte hat keinen Schaden genommen :-)
Hier kann man das Tool mit englischer Beschriftung herunterladen (Siehe „English Language MusicDownload.exe“):
https://sparks.gogo.co.nz/jq6500/index.html
Das Funktioniert gut. Ich konnte nicht probieren ob die Installation der Firmware, wenn man dieses Programm verwendet, noch nötig ist, weil ich diesen Schritt ja schon ausgeführt hatte.
Ingo: Hast Du schon alle Deiner neuen Module mit der Firmware versorgt oder kannst Du testen ob es auch ohne Firmware geht?
Antwort:
Zitat von Ingolf im Beitrag #142
Ich habe eben mit einem neuen Modul probiert, es geht auch ohne vorher das Rescue-Tool zu verwenden.
=> Die Module können genau so einfach (vielleicht sogar noch einfacher) mit Sound Dateien bespielt werden wie die MP3-TF-16P Module.
Weiter mit dem Vergleich: Bei dem JQ6500 Sound Modul kann man nur 5 Sound Dateien per Knopfdruck abrufen. Bei dem MP3-TF-16P Modul sind es 14. Das liegt daran, das bei dem JQ6500 Modul nur ein analoger Eingang zum abrufen verschiedener Titel vorhanden ist bei dem MP3-TF-16P gibt es 2 analoge Eingänge welche zusätzlich eine feinere etwas feinere Abstufung besitzen (10 Stufen anstelle von 9).
Das JQ6500 Modul unterstützt auch keine zufällige Widergabe von Sound Dateien.
Beide Geräte können beliebig viele Sounds sequenziell nacheinander abspielen. Beim JQ6500 ist man durch den internen Speicher evtl. etwas eingeschränkt, aber ich vermute, dass 2 MB Platz für alle frei verfügbaren Bahnhofsansagen… aus dem Internet reichen.
Für meine Tests verwende ich Sound Dateien mit Zahlen. Diese kann man hier herunterladen:
https://vocapp.com/german-numbers-1-20-flashcards-26526Bezüglich der Soundqualität und der Lautstärke sind beide Module gleich.
Das JQ6500 reagiert etwas empfindlicher auf eine schlechte Versorgungsspannung. Mit einem Pufferkondensator (470uF) und einem 1 Ohm Widerstand nahe beim Modul wird das besser.
Ansteuerung der Module: Die Sounds sollen über die MobaLedLib genauso behandelt werden können wie die LEDs. Die Platinen werden mit dem gleichen Kabel angesteuert wie die anderen Komponenten. Dazu wird ein WS2811 Modul verwendet. Dieses hat 3 Ausgänge mit denen man normalerweise drei Leuchtdioden betreibt. Diese Ausgänge generieren ein PWM Signal (Puls Weiten Moduliert) mit dem die Helligkeit der LEDs gesteuert wird. Wenn die LED hell sein soll, dann ist das Signal lange an und kurz aus, wenn die LED dunkler sein soll, dann ist die Spannung an der LED kürzer an und lange aus (
https://www.mikrocontroller.net/articles...eitenmodulation). Mit diesem Signal werden die Module gesteuert. Sie besitzen einen bzw. zwei analoge Eingänge über die man normalerweise mit verschiedenen Widerständen die Sound Dateien abrufen kann:
Über das PWM Verhältnis werden diese Widerstände simuliert. Das ist eine lästige Geschichte, weil man herausfinden muss welches PWM Verhältnis einen bestimmten Widerstandswert optimal repräsentiert. Eigentlich bildet man damit nicht den Widerstand nach sondern die Spannung ab. Der Widerstand bildet zusammen mit einem internen Widerstand auf dem Sound Modul einen Spannungsteiler der eine bestimmte Spannung am Eingang des Analog/Digital Wandlers das Sound Chips erzeugt. Diese Spannung muss möglichst genau getroffen werden. Das PWM Signal muss über einen Filter geglättet werden damit eine halbwegs konstante Spannung entsteht. Das wird über R4 und C4 im folgenden Schaltplan bewerkstelligt.
Die Spannung muss zwischen der im Modul verwendeten Maximalspannung und 0V liegen. Dazu benötigt man eine stabilisierte Spannung die der des Moduls entspricht. Da die interne Spannung nicht über Pins herausgeführt ist muss man sich diese selber generieren. Das IC1 erzeugt die benötigten 3.3V. Jetzt muss nur noch der Widerstand R3 bestimmt werden. Dazu muss man Testreihen mit verschiedenen Widerstandswerten und PWM Verhältnissen machen und einen Wert finden bei dem alle „Tasten“ über einen möglichst breiten PWM Bereich angesprochen werden. Das ist das größte Problem es müssen 256 verschiedene PWM Signale generiert und beurteilt werden. Dazu kommt noch eine Abhängigkeit von der Impulsdauer. Außerdem ist das ganze evtl. von der Versorgungsspannung und der Temperatur und natürlich den Bauteiltoleranzen abhängig.
Testprogramm: Zur Ermittlung der PWM Verhältnisse habe ich ein keines Tool verwendet mit dem man unterschiedliche Signale generieren kann. Das ist auch für andere Aufgaben nützlich darum beschreibe ich es hier mal etwas ausführlicher (Auch wenn vermutlich keiner bis zu dieser Stelle in dem Text kommen wird).
Mit dem Tool kann man die Helligkeiten und Farben der LEDs per Tastatur Kommandos vom PC aus einstellen. Das ist praktisch, wenn man die
Lichtfarbe oder Helligkeit in einem Haus anpassen will.
Das Programm benutzt den „seriellen Monitor“ der Arduino IDE. Der wird über STRG+Umschalt+M aus der IDE heraus gestartet. Wichtig ist dabei, dass die Baudrate (Unten rechts) mit der im Programm verwendeten übereinstimmt. Bei dem Beispiel „24.DCC_and_Sound“ wird eine Baudrate von 115200 verwendet. Außerdem muss unten rechts „Zeilenumbruch (CR)“ eingestellt werden.
Zur Aktivierung des Test Modes gibt man in der „Senden“ Zeile das „seriellen Monitors“ das Paragraph „§“ Zeichen ein. Das ist hier notwendig, weil die serielle Schnittstelle auch zu Übertragung der DCC Befehle von dem DCC-Arduino benötigt wird (Siehe
https://stummiforum.de/viewtopic.php?p=1926995#p1926995).
Nach der Eingabe des „§“ Zeichens sieht der „serielle Monitor“ so aus:
Jetzt kann man mit z.B. durch die Eingabe von „P29“ den ersten Sound abrufen:
Das Programm erzeigt einen PWM Impuls mit einem Tastverhältnis von 29 bei einer Dauer von 200ms. Jetzt kann man untersuchen ob das auch noch bei einem Tastverhältnis von 30 funktioniert. Dazu gibt man „P+“ ein. Wenn Ihr die gleichen Bedingungen habt wie ich, dann sollte das auch noch die Sound Datei 1 abrufen. Für den nächsten Test muss nur noch Enter gedrückt werden. Das Programm wiederholt dann den letzten Befehl. Das Funktioniert bei meiner Konfiguration von 26 bis 33. Auf diese Weise müssen alle „Tasten“ mit verschiedenen Widerständen getestet werden.
Daraus erstellt man eine Tabelle und benutzt den mittleren Wert im Programm:
1
2
3
4
5
6
7
8
9
10
// ADKey1 400ms 470 Ohm
#define SOUND_JQ6500_ADKEY1 29 // 1
#define SOUND_JQ6500_ADKEY2 40 // 2
#define SOUND_JQ6500_ADKEY3 50 // 3
#define SOUND_JQ6500_ADKEY4 60 // 4
#define SOUND_JQ6500_ADKEY5 80 // 5
#define SOUND_JQ6500_ADKEY6 162 // Prev/Vol-
#define SOUND_JQ6500_ADKEY7 231 // Next/Vol+
Wie oben erwähnt ist das auch noch abhängig von der Impulsdauer. Diese kann im Programm mit „i“ verändert werden. Die Eingabe von „i200“ erzeugt eine Impulsdauer von 400ms.
Wie gesagt, eine langwierige Geschichte, aber dank dieser Dokumentation kann das ja in Zukunft einer von Euch übernehmen…
Der Test Modus kann aber auch zum ausprobieren der Helligkeit und Farbe der LEDs in einem Haus benutzt werden. Dazu gibt es noch weitere Kommandos.
Zum Verstellen der Farben eignet sich der HSV Farbraum (https://de.wikipedia.org/wiki/HSV-Farbraum). Damit kann man die Farbe, die Sättigung und Helligkeit einer Leuchtdiode getrennt verstellen. Im Programm macht man das mit „H“, „S“ und „V“. Die Eingabe von „H60“ erzeugt ein gelbes Licht. Mit „H+“ und mehrfachem ENTER wird daraus Grün und Blau…
Das Programm zeigt dabei beben den HSV Werten auch die RGB Werte an. Diese kann man notieren und in dem „Set_ColTab()“ Befehl benutzen. Das Beispiel „03.Switched_Houses“ zeigt wie das geht.
Man kann in der Eingabezeile auch mehrere Befehle hintereinander angeben: „v10v50“ z.B. erzeugt ein dunkles Rot.
Momentan gibt es diese Befehle:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
L10 => LED Nr
L+ => Next LED
L- => Previous LED
ENTER => Repeat last input (Useful with +, -, T or impulse)
X => Exit test mode
h45 => Hue = 45
v100 => Value = 100
H20 => Hue = 20
H+4 => Hue+=4
H- => Hue--
H+ => Hue++
R30 => Red LED value
G+ => Increment Green value
B-3 => Decrement green value by 3
P50 => ImPulse with a value of 50 (Sound module tests)
i100 => Impulse length [2ms] i100 = 200 ms
M2 => Impulse mask 1 = Red, 2 = Green, 4 = Blue, 7 = white
A => All LEDs on (255)
C => All LEDs off
e3 => Enable input 3
d3 => Disable input 3
t3 => Toggle input 3
Dieses Testprogramm kann man in jedem Beispiel verwenden. Dazu muss man die Headderdatei "Serial_Inputs.h" nach der MobaLedLib_Create(leds); Zeile inkludieren:
1
2
3
4
5
MobaLedLib_Create(leds); // Define the MobaLedLib instance
#include "Serial_Inputs.h" // Use the serial monitor to test LED colors and brightness values
Und in der „loop()“ Funktion dieser Zeile einfügen:
Im „24.DCC_and_Sound” Beispiel wird die Zeile in der „Proc_Received_Char()“ Funktion verwendet weil hier gleichzeitig die DCC Kommandos empfangen werden müssen.
Und für die unter Euch, die Tapfer bis zum Ende gelesen haben hier ein Video (Wer nicht alles gelesen hat ist nicht berechtigt das Video zu betrachten!):
Es zeigt das Abrufen bestimmter Sounds über die Adressen 1-3. Danach wird mit Adresse 4 „Rot“ der vorangegangene Sound abgespielt und mit „Grün“ der nächste Sound. Die Adresse 5 „Rot“ schaltet zwischen den Sounds 1-3 um und „Grün“ ruft eine zufällige Sound Datei ab. Nicht gezeigt hab ich das verändern der Lautsterke welches über Adresse 6 gemacht wird.
Gegen Ende sieht man, das die eine Taster meiner MS2 nicht immer reagiert ;-(
So, jetzt seid Ihr erlöst…
Viel Spaß mit dem Lärm auf Eurer Anlage.
Hardi