ESP32 Audio Kit (ESP32-A1S)

Ohne eine Lautstärkeanpassung in der AC101 Lib hat das bei mir ganz gut funktioniert und die Lautstärke war okay. Aber mit

 ac.SetVolumeHeadphone(63);
 ac.SetVolumeSpeaker(63);

an geeigneter Stelle im setup() lässt sich die Lautstärke noch deutlich erhöhen
vG
Wolle

Danke @biologist und @Wolle für die Hinweise, werde ich morgen mal checken , bin heute zu müde.

Hi @Wolle
Die Lautstärke des Lautsprechers war etwas zu leise und die des Kopfhörers nicht vernünftig nutzbar .

Ich habe die beiden Zeilen in diesen Abschnitt
// Function to play music as task eingefügt .
Es funktioniert einwandfrei . Ich habe einiges getestet mit unterschiedlichen Einstellungen der max. Lautstärke im WebGui usw. Ich habe bisher noch keinen Fehler festgestellt . Jetzt ist es fast zu laut aber das läßt sich ja anpassen und der Regelbereich ist voll nutzbar . Super .
Leider verstehe ich den Code nicht und das Zusammenspiel der Libraries , z.Bsp. dass der Wert 63 von AC101 und der Regelbereich bis 21 irgendwie zueinanderpassen .
Ich werde es noch final mit den Endstufen-IC´s NS5140 testen und dann bin ich einen großen Schritt weiter zur Erstellung eines minimalistischen ESP32-A1S_Complete .

VG und danke nochmals

Hi @compactflash,
die Wertebereiche passen nicht wirklich zusammen. Ich habe mir das Datenblatt vom AC101 angesehen, das Register HPOUT verarbeitet 5 Bits (0…31) und SPOUT 5 Bits (0…63)
Damit alles etwas einheitlich wird mit größerem Regelbereich:

audio.setVolume(currentVolume);
ac.SetVolumeHeadphone(currentVolume * 3);
ac.SetVolumeSpeaker(currentVolume * 3);

@Wolle: Führt diese Multiplikation nicht aber im Endeffekt dazu, dass es um unteren Bereich sehr leise ist und die Lautstärke dann oben raus enorm zunimmt? Also ich habe auch drüber nachgedacht, einen Faktor einzumultiplizieren, habe es jedoch (aus meiner Vermutung raus) nicht gemacht. Ich hätte jetzt gesagt: Man die AC-volume auf einen hohen Wert und passt dann nur noch audio.setVolume() an.

Hi , ich habe das heute mal kurz ausprobiert. Ich bin mir nicht sicher wo die 3 Zeilen hin müssen , habe es im Setup gemacht . Danach war es wieder sehr leise , ich habe aber bestimmt aus Ahnungslosigkeit etwas falsch gemacht.
Die Lösung von gestern ist für mich ok , auch wenn es vielleicht mathematisch nicht korrekt ist , das merkt kein Mensch.
Ich habe nicht weiter gemacht weil ich noch mit Hardware beschäftigt war . Das ist erledigt und ich habe jetzt die für mich finale Lösung bis auf ein paar Kleinigkeiten fertig.
VG und gute Nacht

Was verwendest Du denn genau?
Die Boardgrösse finde ich super!

@biologist: ich habe nir die AC101 Lib etwas genauer angesehen. Nach der Initialisierung ist für Kopfhorer und Lautsprecher der Wert 30 voreingestellt. Wenn dort auf 63 erhöht wird ist nach meiner Einschätzung die unterste Stufe etwas zu laut.
ich ahbe das jetzt so:
in setup()

audio.setVolume(initVolume);
#if (HAL == 2)
    ac.SetVolumeHeadphone(initVolume * 3);
    ac.SetVolumeSpeaker(initVolume * 3);
#endif

und in
AudioSetVolume()

    audio.setVolume(currentVolume);
#if (HAL == 2)
    ac.SetVolumeHeadphone(currentVolume * 3);
    ac.SetVolumeSpeaker(currentVolume * 3);
#endif

So ist einfach der Regelbereich besser.

Ok, dann nehme ich das mal auf, wenn @tuniii mit dem Refactoring durch ist.
Danke.

Hi @Christian
Anbei mal die vorläufige Schaltung .ESP32_A1S Breakout Board.pdf (155,7 KB) Das Board ist ein Schnellschuß weil ich etwas anderes bei JLCPCB bestellt habe und wegen Porto sparen dieses dann gleich mit . Die Schaltung wird so bleiben , aber das Layout habe ich nochmals geändert .

  1. der SD_Card_Reader ist nicht sehr hochwertig und in der neuen Version will ich einen mit mechanischer Verriegelung verwenden ( ist bestellt ) .
  2. Ich habe den Footprint des ESP32-Wrover benutzt , leider ist der A1S etwas breiter . Das war mir nicht aufgefallen und somit ließ sich der Chip nur sehr schlecht auflöten . Ich habe einen neuen Footprint erstellt . Deshalb mußte ich einige Leiterbahnführungen ändern und die Lage einiger Ausgangspins haben sich geändert .

Das Board hat ca. die Größe eines Lolin D32 Pro .
Da ich nur mit FTDI232-Adapter flashe und dieser max ca. 30mA liefern kann ist es nicht möglich die komplette Schaltung mit allen Komponenten wie Neopixel , Cardreader usw. zu versorgen . Deshalb habe ich J9 vorgesehen . Dieser ist normalerweise nicht gesteckt und wird nur benötigt wenn man das Board außerhalb des „Motherboards“ flashen will . Das geht dann problemlos .
Das Motherboard ist theoretisch fertig , soll heißen alle Komponenten funktionieren auf einem Lochrasterboard wie erwartet . Die letzte Änderung von @Wolle funktioniert und ist auch erforderlich sonst ist Audio zu leise .
Bis Ali liefert habe ich jetzt Zeit das Layout zu erstellen . Es wird ähnlich sein wie das bereits von mir veröffentlichte , da ich die vorhanden Komponenten in den fertigen Boxen 1:1 übernehmen will .
VG

1 „Gefällt mir“

@Wolle ich habe das mal getestet . Für den Lautsprecher ist mir die max. Lautstärke etwas zu leise . Ich habe aber auch eine kleine Regalbox dran . Für Kopfhörer ok , wenn es auch im unteren Bereich etwas leise ist ( mit verschiedenen Kopfhören probiert). Ich habe es für Lautsprecher wieder herausgenommen . Der Regelbereich ist ok .
@biologist . Ich würde es so übernehmen . Kann ja jeder ändern wie er will und an seine Hardwarekomponenten anpassen . Im Zusammenhang mit den Einstellungen in der WEBGUI ist dann alles möglich und .
Auf jeden Fall bin ich vom A1S begeistert , nur noch wenige Komponenten erforderlich .
VG

Ich habe eine Frage an die User des ESP32-A1S Development Kits .
Gibt es beim Ein/Ausschalten ( auch beim Reset ) irgendwelche Knackgeräusche ? .

Das Datenblat des verwendeten NS5140 sagt folgendes:
Pop noise reduction function
The Pop Noise Reduction Function works in the cases of Power-on, Power-off, Power-down on, and Power-down off. And, the pop-noise can be suppressed according to control the power down by the following procedure.
・Power down mode is cancelled after power-on and the power supply is stabilized enough.
・Power down mode is set before Power-off.

Der CTRL-Pin liegt an GPIO21 und wäre damit per Software schaltbar .

Bei meinem A1S knackt es etwas, allerdings denke ich dass dies vom DAC AC101 kommt weil es auch im Kopfhörer leise hörber ist .

Wie verhält sich das Board bei euch ?

VG

Betrifft: analoge Tastenabfrage

Ich habe bei meinem neuen ESP32-A1S complete genug Pins . Trotzdem interessiert es mich ob und wie es im aktuellen Code möglich ist die Tastenabfrage per analogread zu lösen . Ich möchte keinen Portexpander verwenden, weil das wieder mehr Hardware erfordert . Per analoger Abfrage würde auch das Kabelwirrwarr im Gehäuse und die Anzahl der Buchsen auf dem Board deutlich reduziert werden .
Statt wie z.Bsp. bei mir 3 Tasten und Rotary mit insgesamt 8 Adern (GND , 3x Taste , 3,3V , CLK , DT , SW ) wären nur noch 2 Adern( GND , 1 x gemeinsam ) erforderlich .
HeadPhone detect lasse ich mal außen vor weil dort sowieseo ein Kabel wegen Audio hin muss .
Die z.Zt. noch 6 Adern für Ladestatus-LED und Single-Neopixel-LED werde ich mit 2 SMD-LED und LWL ersetzen .

@kobel , denkst du , dass es mit dem derzeitigen Stand der Software umzusetzen ist ? Dazu fehlen mir die Kenntnisse.

Hat sonst noch jemand einen Tipp dazu ?

VG

Hallo erstmal! Ich lese schon länger mit, melde mich hiermit auch mal zu Wort. :slight_smile:
Ich möchte mir auch einen ESPuino bauen, aber bin noch nicht ganz sicher, welche Hardware dafür am besten geeignet ist. Mir gefällt auch der Ansatz von compactflash mit einem Board, der ESP32 A1S wäre ein guter Kandidat denke ich. Die Hardware des SqueezeAmp fide ich auch gut, da ist aber fraglich ob noch genügend IOs frei sind für RFID und Encoder/Buttons. Die Bedienung vom SqueezeAmp läuft ja über WLAN über das SlimProto. (Aber das ist eine andere Geschichte…)

Mir wäre auch eine lange Standby-Lebenszeit wichtig. Die NodeMCU boards die ich zur Verfügung habe scheiden daher aus.

Wie gehts mit dem sogenannten „complete“ board? Bist du noch am testen oder gibt es schon eine stabile Version? Und wie könnte man zu einer Hardware kommen? Am Foto mit der „Vorstufe“ sieht die Platine nicht größer als ein NodeMCU aus - ist trotzdem alles drauf was man braucht - bin beeindruckt!

tl;dr

Zu deiner analogen Tastenabfrage gibt es hier eine elegante Idee. Im Prinzip ist das ein Widerstandsnetzwerk. Theoretisch sollte das möglich sein, jedoch hängt es von vielen Faktoren ab, ob das in der Praxis auch funktioniert.

Dank Port-Expander gibt es die Funktion digitalReadFromAll.
Dort kannst du deine Anpassungen vornehmen.

Hallo compactflash, ich habe immer noch SW Code vom Dezember am laufen. Meine Lösung, vielleicht nicht elegant, aber es funktioniert:

void buttonHandler() {

    if (xSemaphoreTake(timerSemaphore, 0) == pdTRUE) {
    if (lockControls) {
        return;
    }
    unsigned long currentTimestamp = millis();
     val = analogRead(36);
//    // Serial.print("Analog; ");
//     //Serial.println(val);
    buttons[0].currentState=true;
    buttons[1].currentState=true;
    buttons[2].currentState=true;
    buttons[3].currentState=true;
    buttons[4].currentState=true;
    buttons[5].currentState=true;
  
    if (val < 100) {
        buttons[4].currentState=false;
    }
    else if ((val > 400) && (val < 800)) { 
        buttons[5].currentState=false;
    }
    else if ((val > 1400) && (val < 1800)) {
        buttons[2].currentState=false;
    }
    else if ((val > 2300) && (val < 2800)) {
        buttons[0].currentState=false;
    }
    else if ((val > 3000) && (val < 3500)) {
        buttons[1].currentState=false;
    }
    //buttons[0].currentState = digitalRead(NEXT_BUTTON);
    //buttons[1].currentState = digitalRead(PREVIOUS_BUTTON);
    //buttons[2].currentState = digitalRead(PAUSEPLAY_BUTTON);
    // buttons[3].currentState = digitalRead(DREHENCODER_BUTTON);
    // buttons[4].currentState = digitalRead(VOLUME_UP);
    // buttons[5].currentState = digitalRead(VOLUME_DOWN);

    //Serial.println(buttons[4].currentState);
    // Iterate over all buttons in struct-array
    for (uint8_t i=0; i < sizeof(buttons) / sizeof(buttons[0]); i++) {
        if (buttons[i].currentState != buttons[i].lastState && currentTimestamp - buttons[i].lastPressedTimestamp > buttonDebounceInterval) {
            if (!buttons[i].currentState) {
                buttons[i].isPressed = true;
                buttons[i].lastPressedTimestamp = currentTimestamp;
            } else {
                buttons[i].isReleased = true;
                buttons[i].lastReleasedTimestamp = currentTimestamp;
            }
        }
        buttons[i].lastState = buttons[i].currentState;
    }
}

}

Hi @fizze , danke für die Info . Den Link kenne ich . Die erforderliche Hardware und einfacher Code ist mir auch klar . Ich habe sowas auch schon mal vor langer Zeit mit Arduino ausprobiert aber eben nicht in Zusammenhang mit solch einem komplexen Code .
Zu meinem Board habe ich eigentlich in diesem Thread schon alles geschrieben . Neues gibt es im Moment nicht . Mir ist heute eine Lösung gegen die Ein/Ausschaltgeräusche eingefallen , dafür brauche ich aber einen GPIO mehr . Ist im Moment noch Theorie, werde ich aber zeitnah ausprobieren .
VG

Hallo @Jonas und @kobel .
Danke für eure Infos . Mein Problem ist , dass ich kein C kann . Meine Programmierkenntnisse sind Maschinensprache und Assembler und das ist schon ca. 30 Jahre her . Alles was ich heute mache muß ich mir mühsam erlesen und „erkämpfen“ . Ich habe schon einiges gemacht , auch mit Arduinos , aber ich brauche dazu immer viel Zeit .
Ich werde mir das mal genauer ansehen .
VG
Edit: nach etwas Studium … sieht ja garnicht so schwierig aus , bin voller Hoffnung das zu schaffen .

Ich hab auch ne ganze Zeit kein C mehr programmiert, aber das ist wie Fahrrad fahren… :wink:

Ok, das wäre dann eine Hürde für die „complete“ Platine, mit dem Encoder.
Das Problem beim Einschalten wird üblicherweise so gelöst, dass man nur bei Nulldurchgängen ein- bzw ausschaltet. Dann „knackt“ es nicht. Das ist aber nicht bei jeder Beschaltung trivial.

Wie kann man hier am besten behilflich sein?
Ich könnte denke ich nen Rotary encoder wo kannibalisieren und an einen NodeMCU mit ESP32 dranhängen. Bzw. versuchen über analog auszulesen.

Wenn sich bei der Hardware sonst nix mehr tut spricht ja eigentlich nichts dagegen, ein „complete“ board zu bestellen, oder?

Das hatte ich mal angefragt . Mittlerweile ist mir klar dass es dieses Problem bei dem Board nicht gibt . Bei dem Board ist ab Werk der Pin CTRL des NS4150 mit einem PullDown Widerstand versehen und damit erst durch ein HIGH an IO21 aktiv . Das wäre auch für alle anderen DAC´s und Endstufen eine vernünftige Lösung . Der MAX98357 und der PCM5102A knacken nur unwesentlich , da muss man nichts machen . Der PT8211 , PAM8403 und PAM8406 knacken heftig , der NS4150 nicht ganz so störend.
Das Knacksen am ESP-A1S im Kopfhörer bekommt man dadurch nicht weg , ist aber auch nur sehr leise . Nachteil ist natürlich ein weiterer erforderlicher Pin .
Da ich aus minimalistischen Gründen den Portexpander nicht will , strebe ich deshalb eine Tastenabfrage mit analogread an , evtl. auch Rotary mit analogread , am besten am gleichen Pin . Ich habe dazu schon etwas gefunden aber noch nicht ausprobiert ob es in Kombination funktioniert . Und ob es im Torsten Code läuft werde ich wegen fehlender Kenntnisse selbst nicht herausfinden können . Da hoffe ich auf Hilfe .
Man könnte die Stummschaltung auch mit dem Pin Power verknüpfen und das sollte dann auch mit meinem ON/OFF-Controller LTC2954 funktionieren .
Ein weiterer Vorteil wäre die Stummschaltung bei Verwendung eines Kopfhörers . Mit meiner Kopfhörerplatine habe ich ja den MAX98357 direkt abgeschaltet . Dazu habe ich die Klinkenbuchsen von Cliff verwendet , welche ich noch vom Tonuino hatte . Da diese zum Wegwerfen zu teuer waren aber wegen des Ruhekontaktes beim MAX98357 nicht zu nutzen sind habe ich zur Invertierung des Kontaktes einen Mosfet eingesetzt . Dieser könnte dann entfallen und damit wären wahlweise Buchsen mit Ruhe-oder Arbeitskontakt verwendbar , und im Code einstellbar .
So , erst einmal genug für heute.
VG