domingo, 14 de agosto de 2016

Módulo rfid MFRC522 + ARDUINO + LCD 16x2 I2C




Nesse exemplo o primeiro cartão é lido e seu número de série é armazenado em uma variável.
Depois ao aproximar um cartão, este é lido e seu número é comparado com o número armazenado. Se forem iguais mostra a mensagem " ACESSO LIBERADO" caso contrário mostra "ACESSO NEGADO".
Como é um programa teste não me preocupei em armazenamento não volátil do número de série do cartão valido.  Para uso real será necessário, pro exemplo, alterar o código para armazenar o número de série do cartão "válido" na memoria eprom do arduino.

Material utilizado:

Módulo RFID MFRC522 (datasheet)
Arduino UNO (foi usado um similar)
Display LCD 16x2 com módulo I2C.
Jumpers

Ligação:




Código:

/* adaptado do codigo que acompanha a biblioteca MFRC522:
https://github.com/ljos/MFRC522

Este exemplo armazena o numero primeiro cartão lido em uma variavel
A partir ao aproximar um catão é feita a comparação entre o valor lido do cartão e o valor armazenado.
As informações são mostrada em um display 16x2 via comunicação I2C.
*/

// bibliotecas
#include <SPI.h>  // padrão do arduino
#include <MFRC522.h>  // necessário adicionar na pasta libraries do arduino
#include <Wire.h> // padrão do arduino
#include <LiquidCrystal_I2C.h> // necessário adicionar na pasta libraries do arduino

LiquidCrystal_I2C lcd(0x27,16,2);
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);    // cria uma intancia MFRC522 com o nome mfrc522

int *aux;
int card1[4];
int flag = 0;
int led = 13;
int cnt =0;

void setup() {
        pinMode(led, OUTPUT);
        
        lcd.init();
        lcd.backlight();
    SPI.begin();        // Init SPI bus
    mfrc522.PCD_Init();    // Init MFRC522 card
        lcd.print(" Aproxime o card");
        lcd.setCursor(0,1);
        lcd.print(" Para registro  ");
}

void loop() {
    // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
    }

    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
    }

    // Now a card is selected. The UID and SAK is in mfrc522.uid.
    
    // Dump UID
    
    for (byte i = 0; i < mfrc522.uid.size; i++) {
            aux[i]= mfrc522.uid.uidByte[i];
    } 
           if(flag == 0)
           {
             lcd.clear();
             lcd.print("   Card UID:    ");
             lcd.setCursor(0,1);
             for (byte i = 0; i < mfrc522.uid.size; i++) {
               card1[i] = aux[i];
             lcd.print( card1[i], DEC);
             lcd.print( " ");
             flag =1;
            }
           delay(3000);
           lcd.clear();
           lcd.print(" Aproxime o card");
           lcd.setCursor(0,1);
           lcd.print("  Para Acesso   ");
           } 

           else{
            
           
             for (byte i = 0; i < mfrc522.uid.size; i++) {
               if(aux[i] == card1[i])
                cnt++;
             }
                            
            if(cnt == mfrc522.uid.size-1)
            {
              lcd.clear();
              lcd.print("     ACESSO     ");
              lcd.setCursor(0,1);
              lcd.print("   PERMITIDO    ");
              delay(2000);
             }
             else
             {
              lcd.clear();
              lcd.print("     ACESSO     ");
              lcd.setCursor(0,1);
              lcd.print("     NEGADO     ");
              delay(2000);
             }
             
           }
           
           lcd.clear();
           lcd.print(" Aproxime o card");
           lcd.setCursor(0,1);
           lcd.print("  Para Acesso   ");
  cnt=0;
}

terça-feira, 2 de agosto de 2016

Módulo relé de 4 canais como ponte H dupla


 Uma solução simples e ecomímica, para controle de dois motores de corrente continua é o modulo relé de 4 canais. Com ele é possível controlar o sentido de rotação de dois motores o suficiente para construir um robô com três rodas, duas de tração e um rodizio, por exemplo, com controle de direção. O "porém" do modulo relé é que não é possível controle de velocidade sem o uso de um transistor de potencia ou um mosfet adicional.

Um exemplo de modulo rele 4 canais (4 relés). Ele possi 4 relé de 1 polo x 2 posições:
Exemplo de modulo relé 4 canais. Nesse caso 5V




Ponte H
Em um motor de Corrente contínua invertendo a polaridade da alimentação em seus terminais:


Na ponte H essa caracteristica é aproveitada  para controlar do sentido de rotação desses motores











Para facilitar a compreensão considere que montaremos um carrinho com parte de tração como a figura abaixo:



Usaremos o arduino como elemento principal de controle:

O primeiro passo é fazer as ligações necessárias no modulo relé 4 canais para que ele seja utilizado como duas pontes H:



Em seguida ligar os motores. Nesse primeiro momento sem se preocupar com a polarização:




O próximo passo é ligar parcialmente ao arduino para ajustar o sentido de rotação. Nessa etapa não é necessário programa rodando no Arduino:

Ligar como acima sem se preocupar com programação do arduino para ajustar o sentido de rotação nos motores. Por exemplo o sentido indicado na ilustração acima que serve para uso em um robô. Consideremos que girar nesse sentido faz o robô ir para frente.
Se ao ligar o sentido de rotação não for o indicado na figura basta inverter os foi de ligação do motor com giro errado. No desenho acima os fios verdes 

Após os testes, completar as ligações com o arduino:



O código para teste é bastante simples. Segue abaixo comentado. As funções "frete", "re", "direita", "esquerda" e "parar" podem ser aproveitadas para qualquer projeto dessa natureza. Um detalhe importante sobre o módulo que esta sendo usado é que ele deve receber sinal de nível baixo (0V) em um dos pinos IN1, IN2, IN3 ou IN4  para acionar o relé correspondente.



/* funçao teste carrinho:

vai para frete por 2 segundos
vai para tras pro 2 segundos
vai para esquerda por 2 segundos
vai para a direita por 2 segundos
para por 2 segundos
pra repetir é necessario pressionar o botão reset do arduino

*/

int IN1= 5;
int IN2= 4;
int IN3= 3;
int IN4= 2;

void setup() {

  //declara pinos como saida
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);


// chama a funçao frete passando parametro em milesegundos
// anda para frete por 2 segundos
frete(2000); 


// anda para traz por 2 segundos 
re(2000); 

// vira para direita por 2 segundos 
direita(2000); 

// anda para esquerda por 2 segundos 
esquerda(2000); 


// Para por 2 segundos
parar(2000); 

}

void loop() {
// como deve execultar uma apenas uma vez para teste a funçao loop esta vazia
// o programa foi colocado na funçao setup
}



// função frente
void frete(int tmp)
{
 
   // MOTOR ESQUERDO FRETE
 digitalWrite(IN1,HIGH);
 digitalWrite(IN2,LOW);
 
  // MOTOR DIREITO FRETE
 digitalWrite(IN3,HIGH );
 digitalWrite(IN4,LOW);

 delay(tmp);

}


// função re
void re(int tmp)
{

  // MOTOR ESQUERDO RE
 digitalWrite(IN1,LOW);
 digitalWrite(IN2,HIGH);
 
  // MOTOR DIREITO RE
 digitalWrite(IN3,LOW);
 digitalWrite(IN4,HIGH);

 delay(tmp);

}

// função esquerda
void esquerda(int tmp)
{

   // MOTOR ESQUERDO RE
 digitalWrite(IN1,LOW);
 digitalWrite(IN2,HIGH);
 
  // MOTOR DIREITO FRETE
 digitalWrite(IN3,HIGH );
 digitalWrite(IN4,LOW);

 delay(tmp);

}


// função direita
void direita(int tmp)
{

   // MOTOR ESQUERDO FRENTE
 digitalWrite(IN1,HIGH);
 digitalWrite(IN2,LOW);
 
  // MOTOR DIREITO RE
 digitalWrite(IN3,LOW);
 digitalWrite(IN4,HIGH);

 delay(tmp);

}


// função parar
void parar(int tmp)
{

   // MOTOR ESQUERDO PARADO
 digitalWrite(IN1,HIGH);
 digitalWrite(IN2,HIGH);
 
  // MOTOR DIREITO PARADO
 digitalWrite(IN3,HIGH);
 digitalWrite(IN4,HIGH);

 delay(tmp);

}