Home › Category Archives › Produtos

Display LCD serial I2C 2004 com interface destacável

Este post trata apenas do específico sobre o modelo de 20 colunas e 4 linhas (2004). Para maiores informações sobre o produto, leia o post sobre o modelo 1602.

Teste básico de funcionamento:

#include <Wire.h>;
#include <LiquidCrystal_I2C.h>;
//Aqui definimos endereço, número de colunas e linhas

LiquidCrystal_I2C lcd(0x27,20,4);
void setup()
{
  lcd.init();  
 
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Linha zero 123456789");
    lcd.setCursor(0, 1);
  lcd.print("Linha um   123456789");
    lcd.setCursor(0, 2);
  lcd.print("Linha dois 123456789");
    lcd.setCursor(0, 3);
  lcd.print("Linha tres 123456789");
}

void loop()
{
}

Módulo L298N – driver para motores (Ponte H dupla) – Modelo B

Teste básico de funcionamento
Não requer motores, nem o Arduino

Notar que este módulo funciona com lógica contrária à do módulo Modelo A

O jumpers 5V_EN precisa estar no lugar.

Conecte 12V nos terminais VMS e GND.
Todos os LEDs devem acender, indicando que há tensão em VCC e que o regulador 5V na placa está funcionando

Em sequência conecte, um de cada vez, os terminais IN1, IN2, IN3 e IN4 ao terminal GND.

Os LEDs L1, L2, L3 e L4 devem apagar na mesma sequência e sempre um de cada vez.

Se você tiver motores 12V conectados, os motores irão girar um de cada vez, num sentido de cada vez.

Para desabilitar os motores, conecte os terminais ENA e ENB a GND (eles estão conectados a +5V internamente na placa, pelos resistores 01 e 02, de 1K). Mas os LEDs continuarão sendo acionados, porque estão conectados diretamente aos terminais de controle.

Módulo L298N – driver para motores (Ponte H dupla) – Modelo A

  • LEDs L1 a L4: Indicam que motor está ligado e em que direção está girando. Correspondem diretamente às entradas IN1 a IN4;
  • IN1 e IN2: Controle do Motor 1 (cada entrada faz girar em uma direção) ;
  • IN3 e IN4: Controle do Motor 2 (cada entrada faz girar em uma direção);
  • VCC: A alimentação dos motores (exemplo: se os motores forem de 12V, ligue 12V aqui);
  • 5V: Alimentação para o CI L298N. Se estiver usando uma tensão de motor acima de 7V, pode deixar desconectada, porque a alimentação dos motores alimentará também o CI por meio do regulador 78M05; Você só precisa conectar 5V aqui se estiver usando motores de tensão muito baixa.

Teste básico de funcionamento
Não requer motores, nem o Arduino

Notar que este módulo funciona com lógica positiva, que é contrária à do módulo Modelo B

Os jumpers ENA-5V e ENB-5V precisam estar no lugar.

Conecte 12V nos terminais VCC e GND.

Deixe pressionada a chave SW1

O LED DS5 deve acender, indicando que há tensão em VCC e que o regulador 5V na placa está funcionando

Em sequência conecte, um de cada vez, os terminais IN1, IN2, IN3 e IN4 ao terminal 5V.

Os LEDs L1, L2, L3 e L4 devem acender na mesma sequência e sempre um de cada vez.

Se você tiver motores 12V conectados, os motores irão girar um de cada vez, num sentido de cada vez.

Para desabilitar os motores, retire os jumpers ENA e ENB. Os LEDs L1 a L4 vão deixar de acender também, porque estão conectados às saídas.

Teclado membrana de 16 teclas com interface I2C

Este é o mesmo teclado membrana que eu já oferecia, 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.

Posso fornecer com endereços I2C de 0x20 a 0x26 (pode ser 0x27 também, mas evito usar este porque é o endereço fixo do meu display). Caso não seja especificado, será enviado com qualquer valor que eu tenha em estoque. O endereço é claramente marcado na região preta que envolve o circuito.

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
  • SDA (DATA): qualquer outra cor (geralmente branco)
  • INTERRUPT: Verde – Nem todos os meu teclados saem com esse fio. Ele sinaliza que houve uma mudança no estado das entradas. Na maioria dos casos você pode deixar solto.

O uso é bem simples.

Usando Arduino 0022:

Requer a biblioteca i2ckeypad de Angel Sancho.

Sketch adaptado do exemplo fornecido com a biblioteca.


#include <Wire.h>
#include <i2ckeypad.h>

#define linhas 4
#define colunas 4
#define endereco 0x20

i2ckeypad teclado = i2ckeypad(endereco, linhas, colunas);

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

Wire.begin();

teclado.init();

Serial.print("Testando Teclado I2C. Aperte teclas agora.\n\n");
}

void loop()
{
char key = teclado.get_key();

if(key != '\0') {
Serial.print(key);
}
}

Usando Arduino 1.0x
Você precisa da biblioteca Keypad_I2C, de Alexander Brevig
E do seguinte sketch:

/*
|| Adaptado do exemplo CustomKeypad de Alexander Brevig
*/
#include <Keypad_I2C.h>
#include <Keypad.h>
#include <Wire.h>

#define Endereco_I2C 0x20

const byte NumLinhas = 4;
const byte NumColunas = 4;
//Essa matriz tem que corresponder à aparência física do teclado
char hexaKeys[NumLinhas][NumColunas] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[NumLinhas] = {0, 1, 2, 3}; //Aqui você define que pinos estão ligados às linhas do teclado
byte colPins[NumColunas] = {4, 5, 6, 7}; //e aqui os pinos ligados às colunas

//inicializa uma instância da classe NewKeypad
Keypad_I2C customKeypad( makeKeymap(hexaKeys), rowPins, colPins, NumLinhas, NumColunas, Endereco_I2C);

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

void loop(){
  char customKey = customKeypad.getKey();

  if (customKey != NO_KEY){
    Serial.println(customKey);
  }
}

Cópias locais das bibliotecas:

Arduino Library I2ckeypad-20090224-3
Arduino Library I2ckeypad-20090224-3
arduino_library_i2ckeypad-20090224-3_v0.1.zip
Version: 0.1
27.3 KiB
360 Downloads
Detalhes...
Arduino Library  - Keypad I2C
Arduino Library - Keypad I2C
Arduino Library - Keypad_I2C.zip
866.3 KiB
406 Downloads
Detalhes...

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

Teclado membrana com 16 teclas

Os pinos foram identificados por mim na foto apenas. O teclado não tem as marcações.

Você precisa da biblioteca Keypad. Com ela,  o teclado pode ser ligado diretamente a oito pinos do Arduino, sem necessidade de qualquer outro componente. Atenção: a versão mais recente da biblioteca funciona com Arduino 0.2x ou 1.x, mas para que os exemplos apareçam na lista do Arduino 0.2x você precisa ir em cada diretório dentro de Examples e renomear os arquivos .ino para .pde.

Conecte o teclado aos pinos 2 a 9 do Arduino. Abra o exemplo keypad -> CustomKeypad e faça a seguinte modificação:


char hexaKeys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {2, 3, 4, 5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {6, 7, 8, 9}; //connect to the column pinouts of the keypad

Abra o Serial Monitor. Cada tecla pressionada deve aparecer corretamente na porta serial.

Esta versão da biblioteca também permite detectar mais de uma tecla pressionada. Use este sketch para testar essa capacidade:

#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {2, 3, 4, 5}; //connect to the row pinouts of the kpd
byte colPins[COLS] = {6, 7, 8,9}; //connect to the column pinouts of the kpd

Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

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

void loop(){

if (kpd.getKeys())
{

for (int i=0; i<LIST_MAX; i++)   // Scan the entire list for any active keys.
{
if (kpd.key[i].kchar)    // Check for an active key.
{
switch (kpd.key[i].kstate) {
case HOLD:
Serial.print("Key ");
Serial.print(kpd.key[i].kchar);
Serial.print(" is being HELD and the state ");
if (!kpd.key[i].stateChanged)
Serial.println("has not changed.");
else
Serial.println("has changed.");
break;
case PRESSED:
Serial.print("Key ");
Serial.print(kpd.key[i].kchar);
Serial.print(" is PRESSED and the state ");
if (!kpd.key[i].stateChanged)
Serial.println("has not changed.");
else
Serial.println("has changed.");
break;
case RELEASED:
Serial.print("Key ");
Serial.print(kpd.key[i].kchar);
Serial.print(" has been RELEASED and the state ");
if (!kpd.key[i].stateChanged)
Serial.println("has not changed.");
else
Serial.println("has changed.");
break;
default:
Serial.print("Key ");
Serial.print(kpd.key[i].kchar);
Serial.print(" is IDLE and the state ");
if (!kpd.key[i].stateChanged)
Serial.println("has not changed.");
else
Serial.println("has changed.");
}
}
}
}
}

Módulo sensor de movimento PIR

  • Alimentação: 4.5 a 20V (Informado pelo fabricante – eu só testei com 5V);
  • Saída: 3.2V (movimento detectado) ou 0V (sem movimento);
  • Proteção contra inversão de polaridade por diodo em série;
  • Funciona normalmente com o Arduino;
  • Ajustes de sensibilidade e tempo de atuação;
  • Controle de redisparo.

Este módulo é quase autônomo. Não é necessário um microcontrolador para fazer uso dele.

Com ajuste de sensibilidade e tempo que a saída fica ligada (de 3 segundos a 3 minutos – o tempo exato varia de módulo para módulo).

Como todo sensor PIR, é preciso esperar de 20 a 60s após energizar para que o sensor estabilize (warm-up). Isso sob condições normais de temperatura, porque em lugares muito frios, como uma câmara frigorífica, esse tempo pode chegar a vários minutos. Antes da estabilização o sensor não é confiável. Nos meus testes, percebi que todo movimento é ignorado nesse período. Este FAQ da empresa de produtos de segurança CROW tem mais informações interessantes sobre o comportamento de um sensor PIR.

Por meio de um jumper é possível configurar dois modos de redisparo:

  • Redisparável – Enquanto houver movimento o sensor continua com a saída ativa. O sensor “redispara” a cada movimento detectado e começa a contar o tempo para desligar, mas começa a contagem de novo se outro movimento for detectado antes.
  • Não redisparável – O sensor ignora qualquer movimento enquanto está contando o tempo para desligar

Alguns módulos não tem indicação de propósito dos trimpots. Olhando o módulo com os componente para cima o da esquerda é o de sensibilidade e o da direita o de tempo.

Sensor de som

 

  • Alimentação 5V;
  • Saída analógica proporcional ao som;
  • Saída digital com limiar ajustado por trimpot multi-voltas.

Teste:

A placa tem dois LEDs:

  • L1 – Sempre ligado enquanto estiver energizado (power)
  • L2 – Sinaliza saída digital ligada.

O trimpot usado é do tipo multi-voltas infinito.

Vá girando o trimpot no sentido anti-horário até que L2 apague. Depois gire nos dois sentidos até que L2 fique em um limiar onde uma movimentação muito pequena no sentido horário acenda o L2. Bata com o dedo sobre o microfone ou com o módulo na mesa e L2 deve piscar acompanhando as batidas. O sensor estará funcionando.

Para ajustar à sua aplicação, vá fazendo testes movendo o trimpot mais no sentido anti-horário até que o sensor não dispare mais à toa mas ainda dispare com o som que você deseja. Por favor note que esse é um sensor muito simples, incapaz de diferenciar entre ruídos diferentes, por isso tem número limitado de aplicações.

Sensor de corrente ACS712

  • Mede corrente alternada ou contínua;
  • Opera por efeito hall – baixíssima resistência interna – Não interfere com o circuito a ser medido;
  • Eletricamente isolado até 2.1kV – Você pode medir corrente em um circuito vivo de 127, 220V ou 380V sem medo de levar choque na placa de medição;
  • Por medir CA, a saída é VCC/2 quando a corrente é zero. Para corrente negativa, a saída se aproxima de 0V. Para corrente positiva, a saída se aproxima de VCC;
  • É possível medir o valor RMS de uma corrente alternada desde que seja feita a amostragem de forma correta;
  • Disponível em modelos de 5A, 20A e 30A (mesmo preço);
  • Pode ser usado em qualquer projeto eletrônico (não é necessário haver um microcontrolador envolvido) e qualquer microcontrolador com entradas analógicas, mas só ofereço exemplos de uso e programas para o Arduino;

Datasheet do CI ACS712

Display LCD serial I2C 1602 com interface destacável

Precisando de pinos livres extras no seu projeto ou passar um cabo com uma dúzia de fios até o LCD está te incomodando?

  • Display serial completo. Só requer alimentação de 5V e dois fios para o bus I2C. Responde no endereço 0x27 (interface vermelha) e 0x20 (interface preta);
  • Como se trata de I2C, que é um bus (compartilhado por natureza), podemos até dizer que não ocupa pino nenhum;
  • Controle de contraste via trimpot integrado;
  • Backlight pode ser desligado/ligado com comandos de software;
  • Compatível com qualquer microcontrolador que possa se comunicar por I2C, mas somente dou suporte ao Arduino;
  • Compatível com a biblioteca LiquidCrystal_I2C do Arduino;
  • Interface destacável. Você pode usá-la em qualquer display que tenha o mesmo pinout (veja pinout na foto abaixo);
  • Posso fornecer o produto na forma de kit, sem headers soldados.

Instruções de uso

O display funcionará igualmente com o Arduino Uno/Duemilanove ou Mega sem modificações nos sketches, mas atente para o fato de que o bus i2c fica em pinos diferentes em cada modelo:

  • No Uno/Duemilanove: Pinos analógicos A4 e A5
  • No Mega: Pinos 20 e 21

O display é compatível com o modelo da DFROBOT. Baixe esta biblioteca (supostamente compatível com IDE 1.0 e 0.2x,mas só testei com 0.22), descompacte no diretório libraries (certifique-se de que os arquivos fiquem em libraries/LiquidCrystal_I2C) e rode o exemplo LiquidCrystal_I2C -> Custom Chars.

Todos os displays são testados por mim e saem com o contraste ajustado, mas se por acaso você mexer no trimpot e a imagem não estiver mais aparecendo, gire o trimpot nos dois sentidos até que apareça. Um ajuste incorreto não danificará o display, por isso pode mexer à vontade.

Cópia local da biblioteca: