Módulo de relês 8 canais I2C

Este é o mesmo módulo de oito canais que eu já oferecia (siga o link para maiores detalhes sobre o módulo), agora com o acréscimo de um cabo que faz a interface I2C, reduzindo de oito para dois os pontos de i/o necessários. Até oito módulos idênticos podem ser conectados em paralelo, dando um total de 64 relês, usando os mesmos dois fios.

Posso fornecer com endereços I2C de 0x20 a 0x27. Caso não seja especificado, será enviado com qualquer valor que eu tenha em estoque. O endereço é claramente marcado na interface.

Minha convenção de cores na fiação que conecta ao Arduino (a interface mostrada na foto não segue esse padrão):

  • +5V: vermelho
  • GND: preto
  • SCL (CLOCK): Amarelo ou laranja – Arduino UNO: A5, Arduino Mega: 21;
  • SDA (DATA): qualquer outra cor (geralmente branco) – Arduino UNO: A4, Arduino Mega: 20;

As saídas do conversor são do tipo latch. Assim não há rebote quando você escreve outro valor na interface. Porém é preciso tomar o cuidado de manter um registro em memória de que saídas estão ligadas, para evitar desligá-las acidentalmente ao ligar outro relê. Mas não é nada que um uso simples de operações bitwise como “AND”, “OR” e “XOR” não resolva.

Falando assim parece difícil, mas na verdade é bem fácil quando as rotinas estão prontas. Você consegue ligar um relê com um comando simples do tipo “LigarRele(7)” sem perturbar nenhuma das outras saídas. Exemplo a seguir:


//aqui você coloca o endereço que escrevi na interface
#define ADDRESS 0x23

//Nesta variavel ficará a representação em memória do estado das saídas
//Depois de manipular as saídas na variável jogamos a variável para a interface.
//Assim é evitada a modificação do estado das saídas erradas
byte Saidas = 0;

#include <Wire.h>

void setup()
{
Wire.begin();
//Por precaução, mas não é realmente necessário.
DesligaTudo();
}

void loop()
{

//Testa cada um dos relês, desligando os outros
for (int i=1;i<9;i++){
LigarReleUnico(i);
delay(200);
}
DesligaTudo();
delay(200);

//agora no caminho inverso
for (int i=8;i>0;i--){
LigarReleUnico(i);
delay(200);
}

DesligaTudo();
delay(200);

//Todos os relês serão ligados em sequencia até ficarem todos ligados ...
for (int i=1;i<9;i++){
LigarRele(i);
delay(500);
}

//... e serão desligados na mesma ordem
for (int i=1;i<9;i++){
DesligarRele(i);
delay(500);
}

}

void DesligaTudo()
{
Saidas=0;
sendI2Cneg(Saidas);
}

byte BitPosToDec(byte BitPos)
//Para entender esta função você precisa entender numeração binária
//e o funcionamento do operador SHIFT (<< e >>)
{
int bt=1; //isso "liga" o bit menos significativo do byte
bt = bt << BitPos-1;//move o bit ligado para a esquerda
return(bt);
}

void LigarRele(byte rele)
{
//Esta função liga um relê sem perturbar o estado dos outros
byte x=BitPosToDec(rele);
Saidas = Saidas | x;
sendI2Cneg(Saidas);
}

void DesligarRele(byte rele)
{ //Esta função desliga um relê sem perturbar o estado dos outros
byte x=BitPosToDec(rele);
 // Saidas = Saidas ^ x;
 Saidas = Saidas &(~x); //corrigido em 04/07/2017
sendI2Cneg(Saidas);
}

void LigarReleUnico(byte rele)
{
//Esta função vai desligar qualquer outro relê que já esteja ligado
sendI2Cneg(BitPosToDec(rele));
}

void sendI2Cneg(byte b)
/*Seria mais elegante chamar esta função de "AtualizarSaidas",
mas seria preciso fazer outras modificações que tornariam
o uso mais chato. Preferi deixar assim.
O "neg" vem do fato de que o módulo de relês opera
com lógica negativa e por isso todos os bits precisam ser invertidos
ao enviar. Uma única operação XOR se encarrega disso */
{
Wire.beginTransmission(ADDRESS);

//compatibilizando com o Arduino 1.x
#if (ARDUINO >= 100)
Wire.write(b ^ 255); // XOR
#else
Wire.send(b ^ 255); // XOR
#endif
Wire.endTransmission();

}

Forma alternativa da função BitPosToDec, que pode ser mais fácil de entender

byte BitPosToDec(byte BitPos)
{
switch (BitPos) {
case 1:
return(1);
break;
case 2:
return(2);
break;
case 3:
return(4);
break;
case 4:
return(8);
break;
case 5:
return(16);
break;
case 6:
return(32);
break;
case 7:
return(64);
break;
case 8:
return(128);
break;
}
}

Tags: ,

  1. Marcio Duchewski Boruchosas Jr.’s avatar

    Jefferson, obrigado por manter o blog! Muito útil! Você escreve muito bem!

    Você vende estes produtos todos?
    Quanto custa o conjunto e quanto custa cada equipamento separadamente?
    Você envia pelos Correios?

    Grato pela disponibilidade!
    Abraços!

    Responder

    1. Jefferson’s avatar

      resposta enviada para o seu email em julho.

      Responder

    2. Táricris Vieira’s avatar

      Gentileza, condições de pagto e valores dos módulos de relés. Moro em Recife. Possível retirar em mãos. Grato pela atenção.

      Responder

      1. Jefferson’s avatar

        resposta enviada para o seu email.

        Responder

      2. Elizeu’s avatar

        Favor me envie preço de dois (Módulo de relês 8 canais I2Cs) e um (Teclado membrana de 16 teclas com interface I2C).
        Será que eu consigo ligar estes tres modulos usando a mesma porta do arduino?

        Responder

        1. Jefferson’s avatar

          Respondido para o seu email.

          Responder

        2. Ailtom Fabiano’s avatar

          muito bom o artigo.
          preciso de um módulo com 16 reles i2c. é possível?
          se não for usarei 2 de 8 potas.

          favor enviar valores .
          vlw .

          fico no aguardo.

          Responder

          1. Jefferson’s avatar

            Respondido para o seu email.

            Responder

          2. Marcos Paulo Nogueira’s avatar

            Olá, estou interessado nesse módulo. Ele funciona também no Raspberry pi

            obrigado

            Responder

          3. Roberto’s avatar

            I want to know and how I could buy if I am from another country modules

            Responder

          4. Nery Santos Freitas’s avatar

            Olá.Preciso acionar 12 LEDS (pinos do Arduino) com seu teclado e enviar a mensagem I2c ao mesmo tempo para o módulo Rele serial.Cada tecla ligaria e desligaria um led enviando também a mensagem serial I2c.É possível?Se eu comprar seus produtos posso ter algum suporte para o que foi descrito?Posso ligar 3 módulos relés?

            Cordialmente,Nery

            Responder

            1. Jefferson’s avatar

              Sim, o que você quer fazer é perfeitamente possível. Você precisa de seis interfaces i2c com endereços distintos. Mas eu só posso dar suporte para aplicação em compras superiores a R$1000.

              Responder

            2. Nery Santos Freitas’s avatar

              Desculpe,não informei adequadamente o que gostaria de fazer com seus produtos:

              Seria assim:Ligar um teclado 4×3 com I2c e o módulo de relês 8 canais I2c em um arduino uno,ao pulsar por exemplo a tecla 1,ligaria um pino do arduino e simultaneamente enviaria o protocolo I2C ao módulo de relês acontecendo o mesmo com as outras teclas,outro pulso desligaria o relê correspondente e o pino.Se possível gostaria de ligar três módulos relês perfazendo 24(relês) e três teclados nos quais eu usaria 12 teclas em cada.

              Responder

              1. Jefferson’s avatar

                OBS.: Você não tem portas suficientes em um UNO para acender 24 LEDs. Vai precisar de interfaces i2c para isso também.

                Responder

              2. leandro chamiso’s avatar

                Boa noite. Qual o valor deste cabo conversor, já com frete para Santos (11015-230)?

                Responder

                1. Jefferson’s avatar

                  O conversor não é vendido separadamente.

                  Responder

                  1. leandro chamiso’s avatar

                    qual o valor junto com a placa de rele?

                    Responder

                    1. Jefferson’s avatar

                      A mercadoria custa R$79 e você pode pagar com cartão de crédito via MercadoPago aqui:
                      http://produto.mercadolivre.com.br/MLB-741560126-modulo-de-rels-serial-i2c-8-canais-5v-em-recife-_JM

                      Direto comigo sai por R$72

                      Frete:

                      PAC Valor: R$ 27,80 Prazo de entrega: 7 dia(s) úteis após a postagem
                      SEDEX Valor: R$ 68,50 Prazo de entrega: 2 dia(s) úteis após a postagem

                      Responder

                    2. Jefferson’s avatar

                      O exemplo tinha um erro na rotina DesligarRele que foi corrigido

                      Responder

                    3. Léo Renan’s avatar

                      Boa tarde, Qual o valor desse kit completo? Você realizaria o envio para São Paulo para o CEP 03152-155? Preciso de 8 kits

                      Responder

                      1. Jefferson’s avatar

                        Não estou fazendo envio para fora do estado no momento, pois não emito NF.

                        Responder

                      2. Erivaldo santos ferreira’s avatar

                        ola amigo bom dia .. vi o seu conversor i2c tenho um PROJETO para ligar 32 rele via arduino .porem naum ha portas suficientes para tal . gostaria de saber se eh possivel criar 32 enderecos no i2c para usar no modulo rele .? caso haja como faco para adquerir o conversor para os 32 canais ?

                        Responder

                        1. Jefferson’s avatar

                          Você não precisa de 32 endereços i2c. É um endereço para cada módulo de 8 canais. Então você precisa de 32/8 = 4 módulos i2C com diferentes endereços. Cada um deles custa R$49 sem os relês e sem o frete. Cada conjunto completo de módulo de relês i2C 8 canais como o mostrado na página custa R$69 + frete.

                          Responder

Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *