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.