ESP32 Audio Kit (ESP32-A1S)

Hallo Johannes, den Fork habe ich zum Experimentieren angelegt um herauszufinden, was die beste Konfiguration ist. Besser ist es, du bleibst beim Original. Anfangs hatte ich SPI für die SD und den Kartenleser. Der RD511 kann lt. Datenblatt max 10MHz, viele SDs schaffen 40. Das macht FTP noch langsamer. Jetzt habe ich die SD als SD_MMC konfiguriert und der Kartenleser ist alleine auf dem SPI. Der A1S hat nicht viele GPIOs und es geht darum möglichst viele Pins einzusparen.

Meine Konfiguration ist jetzt: MOSI 22, MISO 13, SCK 12 RFID_CS 05. Die SD_MMC belegt 11,15 und 2, der Neopixelring GPIO0 und der Rotary Encoder CLK 18, DT 19, SW 23. Viele Möglichkeiten die Pinbelegung zu ändern sehe ich nicht. Die Strapping-Pins müssen beim Booten festgelegte Pegel haben und für die SD Karte gilt beim Initialisieren das gleiche. Schliesslich liegen an allen Pins der SD Datenleitungen, nicht nur die drei Leitungen die nachher benutzt werden. Die Pins 21,25,26,27,32,33,34 und 39 werden intern benötigt. So ist nur noch Platz für zwei Tasten an Pin 4 und 36. Es lassen sich noch zwei Pins gewinnen wenn der Kartenleser auf dem I2C Bus gelegt wird. Ich habe diesen:
MRFC522
der leider nicht mit I2C funktioniert.
vG Wolle

Es ist noch ein Pull-Request für den PN532 in meinem Repository ausstehend. Der kann i2c.

Ist jetzt die Frage, was besser ist :slight_smile: Bei mir ist der etwas stiefmütterlich behandelt wenn ich ehrlich bin. Ich habe ihn zwar am laufen gehabt, aber das war nur SPI (kein SD_MMC).

Das Gesamtprojekt ist einfach zu komplex geworden, als dass ich Zeit hätte, das alles immer zu testen+dokumentieren :woman_shrugging: Aber zur Not kann ich auf den Thread hier verweisen - das ist ja gut :smiley:

Danke, ich werde mich nach einem anderen Kartenleser umsehen. Es hat lange gedauert herauszufinden, warum I2C nicht funktioniert. Der RC522 kann das. SDl und SDA sind auch herausgeführt. Zuerst habe ich eine falsche Adresse vermutet, nachher und die fehlenden PullUps an den Datenleitungen bemerkt. Aber der wirkliche Grund ist Pin1 des Chips. Pin 1 schaltet zwischen UART und I2C um. Leider liegt Pin 1 auf Masse und ich habe keine Möglichkeit das zu ändern ohne den Chip auszulöten :slightly_frowning_face:
Der A1S hat zu wenige Ausgänge. So wie ich das beschrieben habe funktioniert es, einfach in der settings und sttings_espa1s die Werte einstellen. Umd im setup() habe ich bei SPI.begin() noch die Ports eingetragen.

Hallo Wolle, danke für die ausführliche Antwort. Kleiner Status Update: Deinen Fork habe ich ausprobiert; damit klappt das Erkennen der RFID Karte, aber der Ton kommt mit Kratzen aus den Lautsprechern.
Mit den Sourcen aus dem Original Repo spielen die Lieder einwandfrei, jedoch werden die RFID Karten nicht gelesen. Das Init des SPI hatte ich dort auch angepasst (SPI.begin(RFID_SCK, RFID_MISO, RFID_MOSI, RFID_CS);), und anschließend wird auch die Firmware Version des RC522 korrekt ausgelesen (mittels mfrc522.PCD_DumpVersionToSerial()):

Firmware Version: 0x92 = v2.0

Nur in rfidScanner wird die Karte nicht erkannt. Irgend was kleines fehlt noch…

PS: Als Lib nutze ich miguelbalboa/MFRC522

@Wolle Schau mal hier: RC522 via second I2C instance · Issue #7 · biologist79/ESPuino · GitHub
Dort ist einerseits ein anderes Board verlinkt und andererseits ein weiterer Links zum Arduino-Forum, wo beschrieben ist, wie man das RC522-Board „fixen“ kann.

@biologist , danke für Deine Bemühungen, das RC522_Board auf I2C umzurüsten ist nicht ganz einfach. Da gibt es eine Anleitung für


das ist zu schwierig für mich. Ich habe ein anderes Board bestellt und werde damit testen.
@jpellenz Bei mir läuft das gleiche Board mit genau derselben Firmware. Mit der Original Repo (bei meinem habe ich schon zuviel verdreht) und den genannten Einstellungen gibt es keine Probleme, die RFID Karten werden richtig erkannt.

@Wolle - du hast recht - es klappt mit der ESPuino Firmware mit den minimalen Änderungen. Mein Problem war, dass der Encoder CLK auch noch auf den Pin 5 gelegt war (den hatte ich vergessen anzupassen):

#define DREHENCODER_CLK              5

statt richtig

#define DREHENCODER_CLK              18

Danke nochmal für die Unterstützung.

Hallo Zusammen,
vorab ein dickes Lob an alle die das Projekt vorantreiben! Echt Klasse was ihr da auf die Beine gestellt habt.
Nun zu meiner Frage:
Bin auch Besitzer eines ESP32 A1S v2.2 Boards und würde gerne einen ESPuino umsetzen, der mit einem RFID RC522 und lediglich 3 Tasten ausgestattet ist. Ist primär für meinen kleinen Sohn gedacht, daher eine hybride Bedienung via Tasten, RFID und Webinterface. Ist das realisierbar? Für mich ergeben die verfügbaren Infos noch kein klares Bild. Was ich soweit verstanden habe:

  • Die Widerstände R66 bis R70 entfernen
  • Stellungen der Switches 1-5 laut @Wolle (OFF?, ON, ON, ON, ON)
  • SD_MMC 11, 15, 2 laut @Wolle (intern für den SD-Reader)
  • Die drei Tasten auf 18, 19, 23

Habe ich etwas übersehen? Wollte das nur vor dem ersten Versuch gefragt haben, da ich nicht wieder 8 Wochen warten will, bis Ersatz für das kaputte Board da ist…

Vielen Dank im Voraus!

Grüße PrR3

1 „Gefällt mir“

@Wolle: Du hast dich da verschrieben, oder? SD_MMC müsste über 2, 14 und 15 laufen.

Das funktioniert.

An der Stelle noch ein Hinweis: Integration des Port-Expanders PCA9555
Also ich arbeite gerade daran, dass man einen Port-Expander einbinden kann. Da müsstest du zwei GPIOs für i2c opfern, hast dann aber bis zu 16 zusätzliche Eingänge, die für Buttons nutzbar sind. da könntest du dann bis zu fünf Buttons (mehr unterstütze ich im Code aktuell nicht) und zusätzlich den Button eines Drehencoders dranhängen.

Den Rest lasse ich mal die beantworten, die aktuell tiefer im Thema drin sind. Bei mir ist das zu lange her :woman_shrugging:

ja, da habe ich mich vertan, Data0, CLK und CMD sind die Pins 2, 14 und 15. Die GPIOs sind fest vorgegeben.

Hhmmm…dann bietet sich eigentlich eine Aufsteck-Platine für das Audio-Kit an. Dort dann den Port-Expander und alle anderen Anschlüsse und Stromversorgung drauf.

Es scheint ja irgendwie zwei Versionen zu geben. Ist die 2.2 die „große“ Version, die auch oben im Bild von Wolle zu sehen ist? Ich warte gerade auf diese Version :
Bild

Das könnte man machen. Hier mal zwei Bilder von meinem Board (V2.2):

Das Anlöten des Drahtes hatte ich damals gemacht, um an den GPIO für RFID zu kommen. Im Hinblick auf SD_MMC ist das hinfällig.
Also um maximale GPIOs zu sparen könnte man den RFID per i2c anbinden und ebenfalls per i2c den Port-Expander.

@Wolle @tuniii
Ihr habt das Board doch laufen, oder? Könnt ihr mir mal settings-Files dafür schicken? Mir fehlt ehrlich gesagt bissl die Zeit, mich da jetzt wieder reinzufuchsen. Aber zumindest soll das, was die User vorfinden, in einem Zustand sein, der compilefähig ist. Auf jeden Fall werde ich das fix einkodierte i2c für RFID aus platformio.ini wieder entfernen. Weil wenn man das auswählbar hat in settings.h, dann muss das auch der Master sein.

SD_MMC, RFID via SPI, Drehencoder, drei Buttons kriegt man aber von den wenigen GPIOs, die man hat, nicht hin. Oder?

Nur zur Einordnung:
Ich hatte ursprünglich ESPuino darauf zum Laufen gemacht und es dann in den Hardware-Platforms-Ordner verschoben. Da ist es ein Stück weit rumgedümpelt. Irgendwann hat es kkloesner aufgegriffen und in meinen Code integriert. Aber ich selbst habe daran, wenn ich ehrlich bin, nicht mehr wirklich was gemacht.

@biologist
Das Board läuft. Hardwareseitig habe ich nichts verändert, alles ist noch so wie oben beschrieben,
SD_MMC, RFID über SPI, Rotary-Encoder und NeoPixelRing. Es bleiben noch zwei Pins, einer davon, Pin4 ist nicht herausgeführt. Der I2C Kartenleser ist angekommen, ich werde ihn in den nächsten Tagen testen. Dann werden weitere zwei GPIOs frei.
Podcasts gibt es vom Bayerischen Rundfunk sehr viele (Betthupferl, Detektivgeschichten…) Alle Podcasts haben eine Verbindung über SSL. Mir ist aufgefallen, dass der Speicher dann kaum noch reicht. Du hast zwei TaskQueues am laufen, die wahre Speicherfresser sind. Eine, die den Kartenleser verwaltet habe ich entfernt. Der Kartenleser liegt bei mir jetzt unmittelbar im Loop, Abfrage ‚neue Karte?‘ ->nein → weiter. Das braucht kaum Rechenzeit. Seitdem reagiert der Kartenleser viel schneller und ich habe das Gefühl er ist viel empfindlicher, obwohl das technisch nicht sein kann.

Hallo, ich habe mit den GPIO-Empfehlungen von @Wolle das Bord in Betrieb genommen. Die Änderungen an Deinem Master mit den Anpassungen von kkloesner waren tatsächlich minimal. Die Änderungen findest Du in diesem Fork: https://github.com/jpellenz/ESPuino. Anmerkungen:

  • Die Anbindung des RC522 erfolgt hier über SPI. Daher ist das Einbinden der I2C Lib rausgenommen, und die Definitionen der Pins für SPI dazugekommen.
  • Wolle hatte oben mal für den Drehencoder Butten GPIO 23 empfohlen. Leider kann man über GPIO 23 den ESP32 nicht aus den Deepsleep holen. Daher ist der Button bei mir nun an GPIO 0 angeschlossen. (GPIO 0 wird jedoch auch vom Board selber glaube ich für I2S_MCLK genutzt; wenn man den Button während des Betriebs nutzt, kann es sein, dass der Sound verschwindet. Erneutes Drücken kann den Sound wieder hervorholen.)
  • PAUSEPLAY_BUTTON ist der einzige Button, den ich angeschlossen habe (GPIO 21). Die Funktion bei kurzem Druck ist Pause/Play, bei langem Druck Next. Das war für mich die minimalistische Version mit einem Button. Masse habe ich an einer Lötstelle der Steckerleiste auf der Rückseite abgegriffen.
  • Neopixel hängen an GPIO 23. Masse und 3.3 V habe ich wieder an den Lötstellen von der Steckerleiste abgegriffen.
  • Die Sourcen unter Hardware-Plaforms/ESP32-A1S-Audiokit sollte man wirklich entfernen; das verwirrt doch ziemlich.

@Wolle: Zwei zusätzliche GPIOs wären wirklich super für den Anschluss zweier weiterer Taster. Ich nehme mal an der Sensor ist wo einer wie dieser, richtig?
https://www.aliexpress.com/item/32956826832.html

Zwei Fragen die für mich noch offen sind:

  • Welche Akkus kann man an dem Bord anschließen? Ist eine Ladeelektronik enthalten?
  • Ich möchte das Board mit nur einem Lautsprecher betreiben. Wie bekommt man das am elegantesten hin? Im Moment fehlt bei Abspielen von Stereo-Dateien der zweite Kanal.

Johannes

@jpellenz da haben wir jetzt den selben Stand. Mein Board sieht mit der „Freiluftverdrahtung“ ähnlich aus wie auf Deinen Fotos. Ja, WakeUp funktioniert nicht mit allen GPIOs, danke für den Hinweis. Das habe ich jetzt verändert. Die Steuerung mit den Rotary-Knopf ist jetzt so:
lang deepSleep/wakeUp, kurz pause/play.
Den I2C Kartenleser (der gleiche wie Dein Link zu aliexpress) habe ich beim großen ‚A‘ bestellt und ist inzwischen geliefert worden. Das Problem: der I2C Bus ist intern mit dem AC101 verbunden und kann nicht für den Kartenleser benutzt werden. Also braucht man eine zweite I2C Instanz. Da hat Torsten gut vorgearbeitet und das bereits vorgesehen. Und dann braucht man die speziellen Libs für den Kartenleser und den AC101.
Die „audio.h“ hat die Methode forceMono(true). Damit wird im Prinzip das arithmetische Mittel des rechten und linken Kanals gebildet. Und zusätzlich kannst Du setTone(3,0,0) setzen. Bei kleinen Lautsprechen bewirkt das eine Anhebung der Tiefen. In der Lib gibt es digitale Filter (Tiefpass, Bandpass, Hochpass) die bis +6dB verstärken oder bis -40dB absenken können.
Um den Akku habe ich mich noch nicht gekümmert. Eine Ladeschaltung dafür ist vorgesehen. GPIO21 geht beim DeepSleep auf Masse, damit könnte man den Kartenleser und die Neopixels ausschalten.
vG Wolle

Danke für eure Infos.
Dann werde ich mal schauen, was ich daraus mache.
@Wolle die Tasks ermöglichen mir halt ein einfaches Scheduling. Aber du hast schon Recht: Für rfid müsste man das nicht haben. Weiß nicht mehr genau, warum ich das damals eingeführt hatte.

@jpellenz Ja, ich werde den Code mal rauswerfen. Das verwirrt. Mal schauen, ob ich heute Abend dafür Zeit habe.

So. Ich habe eben mal den alten Code entfernt und zudem die Readme etwas überarbeitet. Aber ich muss das Layout (die Tabelle) dort nochmal aktualisieren. Dafür habe ich jetzt keine Zeit :slight_smile: Kinder und so… :joy:

@Wolle Habe vorhin mal RFID ohne Task gemacht und tatsächlich scheint die Sensitivität von rc522 damit besser zu werden.
Ich habe aber noch ein Problem mit pn5180, deswegen habe ich das Ganze noch nicht comitted.

Ein User schrieb mir eben übrigens was wegen einer fehlenden sdfat-Lib, als er deine aktuelle Version kompilieren wollte. Muss da es angepasst werden?

@biologist Es gibt Bemühungen SdFat in die audio Lib einzubinden. Leider verhält sich SdFat ziemlich ‚zickig‘ umd mag nicht zeitgleich mit SD, SD_MMS, SPIFFS… existieren. Ich bin jetzt wieder auf dem alten Stand und habe SdFat entfernt.