Soundboard eines Flippers ersetzen

Hallo zusammen. Gerne möchte ich in einem Flipper das Soundboard ersetzen und statt die alten einfachen Sounds irgendwelche MP3-Files abspielen. Ich möchte in einem ersten Schritt nur Hilfe bei der Signalauswertung und danach mein "Glück" selber wieder versuchen.

Worum geht es. Die Grafik zeigt, dass die MPU 6 Leitungen zum Soundboard hat. Die stehen stetig unter Spannung (i.d.R. 4 - 4.8V; auch schon einen Wert von 3.9V gemessen). Je nach Sound werden die Spannungen auf einer oder mehrere Leitungen kurz unterbrochen. Das habe ich für mich mittels LED visualisiert. Die Unterbruchzeiten müsste ich noch mit dem Oszilloskop messen und nachreichen. Ich hänge auch das Schema des Soundboards an, falls das jemand interessiert. Massgebend sind A4J4 Pin 1 - 4, Pin 12 und auch Pin 10 (Spezialfunktion).

Zusammengefasst: über die 6 Leitungen bekomme ich HIGH und LOW-Signale. 6 Leitungen ergeben 64 Kombinationen, welche den gewünschten Sound ausgeben.

Frage: Wie muss die Programmierung aussehen, wenn ich in Abhängigkeit der LOW-/HIGH-Kombination z.B. einen Wert von 1 - 64 erhalten möchte (um danach den Sound auszuwählen)?
Schematics Soundboard.pdf (1,3 MB)

Vielen Dank für euren Support!

Mir würde da eine Kombination aus einem 74HC165 Baustein und einem Microcontroller einfallen:

Zur Sicherheit würde ich die Eingänge über Optokoppler führen und direkt von einem Arduino auswerten.
Als Soundmodul einen DFplayer mini verwenden.

Direkt mit D2 - D8 verbinden (über 220 Ohm Angstwiderstand), dann hast eh schon alles was du brauchst. Mit dem Oszi (oder besser mit einem 6-Kanal Logicanalyzer) die Signale mal mitschneiden. Interessant sind die Rise/Fall-Zeiten und ob's einen Zeitlichen Versatz gibt.

@Kai-R: Krass cooler Link und super schnell. Das macht Spass!!! Den 74HC165 habe ich nicht auf Lager. Muss das Teil erst bestellen und mach mich dann mal ans Werk. Danke für die Infos. Werde mich melden (nicht falls sondern) sobald ich weitere Probleme habe :wink:

Annahme: Ruhezustand alle 6 Leitungen HIGH. Übergabe der Zahl über setzen der Leitungen auf LOW.
Man könnte mit einem PCF8574 die 6 Leitungen auswerten und ihn einen Interrupt generieren lassen, wenn mindestens eine Leitung LOW ist. Dann einlesen und auswerten.
Alternativ über PinChangeInterrupt arbeiten, wenn direkt am Arduino angeschlossen.

Gruß Tommy

Ist nur ein "erster Gedanke" gewesen... bevor du bestellst, warte hier erst mal ab, ob es nicht noch ne bessere Idee gibt. Der Baustein macht es von daher recht einfach, weil er Dir die "Zustandszahl" in einem Rutsch als "fertiges" Byte liefert..

Habe nun das Oszilloskop angehängt und ich bekomme Werte zwischen 20 - 30ms (manchmal bis 60ms) in welchen der Wert auf LOW ist. Einfach z.K.

Wurde machen so wie @zwieblum schreibt, wen die Pegel sind unter, gleich 5V, ist bequemer alles auswerten direkt über Arduino.
Im Original wird der Ton über den 555 erzeugt, ein wenig modifiziert und ausgegeben

Viele Wege führen nach Rom, so könntest Du auch einen MCP23017 oder MCP23S17 als Interrupt generierenden Baustein verwenden. Der wird mittels I²C- oder SPI-Bus an den Arduino angeschlossen. In einem anderen Thema wurde der MCP23S17 für eine Darttrefferanzeige verwendet, ist also schnell genug.

Optokoppler finde ich eine gute Idee!

Neben den Arduinos gibt es auch die im Umfeld der Arduino-IDE. Wenn Du Dein "Glück" versuchst, schaue auch mal auf Teensy, STM32 und ESP32. Letztere haben ein eigenes Dateisystem, um (nicht nur) Sounddateien zu speichern. Auch der I²S-Bus für Soundmodule könnte für Dich interessant sein. Ich habe mal für eine sprechende Uhr damit experimentiert. Nur ein paar Stichwörter und Hinweise :wink:

Für 64 verschiedene Signale sind dann beliebige Kombinationen der sechs Signale auf LOW, richtig? Einigermaßen gleichzeitig ?
Falls ja, ist Interrupt eher zu kompliziert:
Sobald ein Signal LOW wird, 10 ms warten, dann auswerten, welche Pins LOW sind. Den Soundmodul starten und 100 ms warten, bevor auf einen neuen Wechsel eines Signals von HIGH nach LOW gelauert wird.
Mein Vorschlag.

Nur zum Erkennen der Signale, stimme ich Dir zu. Zum Abspielen von Sound benötigt der µC allerdings ein paar Resourcen, die wir noch nicht kennen, die aber den zeitlichen Ablauf stören könnten. Da könnte (Konjunktiv!) ein sicheres Erkennen einer Pegeländerung hilfreich sein, die Interruptleitung eher als Meldeleitung, nicht zum Auslösen eines Interrupts. Das muß man aber abwarten.

Hab mir den Schaltplan angeschaut. Ich finde da keine 6 Signalleitungen sondern nur 5.
Zusatzinfo.
Bitte schau Dir mal die Platine an und sag uns was für ICs U3, U4, U5, U8 und U11 sind.
In welcher Stellung sind die 4 Brücken ( pos A oder B) ?
Abhängig von der Stellung gibt es 8 oder 16 Verschiedenen Töne wobei wahrscheinlich eine Kombination als "kein Ton " definiert ist.

Grüße Uwe

Hallo Uwe
Von der MPU gehen diese 6 Leitungen über das Soundboard zum Spulentreiberboard. Mit der Leitung 6 unterscheidet das System, ob nun ein Sound kommen soll oder ob eine Spule ziehen soll. Deshalb benötigen wir die 6 Leitungen.
U3 = ROM
U4, U5 = 14526
U8 = 14049B
U11 = 86L93
Die Brücken sind immer in Position B
Falls du noch weitere Fragen hast, dann gerne melden.

@agmue: Danke fürs Aufzeigen der alternativen Möglichkeiten. Ich bleibe mal beim Arduino Uno/Nano und freue mich schon, wenn dann die Signale richtig gelesen werden und ich mit Unterstützung die Programmierung hinbekommen :slightly_smiling_face:. Bin noch bescheiden, was sich mit zunehmendem Erfolg ändern könnte :face_with_hand_over_mouth:.

Jetzt habe ich auch noch Links gefunden:

ESP8266Audio - supports ESP8266 & ESP32 & Raspberry Pi Pico RP2040

Inter-IC Sound (I2S)

Nur so für den Fall, die Bescheidenheit will weichen :wink:

Ich schaffe es nun die Signale auszuwerten (z.B. 1111010) (D2 bis D8 [D8 wird offensichtlich nicht gebracht -> immer 0). Wie sieht nun eine effiziente Programmierung aus, wenn Arduino in Abhängigkeit des Wertes der verschiedenen Datenleistungen etwas machen muss (am Schluss eine Sounddatei abspielen, aber zuerst nur vorgelagerte Programmierung; noch kein Sound)? 64-fache IF-Zeile?

Deine Leitungen sollten eine Zahl von 0 bis 63 ergeben. Mit der (und evtl. Arrays) kannst Du weiter arbeiten.

Gruß Tommy

Wenn du von 6 Datenleitungen sprichst, kann es auch nur bis D7 gehen.

Es gibt viele Möglichkeiten, ich mag diese zum Zusammensetzen eines Dateinamens:

uint8_t bitWert;

void setup() {
  Serial.begin(9600);
  Serial.println("\nStart");
  bitWert = 0b111101;
  char dateiName[] = {"Sound00.mp3 "};  // Inhalt zur Längenermittlung
  snprintf( dateiName, sizeof(dateiName), "Sound%02u.mp3", bitWert );
  Serial.println(dateiName);
  bitWert = 0b111111;
  snprintf( dateiName, sizeof(dateiName), "Sound%02u.mp3", bitWert );
  Serial.println(dateiName);
  bitWert = 0b000010;
  snprintf( dateiName, sizeof(dateiName), "Sound%02u.mp3", bitWert );
  Serial.println(dateiName);
}

void loop() {}