ESP8266 MotorShield

Hallo zusammen, habe folgendes Problem:

  • ESP8266
  • MotorShield (Erweiterungsplatine)
  • 4x IR Sensor (lm393)
  • 2x Servo (SG90)
  • 2x DC Motoren
  • 1X PCF8574
  • 1X Adafruit 16-Kanal (PCA9685)

Habe einen Pan/Tilt versucht zusammen zu stellen funktioniert ohne probleme, wenn das ganze in einen WebServer eingepflegt wird reagieren die sensoren nicht .
So klappt es.

#include "PCF8574.h"
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
PCF8574 pcf8574(0x20,D6,D5);

#define SERVOMIN 1100
#define SERVOMAX 3000

void setup()
{
  Serial.begin(115200);
  pcf8574.pinMode(0, INPUT_PULLUP);
  pcf8574.pinMode(1, INPUT_PULLUP);
  pcf8574.pinMode(2, INPUT_PULLUP);
  pcf8574.pinMode(3, INPUT_PULLUP); 
  pcf8574.begin(); 
  Wire.begin(D6,D5);
  pwm.begin();
  pwm.setPWMFreq(50); 
}

void loop()
{
  int posA = 40;
  int posB = 60;
  int statusSensor_O = pcf8574.digitalRead(0);
  int statusSensor_U = pcf8574.digitalRead(1);
  int statusSensor_R = pcf8574.digitalRead(2);
  int statusSensor_L = pcf8574.digitalRead(3);
  int stepsize = 2;
  if (statusSensor_O == 0){
    Serial.println("Oben") ;
    posA = posA + stepsize;
    pwm.setPWM(4, 0, pulseWidth(posA));
    delay(30);
    if (posA > 150){
      posA = 150;
    }
  }
  if (statusSensor_U == 0){
    Serial.println("Unten") ;
    posA = posA - stepsize;
    pwm.setPWM(4, 0, pulseWidth(posA));
    delay(30);
    if (posA < 40){
      posA = 40;
    }
  }
  
  if (statusSensor_L == 0){
    Serial.println("Links") ;
    posB = posB + stepsize;
    pwm.setPWM(2, 0, pulseWidth(posB));
    delay(30);
    if (posB > 120){
      posB = 120;     
    }
  }
  
  if (statusSensor_R == 0){
    Serial.println("Rechts") ;
    posB = posB - stepsize;
    pwm.setPWM(2, 0, pulseWidth(posB));
    delay(30);
    if (posB < 10) {
      posB = 10;        
    }
  } 
}

int pulseWidth(int angle){  
  int pulse_wide, analog_value;
  pulse_wide   = map(angle, 0, 180, SERVOMIN, SERVOMAX);
  analog_value = int(float(pulse_wide) / 1000000 * 50 * 4096);
  return analog_value;
}

So klappt das nicht

#include <ESP8266WiFi.h>
#include "PCF8574.h" 
#include <Wire.h>
#include <math.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
PCF8574 pcf8574(0x20,D6,D5);

#define SERVOMIN 1100
#define SERVOMAX 3000

const char* ssid     = "**********";
const char* password = "**********";
WiFiServer server(80);
String header;
String valueString = String(5);

// Motor A
int PWMA = D1; 
int AIN1 = D3;
// Motor B
int PWMB = D2; 
int BIN1 = D4; 

int rx, ry = 0; 
int leftspeed = 0;
int rightspeed = 0;

void setup() {
  Serial.begin(115200);
  pinMode(PWMA, OUTPUT);
  pinMode(AIN1, OUTPUT);
  pinMode(PWMB, OUTPUT);
  pinMode(BIN1, OUTPUT);
  
  pcf8574.pinMode(0, INPUT_PULLUP);
  pcf8574.pinMode(1, INPUT_PULLUP);
  pcf8574.pinMode(2, INPUT_PULLUP);
  pcf8574.pinMode(3, INPUT_PULLUP); 
  pcf8574.begin();
  Wire.begin(D6, D5);
  pwm.begin();
  pwm.setPWMFreq(50); 

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  server.begin();
}

void loop() {
   client = server.available();
  if (client) {
    String currentLine = "";
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        header += c;
       
        if (c == '\n') {
          if (currentLine.length() == 0) {
            printWebsite();

         if(header.indexOf("GET /Kopf/L") >= 0)
           {
           pwm.setPWM(2, 0, kopfpulseWidth(120));
           }
           else if(header.indexOf("GET /Kopf/R") >= 0)
           {
           pwm.setPWM(2, 0, kopfpulseWidth(10));
           }
           else if(header.indexOf("GET /Kopf/Folgen") >= 0)
           {
           folgen();
           }
           else if (header.indexOf("GET /?M") >= 0) {
           valueString = header.substring(header.indexOf("/?X") + 3, header.indexOf("/X"));
           rx = valueString.toInt();
           valueString = header.substring(header.indexOf("/?Y") + 3, header.indexOf("/Y"));
           ry = valueString.toInt() * -1 ; 
          }
          client.println();
          setMotorsXY(rx, ry);
          break;
          } else { 
          currentLine = "";
         }
        } else if (c != '\r') {  
          currentLine += c;      
      } 
     } 
    } 
    header = "";
    client.stop();
  }
}

void setMotorsXY(int x, int y) {
 double theta = PI / 2; 
  double rightSpeed = 0;
  double leftSpeed = 0;
  if (x != 0) {  
    if (y > 0) {
      theta =  PI - atan2(y, x * (-1));
    } else if (y < 0) {
      theta = 2 * PI + atan2(y, x);
    }
  } else {
    if (y > 0) {
      theta = PI / 2;
    } else {
      theta = 3 * PI / 2;
    }
  }
  double r = sqrt(x * x + y * y) / 100; 

  if (theta < PI / 2) {
    leftSpeed = 100 * r;
    rightSpeed = (200 * (2 * theta) / PI - 100) * r;
  } else if (theta < PI) {
    leftSpeed = (100 - 400 * ((theta / PI) - .5)) * r;
    rightSpeed = 100 * r;
  } else if (theta < 3 * PI / 2) {
    leftSpeed = -100 * r;
    rightSpeed = (100 - 400 * ((theta / PI) - 1)) * r;
  } else if (theta < 2 * PI) {
    rightSpeed = -100 * r;
    leftSpeed = ( 400 * ((theta / PI) - 1.5) - 100) * r;
  }
  setMotors((int)rightSpeed, (int) leftSpeed);
}

void setMotors(int _right, int _left) {
  int rightVal = abs(_right) ;
  int leftVal = abs(_left);

  if (_right > 0) {
  digitalWrite(AIN1, 0);
  analogWrite(PWMA, 1000);
  } else if (_right < 0) {
  digitalWrite(AIN1, 1);
  analogWrite(PWMA, 800);
  } else {
  digitalWrite(AIN1, 0);
  analogWrite(PWMA, 0);
  }
  if (_left > 0) {
  digitalWrite(BIN1, 0);
  analogWrite(PWMB, 1000);
  } else if (_left < 0) {
  digitalWrite(BIN1, 1);
  analogWrite(PWMB, 800);
  }
  else {
  digitalWrite(BIN1, 0);
  analogWrite(PWMB, 0);
  }
}

void folgen(){
  int posA = 40;
  int posB = 60;
  int statusSensor_O = pcf8574.digitalRead(0);
  int statusSensor_U = pcf8574.digitalRead(1);
  int statusSensor_R = pcf8574.digitalRead(2);
  int statusSensor_L = pcf8574.digitalRead(3);
  int stepsize = 2;
  if (statusSensor_O == 0){
    Serial.println("Oben") ;
    posA = posA + stepsize;
    pwm.setPWM(4, 0, pulseWidth(posA));
    delay(30);
    if (posA > 150){
      posA = 150;
    }
  }
  if (statusSensor_U == 0){
    Serial.println("Unten") ;
    posA = posA - stepsize;
    pwm.setPWM(4, 0, pulseWidth(posA));
    delay(30);
    if (posA < 40){
      posA = 40;
    }
  }
  
  if (statusSensor_L == 0){
    Serial.println("Links") ;
    posB = posB + stepsize;
    pwm.setPWM(2, 0, pulseWidth(posB));
    delay(30);
    if (posB > 120){
      posB = 120;     
    }
  }
  
  if (statusSensor_R == 0){
    Serial.println("Rechts") ;
    posB = posB - stepsize;
    pwm.setPWM(2, 0, pulseWidth(posB));
    delay(30);
    if (posB < 10) {
      posB = 10;        
    }
  }   
 }

int pulseWidth(int angle){  
  int pulse_wide, analog_value;
  pulse_wide   = map(angle, 0, 180, SERVOMIN, SERVOMAX);
  analog_value = int(float(pulse_wide) / 1000000 * 50 * 4096);
  return analog_value;
}

Verstehe nicht woran es liegt, hoffe da kann jemand helfen.
Gruss

Noiasca hat dir schon einen Tipp gegeben.

Dein Sketch funktioniert so nicht.
Du musst den PCF8574 per IRQ abfragen, damit dein ESP überhaupt mit bekommt, das da ein Button gedrückt wurde.
Oder was was auch immer am PCF angeschlossen ist.

Ok , das das nicht funktioniert ist ja der grund warum ich nicht weiter komme und hier um hilfe gebeten hab, in wie fern ist "IRQ" abzufragen? Vielleicht einen ansatz wäre sinnvoll dann kann ich mir wenigstens ein bild drüber machen.
das ist die WepPage die ich auf grund der übesrtschrittenen zeichen nicht einfügen konnte

void printWebsite(){
client.println("<html><head><meta charset=\"utf-8\">");
client.println("<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">");
client.println("<script src = \"https://cdn.jsdelivr.net/gh/jeromeetienne/virtualjoystick.js/virtualjoystick.js\"></script>");
client.println("<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js\"></script>");
client.println("<style>");
client.println("body {overflow  : hidden;background-color: #000000;}");
client.println("#container {width: 100%;height: 100%;overflow: hidden;padding:0;margin:0;-webkit-user-select:none;-moz-user-select:none;}");
client.println("#info {position: absolute;top: 0px; width: 100%; padding: 5px;text-align: center;}");
client.println("#info a {color: white;text-decoration: none;}");
client.println("#info a:hover {text-decoration: underline;}");
client.println(".block {display: block;width: fit-content; height:30px;border: none;background-color: #f44336;color: white;display: inline-block;font-size: 15px;cursor: pointer; text-align: center;border-radius: 5px;border: 1px solid #4CAF50;padding: 0px 10px;}");
client.println("</style></head><body>");
client.println("<div id=\"container\"></div>");
client.println("<div id=\"info\">");
client.println("<a>WEB Test</a>");
client.println("
");
client.println("
");
client.println("<a href=\"/KOPF=L\"><button class=\"block\">L</button></a>");
client.println("<a href=\"/KOPF=R\"><button class=\"block\">R</button></a>
");
client.println("<a href=\"/Kopf/Folgen\"><button class=\"block\">Folgen</button></a>
");
client.println("<p>");
client.println("<span id=\"result\"></span></div> <script>");
client.println("console.log(\"touchscreen is\", VirtualJoystick.touchScreenAvailable() ? \"available\" : \"not available\");");
client.println("var joystick  = new VirtualJoystick({");
client.println("container : document.getElementById('container'),");
client.println("mouseSupport  : true,");
client.println("limitStickTravel : true,");
client.println("stickRadius : 100");
client.println("});");
client.println("joystick.addEventListener('touchStart', function(){");
client.println("console.log('down')");
client.println("})");
client.println("joystick.addEventListener('touchEnd', function(){");
client.println("console.log('up')");
client.println("})");
client.println("$.ajaxSetup({timeout:35});"); //the most important line
client.println("setInterval(function(){");
client.println("var message = \"/?M/?X\"+Math.round(joystick.deltaX())+\"/X/?Y\"+Math.round(joystick.deltaY())+\"/Y/M\";$.get(message);var outputEl = document.getElementById('result');}, 75);");
client.println("</script></body></html>");
};

Da ich deine Libraries nicht kenne, habe ich auch aktuell keinen Tipp.
Sie dir die Beispiele der PCF8574 Lib an, da ist meist auch ein Beispiel mitgeliefert.

ich spreche das PCF8574

PCF8574 pcf8574(0x20,D6,D5);

im setup

  pcf8574.pinMode(0, INPUT_PULLUP);
  pcf8574.pinMode(1, INPUT_PULLUP);
  pcf8574.pinMode(2, INPUT_PULLUP);
  pcf8574.pinMode(3, INPUT_PULLUP); 
  pcf8574.begin();
  Wire.begin(D6, D5);

im loop

folgen();

Das ist die Lib bzw. beispiele, aber ich werde nicht schlau drauss, weil so funktionierts, sobald ich das im server einbaue gib es keine reaktion

ESP8266_.png

Schön, das kann man alles in deinem Sketch sehen.

Nur weiß der ESP nichts davon, wenn an deinem PCF8574 etwas passiert.
Dazu braucht dieser eine Meldung (IRQ oder auch Interrupt) vom PCF.

Wenn dein ESP richtig beschäftigt ist, bekommt der ohne IRQ nix mit.

Poste mal einen Link von deiner Library, das ist eine Information zum Anklicken.

Lib
PCF8574

andele:
Lib
PCF8574

OK....da gibt es das Beispiel "InterruptWemos", das sollte für dein Projekt passen.

Ok, dann werd ich mal versuchen das zu lösen -> Interrupt , Danke.

andele:
client = server.available();

Vergiss den WiFiServer bau den ESP8266WebServer ein.

Gruß Fips