Erklärung Pinout von diesem Controller

Hi zusammen.

Ich habe mir folgenden Microcontroller gekauft. Mit diesem möchte ich über die Arduino IDE etwas rumexperimentieren und einige Projekte umsetzen.

PinOut

Jetzt blicke ich durch die PinBelegung auf den Board nicht wirklich durch, weil ich vom Uno eine andere Belabelung gewöhnt bin D1-D10 oder A1-A5. Wie spreche ich die Pins dieses Controllers an?

Es gibt zwar ein Foto mit einem Pinout, auch eine entsprechende Übersetzung wo ich Arduino gewohnt Digital und Analog Pin erkennen könnte. Aber ich zähle insgesamt 40 Pins auf dem Board, es sind aber nur 16 übersetzt. Was heißt das jetzt?

Kann ich die Restlichen nicht benutzen? Kann da mir jemand bitte mal erklären, wie ich das lesen muss?

Danke

Was verstehtst Du unter 'übersetzt' ?.
Was Du in der IDE immer nutzen kannst, sind die GPIO-Nummern. Also z.B. digitalRead(16) für das Lesen des GPIO16 Pins. Alles andere sind Erläuterungen zu der Standard-Funktionalität der Pins.
P.S. hast Du auch den entsprechenden Core installiert?

leg dir einfach Konstanten für deine Pins an,
sprechend wie du sie brauchst.

z.b. ein

constexpr byte sensorAPin = 26;
constexpr byte ledRedPin = 19;

und in deinem Code verwendest dann nur sensorAPin und ledRedPin.
erstens hast dann alle deine Pins sauber im Kopf von deinem Programm übersichtlich zusammen und zweitens tust du dich leichter, wenn du mal von 19 auf z.B. 23 ändern willst, da die Änderung nur an einer Stelle gemacht werden muss.

Nimm ruhig die "Zahlen" der (GP)IOs aus deiner Zeichnung. Die Dx / Ax Varianten kommen wiederum aus einer Datei in deinem ESP-Core Verzeichnis und können je nach gewählten ESP32 Board unterschiedlich definiert sein (siehe die ganzen Dateien pins_arduino.h).
Also wenn du nicht 100%ig weist welches Board im ESP-Core gewählt werden muss (und wie die die Pins dort alle definiert sind) nimm die IOs...

Aber Achtung, das von dir gezeigte Pinout ist falsch. Die Pins RX und TX, sowie SCL und SDA sind falsch beschriftet.

Dies ist die richtige Darstellung.

2 Likes

Bei einem "Mini" kann es schon zu Einschränkungen kommen, allerdings zähle ich 26 nutzbare GPIOs, manche aber nur Eingänge, siehe ESP32 Pinout Reference: Which GPIO pins should you use?.

Bei meinen ersten Versuchen mit einem ESP32 habe ich ein Blinkprogramm nacheinender mit mehreren Pins verbunden und mit einer LED mit Vorwiderstand meinen Erfolg geprüft.

Also ich fasse einmal zusammen.

Ich kann bei diesem Board einfach die Nummern vom Board als Pin Definition verwenden?

Weil dort auf dem Board steht zB IO18. Ich nehme an das soll dann für GIPO stehen? Heißt aber trotzdem ich kann int pin18=18 auch genauso deklariert? Hab ich das so richtig verstanden? Hier mal noch ein Foto von der Boardbeschriftung.

Gibt es beim ESP32 im Gegensatz zum UNO oder Nano irgendwas zu beachten? In der Programmierung etc? Ich habe in der Arduino IDE bereits das Board hinzugefügt. So das es in der Board verwaltung auswählbar ist.

Ja, deine Pin Definition ist richtig. Und der ESP32 ist ein komplett anderer Controller als der UNO, somit gibt es def. Unterschiede die zu beachten sind.

Bedenke, dass dieses Board 2-reihige Anschlüsse hat. Die inneren sind zur besseren Darstellung nach oben verschoben ( mit den gestrichelten Linien, und da entspricht IO18 wieder GPIO18.
Es gibt keinen Pin wo das unterschiedlich wäre- IOxx == GPIOxx

Ja ;(
Hatte ich gemerkt - sorry.

cooles Modul kompakter Formfaktor und viele IO-Pins.

Für alle ESP32-basierten Boards - egal wie die boards aussehen - muss man eine zusätzliche Board-Definition in der Arduino-IDE installieren.
Hier ist eine Anleitung dazu

Manche der Boards können automatisiert flashen = ohne drücken der "Flash"-Taste, manche können das nicht. Da dieses Modul gar keine Flash-Taste hat kann man mutmaßen, dass es ohne geht. Hast du das schon getestet?

vgs

"können" ja. Aber was bringt es einer Variable pin18 den Wert 18 zuzuweisen?

ich rate dir - wie schon in der Antwort #3

  • nimm sprechende Bezeichner,
  • mach sie byte (nicht int) und
  • mach aus Variablen Konstanten (constexpr).

Hallo nochmal.

Getestest habe ich mit dem Board noch nichts. Ich habe zunächst erstmal die PinSteckplätze festgelötet. Die sind leider nicht von Haus aus drauf. Aber das hat soweit ich das beurteilen kann gut funktioniert.

Eine Boarddefinition habe ich mir schon installiert. Ich meine sogar über den selben Link. Ich weiß nur noch nicht, welche ich jetzt auswählen muss, damit ich den richtigen erwische.

grafik

Und einige mehr Boards zur Auwahl, die eher von der Bezeichnung weniger zutreffen.

Ein weitere Punkt wäre folgender:

Ab wann muss ich eine externe Spannungsquelle verwenden, um Sensoren etc anzuschließen?

Ich habe grade den ersten Sketch drauf gepackt und direkt mal die Kapazitativen Touch Sensoren getestet.

Wirklich super so eine simple Anbindung. Endlich mal problemlos ein Kabel als Button nutzen können um funktionen zu prüfen. Funktioniert hervorragend das Hochladen und ich muss garnichts drücken oder machen. Hier kein Unterschied zwischen zum UNO.

Aber eins kann ich sagen. Im Vergleich ist das Ding wirklich schnell. Ich muss mal versuchen mein aktuelles Projekt auf dieses Board umzuschreiben.

Also was muss ich dabei jetzt beachten?

Die Variablen zum Deklarieren von einem PIN muss ich wie folgt ändern?

const int touchPin = 4;

Oder warum als byte? Unterschied? Nutzen?

Warum als Konstante? Damit nicht die Gefahr besteht, das ein Programmbestandteil mal einen Pin ändert und damit einen Kurzschluss verursacht?

Normale integer Variablen denen entsprechende Werte zugeordnet werden können aber ganz normal verwendet werden oder?

byte ... ... google nach "Datentypen c++". Kurz: byte ist ein byte lang, int ist am Arduino Uno zwei byte lang und am ESP 4 byte. Du hast aber keinen Controller mit mehr als 255 pins, daher reicht byte.

const ... weil sich dein Pin nie ändert. Const verhindert dass du den wert irrtümlich im Programm veränderst. es kann den Compiler helfen, den Code weiter zu optimieren. Außerdem habe ich dir zu constexpr geraten. Google nach "const vs constexpr c++"

am ESP32 kannst du auch weiterhin eine Integer Variable verwenden - wenn du so eine große Variable überhaupt brauchst, siehe dazu wieder "Datentypen c++"

Da es immer der gleiche Chip ESP32 ist, wird man ein "falsch" eingestelltes Board erst mal nicht gar bemerken solane es ein ESP32-board ist.

Die Unterschiede liegen dann in den Feinheiten welches Board hat welche IO-pins herausgeführt und was für eine IO-Pin-Bezeichnung wird dafür verwendet.
Bei manchen Boards sind dann Konstanten wie "D0", "D1", "D2" usw. definiert sein bei anderen nicht.

Und für speziellere Boards ist dann in der Board-Definition vermutlich voreingestellt
wie groß der Flash-ROM-Speicher ist und ob es evtl. PSRAM gibt oder nicht.
Das kann man aber auch von Hand im Menü anpassen.

Ich benutze immer ESP32 devkit und die wirklichen GPIO-nummern und hatte damit keinerlei Probleme.

vgs

Wenn man const oder constexpr benutzt, wird der Compiler dafür MEIST gar keinen RAM-Speicherplatz verwenden müssen.
Und er weiß, welchen Wert sie immer haben wird. (Ob nun byte , int oder long wird ihm dann übrigens egal sein).

Auch dass man selber gehindert wird, Unsinn zu programmieren, sollte man unterstützen.

Hm gut. Hab ich auch mal nachgegooglet. Den konkreten unterschied zwischen constexpr und const habe ich dadurch zwar immer noch nicht richtig verstanden. Aber ich nehme das erstmal so hin.

Eine Frage bezüglich der Nutzbarkeit der Pins habe ich dennoch.

Im Pinout sind ja mit Farben gekennzeichnet, welche Pins wann verwendet werden können... Für Hellgrün ist mir das klar. Immer. Für Dunkelgrün bedeutet es was? Als Beispiel die Pins IO18,IO19,IO23,IO5 werden sonst noch verwendet für SPI0:SCK, MISO, MOSI, CS0...

Das sagt mir in irgendeinem Zusammenhang etwas. Ich glaub die Pins werden für eine LCD Anbindung benötigt wenn ich das richtig im Kopf hab. Heißt das, sofern man kein LCD dran anschließt kann man die dunkelgrünen Pins auch für sowohl IN- als auch OUTPUT verwenden? Oder wie genau muss ich dunkelgrün interpretieren?

Grau bedeutet wohl nicht benutzbar. Wobei der TXD und RXD sicherlich gleich funktioniert wie der Pin 0 und 1 beim Uno oder?

ne so einfach ist es nicht.
SPI0:SCK, MISO, MOSI, CS0 sind die IO-pins die üblicherweise für einen SPI-Bus benutzt werden.
Kein SPI-bus => frei verwendbar für alles mögliche.

Der ESP32 beherrscht Pin-mapping. Das heisst man kann vielen (nicht allen!) IO-Pins verschiedene prozessorinterne Hardware-module wie hardware-SPI, hardware-UART usw. zuordnen.
Deshalb die Formulierung "überlicherweise" bezw. default-configuration wenn man das Pin-mapping nicht benutzt sondern nur Spannungsversorgung auf den ESP32 gegeben hat.
Ich habe mit dem pin-mapping noch nix getestet / gemacht.

Die Seite hier enthält recht viel Info dazu

vgs

Gestern Nacht bereits studiert. OK!

Das wär erstmal alles was ich dazu wissen müsste. Jetzt versuche ich mein aktuelles Projekt auf den ESP32 umzusetzen.

Vielen Dank für den Input!