Forum: Mikrocontroller und Digitale Elektronik ESP32 Esp32-Audio-Kit A1S v2.2 + RC522


von Chris (Gast)


Lesenswert?

Hallo liebe uC Programmierer,

ich habe folgendes Problem an dem ich langsam verzweifle. Ich habe mir 
aus reinem Bastelvergnügen folgendes Board im Inernet bestellt:
-(Google translate notwendig) http://wiki.ai-thinker.com/esp32-audio-kit
-(Schematic) 
http://wiki.ai-thinker.com/_media/esp32-audio-kit_v2.2_sch.pdf

Mittels der IDF und ADF von espressif lässt sich eigentlich alles soweit 
umsetzen wie ich es für meine Zwecke benötige (Music abspielen, Wifi, 
Bluetooth etc.pp). Nun war meine nächste Idee über SPI den bekannten 
RFID Leser RC522 anzschließen. Auf Github konnte ich folgende Bib finden 
die eigentlich perfekt funktioniert:
https://github.com/abobija/esp-idf-rc522

Das Problem ist aber, das ich für ein funktionierendes Auslesen eines 
Tags unter Verwendung der Bib eine Pinbelegung von MISO -> 12, MOSI -> 
13, SCK -> 14 und SDA -> 15 vornehmen muss. Das wiederum führt zu einem 
Konflikt, da auf dem Board der SDMMC Leser genau über diese Ports 
angeschlossen ist ("HS2_*" Belegung). Bei einem Stream einer Musikdatei 
von der SD-Karte, bekomme ich daher Probleme.
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/sdmmc_host.html

Aus der IDF Docu 
(https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/spi_master.html) 
kann ich ablesen, dass es theoretisch noch eine SLOT3 SPI-Pinbelegung 
mit MISO -> 19, MOSI -> 23, SCK -> 18 und SDA -> 5 gibt. Diese Pins 
wären laut Datenblatt des ESP32-audio-kit boards auch verfügbar. Nur 
leider kann ich nicht einfach die Pinbelegung auf diese Pins ändern.

Hätte vielleicht jemand, der sich mit Datenblätter und der Verschaltung 
des ESP32 auskennt, kurz Zeit über die recht dürftige Doku des ESP32 
Audio Kits drüber zu sehen? Ich befürchte nämlich, dass diese Pins wohl 
einfach nicht für den SPI Bus verwendet werden können bei diesem Board. 
Falls dem so wäre, müsste man doch auch softwareseitigen SPI verwenden 
können?

Vielen Lieben Dank vorab!

Grüße
Chris

von Michael U. (amiga)


Lesenswert?

Hallo,

vorweg: ich nutze das IDF nicht, nur die ArduinoIDE.
Mich verwirrt: MISO -> 12, MOSI ->
13, SCK -> 14 und SDA -> 15

Was ist SDA? Kenne ich nur von I2C, bei SPI ist das üblicherweise /CS.
Die Pinbelegung stammt wohl von einem ESP8266, da ist das der Standard 
(15 ist eben /CS).
SPI ist ein BUS, nur /CS wird zur Unterscheidung der Geräte genutzt, 
MOSI, MISO, SCK gehen an alle parallel und jeder bekommt seinen /CS.
Wie man das dem IDF klarmacht, weiß ich nicht.
Danke für den Link zum Schaltplan, den hatt ich noch nicht (hier auch 
die v2.2 des Kits.

Ich will da auch noch einen RC522 ranhängen, nur wenig Zeit im Moment...
Alles aber unter der ArduinoIDE, dazu die I2SAudio-Lib:
https://github.com/schreibfaul1/ESP32-audioI2S
und die AC101-Lib für den Codec:
https://github.com/Yveaux/AC101

Spielt von SD-Card oder Webstream problemlos, muß nur noch weitermachen.
PS: ich habe hier aber folgende Belegung für mein Board rausgefunden?
1
// SPI GPIOs
2
#define SD_CS         13
3
#define SPI_MOSI      15
4
#define SPI_MISO       2
5
#define SPI_SCK       14
6
7
// I2S GPIOs          die Pinnamen beziehen sich auf den AC101
8
#define I2S_DSIN      25           
9
#define I2S_BCLK      27
10
#define I2S_LRC       26
11
#define I2S_MCLK       0
12
#define I2S_DOUT      35
13
14
// I2C GPIOs
15
#define IIC_CLK                     32
16
#define IIC_DATA                    33
17
18
// Tasten
19
#define KEY_WAIT 50
20
21
#define BUTTON_1_PIN 36
22
// #define BUTTON_2_PIN 13                        // shared mit SPI_CS
23
#define BUTTON_3_PIN  19
24
#define BUTTON_4_PIN  23
25
#define BUTTON_5_PIN  18               // Stop
26
#define BUTTON_6_PIN   5               // Play
27
28
// Verstärker enable
29
#define GPIO_PA_EN    21
30
31
#define LED_D4        22 
32
#define LED_D5        19
33
34
// DIP-Schalter: 1-OFF, 2-ON, 3-ON, 4-OFF, 5-OFF

Gruß aus Berlin
Michael

von Chris (Gast)


Lesenswert?

Hi,

ich bin auf die Pinbelegung über den Schaltplan gekommen. Wenn man die 
DIP Schalter umlegt, hat man an der JTAG Schnittstelle nochmal IO_12, 
IO_13, IO_14 und IO_15 vorhanden, welche ich für den SPI des RC522 dann 
verwenden wollte. Leider überlappen diese Pins natürlich mit denen der 
SD/MMC Card und dort konnte ich aus dem Schaltplan folgendes ablesen

IO12 -> SD_DATA2,
IO13 -> SD_DATA3,
IO15 -> SD_CMD,
IO14 -> SD_CLK,
IO2 -> SD_DATA0,
IO4 -> SD_DATA1
( was auch perfekt zur Belegung Slot1 HS2_* passt 
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/sdmmc_host.html 
)

Laut 
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/spi_master.html
wäre SPI2 über
IO15 -> CSO,
IO14 -> SCLK,
IO12 -> MISO,
IO13 -> MOSI
und funktioniert auch, wenn ich die SD-Card nicht verwendet wird.
Da es noch den SPI3 gibt hätte ich gehofft auf die Pins
IO5 -> CSO,
IO18 -> SCLK,
IO19 -> MISO,
IO23 -> MOSI
auszuweichen, welche auch vorhanden sind auf dem A1S v2.2 board (wobei 
diese auch Mehrfach belegt sind da LEDs und Taser über diese Pins 
erreichbar sind z.b. IO19 addressiert Taster und LED). Nur leider 
passiert da garnichts wenn ich diese Pins auswählen und mein RC522 
anstecke und momentan habe ich auch keinen funktionierenden 
Logic-Analyzer hier.

Arbeitest du auch mit dem Audio Kit von AI-Thinker v2.2? Konnte ich aus 
dem Git nicht genau ablesen?

von Michael U. (amiga)


Lesenswert?

Hallo,

Chris schrieb:
> Arbeitest du auch mit dem Audio Kit von AI-Thinker v2.2? Konnte ich aus
> dem Git nicht genau ablesen?

Ich hatte das vor einiger Zeit bestellt, als es noch als v2.1 angeboten 
wurde und auch auf den Bildern so gezeigt wurde.
Bekommen habe ich dann aber die v2.2 wie aus dem Link:
https://www.amazon.de/Vaorwne-Seriell-Esp32-Aduio-Entwicklung-Esp32-A1S-schwarz/dp/B0858YCMJ1/ref=sr_1_12?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&keywords=esp32+audio+kit&qid=1584953577&sr=8-12

Den Rest habe ich mir dann zusammengesucht bzw. ausgeprüft. Zumindest 
spielt es hier so, liegt aber eben schon länger nur rum...
Mal schauen, ob ich mir da jetzt mal wieder Zeit für nehmen.
Habe es gerade mal rausgekramt und den Sktech geflasht, aus dem meine 
Pinbelegung stammt: spielt zumindest meinen Webstream und auch von 
SD-Card noch.

Gruß aus Berlin
Michael

von danny L. (da_danny)


Lesenswert?

Hallo,

ich arbeite auch seit einiger Zeit mit dem Board und hatte auch schon 
einige Probleme damit ;)

RC522: ich hab ihn nicht zum Laufen bekommen und habe mich viel zu lange 
damit rungeärgert! ich habe dann auf den PN532 gewechselt; den kann man 
über UART ansteuern => braucht daher auch nur 2 IOs von denen bei dem 
Board nicht viele rausgeführt sind.
BTW: I2C läuft bei PN532 nicht, da der ESP32 kein Clock Stretching 
unterstützt.


ciao
danny

von Chris (Gast)


Lesenswert?

Hi,

ich habe noch eine weitere Bib/Component gefunden für den RC522 
https://github.com/binh8994/rc522-esp-idf aber gleiches Problem. Ich 
kann die GPIO_NUM_19, GPIO_NUM_23, GPIO_NUM_18, GPIO_NUM15 nicht 
verwenden. Addressieren kann ich aber auf alle Fälle diese Ports, da 
eine einfache LED Blinkschaltung funktioniert (ja leider ist mein logik 
analyzer kaputt).

Ich vermute langsam, dass AI Thinker diesen SPI Bus, der normalerweise 
bei einem ESP32 dort verfügbar wäre, irgendwie entfernt hat. Ein 
Hinweise darauf liefert vielleicht auch die Tatsache, dass einige Taster 
sowie Leds auf dem Board auch auf diese IOs laufen.

von Chris (Gast)


Lesenswert?

Hi,

ich nochmal, kann den RFID reader und das ESP32 Audio-Ki A1s von AI 
Thinker jetzt gleichzeitig laufen lassen. Ich nutze dafür folgende 
Library als component:
https://github.com/binh8994/rc522-esp-idf
Folgende PINS
1
#define PIN_NUM_MISO GPIO_NUM_12
2
#define PIN_NUM_MOSI GPIO_NUM_13
3
#define PIN_NUM_CLK  GPIO_NUM_18
4
#define PIN_NUM_CS GPIO_NUM_5
5
#define PIN_NUM_RST  GPIO_NUM_4 //Unnötig muss aber gesetzt sein
und folgenden source code, wobei ich .clock_speed_hz stark reduziert 
habe um den IO_18 Pin verwenden zu können
1
void spi_init(uint8_t clk, uint8_t mosi, uint8_t miso)
2
{
3
  esp_err_t ret;
4
  spi_bus_config_t buscfg = {
5
      .miso_io_num = miso,
6
      .mosi_io_num = mosi,
7
      .sclk_io_num = clk,
8
      .quadwp_io_num = -1,
9
      .quadhd_io_num = -1,
10
      .max_transfer_sz = 1024,
11
  };
12
  spi_device_interface_config_t devcfg = {
13
      .command_bits = 0,
14
      .address_bits = 0,
15
      .dummy_bits = 0,
16
      .duty_cycle_pos = 128,
17
      .cs_ena_pretrans = 0,
18
      .cs_ena_posttrans = 0, // Keep the CS low 3 cycles after transaction, to stop the master from missing the last bit when CS has less propagation delay than CLK
19
      .clock_speed_hz = 10 * 1000,      //Clock out: !!! Hier habe ich den Clock reduziert um GPIO_NUM_18 verwenden zu können
20
      .mode = 0,                               //SPI mode 0
21
      .spics_io_num = -1,                      //CS pin
22
      .queue_size = 8,                         //We want to be able to queue transactions at a time
23
      .pre_cb = spi_pre_transfer_callback, //Callback to be called before a transmission is started, handle CS pin
24
      .post_cb = spi_post_transfer_callback, //Callback to be called after a transmission has completed, handle CS pin
25
  };
26
  //Enable pull-ups on SPI lines so we don't detect rogue pulses when no master is connected.
27
  gpio_set_pull_mode(miso, GPIO_PULLUP_ONLY);
28
  gpio_set_pull_mode(mosi, GPIO_PULLUP_ONLY);
29
  gpio_set_pull_mode(clk, GPIO_PULLUP_ONLY);
30
31
  //Initialize the SPI bus
32
  ret = spi_bus_initialize(VSPI_HOST, &buscfg, VSPI_DMA_CHANNEL);
33
  ESP_ERROR_CHECK(ret);
34
  if(ret != ESP_OK) {
35
    ESP_LOGI("SPI-MFRC: ","Error Init");
36
  } else
37
    ESP_LOGI("SPI-MFRC: ","Success Init");
38
39
  //Attach the RC522 to the SPI bus
40
  ret = spi_bus_add_device(VSPI_HOST, &devcfg, &vspi);
41
  ESP_ERROR_CHECK(ret);
42
  if(ret != ESP_OK) {
43
    ESP_LOGI("SPI-MFRC: ","Error Add");
44
  } else
45
    ESP_LOGI("SPI-MFRC: ","Success Add");
46
}

Vielleicht hilft es ja jemanden der ein ähnliches Projekt verfolgt

Grüße

von Lukas H. (lukas_h320)


Lesenswert?

Hallo zusammen

Vorweg: Ich arbeite mit dem Arduino IDE.

Habe das Board dank https://github.com/schreibfaul1/ESP32-audioI2S zum 
Laufen bekommen. Musste aber ebenfalls vom RC522 auf den PN532 mit UART 
wechseln (Library: PN532_HSU.h), wegen bekanntem SPI Problem.


Nun habe ich aber das Problem, dass mp3 Streaming von der SD Karte und 
parallel RFID Lesen (noch) nicht funktioniert bzw. der Stream abbricht. 
Wenn ich die RFID Funktion mittels TaskScheduler ausbremse (z.B. wird 
dann nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], 
&uidLength) nur alle 3 Sekunden ausgeführt), klappt es zwar mit dem 
Stream. Aber dafür ist dann alle 3 Sekunden ein Klicken auf dem 
Audiosignal zu hören.

Hat jemand von euch eine bessere Idee als den TaskScheduler? Evt. den 
einen Prozess vom Core0 auf den Core1 verschieben? Oder muss ich mich 
mal mit FreeRTOS auseinandersetzen, um das irgendwie hinzubekommen?

Danke für euren Input und beste Grüsse
Lukas

von Werner B. (werner-b)


Lesenswert?

Da der ESP32 zwei Prozessorkernel hat und das Framework auf FreeRTOS 
basiert, könntest du den PN532-Teil als eigenen Thread/Prozess auf dem 
zweiten CPU-Core laufen lassen. Das geht auch in der Adruino IDE.
Das ist allerdings nicht so schnell aus dem Ärmel geschüttelt.
Da hilft nur - wie immer - RTFM. Oder in diesem Fall die Mehrzahl. 
RTFMs.

Als Einstieg:
- https://randomnerdtutorials.com/esp32-dual-core-arduino-ide/
- 
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/freertos.html
- https://freertos.org/Documentation/RTOS_book.html

von Kybernetiker X. (kybernetiker)


Lesenswert?

Kann man die GPIO_NUM_19, GPIO_NUM_23, GPIO_NUM_18, GPIO_NUM15 für 
Servosteuerung verwenden? Denn PWM müssen die ja verfügen.

von Marcel L. (marlic)


Lesenswert?

Hallo,

ich hatte mich die letzten Tage auch mit dem ESP32 Audio Kit V2.2 
gequält. Es scheint aber möglich zu sein, alle buttons zu verwenden und 
trotzdem die GPIO's für SPI oder anderes frei zu bekommen. Die buttons 
können über IO36 ausgewertet werden. Ich habe im Rahmen eines anderen 
Projekts ein kleines Video gemacht: https://youtu.be/r0af0DB1R68
Vielleicht hilft es ja dem einen oder anderen weiter.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.