ESP32 UART zu Raspberry Pi I2C

Ich versuche zu verstehen, wie man die UART-Pins eines ESP32 mit den I2C-Pins meines Himbeer-Pi 3B + verbindet. Ich sehe mehrere Bridge-Chips, die dafür verfügbar sind, wie das MSP430- Datenblatt von TI . Aber ich bin nicht sehr versiert auf Rennstrecken, also habe ich eine schwierige Zeit. Die Pins, die ich auf dem ESP32 verwenden muss, sind: GPIO 9 und 10, RX bzw. TX (UART1). Auf dem Raspberry Pi: GPIO 2 und 3, SDA bzw. SCL. Weiß jemand Antworten auf die folgenden Fragen?

  1. Welche zusätzlichen Schaltungen wären neben dem Verbinden der RPi-, ESP-, Vcc- und GND-Pins mit der Brücke an den richtigen E / A-Positionen auf dem Chip erforderlich, um eine gute Kommunikation herzustellen?

  2. Wie würde der ESP32-Code aussehen (Arduino IDE)?

  3. Wie würde der Code des Pi aussehen (Python)?

Warum möchten Sie I2C auf dem Raspberry Pi verwenden? Es hat auch einen Uart, also warum nicht stattdessen verbinden?
Gute Frage, der Grund ist, dass UART-Pins von einem anderen Modul belegt sind.
Der ESP32 hat eine I2C-Schnittstelle, der PI hat eine I2C-Schnittstelle, warum nicht das verwenden?
Ich habe mich nur darüber gewundert ... Beide Module I2C-Schnittstellen sind in meiner Anwendung nicht belegt. Ich habe das noch nie zuvor versucht.
@Feynman137: Hol dir einen Pi4. Der hat 6 Uart ;-)
Vielleicht habe ich endlich einen Grund, @PMF zu aktualisieren
Wenn Sie darauf bestehen, diese Pins zu verwenden, ist Ihre einzige realistische Chance eine Software-Seriennummer. I2C und uart sind einfach überhaupt nicht kompatibel, außer wenn Sie ein Konverterboard verwenden, aber es gibt einfachere Lösungen (Chips / Pins ändern, an einer Schnittstelle festhalten, Softwarelösung, ...)

Antworten (2)

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Der ESP32 hat mehr als 1 UART. Obwohl es üblich ist, nur einen davon in der Standardkonfiguration zu verwenden, verfügt der ESP32 über 3 UARTs. Sie können konfigurieren, welche GPIO-Pins verwendet werden sollen, indem Sie die Funktion uart_set_pin() verwenden. Einzelheiten finden Sie im Datenblatt oder auf der Espressif-Website.

Die Verwendung mehrerer UARTs ermöglicht es dem ESP, als serielle Brücke zu fungieren. Diese Funktion wird häufig mit den verschiedenen Varianten von ESPs als WiFi Serial Bridge implementiert, funktioniert aber auch für kabelgebundene Verbindungen.

UART-Seite

ESP hat mehrere UART, aber Pi 3b+ hat keine Pins für mehr als einen UART und diese Pins sind derzeit belegt. Das ist das Problem. Ich war mir der Funktion uart_set_pin () jedoch nicht bewusst, daher schätze ich den Vorschlag.

Andere haben kommentiert, der einfachste Weg, zwischen ESP32 und RPi zu kommunizieren, ist die Verwendung von asynchroner serieller Schnittstelle; Wenn Sie keinen freien seriellen Anschluss am Pi haben, können Sie einen USB-zu-Seriell-Adapter hinzufügen.

Wenn Sie sich für einen mit einem FTDI-Chip entscheiden, schließen Sie ihn einfach an den Pi an und Sie erhalten einen weiteren seriellen Anschluss. Der andere gängige Adaptertyp verwendet den CP2102-Chip, und ich denke, dazu müssen Sie möglicherweise einen Treiber auf dem Pi installieren, aber Sie finden im Internet zahlreiche Anweisungen, wie Sie dies tun können, z. B. auf dieser Seite

Stellen Sie sicher, dass Sie einen Adapter mit dem richtigen Spannungspegel verwenden (3,3-V-Logiksignale, keine 5-V- oder RS232-Spannungen), verbinden Sie dann die Erdungskabel und Tx auf Pi mit Rx auf ESP32, Rx auf Pi mit Tx auf ESP32.

In Bezug darauf, wie Sie diesen Link zur Kommunikation verwenden, wird jedes Zeichen, das Sie auf der einen Seite senden, nur auf der anderen Seite erscheinen. Es ist jedoch ratsam, ein einfaches Kommunikationsformat zu erstellen, z. B. einen Befehlsbuchstaben, möglicherweise einige numerische Werte und dann einen Wagenrücklauf, um das Ende der Befehlszeile zu signalisieren. Dies hat 2 Vorteile; Dies bedeutet, dass Sie ein serielles Terminal verwenden können, um Befehle manuell einzugeben, und es vermeidet auch die mögliche Verwirrung, wenn der Empfänger versucht, Maßnahmen zu ergreifen, wenn er nur einen Teil eines Befehls erhalten hat.