Hc sr04 y funcion random

Hola buenas, estoy realizando un proyecto y no se como puedo hacer para que mi robot coja una dirección aleatoria una vez ha detectado 10 cm aprox de distancia.
Gracias.

Hola leete en el IDE , ayuda, referencia, las funciones: randomSeed y random.
Saludos.

//HC-SR04
 const int EchoPin = 2;
 const int TriggerPin = 7;
 //MOTOR IZQUIERDO
 int encendidoA = 10;
 int motorIzqA = 11;
 int motorIzqB = 12;
 //MOTOR DERECHO
 int encendidoB = 5;
 int motorDerA = 3;
 int motorDerB = 4;
 int DURACION;
 int DISTANCIA;
 int aleatorio;
 
void setup()
{
   Serial.begin(9600);
   pinMode (TriggerPin, OUTPUT);
   pinMode (EchoPin, INPUT);
   pinMode (encendidoA, OUTPUT);
   pinMode (motorIzqA, OUTPUT);
   pinMode (motorIzqB, OUTPUT);  
   pinMode (encendidoB, OUTPUT);
   pinMode (motorDerA, OUTPUT);
   pinMode (motorDerB, OUTPUT);  
   randomSeed(2);
   
}

void loop() 
{
  aleatorio = (random(0,2));
  Serial.println(aleatorio);
  delay(1000);
  digitalWrite(TriggerPin, HIGH);     // generacion del pulso a enviar al pin conectado al trigger del sensor
  delay(10);     
  digitalWrite(TriggerPin, LOW);  
  DURACION = pulseIn(EchoPin, HIGH);  // con la funcion pulseIn se espera un pulso alto en Echo
  DISTANCIA = DURACION / 58.2;    // distancia medida en centimetros
  Serial.println(DISTANCIA);    // envio de valor de distancia por monitor serial
  delay(1000);       // demora entre datos
  
  if (DISTANCIA < 10 && aleatorio ==0)
  {   
        
     Serial.println(DISTANCIA);
     digitalWrite (motorIzqA,LOW);
     digitalWrite (motorIzqB,LOW); //PARO
     digitalWrite (motorDerA,LOW);
     digitalWrite (motorDerB,LOW);
     delay(500);
     digitalWrite (motorIzqA,LOW);
     digitalWrite (motorIzqB,HIGH);
     digitalWrite (motorDerA,LOW);  //ATRAS
     digitalWrite (motorDerB,HIGH);
     delay(2000);
     Serial.println("Derecha");
     analogWrite (encendidoA,105);
     analogWrite (encendidoB,105);
     digitalWrite (motorIzqA,HIGH);
     digitalWrite (motorIzqB,LOW); //DERECHA
     digitalWrite (motorDerA,LOW);
     digitalWrite (motorDerB,LOW);
     delay(3000);
   }  else if (DISTANCIA < 10 && aleatorio ==1)
   {
     Serial.println(DISTANCIA);
     digitalWrite (motorIzqA,LOW);
     digitalWrite (motorIzqB,LOW); //PARO
     digitalWrite (motorDerA,LOW);
     digitalWrite (motorDerB,LOW);
     delay(500);
     digitalWrite (motorIzqA,LOW);
     digitalWrite (motorIzqB,HIGH);
     digitalWrite (motorDerA,LOW);  //ATRAS
     digitalWrite (motorDerB,HIGH);
     delay(2000);
     Serial.println("Izquierda");
     analogWrite (encendidoA,105);
     analogWrite (encendidoB,105);
     digitalWrite (motorIzqA,LOW);
     digitalWrite (motorIzqB,LOW); //IZQUIERDA
     digitalWrite (motorDerA,LOW);
     digitalWrite (motorDerB,HIGH);
     delay(3000);
    } else {
       //Serial.println("Adelante"); Esto lo tenía para comprobar que entraba en este if
     Serial.println(DISTANCIA);
     analogWrite (encendidoA,105);
     analogWrite (encendidoB,105);
     digitalWrite (motorIzqA,HIGH);
     digitalWrite (motorIzqB,LOW);
     digitalWrite (motorDerA,HIGH);  //ADELANTE
     digitalWrite (motorDerB,LOW);
     delay(1000);
    }
}

@ sergioamor99 gracias por tu ayuda pero te recomiendo que leas como postear un código usando etiquetas.
Esta es la etiqueta. Seleccionas todo el código y luego click acá.

Ahora lo he hecho yo, pero tenlo presente para la próxima. Todo el código seleccionado y le das click o click en </> y luego pasteas el código. Muy fácil.!!

He modificado levemente tu código de manera que sea mas entendible al usar rutinas que hacer parar, izquierda, derecha, adelante o atras.
Ahora cada numero aleatorio ejecuta un switch case y de lo contrario default.

//HC-SR04
const int EchoPin = 2;
const int TriggerPin = 7;
//MOTOR IZQUIERDO
int encendidoA = 10;
int motorIzqA = 11;
int motorIzqB = 12;
//MOTOR DERECHO
int encendidoB = 5;
int motorDerA = 3;
int motorDerB = 4;
int duracion;
int distancia;
int aleatorio;

void setup()
{
  Serial.begin(9600);
  pinMode (TriggerPin, OUTPUT);
  pinMode (EchoPin, INPUT);
  pinMode (encendidoA, OUTPUT);
  pinMode (motorIzqA, OUTPUT);
  pinMode (motorIzqB, OUTPUT);
  pinMode (encendidoB, OUTPUT);
  pinMode (motorDerA, OUTPUT);
  pinMode (motorDerB, OUTPUT);
  randomSeed(2);

}

void loop() {
  aleatorio = (random(0, 2));
  Serial.println(aleatorio);
  ultrasonico();
  Serial.println(distancia);    // envio de valor de distancia por monitor serial
  delay(1000);       // demora entre datos

  switch(aleatorio) {
    case 0: if (distancia < 10) {
                Serial.println(distancia);
                paro();
                delay(500);
                atras();
                delay(2000);
                Serial.println("Derecha");
                derecha();
                delay(3000);
            }
            break;
    case 1: if (distancia < 10) {
                Serial.println(distancia);
                paro();
                delay(500);
                atras();
                delay(2000);
                Serial.println("Izquierda");
                izquierda();
                delay(3000);
            }
            break;
     default:  // cuando el nro aleatorio es 2 ejecuta esta parte.
            //Serial.println("Adelante"); Esto lo tenía para comprobar que entraba en este if
            Serial.println(distancia);
            adelante();
            delay(1000);
            break;
  }  // end switch
}

void ultrasonico() {
  digitalWrite(TriggerPin, HIGH);     // generacion del pulso a enviar al pin conectado al trigger del sensor
  delay(10);
  digitalWrite(TriggerPin, LOW);
  duracion = pulseIn(EchoPin, HIGH);  // con la funcion pulseIn se espera un pulso alto en Echo
  distancia = duracion / 58.2;    // distancia medida en centimetros
}

void paro() {
  digitalWrite (motorIzqA, LOW);
  digitalWrite (motorIzqB, LOW); //PARO
  digitalWrite (motorDerA, LOW);
  digitalWrite (motorDerB, LOW);
}

void atras() {
  digitalWrite (motorIzqA, LOW);
  digitalWrite (motorIzqB, HIGH);
  digitalWrite (motorDerA, LOW); //ATRAS
  digitalWrite (motorDerB, HIGH);
}

void adelante() {
  analogWrite (encendidoA, 105);
  analogWrite (encendidoB, 105);
  digitalWrite (motorIzqA, HIGH);
  digitalWrite (motorIzqB, LOW);
  digitalWrite (motorDerA, HIGH); //ADELANTE
  digitalWrite (motorDerB, LOW);
}

void derecha() {
  analogWrite (encendidoA, 105);
  analogWrite (encendidoB, 105);
  digitalWrite (motorIzqA, HIGH);
  digitalWrite (motorIzqB, LOW); //DERECHA
  digitalWrite (motorDerA, LOW);
  digitalWrite (motorDerB, LOW);
}

void izquierda() {
  analogWrite (encendidoA, 105);
  analogWrite (encendidoB, 105);
  digitalWrite (motorIzqA, LOW);
  digitalWrite (motorIzqB, LOW); //IZQUIERDA
  digitalWrite (motorDerA, LOW);
  digitalWrite (motorDerB, HIGH);
}

Gracias, tengo problemas con los motores, y es que les conecto y les alimento vin y no funcionan , hacen un ruido agudo, puede ser por el l293d

ESTE ES MI CODIGO, QUE POR TNKERCAD SI FUNCIONA, PERO CUANDO LO MONTO NO, ME HACEN UN SONIDO EXTRAÑO LOS MOTORES Y NO VA

//HC-SR04
 const int EchoPin = 2;
 const int TriggerPin = 7;
 //MOTOR IZQUIERDO
 int encendidoA = 11;
 int motorIzqA = 10;
 int motorIzqB = 12;
 //MOTOR DERECHO
 int encendidoB = 5;
 int motorDerA = 3;
 int motorDerB = 4;
 int DURACION;
 int DISTANCIA;
 int ALEATORIO;
 
void setup()
{
   Serial.begin(9600);
   pinMode (TriggerPin, OUTPUT);
   pinMode (EchoPin, INPUT);
   pinMode (encendidoA, OUTPUT);
   pinMode (motorIzqA, OUTPUT);
   pinMode (motorIzqB, OUTPUT);  
   pinMode (encendidoB, OUTPUT);
   pinMode (motorDerA, OUTPUT);
   pinMode (motorDerB, OUTPUT);  
   randomSeed(A0);
   
}

void loop() 
{
  ALEATORIO = (random(0,2));  //GENERO NUMEROS ALEATORIOS CON VALOR ENTRE 0 Y 2
  Serial.println(ALEATORIO);
  delay(1000);
  
  digitalWrite(TriggerPin, HIGH);     // generacion del pulso a enviar al pin conectado al trigger del sensor
  delay(10);     
  digitalWrite(TriggerPin, LOW);
  DURACION = pulseIn(EchoPin, HIGH);  // con la funcion pulseIn se espera un pulso alto en Echo
  DISTANCIA = DURACION / 58.2;    // distancia medida en centimetros
  Serial.println(DISTANCIA);    // envio de valor de distancia por monitor serial
  delay(1000);       // demora entre datos
  
  if (DISTANCIA < 10 && ALEATORIO ==0)
  {   
        
     Serial.println(DISTANCIA);
     digitalWrite (motorIzqA,LOW);
     digitalWrite (motorIzqB,LOW); //PARO
     digitalWrite (motorDerA,LOW);
     digitalWrite (motorDerB,LOW);
     delay(500);
     
     analogWrite (encendidoA,105);
     analogWrite (encendidoB,105);
     digitalWrite (motorIzqA,LOW);
     digitalWrite (motorIzqB,HIGH);
     digitalWrite (motorDerA,LOW);  //ATRAS
     digitalWrite (motorDerB,HIGH);
     delay(2000);
     
     analogWrite (encendidoA,105);
     analogWrite (encendidoB,105);
     digitalWrite (motorIzqA,HIGH);
     digitalWrite (motorIzqB,LOW); //DERECHA
     digitalWrite (motorDerA,LOW);
     digitalWrite (motorDerB,LOW);
     delay(3000);
     
   }  else if (DISTANCIA < 10 && ALEATORIO ==1)
   {
     Serial.println(DISTANCIA);
     digitalWrite (motorIzqA,LOW);
     digitalWrite (motorIzqB,LOW); //PARO
     digitalWrite (motorDerA,LOW);
     digitalWrite (motorDerB,LOW);
     delay(500);
     
     analogWrite (encendidoA,105);
     analogWrite (encendidoB,105);
     digitalWrite (motorIzqA,LOW);
     digitalWrite (motorIzqB,HIGH);
     digitalWrite (motorDerA,LOW);  //ATRAS
     digitalWrite (motorDerB,HIGH);
     delay(2000);
     
     analogWrite (encendidoA,105);
     analogWrite (encendidoB,105);
     digitalWrite (motorIzqA,LOW);
     digitalWrite (motorIzqB,LOW); //IZQUIERDA
     digitalWrite (motorDerA,HIGH);
     digitalWrite (motorDerB,LOW);
     delay(3000);
    } else {
       
     analogWrite (encendidoA,105);
     analogWrite (encendidoB,105);
     digitalWrite (motorIzqA,HIGH);
     digitalWrite (motorIzqB,LOW);
     digitalWrite (motorDerA,HIGH);  //ADELANTE
     digitalWrite (motorDerB,LOW);
  
    }

}

Moderador:
@sergioamor99 parace que nunca has escrito en los foros y de hacerlo nunca nadie te ha dicho esto: En un foro cuando usas mayùsculas estas gritàndonos.
Te pido por favor que edites tu post anterior.
Gracias.

Buenas, tengo conectado un HCSR04 para mi coche evita obstaculos, el problema viene que no es capaz de ir hacia delante cuando la distancia es mayor que 20, si lo conecto al ordenador lo hace todo bien, pero cuando lo pongo para que vaya el solo no lo hace. Necesito ayuda

//HC-SR04
 const int EchoPin = 2;
 const int TriggerPin = 7;
 //MOTOR IZQUIERDO
 int encendidoA = 10;
 int motorIzqA = 11;
 int motorIzqB = 12;
 //MOTOR DERECHO
 int encendidoB = 5;
 int motorDerA = 3;
 int motorDerB = 4;
 //VARIABLES
 int DURACION;
 int DISTANCIA;
 int ALEATORIO;
 
void setup()
{
   Serial.begin(9600);
   pinMode (TriggerPin, OUTPUT);
   pinMode (EchoPin, INPUT);
   pinMode (encendidoA, OUTPUT);
   pinMode (motorIzqA, OUTPUT);
   pinMode (motorIzqB, OUTPUT);  
   pinMode (encendidoB, OUTPUT);
   pinMode (motorDerA, OUTPUT);
   pinMode (motorDerB, OUTPUT);  
   randomSeed(A0);
   
}

void loop() 
{
  ALEATORIO = (random(0,2));  //GENERO NUMEROS ALEATORIOS CON VALOR ENTRE 0 Y 2
  Serial.println(ALEATORIO);
 

  digitalWrite(TriggerPin, HIGH);     // generacion del pulso a enviar al pin conectado al trigger del sensor
  delay(14);     
  digitalWrite(TriggerPin, LOW);
  DURACION = pulseIn(EchoPin, HIGH);  // con la funcion pulseIn se espera un pulso alto en Echo      //ESPACIO = VELOCIDAD X TIEMPO /2
  DISTANCIA = DURACION / 58.2;    // distancia medida en centimetros
  Serial.println(DISTANCIA);    // envio de valor de distancia por monitor serial
  delay(1000);       
  
  if (DISTANCIA < 30 && ALEATORIO ==0)
  {   
        
     Serial.println(DISTANCIA);
     digitalWrite (motorIzqA,LOW);
     digitalWrite (motorIzqB,LOW); //PARO
     digitalWrite (motorDerA,LOW);
     digitalWrite (motorDerB,LOW);
     delay(1000);
     
     analogWrite (encendidoA,255);
     analogWrite (encendidoB,255);
     digitalWrite (motorIzqA,LOW);
     digitalWrite (motorIzqB,HIGH);
     digitalWrite (motorDerA,LOW);  //ATRAS
     digitalWrite (motorDerB,HIGH);
     delay(2000);
     
     analogWrite (encendidoA,255);
     analogWrite (encendidoB,255);
     digitalWrite (motorIzqA,HIGH);
     digitalWrite (motorIzqB,LOW); //DERECHA
     digitalWrite (motorDerA,LOW);
     digitalWrite (motorDerB,LOW);
     delay(1500);
     
   }  else if (DISTANCIA < 30 && ALEATORIO ==1)
   {
     Serial.println(DISTANCIA);
     digitalWrite (motorIzqA,LOW);
     digitalWrite (motorIzqB,LOW); //PARO
     digitalWrite (motorDerA,LOW);
     digitalWrite (motorDerB,LOW);
     delay(1000);
     
     analogWrite (encendidoA,255);
     analogWrite (encendidoB,255);
     digitalWrite (motorIzqA,LOW);
     digitalWrite (motorIzqB,HIGH);
     digitalWrite (motorDerA,LOW);  //ATRAS
     digitalWrite (motorDerB,HIGH);
     delay(2000);
     
     analogWrite (encendidoA,255);
     analogWrite (encendidoB,255);
     digitalWrite (motorIzqA,LOW);
     digitalWrite (motorIzqB,LOW); //IZQUIERDA
     digitalWrite (motorDerA,HIGH);
     digitalWrite (motorDerB,LOW);
     delay(1500);
    } else {
       
     analogWrite (encendidoA,255);
     analogWrite (encendidoB,255);
     digitalWrite (motorIzqA,HIGH);
     digitalWrite (motorIzqB,LOW);
     digitalWrite (motorDerA,HIGH);  //ADELANTE
     digitalWrite (motorDerB,LOW);
  
    }
}

Hola:
El problema esta en que el bloque que da la marcha adelante esta dentro del conjunto if-ese y tal como esta nunca se ejecuta. Quita el ultimo else y sacalo del conjunto if-else.
Aunque yo personalmente quitaria los else y dejaria la lógica del código de esta forma:

if (DISTANCIA < 30 && ALEATORIO == 0) {
  //PARO
  delay(1000);
  //ATRAS
  delay(2000);
  //DERECHA
  delay(1500);
}
if (DISTANCIA < 30 && ALEATORIO == 1) {
  //PARO
  delay(1000);
  //ATRAS
  delay(2000);
  //IZQUIERDA
  delay(1500);
}
//ADELANTE
}

Saludos.

Moderador:
@sergioamor99 no habras hilos del mismo tema mientras no cierres los anteriores. Para cerrarlos me debes avisar o seleccionar alguna respuesta como la solución.
Tuve que editar tu código porque lo pegaste de manera errónea. Siempre comprueba que se visualice de modo correcto. La forma apropiada de hacer que un código quede bien es asi: vas al ícono o etiqueta de código, le das click </> y luego pasteas el código. NO A LA INVERSA porque lo toma mal.

Ahora que @Surbyte ha unido los dos hilos me voy enterando.

  • Ya @Surbyte te dio una solucion totalmente viable para el código
  • Yo te he dado otra distinta pero que tambien funciona.

Eso no es debido a ninguno de los tres codigos , algo tienes mal conectado

Eso me suena a mal conectado, ademas si el modulo te pita es que lo estas conectando mal, sube un esquema de conexionado o no lograremos nada.
Saludos

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.