Como controlar dos modulos Reles compartido con otro arduino.

Tengo 2 arduino UNO + 2 modulos de 8 reles, uno de ellos controla un modulo de 8 reles y el segundo controla otro modulo de 8 reles.

Necesitaria que el 1º arduino controlase 10 reles , ( los 8 de su propio modulo y usar 2 reles del modulo que es controlado por el 2º arduino ) ( tenia un modulo de 16 reles, "para el arduino que necesita controlar 10 " pero se averió y me tengo q apañar con lo que hay )

Exactamente lo que tengo es lo siguiente :
En una mismo registro de plástico (30x40) e instalado; 1º Arduino Uno que insertado lleva un shield Easy VR3 ( moduo reconocimiento de voz ) , modulo 8 reles + Fuente alimentación , 2º Arduino Uno + sensor de sonido, modulo 8 reles.

La idea:

El 1º Arduino UNO + Easy VR3 : tener un control sobre 10 reles para que me encienda varias luces de la casa a la orden de mi voz .

El 2º Aruino UNO + sensor de sonido : tener un control sobre 6 reles para que cuando de una palmada me active unos motores de 12v.

Los códigos ya están echos y probados , todo por separado funciona ok y no tengo que programar nada, es solo cuestión de ver como le "pillo prestado " 2 reles del 2º arduino.

Ademas estoy detectando lo siguiente:

Cuando digo (Enciende luz!) el 1º arduino me obedece y me activa el rele de su modulo , pero no se por que el 2º arduino me activa también un relé de su modulo, me he asegurado de que el micrófono no me estuviese detectando el "sonido " de la activación del relé , he probado bajar sensibilidad al miscrofono, pero nada. He pensado que cuando me activa un relé me baje un poco el consumo y por eso entiende arduino que hay una diferencia y me activa, además es muy curioso que cuando estoy midiendo con el tester la tensión de entrada del 2º arduino NUNCA se activa cuando enciendo la bombilla y cuando lo retiro se enciende a la vez. ::slight_smile: …curioso…

Dejo dos imágenes:
-1 De como lo tengo montado y funciona OK, ( a falta de resolver que cuando enciendo la Bombilla se me activa el motor ) >:(

-2 De como “creía” que tenia que cablearlo para usar 2 reles de un modulo diferente y no funciona. ( los cables lilas representan como “pilla prestado” :slight_smile: un reles de un modulo diferente )

Pd: Espero se entienda.

hola, a la espera de que alguien pueda ayudarte mejor, la placa de reles funciona a7 voltios o 5?
por otro lado, si es la placa de reles que yo conozco, cierra por masa en la entrada, lleva unos optoacopladores con positivo (5v) comun, por lo que creo que te falta la linea esta comun, es decir, que los 5v que hacen activar el optoacoplador debe ser comun para ambas placas y ambos arduinos.

la segunda imagen esta bien! solo te falta unir lo dos GND de ambos arduinos y ambas placas de reles y funcionara

GO_zalo:
la segunda imagen esta bien! solo te falta unir lo dos GND de ambos arduinos y ambas placas de reles y funcionara

Sii tenias razón !! ha sido conectar en común el GND y a funcionar. Gracias .

Solo me queda solventar el otro problemilla, el 95% de las veces que digo ENCENDER Luz! el arduino encargado de eso me obedece y me activa el relé correspondiente , Pero a la vez el otro arduino que se encarga de otra cosa también me activa un relé de su modulo. :o

Me explico e informo de las pruebas que he realizado :

-Conecto solo Arduino + easyvr + modulo rele, digo ENCENDER LUZ! y se activa su relé correspodiente.

-Conecto solo Arduino + sensor de sonido + modulo relé, doy una PALMADA! y se activa su relé correspodiente .

-Lo conecto todo " sin colocar la bombilla como se muestras el las fotos que subí " y funciona todo Ok. ( si digo ENCIENDE Luz se activa su relé y si doy palmada se activa su relé.

-Pero cuando lo conecto todo y coloco la bombilla es cuando viene el problema, Se enciende la bombilla y a la vez se activa un relé del arduino que funciona con las palmadas! :o

Creo que cuando está la bombilla y se enciende / apaga existe un pequeño consumo que provoca una minima variación de tensión y el arduino " de las palmadas" se piensa que ha sido el sensor de sonido que le ha mandado la señal y por eso me activa el relé . el sensor de sonido lo estoy usando con la salida D0 y ya he probado meterlo en varias entradas digitales , en la 0, 10, 11, … y nada todo igual.

A alguien se le ocurre el por que ? Estoy usando fuentes diferentes para alimentar los arduinos a 7v. para evitar variaciones de tensión, pero nada…sigue igual.

Me parece que tienes un problema de ruido electrico. El ruido que se genera al activar la bombilla que viaja por la red hasta las fuentes y lamentablemente tu segundo arduino reacciona. Pero en toda tu consulta no veo los códigos. Publícalos no sea cosa que estemos obviando algo simple. Lee las normas de como se insertan código e imágenes.

Hee porque usas dos módulos de sonido y no solo uno y que el Arduino que lo tenga se comunique con el segundo para las tareas que le corresponda a este ?

Bueno y porque dos Arduinos si con uno y un poco de ayuda (Integrados 595) extras puede expandir los puertos y prescindir del segundo.

surbyte yo estoy contigo cuando dices que tengo problema de ruido eléctrico..... Necesito dos arduinos por que tengo que tener uno en un lugar concreto de la casa ( para encender bombillas ) y el otro en la otra punta ( para encender un motor ) si coloco solamente uno, tendría que pasar un cable para llevar el micrófono de uno de los arduinos a la estancia deseada y con esa tirada de cable no me funcionaria bien, la jefa no quiere que pase cables .... No tiene sentido que cuando "No enrosco" la bombilla funciona a las mil maravillas y cuando "la enrosco " se me fastidia, además he provado lo siguiente y también me he quedado :o :

-Mido con el tester la alimentación del arduino " de las palmas " para intentar ver si cuando enciendo la bombilla, puedo detectar esa posible bajada de tensión en este; Enciendo y apago varias veces la bombilla con mi voz ( se pone en marcha el arduino con el Easy Vr) y resulta que NO VEO BAJADAS DE TENSION, LA BOMBILLA ENCIENDE/APAGA OK Y EL ARDUINO DE LAS PALMAS NO SE ENCIENDE SOLO, ahora quito el tester y phuufff vuelvo a lo mismo de siempre..... puede que el tester consiga retener las posibles séñales ruido de la alimentación del arduino y por eso cuando lo coloco va bien y cuando lo quito va mal?

Aquí dejo el Arduino + sensor sonido ( funciona con palmadas ) :

const byte Led6 =6;
const byte Led2 =2;
const byte Led3 = 3;
const byte Led4 = 4;  // defino Pin Led1
const byte Led5 = 5;  // defino Pin Led2
const byte buttonpin  = 10;  // Define D0 Sensor as Interface
byte i        = 0;  // Contador de palmadas
bool val;
bool valAnt = false;    // define numeric variables val
bool activar    = false;

void setup() {
  
  pinMode(Led2, OUTPUT);    // Define LED as output interface
  pinMode(Led3, OUTPUT);    // Define LED as output interface
  pinMode (Led4,OUTPUT);
  pinMode (Led5, OUTPUT); 
  pinMode(buttonpin,INPUT); // Define D0 Sensor as output Interface
  
}

void loop() {

     

  val = digitalRead(buttonpin); // digital interface will be assigned a value of 3 to read val


  if (val && !valAnt && !activar)  { // Cuando hay un cambio de nivel incremento el contador
    i++;
    activar = true;
  }
  valAnt = val;

  if (activar)
  {
    switch(i) {
            case 2:
      
      //SUBIR MOTOR !!!
      
          digitalWrite(Led2, HIGH);
          digitalWrite (Led3,HIGH); 
          delay(10000);
          digitalWrite(Led2, LOW);
          digitalWrite (Led3,LOW);
          break;
               
           case 1:  
  //BAJAR MOTOR !!!
           digitalWrite(Led4, HIGH);
          digitalWrite (Led5,HIGH);
          delay(10000);
          digitalWrite(Led4, LOW);
          digitalWrite (Led5,LOW);
          break;
      
   
                   
      default: i = 0;
          break;
    }


    
    activar = false;
  }
}

En otro post coloco el del Arduino + Easy vr que es muy largo y no me deja metero aquí.

Aquí dejo el código que controlo bombillas con la voz ( 0,1,2,3,4,5…enciendo/apago bombillas )

#include "Arduino.h"
#if !defined(SERIAL_PORT_MONITOR)
  #error "Arduino version not supported. Please update your IDE to the latest version."
#endif

#if defined(SERIAL_PORT_USBVIRTUAL)
  // Shield Jumper on HW (for Leonardo and Due)
  #define port SERIAL_PORT_HARDWARE
  #define pcSerial SERIAL_PORT_USBVIRTUAL
#else
  // Shield Jumper on SW (using pins 12/13 or 8/9 as RX/TX)
  #include "SoftwareSerial.h"
  SoftwareSerial port(12, 13);
  #define pcSerial SERIAL_PORT_MONITOR
#endif

#include "EasyVR.h"

EasyVR easyvr(port);

//Groups and Commands
enum Groups
{
  GROUP_1  = 1,
};

enum Group1 
{
  G1_0 = 0,
  G1_1 = 1,
  G1_2 = 2,
  G1_3 = 3,
  G1_4 = 4,
  G1_5 = 5,
  G1_6 = 6,
  G1_7 = 7,
  G1_8 = 8,
  G1_9 = 9,
  G1_10 = 10,
  G1_11 = 11,
};


int8_t group, idx;

void setup()
{
 
  pinMode (2,OUTPUT);
  pinMode (3,OUTPUT);
  pinMode (4,OUTPUT );
  pinMode (5,OUTPUT );
  pinMode (6,OUTPUT );
  pinMode (7,OUTPUT );
  pinMode (8,OUTPUT );
  pinMode (9,OUTPUT );
  pinMode (10,OUTPUT );
  pinMode (11,OUTPUT);

  digitalWrite (2,HIGH);
  digitalWrite (3,HIGH);
  digitalWrite (4,HIGH);
  digitalWrite (5,HIGH);
  digitalWrite (6,HIGH);
  digitalWrite (7,HIGH);
  digitalWrite (8,HIGH);
  digitalWrite (9,HIGH);
  digitalWrite (10,LOW);
  digitalWrite (11,LOW);

  
  // setup PC serial port
  pcSerial.begin(9600);

  // bridge mode?
  int mode = easyvr.bridgeRequested(pcSerial);
  switch (mode)
  {
  case EasyVR::BRIDGE_NONE:
    // setup EasyVR serial port
    port.begin(9600);
    // run normally
    pcSerial.println(F("---"));
    pcSerial.println(F("Bridge not started!"));
    break;
    
  case EasyVR::BRIDGE_NORMAL:
    // setup EasyVR serial port (low speed)
    port.begin(9600);
    // soft-connect the two serial ports (PC and EasyVR)
    easyvr.bridgeLoop(pcSerial);
    // resume normally if aborted
    pcSerial.println(F("---"));
    pcSerial.println(F("Bridge connection aborted!"));
    break;
    
  case EasyVR::BRIDGE_BOOT:
    // setup EasyVR serial port (high speed)
    port.begin(115200);
    // soft-connect the two serial ports (PC and EasyVR)
    easyvr.bridgeLoop(pcSerial);
    // resume normally if aborted
    pcSerial.println(F("---"));
    pcSerial.println(F("Bridge connection aborted!"));
    break;
  }

  while (!easyvr.detect())
  {
    Serial.println("EasyVR not detected!");
    delay(1000);
  }

  easyvr.setPinOutput(EasyVR::IO1, LOW);
  Serial.println("EasyVR detected!");
  easyvr.setTimeout(5);
  easyvr.setLanguage(4);

  group = EasyVR::TRIGGER; //<-- start group (customize)
}

void action();

void loop()
{
  easyvr.setPinOutput(EasyVR::IO1, HIGH); // LED on (listening)

  Serial.print("Say a command in Group ");
  Serial.println(group);
  easyvr.recognizeCommand(group);

  do
  {
    // can do some processing while waiting for a spoken command
  }
  while (!easyvr.hasFinished());
  
  easyvr.setPinOutput(EasyVR::IO1, LOW); // LED off

  idx = easyvr.getWord();
  if (idx >= 0)
  {
    // built-in trigger (ROBOT)
    // group = GROUP_X; <-- jump to another group X
    return;
  }
  idx = easyvr.getCommand();
  if (idx >= 0)
  {
    // print debug message
    uint8_t train = 0;
    char name[32];
    Serial.print("Command: ");
    Serial.print(idx);
    if (easyvr.dumpCommand(group, idx, name, train))
    {
      Serial.print(" = ");
      Serial.println(name);
    }
    else
      Serial.println();
    easyvr.playSound(0, EasyVR::VOL_FULL);
    // perform some action
    action();
  }
  else // errors or timeout
  {
    if (easyvr.isTimeout())
      Serial.println("Timed out, try again...");
    int16_t err = easyvr.getError();
    if (err >= 0)
    {
      Serial.print("Error ");
      Serial.println(err, HEX);
    }
     group = GROUP_1; // MUY IMPORTANTE , DECIR DONDE LO DIRIJIMOS POR PRIMERA VEZ PARA QUE SE SALTE EL group_0 !!!
  }
}

void action()
{
    switch (group)
    {
    case GROUP_1:
      switch (idx)
      {
      case G1_0:
  digitalWrite (2,HIGH);
  digitalWrite (3,HIGH);
  digitalWrite (4,HIGH);
  digitalWrite (5,HIGH);
  digitalWrite (6,HIGH);
  digitalWrite (7,HIGH);
  digitalWrite (8,HIGH);
  digitalWrite (9,HIGH);
  digitalWrite (10,LOW);
  digitalWrite (11,LOW);
        // write your action code here
        // group = GROUP_X; <-- or jump to another group X for composite commands
        break;
      case G1_1:
        digitalWrite (2,LOW);
        // write your action code here
        // group = GROUP_X; <-- or jump to another group X for composite commands
        break;
      case G1_2:
       digitalWrite (3,LOW); // write your action code here
        // group = GROUP_X; <-- or jump to another group X for composite commands
        break;
      case G1_3:
        digitalWrite (4,LOW);// write your action code here
        // group = GROUP_X; <-- or jump to another group X for composite commands
        break;
      case G1_4:
        digitalWrite (5,LOW);// write your action code here
        // group = GROUP_X; <-- or jump to another group X for composite commands
        break;
      case G1_5:
        digitalWrite (6,LOW);// write your action code here
        // group = GROUP_X; <-- or jump to another group X for composite commands
        break;
      case G1_6:
        digitalWrite (7,LOW);// write your action code here
        // group = GROUP_X; <-- or jump to another group X for composite commands
        break;
      case G1_7:
        digitalWrite (8,LOW);// write your action code here
        // group = GROUP_X; <-- or jump to another group X for composite commands
        break;
      case G1_8:
       digitalWrite (9,LOW); // write your action code here
        // group = GROUP_X; <-- or jump to another group X for composite commands
        break;
      case G1_9:
        digitalWrite (10,HIGH);// write your action code here
        // group = GROUP_X; <-- or jump to another group X for composite commands
        break;
      case G1_10:
       digitalWrite (11,HIGH); // write your action code here
        // group = GROUP_X; <-- or jump to another group X for composite commands
        break;
      case G1_11:digitalWrite (2,LOW);
  digitalWrite (3,LOW);
  digitalWrite (4,LOW);
  digitalWrite (5,LOW);
  digitalWrite (6,LOW);
  digitalWrite (7,LOW);
  digitalWrite (8,LOW);
  digitalWrite (9,LOW);
  digitalWrite (10,HIGH);
  digitalWrite (11,HIGH);
  // write your action code here
        // group = GROUP_X; <-- or jump to another group X for composite commands
        break;
      }
      break;
    }
}

Tu modulo de sonido tiene salida digital y salida analógica?

Si,tiene salida digital y analogica, pero no se como podria hacerlo funcionar con esa salida. Con la Analogica podria hacer un codigo para que a cada vez que haga una palmada se encienda y a la siguiente palmada se apague y a la siguiente palmada enciende y siguiente..........ect.?

Anadie se le ocurre como solucionar esto? :frowning:

Yo lo que haría es, detectar una palmada no solo porque se supera un umbral sino porque este umbral se mantiene x miliseg, y de ese modo descarto o filtro cosas que no son palmadas. El comienzo de la palmada inicia una cuenta usando millis(), si esta cuenta supera x miliseg entonces la tomo como palmada válida, sino descarto. Es lo mismo que cuando busco un antirebote, asi que puedes usar eso como guía.

Bueno, tal vez dirás y esto que tiene que ver!!!
pero no te dejes llevar por lo complicado que parezca y solo mira lo que hace.
Este código esta pensado para detectar los compases de la música para que alguien se llene de leds y estos respondan a la música electrónica.
A mi me interesa saber si esto puede ayudarte a detectar las palmas y discriminar algo que no es una palmada de algo que si.
Veamos como se comporta crudamente y tu luego das palmas y me dices como responde.
Lo importante es:

  1. toma muestras del canal A0, asi que lo cambias a gusto. El umbral esta controlado por un potenciómetro en A1, tendrás que agregarlo a tu Arduino.
  2. Dispara el pin2 que tambien puedes cambiar a gusto.
// Arduino Beat Detector By Damian Peckett 2015
// License: Public Domain.

// Our Global Sample Rate, 5000hz
#define SAMPLEPERIODUS 200

// defines for setting and clearing register bits
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

void setup() {
    // Set ADC to 77khz, max for 10bit
    sbi(ADCSRA,ADPS2);
    cbi(ADCSRA,ADPS1);
    cbi(ADCSRA,ADPS0);
   
    pinMode(2, OUTPUT);   //The pin with the LED
}

// 20 - 200hz Single Pole Bandpass IIR Filter
float bassFilter(float sample) {
    static float xv[3] = {0,0,0}, yv[3] = {0,0,0};
    xv[0] = xv[1]; xv[1] = xv[2]; 
    xv[2] = sample / 9.1f;
    yv[0] = yv[1]; yv[1] = yv[2]; 
    yv[2] = (xv[2] - xv[0])
        + (-0.7960060012f * yv[0]) + (1.7903124146f * yv[1]);
    return yv[2];
}

// 10hz Single Pole Lowpass IIR Filter
float envelopeFilter(float sample) { //10hz low pass
    static float xv[2] = {0,0}, yv[2] = {0,0};
    xv[0] = xv[1]; 
    xv[1] = sample / 160.f;
    yv[0] = yv[1]; 
    yv[1] = (xv[0] + xv[1]) + (0.9875119299f * yv[0]);
    return yv[1];
}

// 1.7 - 3.0hz Single Pole Bandpass IIR Filter
float beatFilter(float sample) {
    static float xv[3] = {0,0,0}, yv[3] = {0,0,0};
    xv[0] = xv[1]; xv[1] = xv[2]; 
    xv[2] = sample / 7.015f;
    yv[0] = yv[1]; yv[1] = yv[2]; 
    yv[2] = (xv[2] - xv[0])
        + (-0.7169861741f * yv[0]) + (1.4453653501f * yv[1]);
    return yv[2];
}

void loop() {
    unsigned long time = micros(); // Used to track rate
    float sample, value, envelope, beat, thresh;
    unsigned char i;

    for(i = 0;;++i){
        // Read ADC and center so +-512
        sample = (float)analogRead(A0)-503.f;

        // Filter only bass component
        value = bassFilter(sample);

        // Take signal amplitude and filter
        if (value < 0)
           value=-value;
        envelope = envelopeFilter(value);

        // Every 200 samples (25hz) filter the envelope 
        if(i == 200) {
                // Filter out repeating bass sounds 100 - 180bpm
                beat = beatFilter(envelope);

                // Threshold it based on potentiometer on AN1
                thresh = 0.02f * (float)analogRead(A1);

                // If we are above threshold, light up LED
                if(beat > thresh) 
                   digitalWrite(2, HIGH);
                else 
                   digitalWrite(2, LOW);

                //Reset sample counter
                i = 0;
        }

        // Consume excess clock cycles, to keep at 5000 hz
        for(unsigned long up = time+SAMPLEPERIODUS; time > 20 && time < up; time = micros());
    }  
}

Hoo!! tiene buena pinta, esta noche en llegar a casa le meto mano a ver que sale de ahi...

hufff…llevo un par de días probando esto y no soy capaz de hacerlo funcionar o quizas estoy haciendo algo mal. ( no creo que tenga los suficientes conocimientos y no he encontrado en ningún post algo que me ayude con esto ) yo sigo observando que si uso la salida Analogica del sensor de sonido evito las señales “ruido” y funciona bien , pero no sabría como meterle entremedias un contador para que a cada detección me realice una función diferentre ( a cada palmada una acción ) Esto me lleva a otro Hilo ( https://forum.arduino.cc/index.php?topic=371070.0) que gracias a surbyte me ayudó a hacerlo funcionar con la salida Digital y creo que tendré que morir y usar la salida Analogica par que todo fluya.

Aquí dejo el código que estoy trasteando:

int sensorPin = A0;   // Entrada Analogica Sensor sonido 

int SubirMotor = 2;    // Salida 

int sensorValue = 0;  // variable para almacenar el valor del sensor

int knockUp;




void setup() {

  // declarar la relayPin como salida:

  pinMode(SubirMotor, OUTPUT);  

  knockUp = 0;

  digitalWrite(SubirMotor, LOW); 

  Serial.begin(9600);

}




void loop() {

  // leer el valor del sensor:

  sensorValue = analogRead(sensorPin);    




 long startTime = millis();

 while(millis() - startTime < 2000){ // Ajuste tiempo entre palmada y palmada

      sensorValue = analogRead(sensorPin); 

       if (sensorValue > 800)// Ajuste humbral nivel ruido 

       {

        knockUp = knockUp + 1;

        

        delay(200);

        digitalWrite(SubirMotor, HIGH);

        Serial.println(knockUp, DEC); 

       } 

     }

  if (knockUp == 2){
   delay(200);
   digitalWrite(SubirMotor, LOW); 

   

  }

  knockUp = 0;

}

Nose si lo que tendría que hacer es recuperar el otro post y seguir por allí…

Up!

:confused: Nadie me puede ayudar? :confused:

Prueba con este código xuxe.

#define INTERVALO_PALMADA 150UL // 150 milisegundos pero ajusta el valor.
int sensorPin   = A0;   // Entrada Analogica Sensor sonido 
int UpMotor     = 2;    // Salida 
int DownMotor   = 7;
int sensorValue = 0;  // variable para almacenar el valor del sensor

int OnOff=0;

boolean activar = false;   // te cambié la lógica
boolean activoPalmada = true;
unsigned long tiempo1 = 0;
unsigned long startTime;

void setup() {
  // declarar la relayPin como salida:

  pinMode(UpMotor, OUTPUT);
  pinMode(DownMotor,OUTPUT);
  digitalWrite(UpMotor,LOW);
  digitalWrite(DownMotor, LOW); 
  Serial.begin(9600);
  startTime = millis();
}

void loop() {
  // leer el valor del sensor:

  if (activoPalmada) {  
      sensorValue = analogRead(sensorPin); 
      if (sensorValue > 750) {          // Ajuste humbral nivel ruido 
         activoPalmada = false;
         OnOff   = !OnOff;
         Serial.println(OnOff?"ON":"OFF");
         
         activar = true;            // cambié la lógica. Si se supera el umbral se activar = 1
         tiempo1 = millis();
      } 
  }
  else   
      if (millis() - startTime > INTERVALO_PALMADA) {
         activoPalmada = true; // rehabilito el control de palmadas
      }

  if (activar) {
    if (!OnOff) {
        digitalWrite(UpMotor, HIGH ); 
        if (millis() - tiempo1 > 5000UL) {
          digitalWrite (UpMotor,LOW); 
          activar = false;
        }
    }
    if (OnOff){
      digitalWrite(DownMotor, HIGH);
      if (millis() - tiempo1 > 5000UL) {
          digitalWrite(DownMotor,LOW);
          activar = false;
      } 
    }
 }
}