Problemas con servos y stepdowns

Buenas, tengo el siguiente programa para mover un servo (m996r y sg90)por monitor serie, si conecto el servo al arduino o al ESP32 (proyecto final) funciona, pero si le conecto un step down LM2596 empieza a hacer cualquier cosa solo, todo esta alimentado por una fuente de salida 12v 10Am y entrada 220v ac

Codigo:

#include <Servo.h>
Servo SpinnyBoi;
int input;

void setup() {
  // put your setup code here, to run once:
SpinnyBoi.attach(9);
Serial.begin(9600);
SpinnyBoi.write(input);
Serial.println("Enter an Angle:");

}

void loop() {
  // put your main code here, to run repeatedly:
if (Serial.available() > 0) {
  input = Serial.parseInt();
  if (input > 180 || input < 0) {
    Serial.println ("This isn't valid! Try again!");
    Serial.println("Enter an Angle:");
  }
  else {
    SpinnyBoi.write(input);
    Serial.println(String("You entered: ") + input + String("!"));
    delay (1000);
    Serial.println("Enter an Angle:");
  }
}



}

Que podria ser? Gracias desde ya

PD: Perdon si me equivoco de tema

¿Como lo tienes conectado todo?

Fuente 12Vac 10A --cable arduino-->step down ---cable arduino---> Servo Mg996r

Los cables a los step down estan soldados

Mejor pon un esquema de como lo tienes todo realmente conectado y alguna foto del montaje puede ayudar a ver que puede estar ocurriendo.
El step down que tensión de salida está dando?

Los step de salida dan 5V 2a aprox y el arduino 5 1,3A

Creo que el m996r consume unos 2'5A a 6V, me imagino que a 5V consumira algo más y no se si eso afectará ya que el LM2596 da como maximo 3A, por otro lado en el esquema no veo que tengas conectado el out- del step down con el GND del arduino y esto ultimo es imprescindible.

Tendria que conectar 6 servos en total como tendria que ser con los GND ?tengo inconvenientes para saber cuales tienen que relacionarse

Todos los GND tienen que estar interconectados, usando tu propio esquema quedaria asi

imagen

Todos los GND a un mismo punto.

Saludos

Lo tengo asi, lo pude controlar con el esp32 por una web, pero si esta quieto no es estable, ahora le estoy dando 6v 2,47A

Codigo:

#include <WiFi.h>
#include <Servo.h>

Servo myservo;  // create servo object to control a servo
static const int servoPin = 13;
String valueString = String(5);
int pos1 = 0;
int pos2 = 0;
// Current time
unsigned long currentTime = millis();
// Previous time
unsigned long previousTime = 0; 
// Define timeout time in milliseconds (example: 2000ms = 2s)
const long timeoutTime = 2000;

const char* ssid     = "wifiNico"; // Nombre de la red 
const char* password = "12345678";     // Contraseña

WiFiServer server(80);
String header;

void setup() {
  Serial.begin(9600);
  myservo.attach(servoPin);

  // Conectarse a la red wifi con ssid y pass
  Serial.print("Setting AP (Access Point)…");
  // 
  WiFi.softAP(ssid, password);

  IPAddress IP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(IP);
  
  server.begin(); // Inicia el servidor
}

void loop(){
  WiFiClient client = server.available();   // Escucha los clientes entrantes

  if (client) {        
    currentTime = millis();
    previousTime = currentTime;
    Serial.println("Nuevo Cliente.");       //Imprime mensaje
    String currentLine = "";                // Cadena para contener los datos del cliente entrantes
    while (client.connected() && currentTime - previousTime <= timeoutTime) {            // Bucle cuando el cliente esta conectado
      currentTime = millis();
      if (client.available()) {
        char c = client.read();             // lee byte
        Serial.write(c);                    // lo imprime 
        header += c;
        if (c == '\n') {                    // si el byte es un caracter de nueva linea
          // si la línea actual está en blanco, tienes dos caracteres de nueva línea seguidos.
          // final de la solicitud HTTP,envia respuesta:
          if (currentLine.length() == 0) {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();
            
            // Display the HTML web page
            client.println("<!DOCTYPE html><html>");
            client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
            client.println("<link rel=\"icon\" href=\"data:,\">");
            // CSS to style the on/off buttons 
            // Feel free to change the background-color and font-size attributes to fit your preferences
            client.println("<style>body { text-align: center; font-family: \"Trebuchet MS\", Arial; margin-left:auto; margin-right:auto;}");
            client.println(".slider { width: 300px; }</style>");
            client.println("<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js\"></script>");
                     
            // Web Page
            client.println("</head><body><h1>ESP32 with Servo</h1>");
            client.println("<p>Position: <span id=\"servoPos\"></span></p>");          
            client.println("<input type=\"range\" min=\"0\" max=\"180\" class=\"slider\" id=\"servoSlider\" onchange=\"servo(this.value)\" value=\""+valueString+"\"/>");
            
            client.println("<script>var slider = document.getElementById(\"servoSlider\");");
            client.println("var servoP = document.getElementById(\"servoPos\"); servoP.innerHTML = slider.value;");
            client.println("slider.oninput = function() { slider.value = this.value; servoP.innerHTML = this.value; }");
            client.println("$.ajaxSetup({timeout:1000}); function servo(pos) { ");
            client.println("$.get(\"/?value=\" + pos + \"&\"); {Connection: close};}</script>");
           
            client.println("</body></html>");   
            
             //GET /?value=180& HTTP/1.1
            if(header.indexOf("GET /?value=")>=0) {
              pos1 = header.indexOf('=');
              pos2 = header.indexOf('&');
              valueString = header.substring(pos1+1, pos2);
              
              //Rotate the servo
              myservo.write(valueString.toInt());
              Serial.println("entrea");
              Serial.println(valueString); 
            }         
            // The HTTP response ends with another blank line
            client.println();
            // Break out of the while loop
            break;
          } else { // Si tiene nueva linea que borre
            currentLine = "";
          }
        } else if (c != '\r') {  // si obtuvo algo mas,
          currentLine += c;      // agregarlo al currenLine
        }
      }
    }
    // limpiar
    header = "";
    // Cierra la conexion
    client.stop();
    Serial.println("Cliente desconectado.");
    Serial.println("");
  }
}

Conexion:
(no tengo muchos colores de cables)

A priori parece que está bien conectado el GND del esp32 con la salida negativa del step down.

Con que no es estable te refieres a que no se queda totalmente parado?

Exacto, empieza a tener movimientos involuntarios (con el arduino no pasa esto)

Se me plantean varias dudas.

  1. Si lo controlas con el Arduino por Serial sin step down ¿funciona bien?
  2. Si lo controlas con el Arduino por Serial con step down ¿funciona bien?
  3. Si lo controlas con el ESP32 por Serial con step down ¿funciona bien?
  4. Si lo controlas con el ESP32 por Serial sin step down ¿funciona bien?
  5. Si lo controlas con el ESP32 por Wifi sin step down ¿funciona bien?
  6. Si lo controlas con el ESP32 por Wifi con step down ¿funciona bien?

Estas preguntas son para tratar de delimitar el problema

¿El ESP32 no tiene lógica de 3.3V?
¿No será ese el problema?

Saludos

Entiendo que el esp32 tiene como salida de "fuente" 3.3 v, y solo le utilizo el gnd, a que te referis con logica de 3.3v ? Por otro lado, como seria si queremos utilizar esp32. Porque el ejemplo que sacamos lo utiliza, pero no tengo su diagrama.

Saludos!

Logramos mover varios a la vez y descubrimos que solo los grandes (mg996r)tienen problema de inestabilidad que te comente, ademas de que estan mimetizados con los movimientos erraticos. Que podra ser?

¿Has hecho las pruebas que te comenté en post #13?

Que a diferencia de un Uno/Nano en que la tensión de salida de sus pines es de 5V en el ESP esa tensión es de 3.3V entonces una salida PWM va de 0 a 3.3V no de 0 a 5V y un HIGH será de 3,3V en lugar de 5V.

Saludos

1 Like
  1. Si lo controlas con el Arduino por Serial sin step down ¿funciona bien? Si
  2. Si lo controlas con el Arduino por Serial con step down ¿funciona bien? Si
  3. Si lo controlas con el ESP32 por Serial con step down ¿funciona bien? Con inestabilidad
  4. Si lo controlas con el ESP32 por Serial sin step down ¿funciona bien? Con inestabilidad
  5. Si lo controlas con el ESP32 por Wifi sin step down ¿funciona bien? Con inestabilidad
  6. Si lo controlas con el ESP32 por Wifi con step down ¿funciona bien? Con inestabilidad

Entiendo, pero de los ejemplos que saque usan la salida pwm del esp32 para moverlos y lo hacen sin problemas