Sensor infravermelho refletivo

  • Alimentação 5V;
  • Corrente 100mA (especificado pelo fabricante);
  • Lógica negativa – Saída 0V quando o sensor está atuado (a indústria chama de “sensor NPN”);
  • LED indicador de atuação;
  • Alcance ajustável de 3 a 50cm por trimpot;
  • Razoavelmente direcional. Colocado sobre uma mesa, não detecta a mesa mesmo com o ajuste  para cerca de 30cm. Para distâncias maiores ele começa a “ver” a mesa. 

Este sensor não requer arduino ou outro microcontrolador para ser usado. Por exemplo, ele pode ser conectado diretamente a qualquer uma das entradas dos módulos de relês que ofereço. Mas é claro que se algum condicionamento do sinal for necessário (um retardo, por exemplo), o arduino torna-se util.

Sensor de gases MQ-2 – Modelo com saídas analógica e digital

 

 

Este sensor usa o mesmo elemento de detecção, MQ-2, do modelo analógico, mas opera de maneira diferente. Neste modelo o trimpot é multivoltas e se destina a ajustar o ponto de gatilho da saída digital, não tendo qualquer interferência sobre a saída analógica.

Atenção: Eu não me responsabilizo pela eficiência deste sensor nem pelo resultado de quaisquer testes malucos que alguém venha a fazer para comprová-la. Não brinque com gases inflamáveis sem a assistência de um especialista. Se você não entende 100% do que está escrito nos datasheets (eu não entendo) então você precisa de orientação profissional para colocar esse sensor em uma aplicação séria. Considere tudo o que eu escrevo aqui como dicas amadoras apenas.

Para ter uma idéia da dificuldade envolvida, notar que os datasheets mostram gráficos de sensibilidade relativos a uma concentração de 1000ppm de hidrogênio, mas na nossa atmosfera a concentração não passa de 1ppm.

Sensor de gases MQ-2 – Modelo com saída analógica apenas

 

Confira os datasheets do sensor MQ-2 aqui e aqui (são diferentes)

Segundo o datasheet, é capaz de detectar fumaça, GLP (gás de cozinha), butano, propano (são os dois gases presentes no GLP), metano,  hidrogênio e alcool.
Este sensor depende do aquecimento de um elemento interno para operar. Isso precisa ser levado em conta nos testes e, principalmente, na utilização. Por exemplo, é necessário que o seu programa conte um tempo desde o início da execução, quando uma leitura elevada do sensor deverá ser ignorada. Em caso de falta de energia o sensor irá esfriar e quando a energia voltar haverá um falso alarme se isso não for levado em conta.

Testes básicos de funcionamento

Você nem precisa do arduino para testar este sensor. Um multímetro na escala de tensão é perfeitamente capaz de exibir as variações na saída analógica.

Sketch de teste

const int analogInPin = A0; 

int sensorValue = 0;
int outputValue = 0; 

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

void loop() {
  sensorValue = analogRead(analogInPin);           
  Serial.print("sensor em A0 = " );                      
  Serial.println(sensorValue);     
 
  delay(500);                    
}

Alimente o sensor com +5V e a saída à entrada analógica A0. Monitore o valor usando o serial monitor.

Gire o trimpot inteiramente no sentido anti-horário para máxima sensibilidade.

Aguarde um minuto até que a leitura estabilize.

Você verá o valor presente na porta serial ir diminuindo.

Detecção de GLP

Coloque o sensor dentro de um copo.

Aponte um isqueiro para o fundo do copo e acione-o por uma fração de segundo (sem a chama – só queremos o gás). Você deverá ver a leitura dar um salto grande.Por exemplo, se estiver estabilizada em 300, a leitura vai saltar para mais de 700. Em seguida voltará ao normal vagarosamente.

Detecção de Alcool

Coloque a “cabeça” do sensor na boca de uma garrafa de alcool aberta. A leitura deverá saltar.

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
361 Downloads
Detalhes...
Arduino Library  - Keypad I2C
Arduino Library - Keypad I2C
Arduino Library - Keypad_I2C.zip
866.3 KiB
407 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;
}
}

Software Arduino

Alguns clientes, novatos no mundo do Arduino, estranham o fato da placa não vir com nenhum CD. Isso é normal, porque o software é gratuito e disponibilizado no site do projeto. Qualquer cópia que eu coloque em CD corre o risco de se tornar obsoleta. E o custo do CD e do meu tempo para gravá-lo seria pago pelo cliente. Não vejo razão para isso.

Se você usa Windows, aqui estão os links diretos para as versões mais usadas do IDE (Integrated Development Environment):

O driver para que o Windows reconheça as placas está no sub-diretório “drivers”.

Eu recomendo que você tenha no mínimo as versões 0022 e 1.01. Esta por ser a mais recente e a outra porque muitas bibliotecas e exemplos que você vai encontrar pela internet  ainda não foram adaptadas para as versões 1.x do IDE.

Ethernet shield w5100: Teste completo

O teste completo envolve o uso do slot microSD. Você pode usar apenas ele ou pode usar o w5100 sem o acesso ao cartão. Aproveitando essa independência, certifique-se de que você já tenha sido capaz de colocar o shield para funcionar usando os exemplos que vem com o IDE Arduino. Não tente partir direto para um teste completo, quando você pode testar as partes primeiro.

Tenha em mente que ao lidar com arquivos no arduino você vai precisar voltar no tempo e relembrar (ou se familiarizar com) as diferenças entre FAT16 (FAT) e FAT32 e suas limitações. Em geral, o menor denominador comum, garantido de funcionar em todos os casos, será um cartão de até 2GB formatado em FAT16 (FAT). Maior que isso ou formatado com outro sistema e você poderá ter problemas.

Testando o w5100 (arduino 0022 ou 1.01):

File->Examples->Ethernet->Webserver

Altere o endereço IP no sketch para que combine com sua rede e tente acessá-lo usando o browser. Se tudo correr bem você verá uma lista dos valores nas entradas analógicas do arduino.

Testando o slot microSD  (arduino 0022 ou 1.01):

File->Examples->SD->Files

Coloque o cartão no slot e abra o monitor serial. Se tudo estiver OK você verá algo parecido com isto:

Se você encontrar algo muito diferente, como a mensagem “initialization failed!”, não adianta prosseguir com o teste completo. Verifique se o cartão está corretamente formatado. Testado com um cartão FAT16 de 2GB e com um cartão FAT32 de 8GB.

Teste completo

Requerimentos:

  • Um cartão microSD corretamente formatado. Eu padronizei meus testes com um cartão de 2GB formatado com FAT16, mas já testei sem problemas com um cartão de 8GB formatado com FAT32.
  • O IDE Arduino 0022 (veja em “Previous IDE versions”). Todos os meus testes são feitos com essa versão, mas se quiser usar a versão 1.01, veja o final deste texto.
  • A biblioteca SDFATlib – Extraia o conteúdo do ZIP e coloque o diretório SDfat no diretório libraries. Importante: use a versão do meu link. A versão mais recente não compila no arduino 0022.
  • O sketch SDWebBrowse da Adafruit (use a versão .pde)

Mude o sketch para o IP refletir a configuração da sua rede (digamos que seja 192.168.254.177).

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 254, 177 };
Server server(80);

Coloque um cartão no slot e faça o upload do sketch

Importante: sem um cartão corretamente formatado e com arquivos no slot, o exemplo da adafruit vai ficar travado. Nem sequer responderá a um ping.

Agora, de qualquer browser, tente acessar o arduino direto pelo IP:  http://192.168.254.177/

A resposta deverá ser a lista de arquivos no cartão. Atenção: este sketch não tem a capacidade de entrar em pastas, nem exibir imagens. Mas você conseguirá ver o conteúdo de arquivos .txt.

Outro modo de testar é abrindo o monitor serial. Se algo der errado, ele exibirá apenas algo assim:

Mas se estiver tudo certo aparecerá uma lista completa do conteúdo do cartão.

Mensagens de erro

“‘Sd2card’ does not name a type’ – você não instalou a biblioteca SDFatlib corretamente

“cannot declare aparameter ‘client’ to be of abstract type client” – você está usando uma versão do sketch que só funciona com o Arduino 002x, no Arduino 1.x.

Arduino 1.0.1

Para que funcione na versão mais nova do IDE, siga todo o meu procedimento, fazendo as seguintes alterações:

Apesar de eu não ter migrado ainda para essa versão do IDE, fiz um teste aqui e tudo pareceu normal

Para mais informações sobre o funcionamento dos sketches, visite a página da autora.