Motorshield soll über ESP32 gesteuert werden

Liebe Forumsmitglieder,
ich hoffe, dieses Thema ist hier richtig und jemand kann mir helfen, bitte.
Folgendes: ich habe einen ESP32 als Webserver programmiert (PC ist via WLAN mit dem ESP verbunden; ein HTML-Programm läuft dann auf dem PC). Dies funktioniert einwandfrei.
Nun soll über diese Verbindung ein Motorshield (Adafruit Motorshied V2) am ESP angeschlossen werden und die wiederum daran angeschlossenen zwei Stepper steuern. Bitte beachten: ohne Arduino UNO o.ä.
Meine Fragen nun: welche Verbindungen vom ESP zum Shield müssen hergestellt werden? Welche Kontakte/Pins kommen in Frage? Sind bereits Beispiele vorhanden?
Vielen Dank im Voraus
Flieger

Warum suchst du nicht selbst ?
Oder ist dein Google defekt.

Z.B. konnte ich dies hier finden.
Ob das alles passt, musst du selbst prüfen.

flieger1990:
ich hoffe, dieses Thema ist hier richtig und jemand kann mir helfen, bitte.

Grundsätzlich nein, da hier ein Arduino-Forum ist, der ESP32 aber kein Arduino ist, sondern auch mittels Arduino-IDE programmiert werden kann. Der Moderator Uwe ist aber freundlicherweise großzügig, was das betrifft.

flieger1990:
Nun soll über diese Verbindung ein Motorshield (Adafruit Motorshied V2) am ESP angeschlossen werden und die wiederum daran angeschlossenen zwei Stepper steuern.

Ich finde das eine umständliche Herangehensweise. ESP hat 3,3 V, das Shield aber 5 V, die zum Shield passenden Bibliotheken werden vermutlich nicht ohne Probleme auf dem ESP laufen ...

Ich halte es für durchaus realisierbar, könnte mir aber einfachere Wege vorstellen.

Darüberhinaus ist nach meinem Mitlesen das Wissen über das Shield in diesem Forum eher eingeschränkt.

Hallo Dieter, hallo agmue,
zuerst einmal vielen Dank für Euren Input; ich hatte bei diesem Thema nicht wirklich damit gerechnet.
@Dieter: selbstverständlich habe ich diese Problematik vorher ausführlich gegoogelt (und nein, diese Suchmaschine ist bei mir nicht kaputt) und ich habe das Gleiche bei GitHub/Adafruit gefunden wie Du auch, aber es passt noch nicht wirklich.
@augmue: dass das Thema hier nicht wirklich reinpasst, habe ich mir ja schon gedacht, aber es gibt zu Arduino einige Schnittmengen und es schadet ja auch nicht, etwas über den Tellerrand zu sehen.
Zum ESP32: das Teil arbeitet (im Gegensatz zum ESP8266) mit 3,3 V und 5 V. Ich betreibe es schon seit Monaten ohne Probleme mit 5 V. Das Shield kann mit 5 - 12 VDC versorgt werden; alles kein Problem.

Nochmal als Zusammenfassung: was ich bisher gemacht habe und auch funktioniert ist folgendes:
das MotorShield arbeitet auf dem Arduino Uno (mit den dazugehörigen Sketches und Bibliotheken von Adafruit) mit 2 Steppern einwandfrei.
Was ebenso einwandfrei funktioniert ist, dass ich ein Befehl vom PC (HTML) an den ESP32 senden kann, der dann wiederum an einen Eingang des Arduino ein Signal gibt, welches die Stepper dann entsprechend des Arduino-Sketches beliebig steuert. Alles kein Problem.
Nun möchte ich eigentlich "nur" den Arduino-Sketch auf den ESP32 verlagern und damit auf den Arduino verzichten. Und da beginnt mein Problem. Da ich das MotorShield ja nicht auf den ESP32 stecken kann, muss ich die Verbindungen anders (mit Kabel) herstellen. Nur wie? Der Sketch im ESP32 muss sicher auch mit dem des Arduino zusammengefügt werden; dies bekomme ich dann aber sicher hin, sobald ich die notwendigen Kontakte kenne.
Ich bin sicher, es gibt Lösungen dafür, aber offensichtlich ist das Thema recht "exotisch" und bisher hat es noch niemand gemacht oder irgendwo gepostet....?
Bitte seid so gut und philosophiert an dieser Stelle nicht über Sinn oder Unsinn meines Vorhabens.
Ich danke Euch.
Gerhard

Ok, dann hast du doch schon mehr gemacht als ich vermutete.
Jedoch, um dir zu helfen, solltest du uns weitere Informationen liefern.

Die Schaltung, wie das Shield mit dem Uno verbunden ist, der Sketch, der bei dir auf dem Uno funktioniert und einen Hyperlink von deinem ESP32.
Sicher gibt es einige, die mit den Informationen dann helfen können.
Agmue hat ja schon geschrieben, worauf zu achten ist.

Als wichtig betrachte ich auch die von dir verwendete Library zum Shield (Hyperlink posten), ob die überhaupt zum ESP32 passt.

flieger1990:
... und es schadet ja auch nicht, etwas über den Tellerrand zu sehen.

Da bin ich ganz Deiner Meinung, weshalb ich beispielsweise auch einen Teensy 3.2 nutze.

Es könnte nur sein, Du findest in einem reinen ESP32-Forum mehr Resonanz.

flieger1990:
Zum ESP32: das Teil arbeitet (im Gegensatz zum ESP8266) mit 3,3 V und 5 V.

Da bin ich anderer Meinung! Ich meine nicht den 5V-Pin nahe dem USB-Anschluß, sondern die GPIOs. Die vertragen 0 bis 3,3 V mit kleiner Toleranz.

Solltest Du einen mir unbekannten ESP32 mit 5V-festen GPIOs haben, dann verlinke bitte das Datenblatt.

Der Teensy 3.2 und 3.5 arbeitet mit 3,3 V, die meisten IOs vertragen auch 5V. Das scheint mir aber in meinem Universum eher die Ausnahme zu sein.

flieger1990:
... sobald ich die notwendigen Kontakte kenne.

Der UNO ist mit dem Treiber PCA9685 nur mittels I2C verbunden. Da der Treiber wohl auch mit 3,3 V arbeitet, dürfte das ganze Shield mit 3,3 V funktionieren. Dann könntest Du auch I2C ohne Levelshifter nutzen.

GND, 3.3 V, SDA und SCL verbinden, mehr ist da nicht.

Da das Shield spezifisch ist, wird vermutlich nur die Bibliothek von Adafruit laufen. Da man ein Shield üblicherweise nur mit UNO und dergleichen verbindet, gibt es keinen Bedarf einer Anpassung an eine andere Hardware. Hier dürfte die Schwierigkeit sein. Das mußt Du probieren, da betrittst Du vermutlich Neuland.

Ok, danke erneut für Euren Input.
ich habe Einiges überprüft: obwohl der ESP32 sowohl mit 3,3 V als auch mit 5 V einwandfrei läuft, ist für die Signalein- und Ausgänge 3,3 V angeraten. Das ist richtig; bei mir funktionieren an den analogen und digitalen Eingängen beide Spannungen. Bisher ist auch im Dauerbetrieb noch nichts kaputt gegangen :slight_smile:
Die Library zum Shield hat Dieter oben bereits erwähnt; genau die, die dort zu finden sind, benutze ich auch:

#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"
Adafruit_MotorShield AFMS = Adafruit_MotorShield();

Hier die Bibliotheken, die ich für den ESP32 verwende:
#include <ESPAsyncWebServer.h>
#include <SPIFFS.h>

Nun habe ich noch dieses Link gefunden:

Unter Step 7 findet man ein Beispiel, bei dem eine LED mittels PWF angesteuert wird bzw. unter Step 8 ein Servo. Da nach meinem Kenntnisstand auch Arduino das MotorShield mittels PWF steuert (bzw. die Bibliothek), werde ich dies mal weiterverfolgen. Auch I2C werde ich weiterverfolgen.
Falls noch jemand eine Idee hat, bitte immer gerne.
Vielen Dank erst einmal
Gerhard

Hallo,

warum liest Du nicht mal was auf der Seite zu finden ist. link. Demnach ist die Schnittstelle I2c.

Auf dem Board sollen Jumper sein um die Schnittstelle auch auf 3,3V umstellen zu können.

Fraglich ist ob die libs zum Board auf einem ESP32 laufen, aber das wurde Dir hier bereits gesagt.

Heinz

flieger1990:
Bisher ist auch im Dauerbetrieb noch nichts kaputt gegangen :slight_smile:

Du bist ein Glückspils!

Elektronik stirb üblicherweise durch Überhitzung und manchmal mit Verzögerung. Sollte die außerhalb der Spezifikation betriebene Elektronik irgendwann unverständliche Dinge tun, dann schimpfe bitte ausschließlich mit dem Typen, den Du im Spiegel siehst!

Ich habe die Bibliothek mal geladen und erstaunlicherweise konnte ich ein Beispiel für den ESP32 kompilieren. Funktion kann ich mangels Hardware aber nicht testen.

Hallo, liebe Forumsmitglieder,
zuerst einmal vielen Dank an alle, die sich hier eingebracht und mich auf die richtige Spur geführt haben.
Was habe ich erreicht? Nun, zuerst habe ich alles sicherheitshalber und komplett auf 3,3 V umgestellt; auch auf dem MotorShield.
Dann habe ich einen I2C-Scanner laufen lassen; zuerst versuchsweise auf dem UNO (wo mir dann auch das angeschlossene MotorShield angezeigt wurde), dann den gleichen Sketch auf den ESP32. Nach anfänglichen Schwierigkeiten, die richtigen Pins zu finden, hat dieser dann ebenfalls das MotorShield erkannt.
Hier noch die Ergänzung im Sketch:

#include <Wire.h> //für I2C-Schnittstelle des ESP, ohne Gewähr, dass es bei anderen Dev Modulen auch funktioniert

#define SDA 21
#define SCL 22

und im Setup natürlich:
Wire.begin(SDA, SCL);

Also, alles funktioniert nun einwandfrei und mein Problem existiert damit nicht mehr. Nun kann ich über das erwähnte HTML-Programm wie eingangs erwähnt, die Stepper-Motoren steuern.
Falls jemand Interesse am Code hat, bitte hier melden.
Nochmals vielen, vielen Dank
Gerhard

Hi

Es wäre alleine für zukünftige HTML-und-Arduino-Bastler bestimmt ein Leckerbissen, wenn Dein Sketch hier zum Abgreifen bereits rumliegt.
Oder wirst Du eine Anfrage in zwei Jahren oder so mit dem jetzigen Sketch beantworten können?
In 6 Jahren?

MfG

flieger1990:
und im Setup natürlich:
Wire.begin(SDA, SCL);

Da Du die Standard-Pins verwendest, sollte es auch ohne gehen. Wäre einen Versuch wert.

Moin, liebe Helfer,
danke für Euer Interesse.
Ich habe alle Programme zur Übersichtlichkeit stark abgespeckt und hier angehängt.
Ich denke, die Vorgehensweise mit den Uploads zum ESP, Herstellen der WLAN-Verbindung und Aufruf im Browser (mit 192.168.4.1/html) sind klar, oder? Ihr müsst bitte im Forumsdemo.ino Code für die WLAN-Verbindung Eure SSID und Euer Password vor dem Hochladen zum ESP einsetzen.
Den HTML-Code habe ich als Textdatei angehängt (bitte nicht vergessen: dies gehört in das data-Verzeichnis); HTML selbst scheint nicht erlaubt..?? Die beiden Background-Worker habe ich mir geschenkt; sonst bitte anfragen.
Falls Fragen sind, bitte gerne hier wieder melden.
Nochmals vielen Dank
Gerhard

Forumsdemo.ino (4.33 KB)

Forumsdemo.txt (10.3 KB)

Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *). So ist er auch auf portablen Geräten lesbar.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

ich hatte alle Codes hier bereits eingebaut, bekam aber beim posten die Fehlermeldung, dass die erlaubten 9000 Charakter-Länge überschritten sei.
@Tommy, sei doch so gut und mach mal selbst; ich bin sowieso nicht sicher, ob ich Dich richtig verstanden habe und es richtig machen würde.
Es ist sicher kein Problem, aus den Attachments von gestern den Code zu extrahieren bzw. als HTML zu speichern.
Danke
Gerhard

Da ich vom Code gesprochen habe, war damit natürlich der Sketch gemeint.
Den HTML-Teil kannst Du als Anhang lassen oder in einen anderen Beitrag setzen.

Warum sollte ich das tun?

Gruß Tommy

Hi

Da die .ino-Datei knappt 4kB hat - sollten darin ungefähr 4000 Zeichen enthalten sein - das Gleiche kannst Du noch an Text dabei packen und Es passt trotzdem in den Post.

MfG

Edit
Die delay() sollen hier WAS bringen?
Den Bezeichnungen nach: Du steuerst Ventile für Sauerstoff und 'Was brennbares' per Stepper?
Ohne IST-Wert wäre mir Das ... 'unangenehm'
Also ClosedLoop

ok, hier der .ino Sketch.
Bitte beachten, dass ich sowohl diesen Sketch als auch den HTML-Code stark eingekürzt habe, damit er übersichtlich bleibt; Abschnitte, die für das Verständnis nicht notwendig sind, habe ich entfernt. Es sind aber sicher noch Codezeilen enthalten, die wohl verwirren, ebenso Variablennamen.
@Postmaster: Du hast recht, ich steuere damit Verbrennungsvorgänge. Es ist auf jeden Fall viel Sicherheit vorhanden, auch wenn hier nicht sichtbar.
Das eigentliche Anliegen war ja ursprünglich, ein MotorShield von einem ESP32 anzusteuern und das ist (nun mit I2C) erreicht; und genau dies, und ein wenig mehr, geht ja daraus hervor.
Natürlich kann man allen Code weiter kritisieren, muss aber an dieser Stelle nicht sein....
Den HTML-Code lasse ich in der Textdatei wie er ist.
Weitere Fragen kann ich dann Mitte Januar wieder beantworten, oder in 2 Jahren oder in 6 Jahren.
Nochmals danke an Euch allen und frohe Weihnachten. Ich bin dann erst einmal mal weg :slight_smile:
Gerhard

#include <ESPAsyncWebServer.h>
#include <SPIFFS.h>
#include <WiFi.h>
#include "DHT.h"

//Sensorik für Envi-Parameter
#define DHTPIN 23  
#define DHTTYPE DHT11 
DHT dht(DHTPIN, DHTTYPE);

#include <Wire.h>     //für I2C-Schnittstelle des ESP
#define SDA 21        //sind auch die Voreinstellungen
#define SCL 22

#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"

Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 
//Adafruit_MotorShield AFMS(0x60);          //Einstellung überflüssig, da I2C-Adressvoreinstellung
Adafruit_StepperMotor *FuelValveStepper = AFMS.getStepper(200, 1);
Adafruit_StepperMotor *OxValve2Stepper = AFMS.getStepper(200, 2);

int schritte=100;   

int CoolerrelaisPin = 15;

boolean FuelValveOffen = true;  
boolean OxValve2Offen = true;

float EnviTemp;
float EnviHum;

const char* ssid     = "yourSSID";
const char* password = "yourPassword";

//--für die Kommunikation mit dem Client---------------------------------------
AsyncWebServer server(80);
AsyncWebSocket ws("/ws");
AsyncWebSocketClient * globalClient = NULL;
 
void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len){
  if(type == WS_EVT_CONNECT){
    globalClient = client;
  }
  else if(type == WS_EVT_DISCONNECT){
    globalClient = NULL;
  }
  else if(type == WS_EVT_DATA){
    String Clientstring = "";
    for(int i=0; i < len; i++) {
      Clientstring = Clientstring + ((char) data[i]);
    }

    if (Clientstring.startsWith("CPR")) {
      CoolerpumprelaisSchalten(Clientstring);
    }
    
    if (Clientstring == "CVoeffnen") {
      driveStepper(true);
    }
    
    if (Clientstring == "CVschliessen") {
      driveStepper(false);     
    }
  }
}

//Function------------------------------------------------------

void driveStepper(boolean oeffnen)  {     //die beiden Ventile werden von den Steppermotoren geöffnet bzw. geschlossen
  if (oeffnen) {
    FuelValveStepper->step(schritte, FORWARD);  
    OxValve2Stepper->step(schritte, FORWARD);    
  }
  else  {
    FuelValveStepper->step(schritte, BACKWARD);
    OxValve2Stepper->step(schritte, BACKWARD);    
  }
  
  FuelValveStepper->release();
  OxValve2Stepper->release();  
  
  FuelValveOffen = oeffnen;  
  OxValve2Offen = oeffnen;     
  
  globalClient->text("FV" + String(FuelValveOffen));  
  globalClient->text("OV2" + String(OxValve2Offen));  
  delay(500);
}

void CoolerpumprelaisSchalten(String CoolerpumprelaisStat) {
  if(globalClient != NULL && globalClient->status() == WS_CONNECTED){
    if (CoolerpumprelaisStat == "CPROn") {
      digitalWrite(CoolerrelaisPin, LOW);  //inverse Input-Pins am Relais-Modul
    }
    if (CoolerpumprelaisStat == "CPROff") { 
      digitalWrite(CoolerrelaisPin, HIGH);  
    }
  }
}

void setup()  {
  pinMode(CoolerrelaisPin, OUTPUT);

  Wire.begin(SDA, SCL);     //auch Wire.begin() ok, da Voreinstellung
  
  AFMS.begin();   // create with the default frequency 1.6KHz AFMS.begin(1000); OR with a different frequency, say 1KHz
  FuelValveStepper->setSpeed(200);         //rpm  
  OxValve2Stepper->setSpeed(200);         //rpm  
  
  Serial.begin(115200);
  SetAPandConnectToWifi();
  dht.begin();

  if(!SPIFFS.begin()){
    return;
  }

  ws.onEvent(onWsEvent);
  server.addHandler(&ws);
  
  server.on("/html", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/Forumsdemo.html", "text/html");
  });

// 2 Backgroundworker:
  server.on("/Counter.js", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/Counter.js", "text/javascript");
  });

  server.on("/datetime.js", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/datetime.js", "text/javascript");
  });
  
  beginServer();
  digitalWrite(CoolerrelaisPin, HIGH);    //Ausgangszustand
}

void loop() {
  if(globalClient != NULL && globalClient->status() == WS_CONNECTED){
    EnviTemp = dht.readTemperature();     
    globalClient->text("T1" + String(EnviTemp));
    delay(100);
    EnviHum = dht.readHumidity();
    globalClient->text("H1" + String(EnviHum));
 }
  delay(500);
}

void SetAPandConnectToWifi()   {
  WiFi.enableSTA(true);
  WiFi.softAP(ssid, password, 2, 0);
}

void beginServer()  {
  server.begin();
}
1 Like