sábado, 17 de dezembro de 2016

Sensor PIR (Passive Infrared)

Sensor PIR (Passive Infrared)




fonte: próprio autor


O modulo sensor de presença infravermelho trata-se de um conjunto compacto de componentes que permitem o acionamento de um sensor de presença, e o usuário tem controle de ajustes sobre tempo e a sensibilidade do dispositivo.

fonte: https://learn.adafruit.com

No ajuste de sensibilidade do sensor o usuário pode determinar à qual distância o objeto deve ser detectado, dentro de distâncias entre 3 a 7 metros e o tempo acionamento que pode variar de 5 a 200 segundos. Esses ajustes podem se conseguidos por meio de potenciômetros localizados na base do sensor.


fonte: próprio autor

O modulo deve receber alimentação entre 4,5V e 20V em CC. De simples ligação, conta com somente um pino que envia ao microcontrolador um sinal Alto (HIGH) ao detectar movimento e sinal Baixo (LOW) quando nenhum movimento é detectado.


fonte: https://www.robotics.org.za

Utilizando o modulo PIR

Para a realização dos projetos apresentados, deve-se ter a mão os seguintes componentes:

1 Arduino Uno (ou compatível)
1 Sensor PIR
2 Leds coloridos
1 Buzzer 5Vcc
3 resistores 220 ohms
cabos jumpers
protoboard (matriz de contatos)

Esquema de montagem


fonte: próprio autor




fonte: próprio autor

Com a montagem feita, copie e cole o código abaixo e verifique o funcionamento.

O código fonte

 /** Código **/
// Elaborado por Tony Emerson Marim em 17/12/2016.
/** mecatronizando@gmail.com **/
/** Alarme com sensor PIR e LEDs**/


//Variáveis digitais.
int pinBuzzer = 3;
int pinSensorPIR = 7;
int pinLedvm = 8;
int pinLedam = 9;
int SensorPIR = 0;
 
void setup() {
  Serial.begin(9600); //Inicializando o serial monitor
 
  //Definido pinos como de entrada ou de saída
  pinMode(pinBuzzer,OUTPUT);
  pinMode(pinSensorPIR,INPUT);
  pinMode(pinLedvm,OUTPUT);
  pinMode(pinLedam,OUTPUT);
}
 
void loop() {  
  //Lendo o valor do sensor PIR. 
  
  SensorPIR = digitalRead(pinSensorPIR);
   
  Serial.print("Valor do Sensor PIR: "); //1 quando detecta algum movimento e 0 quando não detecta. 
  Serial.println(SensorPIR);
   
  //Verificando detecção de movimentos
  if (SensorPIR == 1) {
    Alarmeacionado();
  } else {
    Alarmedesligado();
  }    
}
 
void Alarmeacionado() {
  //Ligando o led
  digitalWrite(pinLedvm, HIGH);
  delay(500);
  digitalWrite(pinLedvm, LOW);
  delay(500);
  digitalWrite(pinLedam, HIGH);
  delay(500);
  digitalWrite(pinLedam, LOW);
  delay(500);
   
  //Ligando o buzzer com uma frequencia de 600 hz.
  tone(pinBuzzer,600);
   
  delay(2000); //tempo que o led fica acesso e o buzzer toca
   
  Alarmedesligado();
}
 
void Alarmedesligado() {
  //Desligando o led
  digitalWrite(pinLedvm, LOW);
  digitalWrite(pinLedam, LOW);
   
  //Desligando o buzzer
  noTone(pinBuzzer);
}

No código é possível observar o comportamento do sensor pro meio do monitor serial da IDE do Aduino.


fonte: próprio autor

No vídeo abaixo é demonstrado o funcionamento do nosso projeto.


Curtiu? Compartilhe, comente, use nossa FanPage!
Assine o canal!
Caso seja necessário o projeto completo pode ser baixado por esse LINK!


Bons estudos!

domingo, 11 de dezembro de 2016

Drive A4988 para motor de passo bipolar

Drive A4988



Anteriormente vimos no site uma postagem de como acionar um motor de passo utilizando um drive Ponte H L298N, hoje vamos conhecer um pouco sobre o drive A4988 para motor de passo bipolar. 


fonte: https://www.pololu.com

Esse pequeno drive permite um controle por meio de "micropassos", permitindo assim que o usuário obtenha em seu projeto posicionamentos mais exatos onde exige uma melhor precisão.


fonte: https://www.pololu.com

O módulo Drive A4988 trabalha utilizando tensões de 3V e 5V e para o acionamento dos motores permitem tensões aplicadas que podem variar de 8 à 35V. 


fonte: https://www.pololu.com

O controle básico do motor é realizado por dois pinos do modulo, o STEP (passo) e DIR (direção).
Abaixo é possível observar a função dos pinos localizados no modulo.


fonte: https://www.pololu.com


Controlando motor com drive A4988 e Arduino

Para a realização desse projeto é necessário que você tenha em mãos:

1 Arduino Uno (ou compatível, eu usei uma BlackBoard da Robocore)
1 drive A4988
1 potenciômetro 1k
1 capacitor polarizado 100uF
1 protoboard (matriz de contatos) 
1 motor de passo (na demostração estou utilizando um nema 17 PM-K047-02V)
fonte externa 12V 1A
fios jumpers

O controle do motor em questão foi a pedido de um leitor do blog para testar os motores que serão usados em uma impressora 3D.

Esquema de ligação

Vamos conectar o drive A4988 ao Arduino e controlar o movimento direcional do motor por meio do potenciômetro.
Além dos pinos STEP e DIR, utilizei também os pinos MS1 e MS2 para utilizar o recurso de micropassos que o modulo oferece possibilitando ao acionar esses pino os modos full-step, half-step, quarter-step, eight-step e sixteenth-step.


fonte: http://printersketch3d.lojaintegrada.com.br

Observar que na alimentação externa que é necessário para que o motor funcione corretamente foi inserido um capacitor de 100uF, onde pelas especificações do fabricante é indicado para compensar a sensibilidade do modulo em relação a picos de tensão.

fonte: próprio autor

Atenção ao capacitor entre os pinos VMOT e GND, e ao jumper entre os pinos SLEEP e RESET.

O código fonte

Copie e cole o código na IDE do seu Arduino e observe o funcionamento.

/** Código para Projeto DRIVE A4988 com potenciometro_Tony Emerson Marim **/
// Elaborado por Tony Emerson Marim em 11/12/2016.
/** mecatronizando@gmail.com **/
/** Controle de Motor de passo Nema17 com drive A4988 por potenciometro(direcionamento) **/

#define STEP 6 // Pino 6 conectado ao pino STEP no drive
#define DIR 7 // Pino 7 conectador ao pino Direction no drive
#define MS1 10 // Pino 10 conectado ao pino MS1 no drive
#define MS2 9 // Pino 9 conectado ao pino MS2 no drive
#define SLEEP 8 // Pino 8 conectado ao pino SLEEP no drive
#define POT A5 // Pino A5 analogico conectado ao pino de controle do potenciometro

int direction; // Variavel para setar a rotação (CW-CCW) do motor
int steps = 1025; // Posição de centro assumida

void setup() {
pinMode(MS1, OUTPUT);
pinMode(MS2, OUTPUT);
pinMode(DIR, OUTPUT);
pinMode(STEP, OUTPUT);
pinMode(SLEEP, OUTPUT);

digitalWrite(SLEEP, HIGH); // "Desperta" drive
delay(5); 

digitalWrite(MS1, LOW); // Configuração dos Passos
digitalWrite(MS2, LOW); // Configuração dos Passos

}

void loop() {
while (analogRead(POT) >= 0 && analogRead(POT) <= 100) {
if (steps > 0) {
digitalWrite(DIR, HIGH); // (HIGH = anti- horário / LOW = horário)
digitalWrite(STEP, HIGH);
delay(1);//Tempo do passo ( quanto maior mais lento)
digitalWrite(STEP, LOW);
delay(1);
steps--;
  } 
}

  while (analogRead(POT) > 100 && analogRead(POT) <= 400) {
  if (steps < 512) {
  digitalWrite(DIR, LOW); 
  digitalWrite(STEP, HIGH);
  delay(1);
  digitalWrite(STEP, LOW);
  delay(1);
  steps++;
} 
  if (steps > 512) {
  digitalWrite(DIR, HIGH);
  digitalWrite(STEP, HIGH);
  delay(1);
  digitalWrite(STEP, LOW);
  delay(1);
  steps--;
  }
} 

  while (analogRead(POT) > 401 && analogRead(POT) <= 600) {
  if (steps < 1025) {
  digitalWrite(DIR, LOW);
  digitalWrite(STEP, HIGH);
  delay(1);
  digitalWrite(STEP, LOW);
  delay(1);
  steps++;
} 
  if (steps > 1025) {
  digitalWrite(DIR, HIGH);
  digitalWrite(STEP, HIGH);
  delay(1);
  digitalWrite(STEP, LOW);
  delay(1);
  steps--;
  } 
} 

  while (analogRead(POT) > 601 && analogRead(POT) <= 900) {
  if (steps < 1535) {
  digitalWrite(DIR, LOW);
  digitalWrite(STEP, HIGH);
  delay(1);
  digitalWrite(STEP, LOW);
  delay(1);
  steps++;
} 
  if (steps > 1535) {
  digitalWrite(DIR, HIGH);
  digitalWrite(STEP, HIGH);
  delay(1);
  digitalWrite(STEP, LOW);
  delay(1);
  steps--;
  } 
} 

    while (analogRead(POT) > 900 && analogRead(POT) <= 1024) {
    if (steps < 2050) {
    digitalWrite(DIR, LOW);
    digitalWrite(STEP, HIGH);
    delay(1);
    digitalWrite(STEP, LOW);
    delay(1);
    steps++;
    }
  }
}


No Vídeo abaixo é possível ver o funcionamento do controle elaborado utilizando o potenciômetro como direcional.


O projeto completo pode ser baixado nesse LINK!

Curtiu? Compartilhe! 
Assine o nosso canal no YouTube!
Curta nossa página no Facebook!


Bons Estudos!!!

sábado, 10 de dezembro de 2016

Sensor de luz LDR

Senso de luz LDR

O Light Dependent Resistor (LDR) trata-se de um componente que tem sua resistência variada em função da luminosidade do ambiente. Em situações onde a quantidade de luz aumenta sobre o componente menor torna-se sua resistência. 


fonte: http://athoselectronics.info/rele-fotoeletrico

Para encontramos esse tipo de sensores no dia a dia, basta no entardecer observarmos o comportamento da iluminação urbana, com o por do sol a quantidade de iluminação natural baixa e consequentemente sua resistência também permitido de maneira automática o acender das luzes. N estrutura de um relé fotoelétrico que compõe o acionamento de iluminação dos postes, existe uma estrutura mais elaborada eletro mecanicamente do que a que vamos apresentar a seguir, mas o mesmo componente se encontra lá para o perfeito funcionamento.


fonte: http://portaldoprofessor.mec.gov.br/fichaTecnicaAula.html?aula=10495

O projeto

Nesse projeto de nível bem simples e prático, vamos elaborar uma situação onde na ausência de luz, um LED de emergência deve ser aceso e uma mensagem de estado deve ser demonstrada pelo monitor serial do Arduino.

Para isso você deve ter em mãos:

1 Arduino Uno (ou compatível)
1 LDR
1 resistor de 220 ohm
1 resistor de 10k
fios jumpers
1 protoboard (matriz de contatos) 

Esquema de ligação

Seguir a montagem conforme a figura abaixo.


fonte: próprio autor

O código fonte

Sem a necessidade de nenhuma biblioteca, copie e cole na IDE do seu Arduino e execute para entender se funcionamento.

/** Código para Projeto LDR_Tony Emerson Marim **/
// Elaborado por Tony Emerson Marim em 10/12/2016.
/** mecatronizando@gmail.com **/
/** Controle de LED dependente da iluminação ambiente **/

const int ledPin = 10;
const int ldrPin = A1;


void setup() {

  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
  pinMode(ldrPin, INPUT);
}

void loop() {

  int ldrStatus = analogRead(ldrPin);
    if (ldrStatus <=100) {

        digitalWrite(ledPin, HIGH);
        Serial.println("LDR BLOQUEADA, LED LIGADO");
}
  
else {

  digitalWrite(ledPin, LOW);
  Serial.println("LDR LIVRE, LED DESLIGADO");

  }
}



fonte: próprio autor


fonte: próprio autor


No vídeo abaixo é demonstrado o funcionamento do circuito.



Gostou?

Curta e compartilhe a nossa página no Facebook!
Assine o canal!

Caso seja necessário o projeto completo pode ser baixado nesse LINK!

Bons estudos!

sábado, 26 de novembro de 2016

Display 7 segmentos com Arduino

O display de 7 segmentos


fonte: próprio autor

Esse display possibilita que seja escrito números decimais de 0 a 9, além de outros símbolos comumente utilizados como sinais ou letras.


entre as tecnologias de fabricação existentes para fabricação desses componentes, o mais comum é o display a LED, onde cada segmento é composto por um LED e dividi-se em dois tipos denominados catodo comum e anodo comum.


Como o próprio nome diz, o display catodo comum é aquele que possui todos os catodos dos LEDs interligados, em comum, onde para o acionamento (acender), é necessário aplicar o nível lógico 1 no anodo. No anodo comum todos os anodos dos LEDs estão interligados, sendo necessário o nível lógico 0 para ser acionado.
Então para fazer funcionar alguns comando com Arduino basta acionar um led por saída do e combinar os acionamentos.


fonte: www.physics.udel.edu

Vamos precisar para esse simples tutorial:

1 Arduino Uno (ou compatível)
1 Display 7 segmentos
8 resistores de 220 ohms
1 resistor de 330 ohm
1 resistor de 10 k
1 chave pushbutton
1 protoboard
fios jumpers

Projeto 1 

Na primeira montagem vai ser demonstrado led a led acionando no display, testando as saídas digitais dos pinos 2 a 9.
*Atenção: em todos os projetos os estados altos (HIGH) ou baixos (LOW), vai depender do tipo de display que foi escolhido, catodo ou anodo em comum, alterações em algumas linhas dos códigos podem ser necessárias.


fonte: próprio autor

Utilize o código fonte para testar o programa, lembre-se de que a escolha do display anodo comum ou catodo comum fica conforme a disponibilidade do usuário, atentando-se sempre para a ligação.

/*-----------------------------------------------------------------------
Display LED 7 segmentos
Teste das portas
baseado no original de Just4Fun Media
*************************************************************************
www.mecatronizando.com.br
**************************************************************************
 */
void setup() {
 
for(int x = 2; x < 10; x++) {
  pinMode(x,OUTPUT);
}
}

void loop() {
 
for(int x = 2; x < 10; x++) {
  digitalWrite(x,HIGH);
  delay(1000);
  digitalWrite(x, LOW);
}
for(int x = 2; x < 10; x++) {
  digitalWrite(x,HIGH);
}
delay(1000);
for(int x = 2; x < 10; x++) {
  digitalWrite(x,LOW);
}
}

Projeto 2

Utilizando a mesma montagem do projeto anterior, carregue o código para ver valores crescentes de 0 a 9 no display.


fonte: próprio autor

/*-----------------------------------------------------------------------
Display LED 7 segmentos
Ciclo numerico 0-9
por Tony Emerson Marim 26/11/2016

**************************************************************************
www.mecatronizando.com.br
**************************************************************************
 */
void setup() {
  // put your setup code here, to run once:
for(int x = 2; x < 10; x++) {
  pinMode(x,OUTPUT);
}
}

void loop() {
  // put your main code here, to run repeatedly:
  //ZERO
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, HIGH);
    digitalWrite(9, HIGH);
    delay(1000);
  //UM
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);
    digitalWrite(8, HIGH);
    digitalWrite(9, HIGH);
    delay(1000);
  //DOIS
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, HIGH);
    digitalWrite(8, LOW);
    digitalWrite(9, HIGH);
    delay(1000);
  //TRES
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, HIGH);
    delay(1000);
  //QUATRO
    digitalWrite(2, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, HIGH);
    delay(1000);
  //CINCO
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, HIGH);
    delay(1000);
  //SEIS
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, HIGH);
    delay(1000);
  //SETE
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);
    digitalWrite(8, HIGH);
    digitalWrite(9, HIGH);
    delay(1000);
   //OITO
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, HIGH);
    delay(1000);
  //NOVE
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, HIGH);
    delay(1000);
  //"DEZ"
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(9, HIGH);
  }


Projeto 3

O próximo projeto faz uma integração do usuário com o display por meio do monitor serial do Arduino. O numero digital no teclado é exibido no display.
As ligações do circuito permanecem as mesmas anteriores.


/*-----------------------------------------------------------------------
Teste display 7 segmentos serial
Interface com monitor serial
baseado no original de Just4Fun Media
por Tony Emerson Marim 26/11/2016
*************************************************************************
www.mecatronizando.com.br
**************************************************************************
 */

void setup() {
  // put your setup code here, to run once:
  for(int x = 2; x < 10; x++) {
  pinMode(x,OUTPUT);
  Serial.begin(9600);
  while (!Serial) {
  ; // wait for serial port to connect. Needed for native USB port only
  }
  
}
}

void loop() {
  
  if (Serial.available()) {
    char Num = (Serial.read());
  switch (Num) {
    case '0':
      digitalWrite(2, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);
      digitalWrite(6, HIGH);
      digitalWrite(7, HIGH);
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      Serial.write(Num);
      break;
  
  case '1':
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, HIGH);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
    Serial.write(Num);
    break;
  
  case '2':
    digitalWrite(2, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);
    Serial.write(Num);
    break;
  
  case '3':
    digitalWrite(2, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);
    Serial.write(Num);
    break;
  
  case '4':
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);
    Serial.write(Num);
    break;
  
  case '5':
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);
    Serial.write(Num);
    break;
  
  case '6':
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);
    Serial.write(Num);
    break;
  
  case '7':
    digitalWrite(2, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, HIGH);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
    Serial.write(Num);
    break;
  
  case '8':
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);
    Serial.write(Num);
    break;
  
  case '9':
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);
    Serial.write(Num);
    break;
    
  default:
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
    Serial.write(Num);
    break;
    
  }
  }
}


Projeto 4

Nesse quarto e último projeto, o display vai exibir números de 0 a 9 em ordem crescente. Conforme a necessidade do usuário um botão tipo pushbutton deve ser adotado e a velocidade de troca dos valores dos números exibidos dependem do toque no botão.
Nesse circuito vamos mudar as ligações em relação aos últimos circuitos e criar um esquema mais "enxuto". Basta seguir o desenho abaixo e copiar e colar o código na IDE do seu Arduino.


fonte: próprio autor

/*-----------------------------------------------------------------------
Teste display 7 segmentos com botão
por Tony Emerson Marim 26/11/2016
*************************************************************************
www.mecatronizando.com.br
**************************************************************************
 */

byte numbers[10] = {
B11111100, B01100000, B11011010, B11110010, B01100110,
B10110110, B10111110, B11100000, B11111110, B11100110};

void setup() {
for(int i = 2; i <= 8; i++) {
pinMode(i, OUTPUT);
}
pinMode(9, INPUT);
}
 
int counter = 0;
bool botao = true;
int valor_saida = LOW;
 
void loop() {
if(botao) {
int botao_saida = digitalRead(9);
if(valor_saida == LOW && botao_saida == HIGH) {
counter = (counter + 1) % 10;
}
valor_saida = botao_saida;
} else {
delay(1000);
counter = (counter + 1) % 10;
}
writeNumber(counter);
}
 
void writeNumber(int number) {
if(number < 0 || number > 9) {
return;
}
byte mask = numbers[number];
byte currentPinMask = B10000000;
for(int i = 2; i <= 8; i++) {
if(mask & currentPinMask) digitalWrite(i,HIGH);
else digitalWrite(i,LOW);
currentPinMask = currentPinMask >> 1;
  }
}

No vídeo abaixo é possível ver todos os projetos da página funcionando conforme os passos apresentados. Caso seja necessário, todos os arquivos podem ser baixados por esse LINK.




Gostou?
Curta nossa página no Facebook!
Assine o nosso canal no Youtube, curta e compartilhe para podermos estar sempre trazendo um pouco de programação.

Bons Estudos!




Referências:
Elementos de eletrônica digital
Capuano, Francisco Gabriel/ Idoeta, Ivan Valeije

sexta-feira, 25 de novembro de 2016

Controle de acesso por meio do RFID

RFID - Identificão por rádio frequência

A identificação por rádio frequência ou Radio Frequency Identification, consiste em uma tecnologia que utiliza sinais de radio para leitura/gravação de uma tag (etiqueta). Dentro dessa tag uma série de informações estão gravadas e relacionadas com o serviço ou produto, para identificação ou acesso ou outras aplicações. Para ter uma ideia, hoje em dia é comum o uso do RFID no controle à acesso no sistema de transporte público ("Bilhete Único") e no controle sobre acesso em rodovias ("Sem Parar") e logística.


fonte: Wikipedia

No modulo RFID RC522, consegue ler e gravar tag em cartões tipo Mifare que operam na frequência 13,56 Mhz. Utiliza interfaec SPI para comunicação com o Arduino e sua ligação por meio dos pinos digitais de 9 a 13.


Para cada tag do leitor RFID existe uma identificação única que pode ser inserido na programação para definir acessos e prioridades.

fonte:http://rfidblog.com.br/tag/rfid


A pinagem para uma correta ligação do RFID com Arduino deve obedecer a seguinte ordem:

3,3V: Deve ser ligada ao pino de tensão 3,3V do Arduino
RST: Deve ser conectado ao pino 9 do Arduino
GND: GND
IRQ: Não Conectar
MISO: Conectar ao pino 12
MOSI: Conectar ao pino 11
SCK: Conectar ao pino 13
SDA: Conectar ao pino 10

Controle de nível de acesso RFID

O projeto consiste em um controle de acesso para simular uma situação onde as tags relacionadas determinam ao usuário se existe uma atribuição relacionada ao seu número.
Primeiro vamos elaborar um circuito que possibilite ao usuário descobrir os dados que estão gravados no seu cartão, assim poderemos identificar as tags que devem ser inseridas no código e definir as prioridades.

O esquema de ligação

Para começar demos realizar uma montagem conforme o esquema abaixo:


fonte: próprio autor


A ligação de alimentação do módulo deve ser de 3,3V para evitar efeitos prejudiciais à placa

O código

Antes de copiar e colar o código, é importante ressaltar que a biblioteca que estou usando pode ser baixado por este Link.
Agora copie e cole o código para ler as tags do seu cartão ou chaveiro RFID.

#include <SPI.h>
#include <MFRC522.h>
 
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
 
void setup() 
{
  Serial.begin(9600);   // Inicia a serial
  SPI.begin();      // Inicia  SPI bus
  mfrc522.PCD_Init();   // Inicia MFRC522
}
 
void loop() 
{
  if ( ! mfrc522.PICC_IsNewCardPresent()) 
  {
    return;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) 
  {
    return;
  }
  delay(500);
  String conteudo= "";
  for (byte i = 0; i &lt; mfrc522.uid.size; i++) 
  {
     conteudo.concat(String(mfrc522.uid.uidByte[i] &lt; 0x10 ? " 0" : " "));
     conteudo.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  Serial.print("TAG LIDA: ");
  conteudo.toUpperCase();
  Serial.println(conteudo.substring(1));
}


fonte: próprio autor

O valor da Tag deve ser exibido por meio do monitor serial e informado a sequencia que pode ser utilizada no código de acesso ou não no projeto.

O projeto

Agora depois de descoberto as tags do cartão (ou chaveiro) vamos alterar o Código que vai executar o nosso projeto.
O projeto consiste na seguinte lógica, os cartões autorizados devem acessar o sistema indicando por meio de leds os funcionários que têm acesso e um pulso informa via internet, em um browser se o funcionário deu entrada  no local.
Para o projeto você deve ter em mãos:

1 Arduino Uno (ou compatível)
1 módulo RFID MC522
1 display LCD 16x2
1 protoboard
1 potenciômetro 10k 
2 leds (vermelho e verde)
2 resistores 220 ohm

Primeiro vamos montar o esquema abaixo em uma protoboard.

fonte: próprio autor

O código fonte do projeto

Feito toda a montagem, é hora de carregar o código no seu Arduino e testar, o projeto deve dar acesso às tags previamente autorizadas informando ao usuário a liberação por mensagem na LCD e acendendo um sinal visual por meio de um led verde, caso sua tag não esteja autorizada o usuário também recebe uma mensagem e um led vermelho pisca alertando-o.
Copie e cole o código para testar em seu circuito.
**a biblioteca utilizada pode ser baixada no link ao final do post!

// Programa : RFID - Controle de acesso / cancela
// Autor : Tony Emerson Marim
//basedo no original de Arduino e CIA
//www.mecatronizando.com.br

#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>  //Carrega a biblioteca LCD 

#define SS_PIN 10
#define RST_PIN 9

// Definicoes pino modulo RC522
MFRC522 mfrc522(SS_PIN, RST_PIN); 

//Define os pinos que serão ligados ao LCD
LiquidCrystal lcd(6, 7, 5, 4, 3, 2);

// Leds indicadores acesso liberado ou negado
int led_liberado = 8;
int led_negado = 16;
 
char st[20];

void setup() 
{
  
  Serial.begin(9600); //Inicializa a serial
  
  pinMode (led_liberado, OUTPUT);
  pinMode (led_negado, OUTPUT);
   
  lcd.begin(16,2); //Inicializa LCD
  lcd.clear();     //Limpa o LCD
  
  // Inicia a serial
  Serial.begin(9600);
  // Inicia  SPI bus
  SPI.begin();
  // Inicia MFRC522
  mfrc522.PCD_Init(); 
  // Mensagens iniciais no serial monitor
  Serial.println("Aproxime o seu cartao do leitor...");
  Serial.println();
  lcd.begin(16,2);
  mensageminicial();
 }

void loop() 
{

  // Aguarda a aproximacao do cartao
  if ( ! mfrc522.PICC_IsNewCardPresent()) 
  {
    return;
  }
  // Seleciona um dos cartoes
  if ( ! mfrc522.PICC_ReadCardSerial()) 
  {
    return;
  }
  // Mostra UID na serial
  Serial.print("UID da tag :");
  String conteudo= "";
  byte letra;
  for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
     Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
     Serial.print(mfrc522.uid.uidByte[i], HEX);
     conteudo.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
     conteudo.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  Serial.println();
  Serial.print("Mensagem : ");
  conteudo.toUpperCase();
  
  // Testa se o cartao1 foi lido
  if (conteudo.substring(1) == "A5 76 7A 25")
  
  {
    digitalWrite(led_liberado, HIGH);
    Serial.println("Cartao1 - Acesso liberado !");
    Serial.println();
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Ola USUARIO 1!");
    lcd.setCursor(0,1);
    lcd.print("ACESSO PERMITIDO !");
    delay(2000);
    digitalWrite(led_liberado, LOW);
    mensageminicial();
  }
    
      // Testa se o cartao2 foi lido
    if (conteudo.substring(1) == "3A 42 0F BB")   
  {

    digitalWrite(led_liberado, HIGH);    
    Serial.println("Cartao2 - Acesso liberado !");
    Serial.println();
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Ola USUARIO 2!");
    lcd.setCursor(0,1);
    lcd.print("ACESSO PERMITIDO !");
    delay (2000);
    digitalWrite(led_liberado, LOW);
     mensageminicial();

    }
    
  // Testa se o cartao3 foi lido
  if (conteudo.substring(1) == "E5 77 17 53")
  {
    Serial.println("Cartao2 - Acesso negado !!!");
    Serial.println();
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("DESCONHECIDO !");
    lcd.setCursor(0,1);
    lcd.print("Acesso Negado !");
    delay (2000);
       
    // Pisca o led vermelho
    for (int i= 1; i<5 ; i++)
    {
      digitalWrite(led_negado, HIGH);
      delay(200);
      digitalWrite(led_negado, LOW);
      delay(200);
    }
      mensageminicial();
  }
  delay(500);
}
void mensageminicial()
{
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("MECATRONIZANDO");
  delay(2000);
  lcd.clear();
  lcd.print(" Aproxime o seu");  
  lcd.setCursor(0,1);
  lcd.print("cartao do leitor");  

}

No vídeo abaixo é possível ver o funcionamento do projeto.



Caso seja necessário todo o projeto pode ser baixado por esse link.
Gostou?
Faça parte da nossa Fan Page!
Inscreva-se no canal!


segunda-feira, 14 de novembro de 2016

FTDI + ESP8266 + Controle via Blynk

IoT

FTDI + ESP8266 + Blynk

Nesse artigo abordaremos uma integração entre três componentes abordando um conceito de IoT (Internet of Things). Um acionamento de uma saída onde um módulo ESP8266 conectado na rede mundial (Internet) via wi-fi deve acender um led, como demonstração, mas antes devemos conhecer os principais equipamentos usados no projeto.

fonte: próprio autor

ESP8266

Desenvolvido pela Espressif, desde seu lançamento destaca-se pelo seu tamanho reduzido e pelo seu baixo custo (é possível encontrá-lo por menos que $5,00 dólares). Para explorar o conceito de Internet das Coisas - IoT, existem disponíveis no mercado um grande número de diferentes módulos, mas oque vamos utilizar é o modelo ESP8266 ESP-01.
Com a função primordial de receber comando via Serial (UART) interagindo com a rede Wi-Fi por meio de conexões TCP/UDT, inclusive operando em modo standalone, como microcontroladores no Wi-Fi.
No modelo que destaca-se nesse projeto vamos utilizá-lo como uma ponte Serial/Wi-fi e para isso necessita-se de um Arduino ou qualquer outro microcontrolador que tenha uma porta de comunicação serial.


fonte: http://www.keywordhut.com/cnN0IGZvcm0/

Pinagem básica:
  • VCC: Tensão de alimentação 3,3V;
  • GND: sinal de ddp;
  • Tx: sinal transmissor do módulo;
  • Rx: sinal recepstor do módulo;
  • RST: sinal de restart do módulo;
  • CH_PD: usado para gravação de firmware ou atualização, mantido em alto nível para operação normal;
  • GPIO0: pode ser controlado pelo firmware, nível baixo para update ou nível alto para operação normal;
  • GPIO2: I/O controlada pelo firmware
  • Leds indicadores: vermelho para indicar funcionamento e azul para atividade.
Como citado anteriormente, o módulo pode ser usado em modo standalone, onde pode utilizar o GPIO0 e GPIO2 controlando entrada e saída, podendo ser configurado para leitura de sinais, acionamentos entre outras funções, e é  aí que entra nosso projeto.


fonte: próprio autor

FTDI 232

O conversor FTDI ( Future Technology Devices International) é um módulo conversor USB para TTL que foi baseado em FT232RL e permite a interface de dispositivos TTL via USB.


fonte: http://br-arduino.org 


fonte: próprio autor

Blink




Consiste em um conjunto de ferramentas disponíveis para o mundo da IoT (internet of things - internet das coisas), onde os usuários podem elaborar uma aplicação conforme sua necessidade. O Blynk é uma plataforma desenvolvida para realizar controle sobre as placas comerciais mais usadas atualmente por  inventores, professores, estudantes e hobbistas em todos os níveis de conhecimento, do básico ao avançado em qualquer tipo de projeto eletroeletrônico microcontrolado.
Proveniente de uma iniciativa financiada pela Kickstarter, foi um sucesso durante a campanha de criação.
O Blynk integra um aplicativo "montado" pelo usuário com hardwares, por meio da internet permitindo o controle das saídas digitais.
De funcionamento simples e sem a necessidade de programação, o usuário só tem que inserir uma chave (token) gerada pelo aplicativo para o reconhecimento em seu código fonte.
O aplicativo utilizado para que seu projeto seja executado pode ser encontrado na loja do seu sistema, seja Android ou iOS.


fonte: http://docs.blynk.cc/


O projeto

Então conhecidos os principais componentes do projeto vamos começar a montagem.
Para esse projeto vai ser necessário ter me mãos:

1 módulo FTDI 232
1 módulo ESP8266-01
1 fonte externa com tensão de 3,3V
1 protoboard
1 Led
1 resistor 220 ohm
fios Jumpers


fonte: próprio autor

Passo 1

O primeiro passo para realização do projeto é conectar o ESP8266-01 com o FTDI comforme o esquema abaixo.




fonte: próprio autor


CUIDADO!!! Tanto o módulo ESP8266 quanto o FTDI trabalham com tensão de 3,3V!

O módulo FTDI não fornece corrente suficiente para o módulo ESP8266 sendo necessário o uso de uma fonte externa de 3,3V

Passo 2

Na IDE do Arduino vá para: Arquivos > Exempos > Blynk > Boards Wi_Fi > ESP8266_Standalone.


fonte: próprio autor


fonte: próprio autor

Abra agora no seu celular o aplicativo Blynk e vá para: Criar um novo projeto (Create new project) > Dê um nome ao projeto e escolha a placa ESP8266 > clique em enviar auth token por email > Create.


fonte: próprio autor

 Agora ao clicar no aplicativo Blynk no ícone parecido com uma porca sextavada, é possível nomear seu projeto como preferir.


 fonte: próprio autor

Passo 3

Feito isso, o próximo passo é alterar o código que vamos usar, é necessário que em char auth [ ], o usuário insira o  auth token gerado pelo Blynk e enviado por email, em char ssid [ ] = " Inserir o nome de sua rede wi-fi" e em char pass [ ] = " Inserir a senha de sua rede wi-fi".


fonte: próprio autor

Na IDE do Arduino escolha, Ferramentas > placa Generic ESP8266 moule e mantenha as opções padrão.


fonte: próprio autor

Conecte o FTDI e ligue a fonte externa, feito isso é só descarregar o código, não esqueça de especificar a COM utilizada.


fonte: próprio autor

Depois de carregar o código, vamos colocar o ESP em Standalone e inserir um botão de controle no Blynk.

Passo 4

Pode-se tirar a ligação do FTDI, pois não vamos mais  precisar do módulo nas próximas etapas.
Então agora faremos as ligações a seguir.


fonte: próprio autor

Passo 5

Abrir o projeto iniciado no Blynk e inserir um botão. Clique no sinal de mais no alto á direita e escolha button, toque no botão para inserir as configurações necessárias. Em PIN selecione Digital e gp2 PWM > Continue. 

fonte: próprio autor

Toque o círculo ao lado do button para selecionar a cor do seu led > Altere o mode de PUSH para SWITCH.


fonte: próprio autor

Volte para a página principal e inicie o "play" do aplicativo.


fonte: próprio autor

No vídeo abaixo é possível ver uma demonstração do projeto em funcionamento.


Assim como costumo dizer, se acendo um led, inserindo uma eletrônica de potência posso acionar qualquer coisa....
Breve estarei postando um acionamento de dispositivos com diferentes tensões via Blynk/ Wi-Fi.

Gostou?

Bons estudos!