Heute gibt es eine besondere Variante des ESP32, nämlich den ESP32-Mini. Dieses Board zeichnet sich dadurch aus, dass es pinkompatibel zum D1-Mini ist. Das heißt es können Shields für den D1-Mini problemlos genutzt werden .
Die Pins mit der weißen Umrandung sind jene, die mit dem D1-Mini kompatibel sind. Bestückt man diese mit den beiliegenden kombinierten Stift- und Federleisten, so kann man den ESP32-Mini auch auf dem Dual-Base Shield verwenden.
Das Board hat aber noch zwei zusätzliche Pin-Reihen, damit möglichst viele der GPIOs des ESP32 nutzbar sind. Hier das komplette Pinout.
Im heutigen Projekt wollen wir mit dem ESP32-Mini und einem 0,66 Zoll OLED Display Shield einen kleinen, kompakten I2C Scanner realisieren. Die Verdrahtung ist dabei sehr einfach, da das Display nur auf den ESP32-Mini aufgesteckt werden muss. Wir bestücken das ESP32 Board mit den vier zehnpoligen Federleisten. Auf die beiden innenliegenden Federleisten stecken wir das Display-Shield wobei die zwei Pins in Richtung zum USB-Stecker frei bleiben.
Für den zu untersuchenden I2C-Bus wäre es schön, wenn die benötigten Pins so nebeneinander liegen, dass man das I2C Modul einfach aufstecken kann. Das lässt sich einfach realisieren, wenn man das I2C Modul über GPIO-Pins versorgt. Einzige Einschränkung bei dieser Methode, das Modul darf nicht mehr als 30 mA benötigen, was bei allen Sensormodulen sicher der Fall ist.
Wir werden die Pins GPIO27, GPIO25, GPIO32 und GPIO12 auf der rechten, äußeren Federleiste dafür benutzen.
- GPIO27 = Vcc 3.3V
- GPIO25 = GND 0V
- GPIO32 = SCL
- GPIO12 = SDA
Das ist die typische Pinbelegung der meisten Module mit I2C-Bus.
Das Bild zeigt den ESP32-Mini mit aufgestecktem Display und einem BMP180 Sensormodul.
Dieser Aufbau hat aber noch einen kleinen Nachteil. Es gibt auch Sensormodule, bei denen zwar die Pinbelegung übereinstimmt, die aber noch weitere Pins haben. Diese Pins sollten aber nicht mit den benachbarten Pins auf der ESP32 Federleiste verbunden werden. Außerdem kann man das Testmodul nicht mehr einfach einstecken, wenn der Scanner in ein Gehäuse eingebaut werden soll. Die Lösung ist eine vierpolige Verlängerung für die Testpins.
Diese Verlängerung fertigen wir uns aus einer der beiden beiliegenden, kombinierten Stift- und Federleisten an. Wir schneiden sie so ab, dass vier Pins übrigbleiben. Diese Verlängerung stecken wir auf die Testpins. Jetzt liegen zusätzliche Pins der Sensormodule einfach außerhalb der Federleiste. Beim Einbau in ein Gehäuse stehen die Testpins gut erreichbar aus dem Gehäuse heraus.
Das Programm ist sehr einfach. Zum Scannen wird nacheinander mit allen 127 I2C Adressen ein Verbindungsaufbau versucht. Ist die Verbindung erfolgreich, so wird die entsprechende Adresse am Display angezeigt. Die Messung wird für verschiedene Busgeschwindigkeiten durchgeführt.
- 100kHz Standard I2C
- 400kHz Fast I2C
- 1 MHz Fast Plus I2C
- 4 MHz High Speed I2C
Zur Kompilierung benötigen wir das ESP32 Package und die Bibliotheken Adafruit_GFX.h und Adafruit_SSD1306.h für das Display
#include<Wire.h> //I2C Bibliothek im Package enthalten
#include <Adafruit_GFX.h> //Allgemeine Grafik Bibliothek
#include <Adafruit_SSD1306.h> //Bibliothek für den verwendeten Display Treiber
#define SDA1 21 //Daten Pin für den ersten I2C Bus für das Display
#define SCL1 22 //Takt Pin für den ersten I2C Bus für das Display
#define SDA2 12 //Daten Pin für den zweiten I2C Bus verwendet als Testbus
#define SCL2 32 //Takt Pin für den zweiten I2C Bus verwendet als Testbus
#define MVIN 27 //Pin für die Stromversorgubg immer auf HIGH
#define MGND 25 //Pin für GND immer auf LOW
#define X0 32 //Das Display hat nur 64 Pixel in der Breite, der SSD1306 kann aber nur mindestens
//96 Pixel richtig verarbeiten, wobei sich die übrigen 32 Pixel am linken Rand
//befinden. Alle Ausgaben auf das Display haben daher einen Offset von 32 Pixeln
//Instanzen für die beiden I2C Busse
TwoWire I2Ca = TwoWire(0);
TwoWire I2Cb = TwoWire(1);
//Instanz für das Display die Parameter sind
//Display-Breite, Display-Höhe und Adresse der I2C Bus Instanz
Adafruit_SSD1306 display(96,48,&I2Ca);
//Bufferspeicher für die gefundenen Adressen
//"--" bedeutet keine Adresse gefunden
char adresse[4][3] = {"--","--","--","--"};
//Ein Scan mit einer bestimmten Frequenz wird durchgeführt
//Der Parameter step gibt die Nummer der Messung an
void scan(uint32_t frequency, uint8_t step) {
bool error = false;
bool found = false;
I2Cb.setClock(frequency); //I2C Busfrequenz setzen
for(int i=1; i<128; i++){
I2Cb.beginTransmission(i); //I2C Übertragung starten
error = I2Cb.endTransmission(); //Beim Beenden prüfen wir auf Fehler
if(error == 0){ //War kein Fehler aufgetreten, merken wir uns die Adresse
sprintf(adresse[step],"%02x",i);//Adresse als zweistellige HEX Zahl speichern
found=true;
}
}
if (!found) {
strcpy(adresse[step],"--"); //es wurde keine funktionierende Adresse gefunden
}
}
//Die gefundenen Adressen in der zweiten Spalte des Displays anzeigen
void displayResult(){
for (uint8_t i = 0;i<4; i++){
display.fillRect(X0+45,8*i+16,12,8,BLACK); //Zuerst einen alten Wert löschen
display.setCursor(X0+45,16+i*8); //Cursor setzen X=45 und Y ab Zeile 3 daher + 16
display.print(adresse[i]); //Daten aus dem Bufferspeicher ausgeben
}
display.display(); //Display aktualisieren
}
void setup() {
Serial.begin(115200);
//Pins für die Stromversorgung des Testmodul
pinMode(MVIN,OUTPUT);
pinMode(MGND,OUTPUT);
digitalWrite(MVIN,1);
digitalWrite(MGND,0);
//Beide i2C Busse initialisieren
I2Ca.begin(SDA1,SCL1,400000);
I2Cb.begin(SDA2,SCL2,400000);
//Display initialisieren
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
//Leeres Formular anzeigen
display.ssd1306_command(218);
display.ssd1306_command(18);
display.clearDisplay();
display.setFont(NULL);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setTextWrap(0);
display.setCursor(X0+8,2);
display.print("I2C-Scan");
display.setCursor(X0,16);
display.print("100kHz");
display.setCursor(X0,24);
display.print("400kHz");
display.setCursor(X0,32);
display.print("1.0MHz");
display.setCursor(X0,40);
display.print("3.4MHz");
display.display();
}
void loop() {
//Scans für die verschiedenen Frequenzen durchführen
scan(100000,0);
scan(400000,1);
scan(1000000,2);
scan(3400000,3);
//Ergebnis anzeigen
displayResult();
//1s warten
delay(1000);
}
Und so sieht unser I2C-Scanner in einem Gehäuse aus:
Viel Spaß beim Nachbauen.
Hier die Links zu dem Sketch und den 3D-Druckdateien Unterteil / Oberteil.
15 Reacties
Eric McLean
Das Problem mit dem “Nicht bootenden Board” liegt an einem Kontruktionsfehler. Das Board kann theoretisch nur per USB gestartet werden. Dies liegt an dem Fakt, dass IO 0, der beim normalen Booten HIGH sein muss nur durch einen Transistor auf 3,3V gezogen wird. Dieser Transistor wird durch den USB-UART Controller geschaltet. Dieser läuft nicht bei Versorgung über VCC oder 3V3, da es eine Diode in Sperrichtung von VCC nach USB + gibt.
Andreas Wolter
@Rainer Rebhan: unabhängig von diesem Bord ist es immer ratsam, eine höhere Spannung an die VCCs anzulegen, wenn ein Spannungsregler verbaut ist. Denn der möchte 5V erzeugen. Oft funktioniert das eben nicht, wenn 5V reingehen. Somit ist meine Aussage schon korrekt.
Die Frage ist nun, warum es in Ihrem Fall nicht funktioniert. Ich habe etwas recherchiert und es scheint öfter das Problem mit diesen Entwicklungsboards zu geben.
Es hängt davon ab, was Sie für ein Netzteil verwenden. Es gibt Steckernetzteile, die keine Saubere Welle erzeugen. Dazu gibt es dann noch Probleme, wenn WiFi aktiviert ist. Möglichweise ist dann auch die Belastung zu hoch, wenn wie in diesem Projekt ein Display angeschlossen ist. Dann sollten es mehr als 8V sein und auch genug Strom.
Als Lösungsvorschläge hätte ich da nur:
anderes Netzteil,
höhere Spannung an 5V VCC (Max 12V)
3,3V Pin verwenden (mit 3,3V!)
nur den Blink Sketch ohne WiFi und ohne weitere Hardware testen
Workarounds wären entweder den USB-Port zu verwenden. Über ein Steckernetzteil oder ein aufgetrenntes USB-Kabel an ein anderes Netzteil mit 5V Spannug am Ausgang. Man könnte auch auf die Pads der USB-Buchse löten.
Ich kann nicht genau sagen, warum diese Boards das Problem haben. Meistens liegt das scheinbar an den Spannungsreglern, die darauf verbaut sind.
Grüße,
Andreas Wolter
AZ-Delivery Blog
Rainer Rebhan
> Ext. Versorgungsspannung am +5V Pin.
Hallo Hr. Wolter,
meine Frage zur ext. Spannungsversorgung am +5V Pin des ESP32 Mini wurde von ihnen bereits öfters beantwortet. Jedoch ist ihre Aussage “bei einer etwas höheren Spannungsvers. ca. 6-9V” dann funktioniert der Betrieb über eine ext. Spannung nicht zutreffend. Ich habe letzte Woche bei AZ-D 3 ESP32 D1 Mini bestellt und erhalten und muß diese über eine externe Spannungsversorgung betreiben. Leider funktioniert keines der ESP32 Module bei +8V am VCC Pin der Module. Eine Versorgung über die USB-Buchse ist nicht möglich.
Haben sie eine Lösung?
Viele Grüße Rainer Rebhan
Andreas Wolter
@Erwin: auf die GPIO-Pins sollte generell keine Spannung gelegt werden. Sie liefern 3,3V. Am 5V-Pin ist auf dem Entwicklungsboard ein Spannungsregler verbaut. Dort sollte man eine Spannung zwischen 6V und 12V anlegen. Der Spannungsregler erzeugt dann daraus 5V bzw. 3,3V.
Grüße,
Andreas Wolter
AZ-Delivery Blog
Erwin
in der Anleitung von Ihnen steht, daß auf allen Pins nie mehr als 3,3 Volt angelegt werden dürfen. Wieso jetzt auf de 5v Pin bis zu 12 Volt?
Danke für Erklärung
Andreas Wolter
@Ineichen: der VIN auf dem Board ist ein geregelter Eingang und braucht daher mehr als 5V. Ich würde es mit 9V versuchen. Das ist auf vielen Boards gleich und eigentlich kein Problem. Man könnte auch über den USB-Eingang gehen, wenn man nur 5V zur Verfügung hat. Dann wäre ein Adapter notwendig.
Grüße,
Andreas Wolter
AZ-Delivery Blog
Ineichen
Hallo zusammen
Hat den jemand das Problem gelöst mit den VIN. Das Bord läuft nicht mit angelegten geregelten 5VOLT. Über den usb Anschluß kein Problem.
Gruss bruno und danke für Hilfe.
Andreas Wolter
@Marc: ich bedauere, aber 3D-Vorlagen der Module bietet AZ derzeit nicht an.
Grüße,
Andreas Wolter
AZ-Delivery Blog
Marc
Guten Tag, ich suche für den ESP32 Mini die CAD Files, damit ich ihn in Fusion360 importieren kann und so z.B. für das Design von Gehäusen die richtigen Maße habe. Andere Hersteller (z.B. adafruit) bieten diese auch auf Github an. Leider Ist ihr Repo leer.
Stelle sie die *.f3s, *.stl sowie *.step zur Verfügung?
Danke für eine Rückmeldung.
Andreas Wolter
@Thomas Wolter: ich vermute, dass die Spannung (oder der Strom) noch nicht ausreicht. Unbedingt darauf achten, dass der 5V-Pin und nicht der 3.3V-Pin verwendet wird. Siehe eines meiner älteren Kommentare.
Grüße,
Andreas Wolter
Thomas Wolter
Hallo Zusammen
Habe das selbe Problem, das über USB das Board läuft und über den VCC anschluß mit externem Netzteil (gibt 5,5V raus) nicht läuft.
Hat da einer eine Lösung für.
VG
Thomas
Andreas Wolter
@Marco Roll: versuchen Sie bitte meine Lösung aus dem Kommentar direkt darüber. Der Vin eines ESP32 ist regulated. Also müssen mehr als 5V anliegen. Im günstigsten Fall 6V-7V. Meistens werden 9V genutzt (z.B. 9V Block), maximal 12V.
Marco Roll
Ich habe das selbe Problem wie Fabio Tensi beschreibt.
Über USB lassen sich die Boards problemlos betreiben, mit 5V am VCC tut sich nichts.
Grüße
Marco
Andreas Wolter
@Fabio Tensi:
You can power the board in three different ways: via USB port, via Vin 5V pin (unregulated), via Vin 3.3V (regulated).
If you want to use the 5V Vin pin, you should apply a voltage between 5V and 12V. The higher the voltage, the warmer the voltage regulator becomes. Therefore, 9V is often used.
If the 3.3V Vin Pin is used, the 3.3V should not be exceeded. Also, avoid using multiple voltage sources at the same time.
Fabio Tensi
Hi I bought 3 x D1 mini esp-32, all 3 work correctly when I use the usb port, when I use the 5V power supply connected to the VCC PIN (+ 5V),it does not boot.
I have tried with the D1-mini and the D1-mini-pro which are currently working.
Can you help me ?
Thank you.
Fabio Tensi