Go Down

Topic: marcha/paro condicionada (Read 112 times) previous topic - next topic

alevago

Oct 10, 2018, 12:20 pm Last Edit: Oct 11, 2018, 10:10 am by alevago
Buenos días:

- He comenzado no hace mucho, en esto del mundo Arduino y he realizado, con ayuda de tutoriales y leer en foros mi primer proyecto "serio". Un simple coche manejado con Joystick.
Lo que pretendo con mi pregunta, es, que me guieis, en la continuación del programa.
Quiero que una led encendida, sea una condición para que yo, pueda manejar el coche con el joystick.
Y al pulsar paro, se pare y no pueda manejar el joystick.
He leído por otros foros y demás, que este tipo de condiciones, se pueden hacer, con un Arduino DUE. No estoy del todo seguro de que solo con este se pueda hacer.
Yo dispongo de UNO y Mega.
He realizado el siguiente programa y creo que si se puede hacer algo, es en la  programación del void loop.

Adjunto mi programa

Code: [Select]


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

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

int joyVert = A0;//joystick vertical
int joyHori = A1;//joystick horizontal
//
int joyposVert  = 0;//lectura del joystick vertical
int joyposHori  = 0;//lectura del joystik en horizontal



void setup  (){
  inMode (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);
  

  

  
}
void loop(){
 

{
 {
if  (digitalRead  (MarchaCa)==LOW);// marcha del programa

{
  delay (1000);//espera antes de enceder led
  digitalWrite  (LEDOpera,HIGH);//encedido de la led
}
if (digitalRead (Paro)==LOW);//paro de la led
(digitalWrite (LEDOpera,LOW));
  }

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

  
//AQUI ME ESTA FALTANDO ALGO QUE DE PRIORIDAD AL LED QUE NO SE REALIZAR.  UN POCO MAS ARRIBA, PERDON

  if (joyposVert  < 550)//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);
  }
}}




surbyte

Entiendo que eres nuevo y que estas comenzando pero esto

Code: [Select]
if  (digitalRead  (MarchaCa)==LOW);// marcha del programa

que sentido tiene? Arranca el programa y si MarchaCa no esta en HIGH no hace nada y en cada Loop lo mismo?

Jamás vi algo semejante.

Si quieres que algo detenga al joystick y todo lo que hace pues coloca todo el control del joystick dentro de la acción que buscas.
Lo mejor es que tu pulsador controle un flag y este flag controle el uso o no del joystick

Algo asi

Code: [Select]

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


Código modificado completo

Code: [Select]
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;

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);
}

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

  if (joyposVert  < 550) { //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);
  }
}


Hay cosas que no me gustan como el delay dentro de la primer acción pero te lo dejo a ti porque cuando presiones te quedas 1segundo sin poder deternerlo

alevago

Muchas gracias por la rápida respuesta. Te agradezco mucho, que me hayas enseñado algo nuevo en este bonito mundo de Arduino.
El programa funciona a la perfección. ES LO QUE PRETENDIA :)
Espero que me entendierais bien a la primera y me expresase bien.

Go Up