Grupos de salidas arelé con sensor ps2.

Hola a todos , estoy intentando desarrollar un proyecto , con un módulo de 8 relés (de los cuales solo se usan 6), 3 leds de indicación de grupo y un sensor joystick de ps2.
La idea general es :
Controlar los relés en grupos de 2, uno enciende cuando el joystick se coloca hacia arriba en el eje y hacia abajo en el eje x el otro relé del grupo .
El joystick de ps2 posee un contacto cuando se pulsa hacia adentro, el cual serviría para cambiar al siguiente grupo de relés el cual funcionaría igual que el anterior , y el tercero también .
Tras la idea de hacer un contador para saber que grupo tenemos seleccionado con el pulsador del joystick , (Cada grupo , queda señalizado con un led {Led1 grupo 1 y asi respectivamente}.
El problema se me plantea cuando hay que usar el IDE de Arduino para el contador y para la medida analogica del joystick.

Os dejo el Código que e conseguido hacer hasta ahora , pero no está terminado .

int VERT = 7; // analog Eje VR Y
int HORIZ = 5; // analog EJE Vr X
int Button = 9; // digital press button of joystick
int ledPin1 = 10;
int ledPin2 = 2;
int ledPin3 = 3;
int ledPin4 = 4;
int ledPin5 = 5;
int ledPin6 = 6;
int ledPin7 = 7;
int ledPin8 = 8;
int value =0;
int contador = 0;
int estadoanteriorboton =0;

// Also connect the joystick VCC to Arduino 5V, and joystick GND to Arduino GND.

// This sketch outputs serial data at 9600 baud (open Serial Monitor to view).

void setup()
{
Serial.begin(9600);

// make the Button line an input
pinMode(Button,INPUT);
// make the SEL line an output
pinMode(1,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);

// turn on the pull-up resistor for the Button line and also the outputs (see http://arduino.cc/en/Tutorial/DigitalPins)

digitalWrite(Button,HIGH);

digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,HIGH);
digitalWrite(ledPin3,HIGH);
digitalWrite(ledPin4,HIGH);
digitalWrite(ledPin5,HIGH);
digitalWrite(ledPin6,HIGH);
digitalWrite(ledPin7,HIGH);
digitalWrite(ledPin8,HIGH);

// set up serial port for output

}

void loop()
{
value = digitalRead(Button);
int vertical, horizontal, select;

// read all values from the joystick

vertical = analogRead(VERT); // will be 0-1023
horizontal = analogRead(HORIZ); // will be 0-1023
select = digitalRead(Button); // will be HIGH (1) if not pressed, and LOW (0) if pressed

// print out the values

//Serial.print("vertical: ");
// Serial.print(vertical,DEC);
//Serial.print(" horizontal: ");
//Serial.print(horizontal,DEC);
// Serial.print(" select: ");
//if(select == HIGH)
// Serial.println("not pressed");
//else
// Serial.println("PRESSED!");

if(value != estadoanteriorboton){
if(value ==1){

contador++;
Serial.print(contador);
Serial.write(3);
if (contador==3){
contador=0;
}
if (contador==1);
Serial.read("vertical:");
else if ("vertical"== 1023);
digitalWrite(ledPin1,HIGH);
}
estadoanteriorboton = value;
}

Hola a todos de nuevo , algún alma caritativa que pueda ayudarme? Muchas gracias.

El problema se me plantea cuando hay que usar el IDE de Arduino para el contador y para la medida analogica del joystick.

Cual es el problema como agrupar el codigo o como medir la señal analogica del joystick?

no me queda claro si quieres usar del mando solo la parte vertical (si subes un grupo de reles ,si bajas ,otro) y la parte horizontal no la usas (si mueves el mando a izquierda o derecha).¿los grupos de reles ha de funcionar excluyentes (solo puede estar encendido un grupo al mismo tiempo )?

El problema es que al usar el Serial Monitor , o me dice el número del contador en el que está , o me dice los valores analógicos del joystick , pero no hace las dos a la vez.

Por si puedo ponerlo mas claro , el joystick consta de 5 movimientos derecha, izquierda, arriba y abajo y además un pulsador al apretar éste hacia adentro
Éste pulsador será el cual cambie los modos (1, 2 y 3)Pulsando una vez , se activa el modo 1 , pulsando otra vez , el 2 y pulsando otra el tercero.

La idea , o el objetivo es conseguir hacer funcionar los relés con el joystick.(3 modos)
La idea de los modos , es con un simple contador, el cual cuenta
En el modo 1 los relés: (1 y 2 ) se activan cuando se acciona el joystick hacia arriba, y abajo .
El relé 1 se activará cuando el joystick esté hacia arriba y por el contrario , el relé 2 cuando el joystick esté hacia abajo.
En el modo 2 , el cual funciona de la misma manera, pero con distintos relés , arriba relé número 3 , y abajo relé número 4,
En el modo 3 es casi igual pero en dirección horizontal, izquierda se activa el relé 5 y a la derecha el relé 6.
Todo esto , los relés , funcionarán siempre y cuando se esté ejecutando el movimiento con el joystick.

Los grupos funcionan excluyente , (solo un grupo al mismo tiempo) Grupos de relés:{1 y 2} , o {3 y 4} o{ 5 y 6}

A todo esto , y aunque parezca fácil , querría poner leds para saber en que modo se encuentra.
1 led para el modo 1 ,
2 led para el modo 2
y 3 para el modo 3.

Si no he sido claro , decirme , estaré mas que encantado de explicároslo, con tal de que me funcione el maldito chisme.
Un saludo

espero que te una idea esto

// incrementa value cada vez que se presiona el joystick
if (digitalRead(Button)){
value++; 
delay(10); // delay que evita el rebote del botón
if (value < 3)
value = 0;
}

switch( value)

case: 0
if (ver > 700) // si el valor vertical es mayor que 700 enciende el rele1
  digitalWrite(rele1,HIGH);
if (ver < 323 )// si es menor que 323 enciende el rele2
  digitalWrite(rele2,HIGH);
if ((ver > 323) && ( ver < 700)){ // si esta en medio se apagan los dos
  digitalWrite(rele1,LOW);
  digitalWrite(rele2,LOW);  
break;
case: 1
//código para el segundo grupo
break;
case: 2
// código para el tercer grupo 
break;

Ya estoy de nuevo ,con ello , y ahora e conseguido que me muestre el modo en el que está en el serial monitor , pero nada mas, no activa relés ni nada por el estilo.
que mas puedo hacer? el error parece claro en los case '0' case '1' y case '2' pero nose como hacerlo...
Muchas gracias a todos los que me están ayudando. :blush:
Aqui el código que utilizo.

int VERT = 7; // analog Eje VR Y
int HORIZ = 5; // analog EJE Vr X
int Button = 9; // digital press button of joystick
int Rele1 = 1;
int Rele2 = 2;
int Rele3 = 3;
int Rele4 = 4;
int Rele5 = 5;
int Rele6 = 6;
int Rele7 = 7;
int Rele8 = 8;
int value =0;
int contador = 0;
int estadoanteriorboton =0;

// Also connect the joystick VCC to Arduino 5V, and joystick GND to Arduino GND.

// This sketch outputs serial data at 9600 baud (open Serial Monitor to view).

void setup()
{
Serial.begin(9600);

// make the Button line an input
pinMode(Button,INPUT);
// make the SEL line an output
pinMode(1,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);

// turn on the pull-up resistor for the Button line and also the outputs
digitalWrite(Button,HIGH);
digitalWrite(Rele1,HIGH);
digitalWrite(Rele2,HIGH);
digitalWrite(Rele3,HIGH);
digitalWrite(Rele4,HIGH);
digitalWrite(Rele5,HIGH);
digitalWrite(Rele6,HIGH);
digitalWrite(Rele7,HIGH);
digitalWrite(Rele8,HIGH);

// set up serial port for output

}

void loop()
{
value = digitalRead(Button);
int vertical, horizontal, select;

// read all values from the joystick

vertical = analogRead(VERT); // will be 0-1023
horizontal = analogRead(HORIZ); // will be 0-1023
select = digitalRead(Button); // will be HIGH (1) if not pressed, and LOW (0) if pressed

if(value != estadoanteriorboton){
if(value ==1){

contador++;
Serial.print(contador);
Serial.write(3);
if (contador==3){
contador=0;
}
}
estadoanteriorboton = value;

char value = Serial.read();
switch( value)
{
case '0':
if (VERT > 700) // si el valor vertical es mayor que 700 enciende el rele1
digitalWrite(Rele1,HIGH);
if (VERT < 323 )// si es menor que 323 enciende el rele2
digitalWrite(Rele2,HIGH);
if ((VERT > 323) && ( VERT < 700)){ // si esta en medio se apagan los dos
digitalWrite(Rele1,LOW);
digitalWrite(Rele2,LOW);
break;

case '1':
if (VERT > 700) // si el valor vertical es mayor que 700 enciende el rele1
digitalWrite(Rele3,HIGH);
if (VERT < 323 )// si es menor que 323 enciende el rele2
digitalWrite(Rele4,HIGH);
if ((VERT > 323) && ( VERT < 700)){ // si esta en medio se apagan los dos
digitalWrite(Rele3,LOW);
digitalWrite(Rele4,LOW);
break;

case '2':
if (VERT > 700) // si el valor vertical es mayor que 700 enciende el rele1
digitalWrite(Rele5,HIGH);
if (VERT < 323 )// si es menor que 323 enciende el rele2
digitalWrite(Rele6,HIGH);
if ((VERT > 323) && ( VERT < 700)){ // si esta en medio se apagan los dos
digitalWrite(Rele5,LOW);
digitalWrite(Rele6,LOW);
break;

}
}
}
}
}
}

Araldez:
Ya estoy de nuevo ,con ello , y ahora e conseguido que me muestre el modo en el que está en el serial monitor , pero nada mas, no activa relés ni nada por el estilo.

antes no funcionaba?

hay que analizar el código, si no entiendes algunas cosas, ve a la pestaña "Regerece" que esta en la cabecera de esta pagina.

prueba con esto:

int VERT = 7;     //  analog  Eje VR Y
  int HORIZ = 5;    //  analog EJE Vr X
  int Button = 9;   //  digital press button of joystick
  int Rele1 = 1;
  int Rele2 = 2;
  int Rele3 = 3;
  int Rele4 = 4;
  int Rele5 = 5;
  int Rele6 = 6;
  int Rele7 = 7;
  int Rele8 = 8;
  int value =0;
  int contador = 0;
  int estadoanteriorboton =0;
  
   // Also connect the joystick VCC to Arduino 5V, and joystick GND to Arduino GND.

   
    
      // This sketch outputs serial data at 9600 baud (open Serial Monitor to view).

   void setup()
     {
      Serial.begin(9600);
  
        // make the Button line an input
      pinMode(Button,INPUT);
      // make the SEL line an output
      pinMode(1,OUTPUT);
      pinMode(2,OUTPUT);
      pinMode(3,OUTPUT);
      pinMode(4,OUTPUT);
      pinMode(5,OUTPUT);
      pinMode(6,OUTPUT);
      pinMode(7,OUTPUT);
      pinMode(8,OUTPUT);
   
       // turn on the pull-up resistor for the Button line and also the outputs 
     digitalWrite(Button,HIGH);    
     digitalWrite(Rele1,HIGH);
     digitalWrite(Rele2,HIGH);
     digitalWrite(Rele3,HIGH);
     digitalWrite(Rele4,HIGH);
     digitalWrite(Rele5,HIGH);
     digitalWrite(Rele6,HIGH);
     digitalWrite(Rele7,HIGH);
     digitalWrite(Rele8,HIGH);
    

    // set up serial port for output
  
  }
 
 void loop()   
   {
  
     value = digitalRead(Button);
    int vertical, horizontal;// select;
  
   vertical = analogRead(VERT); // will be 0-1023
   horizontal = analogRead(HORIZ); // will be 0-1023
  // select = digitalRead(Button); // will be HIGH (1) if not pressed, and LOW (0) if pressed 
  
  //select comentada por ser redundante.
  
  
  /*  
    if(value != estadoanteriorboton){
      if(value ==1){
        
    contador++;
    Serial.print(contador);
    Serial.write(3);
    if (contador==3){
      contador=0;
      }
      }
      estadoanteriorboton = value;
      */
      
     
     
      // incrementa a contador, que es el valor que entra en el switch, si es mayor igual que 3 se regresa a cero, se imprime en el serial su valor.
      if(value){
      contador++;
      if(contador >= 3)
     {contador=0;}
      Serial.println(contador);
      delay(10);
      }
     
      //char value = Serial.read();
      switch(contador) //deacuerdo con el valor, se activara el grupo correspondiente.
    {
 case '0':
 if (VERT > 700) // si el valor vertical es mayor que 700 enciende el rele1
   digitalWrite(Rele1,HIGH);
 if (VERT < 323 )// si es menor que 323 enciende el rele2
   digitalWrite(Rele2,HIGH);
 if ((VERT > 323) && ( VERT < 700)){ // si esta en medio se apagan los dos
   digitalWrite(Rele1,LOW);
   digitalWrite(Rele2,LOW); 
 } 
   break;
       
  case '1':
  if (VERT > 700) // si el valor vertical es mayor que 700 enciende el rele1
   digitalWrite(Rele3,HIGH);
  if (VERT < 323 )// si es menor que 323 enciende el rele2
   digitalWrite(Rele4,HIGH);
  if ((VERT > 323) && ( VERT < 700)){ // si esta en medio se apagan los dos
   digitalWrite(Rele3,LOW);
   digitalWrite(Rele4,LOW); 
  } 
   break;
  
  
  case '2':
   if (VERT > 700) // si el valor vertical es mayor que 700 enciende el rele1
   digitalWrite(Rele5,HIGH);
   if (VERT < 323 )// si es menor que 323 enciende el rele2
   digitalWrite(Rele6,HIGH);
   if ((VERT > 323) && ( VERT < 700)){ // si esta en medio se apagan los dos
   digitalWrite(Rele5,LOW);
   digitalWrite(Rele6,LOW);
   }  
   break; 
   
     
 }
 }

¿que placa estas usando?

Estoy usando la un Arduino Mega 2560, ,
ahora en el serial monitor se ve como cambia el número de los modos , rapidamente , y no para , sólo para cuando pulso el joystick , si lo suelto, sigue cambiando como loco. :drooling_face:

otra dudilla sobre funcionamiento...los reles han de funcionar mientras el joystrick este arriba o abajo es decir jostick arriba:(suponiendo que esta funcionando grupo 1) enciende rele 1.palanca al centro:apaga rele 1 .palanca abajo:enciende rele 2.palanca al centro:apaga rele 2.?

no habia puesto mucha atencio a tu codigo los pines que utilizas para el joystick los repites para algunos reles.

como estas cableando todo?
puedes mostrarnos una imagen?

ehrja:
no habia puesto mucha atencio a tu codigo los pines que utilizas para el joystick los repites para algunos reles.

como estas cableando todo?
puedes mostrarnos una imagen?

No hay problema con eso ya que al usar analogRead el compilador entiende que quieres trabajar con
los pines analogicos.tambien se puede usar A0 A1 etc etc