Alimentação 5V
Proteção por optoacoplador
Ativado por sinal negativo.
Este módulo opera de forma muito semelhante aos modelos de 2 e 8 relês que forneço.
Fundo azul e letras cinzentas.
Compatível com o modelo FIT0021 da DFrobot
A visibilidade deste display não é muito boa. A escolha da cor de fundo e cor das letras não oferece um constraste muito bom.
Este display pode ser operado em dois modos: paralelo e serial. O Arduino tem velocidade suficiente para a operação serial, que economiza muitas conexões: apenas três saídas digitas são necessárias.
Compatível com a biblioteca u8glib. Para operação no modo serial, abra o exemplo GraphicsTest e “descomente” a linha:
//U8GLIB_ST7920_128X64 u8g(18, 16, 17, U8G_PIN_NONE);
O exemplo acima requer um Arduino Mega, mas se quiser usar um Arduino UNO:
U8GLIB_ST7920_128X64 u8g(3, 9, 8, U8G_PIN_NONE); // E: D3, RS: D8 e R/W:D9
É só um exemplo. Você é livre para escolher que pinos usar
Os exemplos Chess , “F” (sequer compilou) e menu não funcionaram comigo, nem no Duemilanove, nem no Mega.
Exemplos retirados do demo GraphicsTest:
Você também pode usar o demo da DfRobot. Imagem retirada dele:
Ao usar o demo GraphicsTest a imagem parecerá estar “de cabeça para baixo”. É normal.
Abaixo, cópias locais de alguns arquivos (links gerados automaticamente).
O consumo de cada relê, de acordo com o datasheet, é de 71mA. Assim, o módulo de oito canais alcança 568mA com todos os relês ligados. Se você ligar apenas um de cada vez, pode operar o módulo sem problemas usando apenas a alimentação do arduino conectado a uma porta USB. Mas estranhos problemas podem acontecer se você tentar ligar vários relês ao mesmo tempo sem providenciar uma fonte adequada. Os problemas variam caso a caso, porque algumas portas USB são capazes de fornecer mais que 500mA e depende também do resto do consumo de seu projeto, mas o sinal mais comum de que você excedeu a capacidade de corrente é não ouvir mais os relês fecharem, ou ouvir apenas um som débil.
De uma forma ou de outra, mesmo que o consumo esteja dentro da capacidade do Arduino, é recomendável separar as fontes, porque o acionamento das bobinas provoca uma perturbação na alimentação que pode afetar de múltiplas maneiras o seu projeto.
Cada módulo de relês tem um header de três pinos para alimentação. A posição do header e do jumper nele depende do módulo, mas sempre são claramente rotulados:
O jumper deve ser retirado para usar alimentação externa, mas nunca coloque na outra posição, pois isso deixa a alimentação (VCC e GND) em curto.
A placa opera por sinal negativo em cada uma das entradas IN. Embora isso possa parecer estranho ou até ilógico para alguns, é muito comum em aplicações industriais. Os sensores de proximidade refletivos e indutivos que vendo, por exemplo, são todos com saída negativa. Esses sensores são chamados de “NPN” no jargão da indústria local.
Este é o esquema aproximado de cada seção dos módulos:
Como o sinal de ativação é negativo (LOW), cuidados especiais precisam ser tomados no setup e utilização. Exemplo de código:
int Relay = 3; //relê ligado ao pino 3 void setup() { /*É necessário que seja feito nesta ordem, ou o rele vai dar um "rebote" ao energizar e a cada reset do arduino*/ digitalWrite(Relay, HIGH); //Configura o default do pino como HIGH pinMode(Relay, OUTPUT); //Configura o pino como saída } void loop() { digitalWrite(Relay, LOW); //Liga o relê delay(2000); digitalWrite(Relay, HIGH); //Desliga o relê delay(2000); }
Problemas comuns
Um ou mais relês não fazem barulho ou fazem um barulho muito mais baixo que o normal ao ligar
Verifique a fonte de alimentação. Ela não está fornecendo corrente suficiente.
O relê só liga quando eu mando desligar e vice-versa
O módulo opera com lógica negativa. Volte, releia o que foi explicado e estude o sketch de teste.
O arduino reseta quando mando ligar vários relês de uma vez, mesmo sem carga
Os relês já ligados desligam quando mando ligar vários relês de uma vez, mesmo sem carga
Você provavelmente está usando a mesma fonte que alimenta o Arduino para alimentar os relês e esta não aguenta o surto repentino de corrente. Alimente o módulo com uma fonte separada.
O arduino reseta quando mando ligar um relê com carga
Os relês já ligados desligam quando mando ligar um relê com carga
Em condições normais isso só ocorre se você está ligando uma carga que gera muito EMI, como um contactor. Você precisa providenciar filtros de EMI para sua carga. Esses filtros geralmente são compostos de um único capacitor ou de um conjunto resistor + capacitor em série (também chamado de filtro “snubber”).
Em anexo, cópia do datasheet do relê
A imagem abaixo mostra dois módulos iguais. Cada um com uma face da placa para cima.
E aqui está a documentação oficial
O endereço i2c do RTC é 0x68. Isso é definido no chip DS1307 e não pode ser configurado pelo fabricante do módulo, nem pelo usuário. A vantagem disso é que qualquer módulo RTC DS1307 substitui qualquer outro, sem precisar de configuração.
Funciona mesmo sem os resistores.
Funciona com a biblioteca RTCLib da Adafruit.
Para fazer o ajuste de data e hora com esta biblioteca, é preciso dar o seguinte comando no SETUP:
1 2 3 |
//A linha a seguir ajusta o RTC para a data e hora //em que este sketch foi compilado RTC.adjust(DateTime(__DATE__, __TIME__)) |
Execute apenas uma vez, depois remova ou comente o comando e grave o sketch de novo.
Equipado com memória I2C 24C32 de 32kbits (4KB). Datasheet.
A operação da EEPROM é independente do RTC. Lembre-se de que o Arduino tem uma EEPROM interna, por isso para usar a EEPROM do módulo é preciso usar rotinas feitas para acesso a EEPROM I2C, como esta.
Neste módulo é possível acrescentar um sensor de temperatura DS18B20. Mas não é lá grande vantagem, porque o DS18B20 não é i2C e vai requerer que você puxe mais um fio para o módulo. Além disso, você fica limitado a medir a temperatura nas proximidades do módulo.
Informações importantes sobre a operação com bateria
Segundo o datasheet do DS1307:
Este módulo foi projetado para usar uma bateria recarregável LIR2032, que completamente carregada chega a 4.2V e assim além de estar acima da tensão máxima de bateria para o DS1307, normalmente você precisaria fazer VCC ser 1.25*4.2= 5.25V para que ele funcionasse, o que é uma tensão “alta” e difícil de garantir. Para contornar esses problemas o projetista colocou um divisor de tensão entre a bateria e a entrada Vbat do DS1307 para que ele enxergue uma tensão menor. Com a bateria completamente carregada (4.2V) a tensão em Vbat, que você pode ler no terminal BAT de P1, é de cerca de 2.9V. Assim você precisa de um VCC de apenas 1.25*3 = 3,75V para operação total do RTC. Entretanto é recomendado alimentar o módulo sempre com 5V por causa dos componentes extras.
Um segundo problema criado por esse design é que se você quiser alimentar o módulo com uma bateria não-recarregável como a CR2032, com a bateria a 3V a tensão em Vbat será de 2.14V. Perigosamente perto do mínimo. Para fazer com que o módulo opere com a CR2032 você precisará eliminar o circuito de carga da bateria (basta remover D1) e o divisor de tensão (remova R4 e coloque um fio no lugar de R6).
O diagrama abaixo facilita a compreensão do que expliquei:
A durabilidade estimada de uma bateria CR2032 decente alimentando sozinha o DS1307 é de mais de 10 anos. Segundo o datasheet do DS1307 são necessários 48mAh para isso e uma Energizer CR2032 alcança 240mAh. Isso torna a decisão de usar uma bateria recarregável no módulo bastante questionável, principalmente porque esses módulos costumam vir da China com baterias LIR2032 de baixíssima qualidade que descarregam completamente em alguns meses e depois não conseguem ser carregadas. Eu comprei cerca de 130 módulos destes e só consegui salvar duas baterias.
Se você tiver uma fonte confiável de baterias CR2032 (que também costumam ser muito falsificadas) é melhor fazer a alteração no módulo para usá-las.
Relógio atrasando em grandes intervalos de uma vez
Talvez você tenha esquecido ativo no setup do sketch uma linha de código para inicializar a hora do RTC. Por exemplo, este é o método usado nos exemplos da RTClib:
rtc.adjust(DateTime(__DATE__, __TIME__));
__DATE__ e __TIME__ são substituídas automaticamente pela data e hora do seu computador no momento da compilação do programa e esses valores ficarão gravados no Arduino. O relógio parecerá funcionar bem enquanto energizado mas toda vez que o arduino conectado ao módulo for ligado ou resetado vai reconfigurar o relógio para esses valores. Se você estiver presente e observando a cada reset verá o relógio voltar sempre ao mesmo dia e horário e desconfiará da causa, mas se não estiver não perceberá o padrão e vai ficar propenso a confundir com um defeito.
Relógio congelado
Pode ter ocorrido o mesmo esquecimento do item anterior, mas em loop.
O módulo deve ser conectado conforme este diagrama:
Os pinos mudam porque trata-se da porta SPI, que está associada a pinos diferentes no mega.
Não é realmente necessário usar o pino ENC-INT. A Biblioteca Ethershield só usa interrupções em um dos exemplos. E nos meus testes programas simples funcionaram sem qualquer problema com esse pino desconectado.
Os pinos de entrada do ENC28J60 são tolerantes a 5V. Você deve alimentar com 3.3V, mas não há problema se o I/O for 5V, como é o caso do Arduino (exceto DUE).
Para download da biblioteca, que já vem com vários exemplos de uso, siga as instruções deste link.
Limitações
Ao rodar os exemplos de webserver da biblioteca, verá que são bem simples. Sem graça mesmo. Mas isso parece ser inevitável. Entre as limitações do ENC28J60 está o fato de que ele não pode lidar com múltiplos pacotes TCP-IP, então ele tem que mandar toda a página de uma vez, em um único pacote. Porém o tamanho de um pacote TCP-IP está limitado por padrão a algo em torno de 1500 bytes já contando com o overhead; então por segurança os exemplos usam buffers limitados a 500 bytes (não deveria ser tão drástico, mas talvez a biblioteca tenha outra limitação). Ou seja: o webserver não pode dar nenhuma resposta cujo HTML tenha mais que 500 bytes no total, mas código HTML não é nada “econômico” nesse sentido. O sintoma é que o webserver deixa de responder, ficando travado.
O tamanho desse buffer é definido nesta linha dos exemplos:
#define BUFFER_SIZE 500
Para complicar, o Arduino UNO/Duemilanove (ATMEGA328) tem apenas 2KB de RAM (o ATMEGA168 só tem 1KB) para ser usado por todo o seu sketch. Por isso, ao tentar contornar o problema aumentando o tamanho do buffer você corre o risco de travar todo o seu programa.
Veja bem: isso significa que não dá para fazer algo bonito como a GUI de um modem ADSL moderno com um ENC28J60 e um Arduino, porém não é esse o único propósito de uma conexão ethernet. O ENC28J60 é perfeitamente capaz como um meio de enviar comandos simples (por GET, por exemplo) e receber status via rede. Com 500 bytes por comando ou resposta dá para fazer muita coisa. Se você realmente não pode viver com essa limitação, precisa de um shield baseado em um chip com mais recursos, como o Wiznet W5100.
Nota: o ENC28J60 tem outras limitações. Eu só estou citando uma porque foi nessa que eu esbarrei.
Biblioteca Ethercard
O próprio autor da biblioteca ethershield anunciou que não atualizará mais a biblioteca e recomenda o uso da biblioteca Ethercard. Essa biblioteca é compatível com o módulo sem problemas, mas o pino CS precisa ser ligado ao pino D8 do Arduino UNO. Essa é a única diferença de conexão. Mas a biblioteca permite a escolha fácil do CS, que agora é definido na inicialização que é feita no sketch.
Por exemplo, para mudar o pino CS para 10, troque nos exemplos:
if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) //sem o parâmetro opcional, é usado D8.
por
if (ether.begin(sizeof Ethernet::buffer, mymac,10) == 0) // define D10 como CS
Também chamado de NRF24L01P. Esse módulo é usado em pares, mas pode ser vendido por unidade.
Note que esse é a versão “plus” do NRF24L01. Note também que o pinout é muito diferente. Para começar, o módulo NRF24L01 tem 10 pinos, enquanto o NRF24L01+ tem apenas 8.
Todos os meus módulos são testados com este demo (versão software SPI) ou com este (versão hardware SPI). Antes de testar com outros, teste com eles. Notar que as duas versões tem uma ligeira diferença na ligação (pinos D10 e D13 são trocados), mas elas são equivalentes. O arduino configurado com uma versão TX se comunica com um arduino configurado com qualquer das versões RX. Não é preciso instalar bibliotecas para rodar os demos.
Os exemplos da biblioteca RF24 parecem ser muito superiores, mas não consegui colocar para funcionar.
Comentários