Motors controlando la pregunta usb de Arduino

1

simular este circuito : esquema creado usando CircuitLab

Hice un auto RC con una placa Arduino, usando un puente en H para operar los motores. Los conecto a través de un condensador y un diodo al pin de +5 V de la placa Arduino para evitar daños en la placa. Escribí un programa simple. Estoy usando un sensor ultrasónico para evitar objetos. La idea es que cuando no tengo un objeto delante de mí, se debe activar un comando para avanzar. Cuando hay un objeto, los motores deben ir en reversa, moverse por un tiempo, luego avanzar y girar a la derecha. Uso 2 motores de corriente continua, uno para la marcha atrás y adelante, y uno para la derecha y la izquierda (dirección).

El problema es el siguiente: si conecto la placa a la computadora a través del cable USB, y al mismo tiempo enciendo el auto, el código se ejecuta normalmente, pero si quito el cable USB y enciendo automóvil (utilizando los ~ 5.4 V de BAT1 a D1), entonces el automóvil no avanza, retrocede, se queda, avanza y gira a la derecha; esto se repite dos veces y luego el programa comienza a funcionar normalmente.

Aquí está el código:

int forward = 11; 
int reverse = 10;    
int left = 9;       
int right = 8; 

#define ECHOPIN 3   
#define TRIGPIN 2   



void setup() {

  Serial.begin(9600);

   pinMode(forward, OUTPUT);
   pinMode(reverse, OUTPUT);
   pinMode(left, OUTPUT);
   pinMode(right, OUTPUT);

   pinMode(ECHOPIN, INPUT);
   pinMode(TRIGPIN, OUTPUT);



  }



   void loop() {




    digitalWrite(TRIGPIN, LOW);
    delayMicroseconds(2);
    digitalWrite(TRIGPIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIGPIN, LOW);
      // Compute distance
    float distance = pulseIn(ECHOPIN, HIGH);
    distance= distance/58;  
    Serial.println(distance);

     delay(200); 

      if ( distance < 12.50) {

      analogWrite(forward,0);
      delay(1000);

      analogWrite(reverse,100);
      delay(1000);


       analogWrite(reverse,0);
       delay(1000);

       analogWrite(forward,100);
       digitalWrite(right,HIGH);
       delay(1500);
       digitalWrite(right,LOW);
       delay(500);

     }

      if ( distance > 12.50) {
      analogWrite(forward,100);
      delay(1000);
      }




    }
    

2 respuestas

1

A partir de la descripción tan incompleta del problema según lo provisto, solo se puede especular que posiblemente la placa Arduino o los controladores del motor no estén recibiendo suficiente energía en el modo alimentado por batería, para funcionar normalmente.

Las placas Arduino de 5 voltios más antiguas están diseñadas para funcionar con una fuente regulada de 5 voltios en un pin de + 5V, 5 voltios a través del USB, o un voltaje de CC de entre 7 y 12 voltios (o aproximadamente) de una fuente externa. Mientras que la mayoría de los Arduinos funcionarán hasta 6 voltios en la fuente externa, ~ 5.4 voltios deja demasiado poco espacio para que el regulador de bajada baja a bordo produzca un voltaje estable de 5 voltios.

Además, al encender cualquiera de los motores, es casi definitivo que la tensión de alimentación descienda aún más al menos brevemente, lo que provoca un comportamiento impredecible del Arduino, incluidos los posibles restablecimientos de la placa.

Si debe usar la batería de 5.4 voltios, se pueden obtener mejores resultados al usar un regulador de aumento (el regulador de aumento de DC-DC + step-down, no un regulador lineal ) que es capaz de producir 5 voltios regulados desde un voltaje de entrada hasta 4 voltios aproximadamente, y hasta 6 o más voltios. De esa manera, el Arduino tiene garantizado un suministro estable de 5 voltios a pesar de las variaciones de alimentación de la batería en un amplio rango.

Para una resolución más específica del problema, es útil proporcionar una información esquemática y más detallada, incluido el código quizás más relevante.

    
respondido por el Anindo Ghosh
0

He cambiado el sensor con este modelo (sparkfun.com/datasheets/Components/GP2Y0A21YK.pdf) y todo va bien ahora. El programa también se modificó. Esta es mi resolución por ahora.

el nuevo código es este:

     void loop() {

       sensorValue = analogRead(analogInPin);

      if ( sensorValue >550) {

       analogWrite(forward,0);
         analogWrite(reverse,70);
           delay(1000);

             }

        if ( sensorValue < 550) {
         analogWrite(reverse,0);
           analogWrite(forward,100);
             delay(1000);
                }

}

    

Lea otras preguntas en las etiquetas