Kopfhörerplatine basierend auf UDA1334 / PJ306b

Hinweis

Diese Platine wird inzwischen nicht mehr hergestellt. Der Nachfolger ist diese hier: Kopfhörerplatine basierend auf MS6324 und TDA1308 bzw. LM4808M.

Einleitung

Bereits seit langem gibt es die Kopfhörerplatine, die @compactflash entwickelt hat. Ich habe sie hier, sie funktioniert auch astrein, jedoch haben mich folgende Gründe dazu bewogen, das Ganze selbst nochmal anzugehen:

  • Verwendung der günstigeren Kopfhörerbuchse PJ306b.
  • DAC: UDA1334ATS verwenden anstelle PCM5102a, da letztgenannter im Zuge des Chipmangels recht teuer geworden ist.
  • Einseitige Bestückung, um eine automatische Bestückung zu vereinfachen.
  • Alle SMD-Widerstände/Kondensatoren in 0805. Ich jedenfalls tue mir mit 0805 deutlich einfacher als mit 0603.

Was gleich bleibt:

  • Der sechspolige IDC-Anschluss bleibt vollständig pinkompatibel, so dass (das ist zumindest der Plan) diese Kopfhörerplatine mit allen von mir veröffentlichten Carrier-PCBs verwendet werden kann.
  • Wird ein Kopfhörer eingesteckt, so geht der Lautsprecher aus.
  • Als Verstärker wird TDA1308 verwendet.

Nachteil:

  • Durch die größere Kopfhörerbuchse, aber auch aufgrund der Tatsache, dass die SMD-Teile nur einseitig bestückt sind, wird diese Platine ein bisschen größer als die bereits existierende.

Ob das Ganze dann so funktionieren wird, wie ich mir das gedacht habe, wird man sehen. Wollte das einfach nur mal mitteilen, da ich doch immer mal wieder nach einer Kopfhörerplatine gefragt werde. Aktueller Entwicklungsgegenstand nachfolgend in Bildern. Wann (und ob :joy:) das Ganze final sein wird… keine Ahnung :slight_smile:. Aber ich werde es dann hier natürlich kundtun.


Hier diejenigen, die sich ein Gehäuse konstruieren möchten, können sich hier auch das STEP-File runterladen:
Headphone_PCB_UDA1334.step (229,3 KB)

Schaltplan:
Schematics_UDA1334.pdf (60,7 KB)

9 „Gefällt mir“

Zwecks potentieller Winkelmontage habe ich auf Anraten von @compactflash das obere Befestigungsloch nach links verschoben und den IDC-Konnektor gedreht. PCBs habe ich gestern bestellt. Bin gespannt und melde mich in dieser Sache dann so etwa in zwei Wochen wieder :slight_smile:.

2 „Gefällt mir“

Der PCB kam heute an. Werde ich heute Abend mal auflöten und bin gespannt ob das, was ich geplant habe, auch funktioniert :slight_smile:.

Juhu, sie funktioniert! :man_dancing: Habe sie an zwei PCBs getestet:

Klappt also mit und ohne Port-Expander. Sieht gelötet dann so aus…
Zuerst mal ein Größenvergleich mit der aktuellen rev3.1 und der Kopfhörerplatine von @compactflash:

Von oben:

Von unten:

Features:

  • Einseitig bestückt
  • SMD-Kondensatoren / Widerstände in SMD-Größe 0805. Von Hand gut machbar würde ich sagen.
  • 6Pin-IDC-Anschluss; pinkompatibel mit sämtlichen Carrier-PCBs, die ich bisher veröffentlicht habe.
  • Über Lötbrücken erfolgt die Konfiguration, ob die MUTE-Eingänge von UDA1334/Carrier-PCB mit HIGH oder LOW beschaltet werden.
  • Zuschaltbar sind PullUp bzw. PullDown-Widerstände zur MUTE-Steuerung (steht natürlich im Zusammenhang mit den Lötbrücken).

Konfiguration UDA1334 / MAX98357a:
Steckt man den Kopfhörer in die Buchse, so möchte man, dass der MAX ausgeht und der UDA aktiv wird - umgekehrt gilt natürlich das Gleiche. Ein Blick in die Datenblätter bringt folgende Erkenntnis: Der MAX ist aktiv, wenn er HIGH am SD-Pin hat, während der UDA im gleichen Falle auf MUTE ist. Das ist praktisch, denn sie sollen sich ja auch entgegengesetzt verhalten. Sie werden also identisch „konfiguriert“. D.h. ist kein Kopfhörer eingesteckt, so werden SD (MAX98357a) bzw. MUTE (UDA1334) mit 10k-PullUps angesteuert. Ist der Kopfhörer eingesteckt, so werden sie mit GND angesteuert.

Ausblick:

  • Es wird noch marginale Änderungen im Layout geben, aber die Schaltung an sich bleibt so.
  • Ich werde auch (irgendwann) mal SMD-Kondensatoren testen, so dass ggf. nur noch die Kopfhörerbuchse und der IDC-Konnektor in THT-Technik gelötet werden muss.
  • Vollständige SMD-Bestückung via JLCPCB ist aktuell nicht möglich, da TDA1308 und UDA1334 dort nicht auf Lager sind. Das heißt bis auf Weiteres löte ich sie selbst, was jedoch kein Problem ist.
1 „Gefällt mir“

Von den Kopfhörerplatinen habe ich drei Stück komplett fertig gelötet hier liegen. Bei zwei Weiteren fehlen nur noch die drei 100uF-Kondensatoren, die kommen aber schon am Freitag oder Samstag.

Also wer Interesse an einer fertigen Kopfhörerplatine hat, der kann sich gerne bei mir melden; wer zuerst kommt mahlt zuerst. Mehr als fünf Stück kann ich hier und jetzt nicht bereitstellen, weil ich keine UDA1334 mehr habe.

Ich werde die Tage nochmal neue PCBs dazu bestellen, DACs und Verstärker-ICs habe ich schon bestellt. Es wird also nochmal auf jeden Fall Nachschub geben, aber vor Weihnachten wird das wegen den ICs vermutlich eher knapp. Wer möchte kann sich den „Lötspaß“ dann auch selbst auferlegen und nur PCB+Teile oder nur PCB anfragen.

Was ich aktuell nicht hier habe, das sind die 6poligen IDC-Verbindungsleitungen. Oder auch einzeln hier. Sollte das regelmäßig angefragt werden, so werde ich künftig hier auch mal ein paar hinlegen.

Edit 7.12.21: Da das einzelne Bestellen unverhältnismäßig teuer ist bei den 6poligen IDC-Konnektoren, werde ich mir so in 2-3 Wochen davon auch einige hinlegen. Ist dann also alles hier, was man braucht für eine Kopfhörerplatine.

So, die beiden letzten Kopfhörerplatinen sind jetzt fertig und getestet. Meldet euch, wenn ihr Bedarf habt. Neue PCBs für weitere Exemplare habe ich gestern Abend bestellt.

Notwendige Schritte zur Inbetriebnahme:

  1. Option HEADPHONE_ADJUST_ENABLE mit einkompilieren (ggf. nochmal den hinterlegten GPIO für HP_DETECT kontrollieren), sofern nicht bereits geschehen.
  2. Per 6poligem IDC an eure Carrierplatine anschließen.
    Fertig.

Hinweise:

  • Wird ein Kopfhörer eingesteckt, so geht der Lautsprecher automatisch aus (und umgekehrt).
  • Wird ein Kopfhörer eingesteckt, so wird automatisch auf „stereo“ umgeschaltet, so dass man auf dem Kopfhörer ein Stereo-Signal hat.
  • Maximale Lautstärke, die über Kopfhörer möglich ist, kann über WebGUI konfiguriert werden. Sie ist unabhängig von der maximalen Lautsprecher-Lautstärke konfigurierbar.

Anschließen per Jumperwires statt IDC geht im Prinzip auch, jedoch weise ich darauf hin, dass die Kopfhörerplatine keinen Verpolungsschutz hat. Der IDC-Konnektor ist durch seine Nase ganz praktisch, weil man sich hier nicht vertun kann. Hier das Konnektor-Pinout:

1 „Gefällt mir“

So, der zweite Schwung an PCBs ist eingetroffen. Die DACs sind gerade beim Zoll und treffen hoffentlich Anfang/Mitte nächster Woche ein.

1 „Gefällt mir“

So, inzwischen sind PCBs und DACs eingetroffen. Hier mal ein Bild von der leicht umgerouteten Variante.

Musste jetzt nochmal Widerstände und Kondenatoren nachbestellen. Hätte mir mal vorher auffallen können :woman_shrugging:. Wie auch immer: Wer eine benötigt, kann sich melden. Wird nur halt ein paar Tage dauern, bis sie dann fertig gelötet sind.

Mir ist an der Stelle aufgefallen (warum das vorher nie ein Problem war weiß ich nicht), dass der Lolin D32 pro auf der Port-Expander-Platine manchmal nicht richtig bootet, wenn die Kopfhörerpatine angeschlossen ist. Das gleiche Problem hat sich aber gleichermaßen mit der Kopfhörerplatine von @compactflash ergeben. Es reicht an der Stelle jedoch, ein kurzes Delay in System.cpp einzufügen:

#if (POWER >= 0 && POWER <= 39)
    pinMode(POWER, OUTPUT);
    delay(50);     // Sometimes necessary for Wemos Lolin D32 pro in order to boot safely while headphone-PCB is connected
    digitalWrite(POWER, HIGH);
#endif

Dieses brauche ich weder bei den PCBs für Lolin32, Lolin D32 noch AZDelivery DevkitC :thinking:. Naja, ich denke die 50 ms werden niemand wehtun - ob nötig oder nicht. 10 ms haben übrigens nicht gereicht; habe es dann einfach bei funktionierenden 50 gelassen.

1 „Gefällt mir“

Ich habe zum Thema Kopfhörerplatine eine generelle Frage, eher zur „alten“, aber müsste bei dieser genau so sein: Wie verbindest du das MAX98367 Breakout Board mit der Kopfhörerplatine? Was ich hier im Forum gefunden habe weißt auf direkte Verbindung mit SD/MODE hin. Allerdings wird dann nur der linke Kanal auf dem Lautsprecher ausgegeben.

Ich habe das bei mir gelöst, indem ich die Kopfhörerplatine direkt zum GPIO verbunden habe und deren Ausgabe mittels eines 10k-10k Spannungsteilers an das Verstärker-Board angeschlossen habe. Mit einer Spannung von ~1.6V spielt der LS bei mir beide Audiokanäle (getestet mit Testdatei wie z.B. http://www.aoakley.com/articles/stereo-test.mp3). Der Kopfhörer kann zuverlässig den LS ausschalten und auch anschalten und der GPIO bekommt ein sauberes digitales Signal, also nicht 1.6V oder ähnliches.

Gab das Thema schon hier im Forum, allerdings ohne viel Detail und ohne Lösung (?). Der Max98357 verhält sich zum Beispiel bei 3.3V wieder anders als bei 5V… Hast du bei dir mal die entsprechende Spannung gemessen?

Ich denke das könnte eine bessere Dokumentation vertragen, jetzt da du noch eine neue entworfen hast.

PS:

Das stimmt so nur für den linken Kanal, der rechte Kanal von Audiodateien wird dann verworfen (so bei mir getestet)

Müsste ich ehrlich gesagt mal testen mit dem mp3. Wir haben das Thema hier auf jeden Fall mal diskutiert.
Beide Kopfhörerplatinen funktionieren gleich. Halt nur mit dem Unterschied, dass man für die pj306b einen Mosfet braucht, um die Schaltlogik zu invertieren.

Langfristig wird man die Platine eh nochmal überarbeiten müssen, weil der uda1334 abgekündigt ist und man ihn außerhalb von AliExpress nicht mehr wirklich kriegt. Das habe ich jetzt leider im Nachgang erst bemerkt, als ich das schon fertig entwickelt hatte. Über AliExpress kriegt man ihn allerdings gut und er ist auch recht günstig. Das ist erstmal OK so, weil die Anzahl der Interessenten sich bisher relativ in Grenzen gehalten hat.

Hallo @biologist was ist der Unterschied zu I²S Stereo Decoder Breakout Board - Adafruit | Mouser oder darf man das KiCad Projekt anschauen? Überlege dies mir auf meiner Audio-Platine mit den zwei MAX98357 zu integrieren.

1 „Gefällt mir“

Zwei Unterschiede
a) Die verwendete Buchse erkennt nicht, ob was eingesteckt ist. Problem: Steckst du was ein, dann hast du out-of-the-box keine Möglichkeit, den Lautsprecher automatisch auszuschalten.
b) Auf dem Board ist nur der DAC aber kein Verstärker drauf. Also man kann da einen Kopfhörer einstecken und hört auch was, aber allzu sehr kannst das nicht belasten - das verzerrt dann (das beschreibt Adafruit auch).

Kurz gesagt: Diese Platine eignet sich primär als LineOut zur Ansteuerung eines externen Verstärkers. Für Kopfhörer nur so bedingt.
Das Adafruit-Modul kriegt man übrigens auch als Nachbau: Page Not Found - Aliexpress.com. Hab’s auch 2mal hier; als Lineout funktioniert das fein. Nutze das selbst im Keller für einen ESP32, auf den ich per BT streame; der hängt dann an einem Verstärker.

Also ich denke in meinem Tun hier bin ich ziemlich transparent und teile+beschreibe auch sehr viel, aber das gehört zu den wenigen Sachen, die ich nicht rausgeben möchte. Im Endeffekt, das kann ich aber sagen, ist es ein Befolgen der Datenblätter von UDA1334 (DAC) und dem TDA1308 (Amp), wobei ich mich in Sachen UDA1334 eher am Schaltplan von Adafruit orientiert habe (der aber auch nur punktuell von dem von NXP abweicht).

Ok vielen Dank für die Antworten

1 „Gefällt mir“

Hier übrigens nochmal eine Info, wie die Kopfhörerbuchse funktioniert. Damit wird vielleicht nochmal die Funktion von R17 klarer, den ich im Rahmen des Aufweck-Problems mit dem Port-Expander beschrieben habe.

Hinweise:

  • Das Symbol des PJ306b zeigt diesen im Ruhezustand. D.h. SW1 und SW1_O sind miteinander verbunden (O = open). Steckt man den Stecker ein, so ist SW1 mit SW1_C verbunden (C = closed). Das ist ein potentialfreier Schalter, den ich auf GND gelegt habe.
  • Es gibt mit SW2 noch einen zweiten potentialfreien Schalter, den ich jedoch nicht benutzt habe.
  • HP_DETECT hängt an JP1.2. Über JP1 entscheidet man nun, welche Schaltlogik man braucht. In meinem Falle hätte ich gerne im nicht eingesteckten Zustand HIGH auf HP_DETECT und im eingesteckten Zustand LOW. Deswegen setze ich die Lötbrücke JP1.2 + JP1.3 und benötige R16.
  • Würde ich nun die umgekehrte Schaltlogik brauchen, so würde ich JP1.1 + JP1.2 brücken. Getestet habe ich das jedoch nie.
  • R17 und R19 bestücke ich nicht. Die 100k hatte ich einfach nur mal angenommen und passen wahrscheinlich, wenn man sie braucht, eher nicht.
  • MAX98357a und UDA1334 verhalten sich hinsichtlich mute exakt gegensätzlich. Da man hier gegensätzliches Verhalten möchte, werden sie identisch angesteuert.
  • Über R_out und L_out kann man das Signal auch durchschleifen. Das ist im Ruhezustand der Fall und wird unterbrochen, wenn der Stecker eingesteckt ist. Benutze ich aber bei dieser Kopfhörerplatine nicht.

Hallo @biologist , endlich WE Zeit weiter zu machen.
Werde mir dies mal anschauen und dieses WE hoffentlich den groben Entwurf fertig haben.

Denke dies liegt daran dass man im Stereo Mode SD anders beschalten muss.
PCM Operating with two drivers,

TDM MODE: SD/(EN)==Vdd, Gain=> GND for channel0 && Vdd for channel 1,Gain is 12dB

Jetzt wäre natürlich wichtig welcher Mode wird im diesem Projekt benutzt???

Eigentlich hat das Thema gar nicht unbedingt etwas mit der Kopfhörerplatine zu tun. Jedoch natürlich schon, wenn man HP_DETECT der Kopfhörerplatine direkt auf SD des MAX führt. Insofern lasse ich es hier mal stehen.

Also ich habe zu diesem Thema eben nochmal eine Runde gelesen, da ich das bisher noch nicht getan habe. Finde es bei einem einzigen Lautsprecher auch nicht so arg dramatisch, aber gut, ich kann auch der Argumentation folgen, dass man es nicht schlechter machen muss als notwendig, wenn es mit einfachen Mitteln machbar ist.

Ein paar Fakten zum MAX:

  • Das Breakout-Board von Adafruit (und die Nachbauten) verwenden einen PullUp-Widerstand von 1M zwischen SD und VDD. Dies soll, wenn nichts an SD angeschlossen ist, bei 5V VDD stereo mit sich bringen.
  • Der MAX besitzt einen internen Pulldown-Widerstand mit 100k.
  • SD < 0.16 V ist Standby
  • SD zwischen 0.16 und 0.77 V ist stereo
  • SD zwischen 0.77 und 1.4 V ist rechts
  • SD größer 1.4 V ist links

Da werde ich in Verbindung mit meinem PCB für den Lolin D32 pro mal Tests machen. Hier sind MAX.SD und HP_DETECT voneinander getrennt und per Port-Expander angeschlossen. Ja, ein Spannungsteiler müsste es hier eigentlich tun. Aktuell liegen beim genannten PCB auf jeden Fall 3.3 V an, was dann links bedeutet.

@Ringer Ich denke, dass wir hier PCM verwenden.

JA stimmt passt bedingt hier her, aber ganz falsch ist es nicht.
Werde bei mir HP_DETECT über den Port Expander machen, da ich jedoch Pro Kanal einen eigenen MAX will bin ich zufällig darüber gestolpert und denke es hilft für alle zum Allgemeinen Verständnis.
Hier noch ein anderes Schaltungsbeispiel, hier sieht man die möglichen Beschaltungen:
@SZenglein : wie @biologist schon geschrieben hat ~1 MOhm @5V bzw. ~630KOhm @3,3V würde dein Problem lösen wenn sonst an SD nichts angeschlossen ist.

Ansonsten muss man mit Widerstände in „Serie“ arbeiten wie bei meinem oberen Bild um einen Spannungsteiler abhängig des Signals Levels zu haben siehe @biologist

  • SD < 0.16 V ist Standby
  • SD zwischen 0.16 und 0.77 V ist stereo
  • SD zwischen 0.77 und 1.4 V ist rechts
  • SD größer 1.4 V ist links

@SZenglein Irgendwie wundert es mich, dass bei 1,6 V ein Stereosignal rauskommt, wenn das Datenblatt sagt, dass es dafür 0,16 bis 0,77 V braucht. Nachvollziehen kann ich die 1,6 V bei 10/10k jedoch (siehe nachfolgende Rechnung). Aus meiner Sicht ist die Anordnung so:


R1 + R2: Externer Spannungsteiler
R3: Widerstand auf MAX-PCB (1 M)
R4: Interner Pulldown des MAX (100 k)
=> Lässt man R1 + R2 komplett weg (also nicht 0 Ohm sondern weg), dann müssten an R3 3 V abfallen und an SD demnach 0,3 V anliegen. Das müsste dann ein Stereosignal sein im „Auspackzustand“, da es zwischen 0,16 und 0,77 V liegt.

Berechnung für 10k/10k-Spannungsteiler:
Parallelschaltung Rp1= R1 + R3: 9901 Ohm
Parallelschaltung Rp2 = R2 + R4: 9091 Ohm
Gesamtwiderstand Rges = Rp1 + Rp2 = 18992 Ohm
Iges = U / Rges = 3,3 V / 18992 Ohm = 1,737 * 10^-4 A
Spannung Up1 = Iges * Rp1 = 1,72 V
Spannung Up2 = Iges * Rp2 = 1,58 V <= um diese Spannung geht es und das passt sehr gut zu den gemessenen 1,6 V.

Ich hätte jetzt gedacht, dass R1 eher sowas wie 51k sein müsste. Daraus ergäbe sich gemäß meiner zuvor beschriebenen Rechnung:
Up1: 2,8 V
Up2: 0,5 V <= um diese Spannung geht es und das wäre schön zwischen 0,16 und 0,77 V

Für den Fall Standby haben wir im linken Zweig keine 3.3 V sondern GND. Aus meiner Sicht muss man sich R1 dann runtergeklappt auf GND vorstellen. D.h. wir haben dann einen Spannungsteiler bestehend aus R3 und einer Parallelschaltung aus R1 + R2 + R4. Dabei fließt ein Strom von 3,275 x 10^-6 A, was an R3 zu einem Spannungsabfall von 3,275 V führt. Dementsprechend müssten es für Usd 0,025 V sein. Das würde dann zu < 0,16 V passen.

Oder habe ich was übersehen?