Problema al alimentar Arduino UNO

Hola buenas,

he hecho un pequeño coche por ultrasonidos, que avanza hasta que el sensor (HC-SR04) detecta un objeto, entonces el coche para, y gira para cambiar de dirección hasta que el sensor deja de detectar el objeto. Para mover los motores he utilizado un shield para motores de arduino.

El caso es que lo conecto, ya sea por USB o 9V de un transformador, el coche va de lujo. Pero lo que quiero es que el coche sea independiente, así que le puse una pila de 9V, y ahí viene el problema. El coche se vuelve loco porque se queda dando vueltas, como si el sensor detectara algo, pero no tiene nada 1 metro a la redonda xd. Primero pensé que era por la corriente que entrega la pila, que es poca, así que puse cuatro pilas AA recargables, pero sigue igual.
La verdad, no se como solucionarlo :frowning:
Gracias

coche_por_ultrasonidos.ino (2.79 KB)

Los códigos a menos que sean enormes no se suben de ese modo, aunque no esta mal pero por tu bien poca gente se toma la tarea de descargarlo para ver cual es tu problema.
Yo lo hice y lo pego acá, para que todos lo vean mas facilmente y entiendas porque te pediré cosas para entenderlo.
Lo que has hecho lo entiendes tu y solo tu.
No has usaso una sola etiqueta para identificar pines. No sabemos (claro que se puede entender pero no es el punto) que hace cada pin.
Lo que debes hacer es definirlos de este modo

const byte pinLedDer = 2;
const byte pinLedIzq = 4;

Tienes un arranque con esto

#define Pecho 6                          // Define los pines de Arduino que se van a usar con el Sensor HC-SR04
#define Ptrig 7

porque lo habras copiado, y no esta mal, pero sigue con esa línea de trabajo asi se comprende bien el código.
Yo miro hasta que se supone tu ultrasonido detecta algo que esta mas cerca de 7.99. Porque 7.99 y no 8?
Bueno parte de las cosas raras.
Luego lo que hace el resto es inentendible.

Espero tus reformas.

Lee las normas, y aprende a usar tags (etiquetas). Esta muy claro en las normas como usarlas.

/* HC-SR04 conexiones 
    VCC al arduino 5 V
    GND al arduino GND
    Echo al Arduino pin 6 
    Trig al Arduino pin 7

    Conexiones Shield Motor:
    Positivo y negativo de un motor a los puertos "+" y "-" del canal A del Shield
    Positivo y negativo de un motor a los puertos "+" y "-" del canal B del Shield
*/


#define Pecho 6                          // Define los pines de Arduino que se van a usar con el Sensor HC-SR04
#define Ptrig 7
long duracion, distancia;  

void setup() {   
  pinMode(2,OUTPUT); // Configura el pin que será un LED (derecho)
  pinMode(4,OUTPUT); // Configura el pin que será un LED (izquierdo)

  digitalWrite(2,HIGH); //Parpadeo de inicio...
  digitalWrite(4,HIGH);
  delay(50);  
  digitalWrite(2,LOW);
  digitalWrite(4,LOW);
  delay(50); 
  digitalWrite(2,HIGH);
  digitalWrite(4,HIGH);
  delay(50);  
  digitalWrite(2,LOW);
  digitalWrite(4,LOW);
  delay(50);
  digitalWrite(2,HIGH);
  digitalWrite(4,HIGH);
  delay(50);  
  digitalWrite(2,LOW);
  digitalWrite(4,LOW);
  delay(500);  

  pinMode(Pecho, INPUT);               // Define el pin 6 como entrada (echo)
  pinMode(Ptrig, OUTPUT);              // Define el pin 7 como salida  (triger)

  //Setup Motor A
  pinMode(12, OUTPUT); //Inicia el pin que sera el motor del canal A
  pinMode(9, OUTPUT); //Inicia el freno que será del motor del canal A
  //Setup Motor B
  pinMode(13, OUTPUT); //Inicia el pin que sera el motor del canal B
  pinMode(8, OUTPUT); //Inicia el freno que será del motor del canal A
  
}

void loop() {

  digitalWrite(Ptrig, LOW);
  delayMicroseconds(2);
  digitalWrite(Ptrig, HIGH);   // genera el pulso de triger por 10ms
  delayMicroseconds(10);
  digitalWrite(Ptrig, LOW);
  
  duracion = pulseIn(Pecho, HIGH);          // Recibe señal de Triger
  distancia = (duracion/2) / 29;            // Calcula la distancia en centimetros

  if (distancia >=8){  // Si la distancia es mayor a 8 cm
    digitalWrite(2,HIGH); //Enciende LED
    digitalWrite(4,HIGH);// Enciende LED
    digitalWrite(12,HIGH); // Mueve los dos motores hacia delante a máxima velocidad
    digitalWrite(9,LOW);
    analogWrite(3,255);
    digitalWrite(13,LOW);
    digitalWrite(8,LOW);
    analogWrite(11,255);
  }
  
  if (distancia <= 7.99){ 
    // El sensor detecta un obstáculo delante suya a 10cm o menos.
    digitalWrite(12,HIGH); // detiene un momento los motores
    digitalWrite(9,LOW);
    analogWrite(3,0);
    digitalWrite(13,LOW);
    digitalWrite(8,LOW);
    analogWrite(11,0);
    delay(500);
    digitalWrite(2,HIGH); 
    digitalWrite(4,LOW);    
    digitalWrite(12,LOW); // Uno de los motores se detiene, y el otro gira hacia atrás para girar.
    digitalWrite(9,LOW); // El coche girará hasta que el sensor detecte más de 8 cm delante suya
    analogWrite(3,255);
    digitalWrite(13,HIGH);
    digitalWrite(8,LOW);
    analogWrite(11,0);
    delay(1000);
  }
}

Hola me di a la tarea de leer tu código y pues he encontrado varios errores a la hora de definir el sentido de giro de los motores.

Aquí configuras los pines para cada motor, hasta aquí todo bien

//Setup Motor A
  pinMode(12, OUTPUT); //Inicia el pin que sera el motor del canal A   
  pinMode(9, OUTPUT); //Inicia el freno que será del motor del canal A

  //Setup Motor B
  pinMode(13, OUTPUT); //Inicia el pin que sera el motor del canal B
  pinMode(8, OUTPUT); //Inicia el freno que será del motor del canal B

Pero luego cuando entra a la primer condición haces esto…

if (distancia >=8){  // Si la distancia es mayor a 8 cm
    digitalWrite(2,HIGH); //Enciende LED
    digitalWrite(4,HIGH);// Enciende LED
    digitalWrite(12,HIGH); // Mueve los dos motores hacia delante a máxima velocidad  CORRECIÓN - Aquí solo pones al motor "A" a girar

    digitalWrite(9,LOW);
    analogWrite(3,255);           //aqui defines que si vaya a la máxima potencia.
    digitalWrite(13,LOW);         //CORRECIÓN apagas por completo el motor B Al poner ambos pines en bajo es por eso que se queda girando.


    digitalWrite(8,LOW);
    analogWrite(11,255);
  }

Ahí esta tu error.

Ahora en esta parte

if (distancia <= 8){    //si pones 7.99 mejor coloca 8
    // El sensor detecta un obstáculo delante suya a 8cm o menos.

    digitalWrite(12,HIGH); // detiene un momento los motores   CORRECIÓN haces lo mismo que en la primer condición pones en alto al motor A pero en bajo al motor B es por eso que se pone a dar vueltas a lo loco.


    digitalWrite(9,LOW);
    analogWrite(3,0);         //por que en 0 al poner en 0 el motor A aunque arriba le dices que gire aca haces que pare por completo

    digitalWrite(13,LOW);             //aca apagas al motor B, desconosco por que
    digitalWrite(8,LOW);

LUEGO de las 2 lineas de arriba en  lo que resta del código es apagar los motores gracias a estas instrucciones

analogWrite(11,0); aqui pones en 0 al motor A

digitalWrite(12,LOW); 
    digitalWrite(9,LOW); 
    analogWrite(3,255);  // aunque le dices al motor B que vaya al máximo, arriba lo declaras en LOW por lo tanto esta apagado


    digitalWrite(13,HIGH);       
    digitalWrite(8,LOW);
    analogWrite(11,0);



///////////////////////

    analogWrite(11,0);
    delay(500);
    digitalWrite(2,HIGH); 
    digitalWrite(4,LOW);    
    digitalWrite(12,LOW); // Uno de los motores se detiene, y el otro gira hacia atrás para girar.
    digitalWrite(9,LOW); // El coche girará hasta que el sensor detecte más de 8 cm delante suya
    analogWrite(3,255);
    digitalWrite(13,HIGH);       
    digitalWrite(8,LOW);
    analogWrite(11,0);
    delay(1000);
  }

Esos son tus errores además hay etiquetas que no pertenecen a lo que programas en las lineas de código, tengo la ligera sensación de que este código lo tomaste de alguna página y lo estas adaptando no está mal pero deberías prestar más atención para la próxima trata de hacerlo. Tus errores ya los deje en claro ahora te toca a ti resolverlos. Saludos

Gracias por las respuestas :slight_smile:
Pero solucioné el problema alimentado el Arduino por los pines Vin y GND que tiene el shield. Y el código va bien, justo como quería.

Buenas,
Echadle un vistazo a la modificación del código, a ver qué os parece.

/*
HC-SR04 conexiones
VCC al arduino 5 V
GND al arduino GND
Echo al Arduino pin 6 
Trig al Arduino pin 7

Conexiones Shield Motor:
Positivo y negativo de un motor a los puertos "+" y "-" del canal A del Shield
Positivo y negativo de un motor a los puertos "+" y "-" del canal B del Shield
*/


const byte Pin_echo = 6;    
const byte Pin_trig = 7;  
const byte Pin_led_der = 2;
const byte Pin_led_izq = 4;
long duracion, distancia;  
 
void setup() {   
  pinMode(Pin_led_der,OUTPUT); // Configura el pin que será un LED (derecho)
  pinMode(Pin_led_izq,OUTPUT); // Configura el pin que será un LED (izquierdo)
  digitalWrite(2,HIGH); //Parpadeo de inicio...
  digitalWrite(4,HIGH);
  delay(50);  
  digitalWrite(2,LOW);
  digitalWrite(4,LOW);
  delay(50); 
  digitalWrite(2,HIGH);
  digitalWrite(4,HIGH);
  delay(50);  
  digitalWrite(2,LOW);
  digitalWrite(4,LOW);
  delay(50);
   digitalWrite(2,HIGH);
  digitalWrite(4,HIGH);
  delay(50);  
  digitalWrite(2,LOW);
  digitalWrite(4,LOW);
  delay(500);  
           
  pinMode(Pin_echo, INPUT);               // Define el pin 6 como entrada (echo)
  pinMode(Pin_trig, OUTPUT);              // Define el pin 7 como salida  (triger)
    
  //Setup Motor A
  pinMode(12, OUTPUT); //Inicia el pin que sera el motor del canal A
  pinMode(9, OUTPUT); //Inicia el freno que será del motor del canal A
  //Setup Motor B
  pinMode(13, OUTPUT); //Inicia el pin que sera el motor del canal B
  pinMode(8, OUTPUT); //Inicia el freno que será del motor del canal A
  
  }
  
void loop() {
  
  digitalWrite(Pin_trig, LOW);
  delayMicroseconds(2);
  digitalWrite(Pin_trig, HIGH);   // genera el pulso de triger por 10ms
  delayMicroseconds(10);
  digitalWrite(Pin_trig, LOW);
  
  duracion = pulseIn(Pin_echo, HIGH);          // Recibe señal de Triger
 distancia = (duracion/2) / 29;            // Calcula la distancia en centimetros
    
  if (distancia >8){  // Si la distancia es mayor a 8 cm
  digitalWrite(2,HIGH); //Enciende LED
  digitalWrite(4,HIGH);// Enciende LED
  digitalWrite(12,HIGH); // Mueve motor canal A a máxima potencia
  digitalWrite(9,LOW);
  analogWrite(3,255);
  digitalWrite(13,LOW); // Mueve motor canal B a máxima potencia
  digitalWrite(8,LOW);
  analogWrite(11,244);
  
  

  }
  
   if (distancia <= 8){ 
    // El sensor detecta un obstáculo delante suya a 8cm o menos.
    // Se detienen los motores un momento
  digitalWrite(12,HIGH); // Detiene motor canal A
  digitalWrite(9,LOW);
  analogWrite(3,0);
  digitalWrite(13,LOW); // Detiene motor canal B
  digitalWrite(8,LOW);
  analogWrite(11,0);
  delay(500);
  digitalWrite(Pin_led_der,HIGH); // Deja encendido un led (el derecho)
  digitalWrite(Pin_led_izq,LOW);    
  digitalWrite(12,LOW); // Motor canal A gira en sentido contrario 
  digitalWrite(9,LOW); 
  analogWrite(3,255);
  digitalWrite(13,HIGH); // Motor canal B se queda detenido (Para que el coche gire)
  digitalWrite(8,LOW);
  analogWrite(11,0);
  delay(2000);          // Hacer esto durante 2 segundos
  digitalWrite(12,HIGH); // Luego, deja parado el motor canal A
  digitalWrite(9,LOW); 
  analogWrite(3,0);
  digitalWrite(13,LOW);  // Y mueve motor canal B para girar más
  digitalWrite(8,LOW);
  analogWrite(11,255);
  delay(1500);
  
    

   }

  }

Tengo que aclarar que en el codigo un motor está en HIGH y el otro en LOW, es porque uno de los motores que estoy usando está al reves, y tiene que girar al contrario para que los dos vayan en el mismo sentido

  if (distancia >8){  // Si la distancia es mayor a 8 cm
  digitalWrite(2,HIGH); //Enciende LED
  digitalWrite(4,HIGH);// Enciende LED
  digitalWrite(12,HIGH); // Mueve motor canal A a máxima potencia
  digitalWrite(9,LOW);
  analogWrite(3,255);
  digitalWrite(13,LOW); // Mueve motor canal B a máxima potencia
  digitalWrite(8,LOW);
  analogWrite(11,244);

Y otra cosilla es que, en mi opinión prefiero poner “#define” que “const byte …”

usar #define o usar const byte es lo mismo. Si te apetece usar #define bien, pero ninguno de los dos consume RAM y ese ese el objetivo.
Mucha gente define los pines asi

int Led = 3; // Esta bien pero consume 2 bytes de RAM

esto sería mejor pero igualmente consume RAM

byte Led = 3 // Consume 1 byte

esto no consume RAM
const byte Led = 3 o
#define Led 3

ambos dan iguales resultados al compilarse. Ver nota