HC-RS04

Buenas de nuevo:

-Con ayuda de miembros de este foro, he/hemos, desarrollado un programa para el manejo de un coche con Arduino. La idea que tengo ahora es que con un sensor HC-RS04, el coche pare al detectar, que tiene algún obstáculo en su camino, NO QUE LO ESQUIVE, como la mayoría de los tutoriales que encuentro.
La idea es:
tengo un botón, que me enciende una led, que me dá permiso, para que yo, con el joystick, pueda mover el coche a donde se me plazca. Pero que cuando el sensor me detecte algo en su camino, se pare hasta que no tenga nada delante.

Adjunto el programa, con parámetros del HC-RS04 para que alguno me pueda ayudar o orientar.
Muchas gracias.

const byte MarchaCa   = 2;  // marcha de carretilla
const byte Paro       = 3;  // paro de carretilla
const byte LEDOpera   = 8;  // objetivo para que funcione esta led encendida
const byte enA        = 9;  // definir las variables de los motores
const byte in1        = 7;
const byte in2        = 6; 
const byte enB        = 10;
const byte in3        = 5;
const byte in4        = 4;

const byte Trig =12;
const byte Echo =11;
const byte LEDParoSen = 13;
const byte valor;
long  distancia;
long  tiempo;

int motorASpeed       = 0;  // variables motor
int motorBSpeed       = 0;

const byte joyVert    = A0; // joystick vertical
const byte joyHori    = A1; // joystick horizontal

int joyposVert  = 0;        // lectura del joystick vertical
int joyposHori  = 0;        // lectura del joystik en horizontal
bool flag = false;

void setup  (){
  pinMode (MarchaCa,INPUT);
  pinMode (LEDOpera,OUTPUT);
  digitalWrite  (LEDOpera,LOW);
  pinMode   (enA,OUTPUT);//definimos como salidas las variables de
  pinMode   (in1,OUTPUT); 
  pinMode   (in2,OUTPUT);
  pinMode   (enB,OUTPUT);//los motores A y B
  pinMode   (in3,OUTPUT);
  pinMode   (in4,OUTPUT);
  digitalWrite  (enA,LOW);//para el motorA al principio
  digitalWrite  (in1,HIGH);
  digitalWrite  (in2,LOW);
  digitalWrite  (enB,LOW);//para el motorB al principio
  digitalWrite  (in3,HIGH);
  digitalWrite  (in4,LOW);

  Serial.begin(9600); //para las varialbes del sensor, pero no se muy bien
  pinMode(11,OUTPUT);
  pinMode(12,INPUT);
  pinMode(13,OUTPUT);
}

void loop(){
  
  if  (digitalRead(MarchaCa)==LOW) { // marcha del programa
       flag = true;
       delay (1000);                // espera antes de enceder led
       digitalWrite(LEDOpera,HIGH); // encedido de la led
  }

  if (digitalRead (Paro)==LOW) {     //paro del led
     digitalWrite (LEDOpera,LOW);
     flag = false;
  }
  if (flag)
      control_Joystick();
}

void control_Joystick() {
  joyposVert = analogRead  (joyVert);//estado del joystick
  joyposHori  = analogRead  (joyHori);//estado del joystick

  {
     
        digitalWrite(11,LOW);//MIRAR QUE PUEDE FALLAR
        delayMicroseconds(2);
        digitalWrite(11,HIGH);
        delayMicroseconds(10);
        digitalWrite(11,LOW);
        //
        tiempo  = pulseIn(10,HIGH);
        distancia =(tiempo/2)/29;
        
        if (distancia >=500  ||   distancia <=0){
      }
      else{
        Serial.print(distancia);
        Serial.println("cm");
        digitalWrite(13,LOW);

        if  (distancia  <=10  &&  distancia >=1){
          digitalWrite(13,HIGH);
          Serial.print("Alarma...");
        }
    }
  }

  if ((joyposVert  < 550)and (valor=="1"&&distancia>=20)){ //en reposo en joyposVer
  
      digitalWrite  (in1,LOW);
      digitalWrite  (in2,LOW);

      digitalWrite  (in3,LOW);
      digitalWrite  (in4,LOW);
  }

  if  (joyposVert <= 55) { //giro izquierda 
      digitalWrite  (in1,LOW);
      digitalWrite  (in2,LOW);

      digitalWrite  (in3,LOW);
      digitalWrite  (in4,HIGH);
  }

  if (joyposVert  >= 550)   { //giro derecha 
      digitalWrite  (in1,LOW);
      digitalWrite  (in2,HIGH);

      digitalWrite  (in3,LOW);
      digitalWrite  (in4,LOW);
  }

  if  (joyposHori < 50)   { //a delante
      digitalWrite  (in1,LOW);
      digitalWrite  (in2,HIGH);

      digitalWrite  (in3,LOW);
      digitalWrite  (in4,HIGH);
  }

  if (joyposHori  >= 560) { //atrás
      digitalWrite  (in1,HIGH);
      digitalWrite  (in2,LOW);

      digitalWrite  (in3,HIGH);
      digitalWrite  (in4,LOW);
  }
  }

Eso es muy simple.
Si estableces la distancia para la cual el auto debe detenerse simplemente controla el motor para que lo haga y ya.

Antes como detenias el vehículo, ahora tendras dos opciones una detención con tu joystick y otra con el sensor ultrasónico.

Ok, entiendo el concepto. Me pondré en breve a ello.

 if ((joyposVert  < 550) or (valor=="1"&&distancia>=20)){ //esta función( sé qe tengo que modificar algunas cosas, o una parecida, me podría valer para mi programa?¿?  para que con el joystick en reposo o el parámetros del HC-SR04 se pare, verdad?¿?
  
      digitalWrite  (in1,LOW);
      digitalWrite  (in2,LOW);

      digitalWrite  (in3,LOW);
      digitalWrite  (in4,LOW);

Podria ser asi

if ((joyposVert  < 550) || distancia <=20){ //en reposo 
      detener();
  }

/// donde detener es

void detener() {
  digitalWrite  (in1,LOW);
  digitalWrite  (in2,LOW);
  digitalWrite  (in3,LOW);
  digitalWrite  (in4,LOW);
}

La verdad es, que me estoy quedando un poco descolocado. La cuestión es, que tengo un programa paralelo a este. El cuál, en los pines 6 Echo (PWM) y 7 Trig(digital), el programa, me lee y me realiza todo lo que pretendo. Pero, introduzco este programa, dentro del que tengo ya realizado del car/coche Arduino, y no rastrea el sensor. Vale, que no están en los mismo pines, pero tanto influye a la hora de detectar?¿ :o

Dejo ambos códigos, para que me digáis algo.
muchas gracias.

const byte MarchaCa   = 22;  // marcha de carretilla
const byte Paro       = 26;  // paro de carretilla
const byte LEDOpera   = 30;  // objetivo para que funcione esta led encendida
const byte enA        = 9;  // definir las variables de los motores
const byte in1        = 7;
const byte in2        = 6; 
const byte enB        = 10;
const byte in3        = 5;
const byte in4        = 4;

const byte Trig =2;
const byte Echo =3;
const byte LEDParoSen = 13;
const byte valor;
long  distancia, duracion;


int motorASpeed       = 0;  // variables motor
int motorBSpeed       = 0;

const byte joyVert    = A0; // joystick vertical
const byte joyHori    = A1; // joystick horizontal

int joyposVert  = 0;        // lectura del joystick vertical
int joyposHori  = 0;        // lectura del joystik en horizontal
bool flag = false;

void setup  (){
  pinMode (MarchaCa,INPUT);
  pinMode (LEDOpera,OUTPUT);
  digitalWrite  (LEDOpera,LOW);
  pinMode   (enA,OUTPUT);//definimos como salidas las variables de
  pinMode   (in1,OUTPUT); 
  pinMode   (in2,OUTPUT);
  pinMode   (enB,OUTPUT);//los motores A y B
  pinMode   (in3,OUTPUT);
  pinMode   (in4,OUTPUT);
  digitalWrite  (enA,LOW);//para el motorA al principio
  digitalWrite  (in1,LOW);
  digitalWrite  (in2,LOW);
  digitalWrite  (enB,LOW);//para el motorB al principio
  digitalWrite  (in3,LOW);
  digitalWrite  (in4,LOW);

  Serial.begin(9600); //para las varialbes del sensor, pero no se muy bien
  pinMode(2,OUTPUT);
  pinMode(3,INPUT);
  pinMode(13,OUTPUT);
}

void loop(){
  
  if  (digitalRead(MarchaCa)==LOW) { // marcha del programa
       flag = true;
       delay (1000);                // espera antes de enceder led
       digitalWrite(LEDOpera,HIGH); // encedido de la led
  }

  if (digitalRead (Paro)==LOW) {     //paro del led
     digitalWrite (LEDOpera,LOW);
     flag = false;
  }
  if (flag)
      control_Joystick();
}

void control_Joystick() {
  joyposVert = analogRead  (joyVert);//estado del joystick
  joyposHori  = analogRead  (joyHori);//estado del joystick

  {
     
  digitalWrite(Trig,LOW);
  delayMicroseconds(2);
  digitalWrite(Trig,HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig,LOW);

  duracion  = pulseIn (Echo,HIGH);
  distancia = (duracion/2)  /29;

  if  (distancia  >=900    ||distancia <=0){
     Serial.println("---");
      }
      else{
        Serial.print(distancia);
        Serial.println("cm");
        digitalWrite(13,LOW);

        if  (distancia  <=10  ||  distancia >=1){
          digitalWrite(13,HIGH);
          Serial.print("Alarma...");
        }
        delay(240);
    }
  }



  if ((joyposVert  < 550) ||  (distancia<=20)){ //en reposo en joyposVer
  
      digitalWrite  (in1,LOW);
      digitalWrite  (in2,LOW);

      digitalWrite  (in3,LOW);
      digitalWrite  (in4,LOW);
  }

  if  (joyposVert <= 55) { //giro izquierda 
      digitalWrite  (in1,LOW);
      digitalWrite  (in2,LOW);

      digitalWrite  (in3,LOW);
      digitalWrite  (in4,HIGH);
  }

  if (joyposVert  >= 550)   { //giro derecha 
      digitalWrite  (in1,LOW);
      digitalWrite  (in2,HIGH);

      digitalWrite  (in3,LOW);
      digitalWrite  (in4,LOW);
  }

  if  (joyposHori < 50)   { //a delante
      digitalWrite  (in1,LOW);
      digitalWrite  (in2,HIGH);

      digitalWrite  (in3,LOW);
      digitalWrite  (in4,HIGH);
  }

  if (joyposHori  >= 560) { //atrás
      digitalWrite  (in1,HIGH);
      digitalWrite  (in2,LOW);

      digitalWrite  (in3,HIGH);
      digitalWrite  (in4,LOW);
  }
  }
#define Echo 6//una PWM
#define Trig 7 //normal
int Ledroja = 13;
long duracion,  distancia;



void setup() {
  Serial.begin (9600);
  pinMode (Echo,INPUT);
  pinMode (Trig,OUTPUT);
  pinMode (Ledroja,OUTPUT);
  

}

void loop() {
  digitalWrite(Trig,LOW);
  delayMicroseconds(2);
  digitalWrite(Trig,HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig,LOW);

  duracion  = pulseIn (Echo,HIGH);
  distancia = (duracion/2)  /29;

  if  (distancia  >=900      ||distancia <=0){
    Serial.println  ("---");
  }
  else  {
    Serial.print(distancia);
    Serial.println("cm");
    digitalWrite(13,0);
  }
  if  (distancia  <=100  &&  distancia >=1){
    digitalWrite(13,1);
    Serial.println("Alarma.....");
  
  }
  delay(250);
}