Construindo Dashboards para jogos com seu Arduino

Construindo Dashboards para jogos com seu Arduino

A elaboração de dashboards e paineis interativos vem se tornando algo comumente utilizado em vários tipos de aplicações. E isso não ocorre apenas em cenários financeiros ou de negócios. Jogos de computador também utilizam dashboards e paineis para apresentar dados ao respectivo usuário/player. Sabendo de tudo isso, este tutorial tem como objetivo mostrar como podemos construir dashboards para praticamente qualquer tipo de jogo através da coleta de dados diretamente da memória do jogo e como podemos renderizar esses dados utilizando um Arduino e um display TFT.

Exemplo de dashboard em jogos de corrida.

kit arduino robótica educacional


Mãos à Obra - Construindo um dashboard de jogos com o seu Arduino

 

Componentes utilizados:

Coletando informações de jogos

Muito provavelmente, a primeira duvida que surgirá junto ao leitor, será de como podemos obter as informações de um jogo para que esses dados sejam posteriormente aprensentados pelo display conectado ao Arduino. Para que isso seja feito, basicamente podemos partir de dois principios:

  • O jogo em questão possui uma API que fornece todas as informações  ao desenvolvedor.
  • Entender como o jogo funciona e com base nisso "coletar" os dados diretamente da memória do jogo.

 

Ferramentas necessárias

Para que sejamos capazes de "observar" o comportamento da memória de um jogo, iremos precisar de uma ferramenta de análise de memória. Uma ferramenta que já foi, e ainda é utilizada com esse propósito é  o Cheat Engine. O Cheat Engine é capaz de analisar, modificar e pesquisar dados diretamente na memória de aplicações em execução. Isso irá nos possibilitar obter

A ferramenta é bem simples e com poucos cliques somos capazes de manipular a memória de um processo. A figura abaixo mostra a tela inicial onde podemos selecionar um processo e inspecionar sua memória.

 


Pastilha Peltier com Arduino

Pastilha Peltier TEC1-12706 com Arduino

Neste tutorial, vamos desenvolver uma aplicação envolvendo o controle de temperatura utilizando uma Pastilha Termoelétrica Peltier TEC1-12706.

Em nossos tutoriais, já apresentamos soluções que podem ser utilizadas quando queremos medir a temperatura em algum determinado ambiente ou de alguma substância. Desta vez, iremos apresentar para você um dispositivo capaz de esquentar ou resfriar alguma coisa, de forma que você possa usar em projetos variados.

[toc]

kit arduino robótica educacional

A pastilha peltier

As Pastilhas Peltier são elementos que funcionam segundo o princípio do Efeito Peltier. Esse efeito, também chamado de efeito termoelétrico, descreve a conversão da tensão elétrica entre os terminais de um dispositivo condutor ou semicondutor, em diferença de temperatura na sua junção. Dito de outra forma, quando passamos uma corrente elétrica por este componente, geramos um gradiente de temperatura que vai de um lado da placa para o outro.

Nos módulos constituídos por junções semicondutoras, como os da figura abaixo, o efeito da tensão faz com que haja um fluxo de cargas pelos semicondutores Tipo P e Tipo N, ligados em série. No semicondutor do Tipo N, próximo ao terminal negativo há absorção de calor, esquentando, e próximo ao terminal positivo há perda de calor, esfriando. No semicondutor Tipo P acontece o efeito complementar, com absorção de calor no terminal positivo e perda de calor no terminal negativo.

Devido a essas características, arranjando corretamente os semicondutores em pares, é possível ampliar o efeito de aquecimento e resfriamento. A corrente pelos terminais dos semicondutores Tipo N e Tipo P gera uma diferença de temperatura entre as superfícies, de forma que uma é aquecida e a outra resfriada.

 

A eficiência desse tipo de resfriamento não pode ser comparada aos sistemas de resfriamento convencionais, com compressores e fluidos refrigerantes, mas a ausência de partes móveis e a ausência de elementos mecânicos torna a simplicidade desse dispositivo muito atrativa para alguns tipos de equipamento.

Essa pastilha é empregada em resfriamento de bebedouros eletrônicos, coolers para processadores de computador, coolers para resfriar bebidas, entre outros.

 

Pastilha Peltier

Uma informação importante é que essa pastilha se caracteriza por uma curva de aquecimento muito acentuada na sua superfície quente, portanto, em ocasiões nas quais a placa permanecerá ligada durante um tempo considerável, nós aconselhamos que você utilize um dissipador de calor para não danificá-la.

Outro ponto muito importante, e que deve ser levado em conta quando utilizamos a Pastilha Peltier TEC1-12706, é o fato de que não devemos acioná-la diretamente com a nossa placa Arduino. Como os terminais de saída do Arduino tem uma capacidade bem limitada de corrente - 20 mA para o Arduino UNO, por exemplo - não é desejável alimentar cargas como motores ou a placa Peltier de forma direta. Nesse tutorial vamos alimentar a Pastilha Peltier com uma fonte externa de 2 A, acionada por um módulo relé.

Fonte utilizada no acionamento da pastilha Peltier

Mãos à obra - "Acionando a Pastilha Peltier TEC1-12706"

Componentes necessários

Para reproduzir este projeto, você irá precisar dos seguintes componentes:

Montando o projeto

O nosso projeto será montado em duas partes. A primeira delas irá conter o sistema de acionamento do relé utilizado para acionarmos a nossa Pastilha Peltier.

Primeira parte do hardware utilizado

A segunda parte consiste na montagem do circuito necessário para alimentar a placa Peltier.

Segunda parte do hardware utilizado.

Programando

String comando;

void setup() {
  Serial.begin(9600);
  pinMode(7, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(12, OUTPUT);
}

void loop() {
  if (Serial.available()>0) {
    comando = Serial.read();
    switch (comando) {
      case 'a': digitalWrite(7, LOW);
                digitalWrite(9, LOW);
                digitalWrite(12, HIGH);
                break;
      case 'b': digitalWrite(7, HIGH);
                digitalWrite(9, HIGH);
                digitalWrite(12, LOW);
                break;
    }
  }
}

Colocando para funcionar

Hardware montado.

Entendendo a fundo

Software

- Declarando a variável global

Inicialmente, nós vamos declarar uma variável do tipo String e que será responsável por receber os comandos enviados através da porta serial para ligar ou desligar a nossa Pastilha Peltier.

String comando;

- Definindo as configurações iniciais

Em seguida, vamos definir as configurações do Arduino. Dentro da função setup() nós inicializamos a comunicação serial através da sentença Serial.begin(). Também definimos o modo de operação dos pinos 7, 9 e 12 para que estes trabalhem como saídas digitais através da função pinMode().

Além disso, utilizamos também a função digitalWrite() para ligar o led vermelho (pino 9) e garantir que o led verde esteja apagado (pino 12).

void setup() {
  Serial.begin(9600);
  pinMode(7, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(12, OUTPUT);
  digitalWrite(9,HIGH);
  digitalWrite(12,LOW);
}

- Acionando o relé de controle da Pastilha Peltier

Dentro da função loop() vamos criar o acionamento da placa Peltier. Inicialmente, utilizamos a sentença Serial.available() para detectar a existência de algum caractere enviado através da porta serial para o nosso Arduino. Caso exista um valor na porta serial, a variável comando armazena o seu valor, e é realizado um teste para que seja verificado se é a letra a ou a letra b. Se for a letra a, a porta de saída digital do pino 7 é colocada em nível baixo para ligar o relé (lembre-se que os relés existentes no módulo em questão são acionados com nível baixo). Também ligamos o led verde para sinalizar que a Pastilha Peltier está acionada.

No segundo caso, o relé é desligado, colocando o pino 7 em nível alto, e o led vermelho é acionado.

void loop() {
  if (Serial.available()>0) {
    comando = Serial.read();
    switch (comando) {
      case 'a': digitalWrite(7, LOW);
                digitalWrite(9, LOW);
                digitalWrite(12, HIGH);
                break;
      case 'b': digitalWrite(7, HIGH);
                digitalWrite(9, HIGH);
                digitalWrite(12, LOW);
                break;
    }
  }
}

 


Considerações finais

Neste tutorial, demonstramos como acionar a sua Pastilha Peltier TEC1-12706 utilizando um módulo relé de 4 canais. Esperamos que você continue nos acompanhando e sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Tratando bounce com o ESP8266 NodeMCU

Tratando o bounce com o ESP8266 NodeMCU

Em nosso tutorial sobre a utilização de botões com os módulos ESP8266 NodeMCU, nós te mostramos como você deve proceder para usá-los em seus projetos de automação. Entretanto, apesar de termos te apresentado uma situação bem legal para reproduzir, ela não é tão útil assim na maioria dos casos, devido a um evento chamado bounce que, por sua vez, neste tutorial, nós vamos aprender o que é e como tratá-lo de maneira rápida.

Antes de entrarmos diretamente no tópico deste tutorial, você pode estar se perguntando por que nós dissemos que a situação apresentada no tutorial anterior não é tão útil na maioria dos casos. Bem, perceba que o projeto que foi desenvolvido necessitava que o botão fosse continuamente pressionado para que o led permanecesse aceso.

Normalmente, o que nós buscamos em aplicações que utilizam botões é a transição entre estados de algum elemento baseada apenas no acionamento destes, independentemente do fato de continuarmos pressionando eles ou não. Em outras palavras, o que nós buscamos, utilizando o contexto do tutorial anterior, é que ao simplesmente apertarmos o botão (e soltarmos em seguida), uma variável booleana tenha o seu conteúdo invertido e permaneça com ele inalterado até que o botão seja pressionado novamente. É isso que faremos aqui!

[toc]
kit arduino robótica educacional

Mãos à obra - Entendendo o bounce na prática e aprendendo a tratá-lo

Para que seja possível entendermos o que é o bounce e a relação dele com a aplicação que queremos desenvolver, vamos dividir esta seção de mãos à obra em duas partes, de modo que, na primeira delas, fazer uma pequena experiência para mostrar o problema causado pelo bounce e na segunda, resolveremos este impasse.

Componentes necessários

Montando o projeto

A montagem deste circuito é bem simples e consiste apenas no encaixe do módulo ESP8266 NodeMCU no protoboard e na inclusão do botão no circuito.

Circuito com o NodeMCU e push-button

Programando - Parte 1: identificação do problema

Nesta parte, nós queremos te mostrar o resultado da criação de uma aplicação com a utilização de um botão, no qual o usuário deverá apertar o botão (sem segurar) para que o led mude de estado, ou seja, de apagado para aceso ou de aceso para apagado.

bool estado;

void setup()
{
   Serial.begin(9600);
   pinMode(D2,INPUT);
}
void loop() 
{ 
   if(digitalRead(D2) == 1) 
   { 
      estado = !estado; 
      Serial.println(estado);
      while(digitalRead(D2) == 1) 
      { 
      
      }
   }
}

Caso você compile este código, você perceberá que em algumas vezes, ao apertar o botão, o seu módulo ESP8266 NodeMCU irá apresentar no Serial Monitor a transição correta do conteúdo da variável estado (isto é, de nível lógico baixo para nível lógico alto e vice-versa), no entanto, em outros momentos você poderá presenciar uma espécie de confusão, sem que você tenha controle sobre a transição, com o conteúdo da variável estado sendo alterado aleatoriamente.

Janela do Serial Monitor com o resultado sem o tratamento do bounce
Resultado sem o tratamento do bounce

 

Entendendo este código

A primeira coisa que nós fizemos foi declarar uma variável booleana (que só admite dois estados, 0 ou 1) chamada estado antes da função setup().

bool estado;

Em seguida, determinamos, dentro da função setup(), o modo de operação do pino D2 para que ele atue como uma porta de entrada digital e também habilitamos a comunicação serial através da sentença Serial.begin().

bool estado;

void setup()
{
   Serial.begin(9600)
   pinMode(D2,INPUT);
}

Por fim, dentro da função loop(), vamos recorrer a uma estrutura condicional if() para detectar o momento em que o botão for pressionado, ou seja, o momento em que um sinal de nível lógico alto estiver presente na porta de entrada digital D2, utilizando a função digitalRead(), de modo que, caso esta situação aconteça, nós iremos inverter o conteúdo da variável estado, imprimi-lo no Monitor Serial e manter o programa preso no laço while até que o botão seja solto.

void loop() 
{ 
   if(digitalRead(D2) == 1) 
   { 
      estado = !estado; 
      Serial.println(estado);
      while(digitalRead(D2) == 1) 
      { 
      
      }
   }
}

Analisando este código, parece que tudo irá funcionar da maneira que nós queremos, pois, ao apertarmos o botão, o conteúdo da variável estado será invertido e o programa só voltará a ser executado desde o começo quando o botão for solto.

Note que apesar da lógica utilizada para realizarmos este tipo de automação estar correta, o projeto não vai funcionar da maneira que nós queremos, simplesmente por que nós não estamos levando em conta alguns detalhes do processo.

Quando nós pressionamos um push button, mesmo que rapidamente, ocorre uma espécie de trepidação no mecanismo de fechamento do contato existente que faz com que o nível lógico que chega na porta de entrada digital D2 dê uma certa variação indo de alto para baixo e vice-versa. Desta forma, existe a possibilidade de ESP8266 NodeMCU entender que o estado estável do botão é o existente em alguma parte da trepidação e sendo assim nós não conseguimos afirmar qual será o resultado do acionamento do mesmo. Este tipo de fenômeno é chamado de bounce.

Bounce ocorrendo

Desta forma, existe a possibilidade de ESP8266 NodeMCU confundir o estado estável do botão com alguma parte da variação dos níveis lógicos existentes trepidação. Visualmente, como dissemos antes, este acontecimento será detectado por meio da aleatoriedade das transições do conteúdo da variável estado.


Programando - Parte 2: tratando o bounce

Nesta parte, nós queremos te mostrar o resultado da criação de uma aplicação com a utilização de um botão com o tratamento do bounce realizado.

Instalando a biblioteca

Basicamente, para tratarmos o bounce, nós temos que fazer com que ao detectar um aperto no botão, o nosso módulo ESP8266 NodeMCU espere alguns instantes e confira se o botão ainda está apertado após a ocorrência da trepidação. Existem muitas formas de realizar este procedimento, mas como aqui é um guia rápido, nós vamos pela que eu acho mais rápida. Ela consiste na utilização de uma biblioteca chamada bounce 2.

Ela pode ser encontrada neste link: https://github.com/thomasfredericks/Bounce2

Após abrir a página sugerida, clique no botão verde escrito “clone or download” e posteriormente na opção Download ZIP.

 

Depois deste procedimento, você deverá abrir a Arduino IDE, selecionar o menu Sketch, selecionar a opção incluir biblioteca e por último, marcar a alternativa Adicionar biblioteca ZIP. Neste momento, você deve selecionar o arquivo que acabou baixar no passo anterior.

Criando o código

#include <bounce2.h>

bool estado;

Bounce tratador = bounce()

void setup()
{    
  tratador.attach(D2);
  tratador.interval(25);
}

void loop() 
{
   tratador.update();
   if (tratador.fell()) 
   {  
     estado = !estado; 
     Serial.println(estado); 
   }
}

Ao contrário do caso anterior, caso você compile este código, você verá que a cada aperto de botão, o conteúdo da variável estado será alterado de uma maneira consistente, sem erros.

Serial Monitor apresentando o resultado com tratamento do bounce
Resultado com o tratamento do bounce

Entendendo este código

Agora, nós já podemos efetuar algumas mudanças no código apresentado anteriormente para atingirmos o resultado que desejamos. A primeira delas é a inclusão da biblioteca que nós acabamos de baixar antes da declaração da variável estado. Isto deve ser feito da seguinte maneira:

#include <bounce2.h>

bool estado;

Depois de executarmos este passo, nós devemos criar um objeto chamado tratador que será responsável por efetuar o tratamento do bounce. Este objeto pode ser inserido em nosso código após a variável estado.

#include <bounce2.h>

bool estado;

Bounce tratador = bounce()

Em seguida, nós vamos substituir a sentença que define o pino D2 como um pino de entrada digital por outras duas sentenças, veja:

void setup()
{
  Serial.begin(9600);
   
  tratador.attach(D2);
  tratador.interval(25);
}

A primeira sentença utiliza o método attach() para definir qual porta de entrada digital será tratada e o método interval() diz respeito ao intervalo de tempo estipulado da trepidação, para que o NodeMCU leia o sinal apenas em um tempo posterior a este,

Por fim, na função loop(), nós vamos utilizar a sentença update atrelada ao objeto que nós criamos para atualizar o estado do nosso botão e também vamos recorrer à estrutura condicional if() e utilizar como argumento o método fell() em conjunto com o mesmo objeto citado (isto servirá para programa detectar quando o botão for solto, ou seja, proporcionando uma variação do sinal de tensão de 3,3V para 0 V).

Caso esta sentença seja verdadeira, nós vamos inverter o conteúdo da variável estado da mesma forma que realizamos anteriormente.

void loop() 
{
   tratador.update();
   if (tratador.fell()) 
   {  
     estado = !estado; 
     Serial.println(estado); 
   }
}

Considerações finais

Esperamos que você tenha gostado deste tutorial e que você consiga implementar este tipo de técnica nos seus projetos com ESP8266 NodeMCU. Se tiver alguma dúvida, deixe ela nos comentários abaixo.


Hello World com NodeMCU e JavaScript

Hello World com NodeMCU e JavaScript

Em nossa coleção de tutoriais nós elaboramos alguns conteúdos sobre a utilização do módulo ESP8266 NodeMCU e também sobre a implementação de interfaces de controle para placas Arduino através do uso da linguagem HTML e de CSS3. Neste tutorial você irá aprender algo que agrega as duas vertentes citadas, pois, aqui nós vamos desenvolver interfaces de controle para o módulo ESP8266 NodeMCU utilizando os conceitos da linguagem HTML que nós já aprendemos em conjunto com uma ferramenta nova, o Javascript.

Veja os nossos tutoriais sobre o desenvolvimento de interfaces de controle com Arduino.

Para desenvolvermos a proposta deste tutorial, nós devemos primeiramente configurar a Arduino IDE para que seja possível gravarmos códigos nos módulos ESP8266 NodeMCU, portanto, caso você não saiba realizar este procedimento, basta acessar este nosso outro tutorial:

[toc]

kit robotica educacional com Arduino ESP ou Microbit

O Javascript

Como nós aprendemos em nossos tutoriais citados anteriormente, a linguagem HTML é uma linguagem de marcação, isto é, um recurso responsável por organizar as informações de uma página web e também por atribuir sentido aos elementos existentes nas mesmas, portanto, caso nós tenhamos uma frase em uma página web, a linguagem HTML será a responsável por dizer ao navegador se a mesma é um título, um subtítulo, um link, entre outros e também como esta se enquadra em uma ordem hierárquica de importância em relação aos outros fragmentos textuais contidos na estrutura da página em questão.

 

Logo do HTML5
Logo do HTML5

 

Além disso, como tivemos a chance de aprender nos tutoriais apresentados na introdução deste tutorial, a utilização das tags estruturais mais adequadas não é suficiente para que a aplicação possua uma aparência estética bem elaborada, pois, o uso das mesmas produz resultados em uma espécie de estilo padrão.  Visando resolver este impasse, surgiu o CSS (Cascading Style Sheets), que por sua vez, consiste em um recurso semelhante a uma linguagem de marcação, como o HTML, porém totalmente distinta da mesma, com objetivo único de cuidar dos procedimentos de estilização. Uma das vantagens da utilização do CSS é a possibilidade de personalizar os objetos contidos em uma página web sem que seja necessário misturar as regras de estilização com os objetos citados (como acontecia anteriormente).

 

Logo do CSS3
Logo do CSS3

 

Utilizando a linguagem HTML e o CSS3 nós conseguimos estruturar uma página web e também estilizá-la entretanto apenas com estes dois recursos não é possível atuar sobre o comportamento da página. Mas o que seria este suposto comportamento? Imagine que você tenha duas imagens de uma lâmpada, de modo que, uma delas representa a lâmpada apagada e a outra acesa. A sua ideia é utilizá-las para fazer uma animação, na qual, quando o estado de uma determinada porta de saída digital do seu sistema embarcado estiver em nível lógico alto, a figura que representa a lâmpada acesa fique em evidência e em contrapartida, quando a mesma estiver disponibilizando nível lógico baixo em seu terminal, somente a figura referente à lâmpada apagada apareça. Esta alteração automática de elementos reflete um exemplo de comportamento de uma página web e pode ser realizada utilizando Javascript. Basicamente, com ele nós podemos criar funções que são executadas pelo navegador em detrimento de determinados eventos ocorridos na página, como por exemplo, quando um botão é pressionado.

 

Logo Javascript
Logo Javascript

 

Javascript em um código HTML

Como nós já vimos nos tutoriais apresentados na introdução deste post, o código referente às páginas web já adaptados para serem utilizados dentro de um programa a ser gravado em uma placa Arduino possuem a seguinte estrutura:

client.println("<!DOCTYPE html>");
client.println("<html lang=\"pt-br\">");                
   client.println("<head>"); 
   client.println("</head>");
   client.println("<body>");
   client.println ("</body>");
client.println ("</html>");

O primeiro passo para incluirmos o Javascript na estrutura de uma página web é utilizar o par de tags <script></script>.

<script>
    ... Trecho de código em Javascript ...
</script>

Em seguida, basta inserir a estrutura em Javascript que você deseja dentro do espaço delimitado no código acima. É claro que como Javascript é uma linguagem de programação, existem infinitas possibilidades para serem implementadas, porém, neste tutorial, vamos fazer o famoso Hello World utilizando apenas Javascript.


Mãos à obra - Utilizando Javascript com NodeMCU

Componentes necessários

Montando o projeto

Programando

O próximo passo que você deverá realizar será copiar este código para a sua Arduino IDE, alterar os valores das variáveis ssid e password com as informações referentes ao nome da sua rede sem fio e à senha dela e compilar o código.

#include <ESP8266WiFi.h> 
 
const char* ssid = "******"; 
const char* password = "******"; 

IPAddress ip(192,168,25,16);
IPAddress gateway(192,168,25,1); 
IPAddress subnet(255,255,255,0); 
 
WiFiServer server(80); 
 
void setup() 
{ 
  WiFi.begin(ssid, password); 
  WiFi.config(ip, gateway, subnet);
  server.begin(); 
}

void loop() 
{
  String req_str;
  WiFiClient client = server.available(); 
  if (client) 
  { 
    boolean currentLineIsBlank = true;
    req_str = "";
    while (client.connected()) 
    { 
       if (client.available()) 
      {
         char c = client.read(); 
         req_str = req_str + c;
         if(c == '\n' && currentLineIsBlank) 
        {    
            
             client.println("HTTP/1.1 200 OK");
             client.println("Content-Type: text/html");
             client.println("Connection: close");
             client.println();
             client.println("<!DOCTYPE html>");
             client.println("<html lang=\"pt-br\">");                
               client.println("<head>");
                 client.println("<meta charset= \"UTF-8\"/>"); 
               client.println("</head>");
               client.println("<body>");
                 client.println("<h1>Exemplo com JavaScript</h1>");
                 client.println("<script>");
                    client.println ("alert('Esse é o meu primeiro código em JS');");
                 client.println("</script>");                         
               client.println ("</body>");
             client.println ("</html>");
             
          break;
        }
        if (c == '\n') 
        {
         currentLineIsBlank = true;
        }
        else if (c != '\r') 
        {
           currentLineIsBlank = false;
        }
      }
    }
    delay(1); 
    client.stop();
  }
}

Resultado final

Veja o resultado final que nós obtemos:


Entendendo a fundo

Software

– Apenas uma primeira observação

Este software é praticamente igual a todos os outros que nós desenvolvemos em nossos tutoriais (apresentados na introdução deste documento) sobre a criação de interfaces de controle utilizando a linguagem HTML, portanto, não será necessário entrarmos nos detalhes referentes ao funcionamento do mesmo . Por outro lado, como nos tutoriais citados nós estávamos utilizando o conjunto Arduino UNO + Ethernet Shield, deveremos realizar algumas alterações básicas para que o mesmo funcione no módulo ESP8266 NodeMCU, de modo que, esta consiste na troca da sentença:

EthernetClient client = server.available();

por:

WiFiClient client = server.available();

– Definindo os pré-requisitos para o funcionamento do código

Inicialmente, devemos incluir uma biblioteca no código para que o mesmo possa funcionar corretamente. A biblioteca em questão é a ESP8266WiFi.h, que por sua vez, é a responsável por garantir a conectividade do módulo com a nossa rede local (essa biblioteca é automaticamente instalada no momento em que pacote do ESP8266 é instalado na Arduino IDE.

#include <ESP8266WiFi.h>

Após a inclusão da bibliotecas citadas, devemos definir a rede na qual queremos conectar o nosso módulo ESP8266 NodeMCU e a senha de acesso à esta mesma rede.

const char* ssid = "** digite aqui o nome da sua rede **"; 
const char* password = "** digite aqui a senha da sua **"; 

Em seguida, você deverá determinar um endereço IP (válido e disponível na sua rede) para o seu módulo ESP8266 NodeMCU e também outros dois elementos: o endereço do gateway (geralmente possui os 3 primeiros conjuntos de algarismos igual ao definido por você anteriormente, no entanto, com o número 1 no último grupo de algarismos) e a máscara de rede (subnet), que por sua vez, para residências costuma ter o padrão 255.255.255.0 (você pode levantar estes dois últimos elementos digitando ipconfig no prompt de comando (caso o sistema operacional que você estiver utilizando seja o Windows)).  Por fim, devemos criar o objeto que será responsável por representar o Servidor Web no código (aqui, chamamos este de server) e relacioná-lo com a porta 80.

IPAddress ip(192,168,25,16);
IPAddress gateway(192,168,25,1); 
IPAddress subnet(255,255,255,0);  
WiFiServer server(80);

– Definindo as configurações iniciais

Dentro da função setup() nós iniciamos a conexão com a rede local através da função WiFi.begin() (passando como parâmetro o nome da rede local e a senha de acesso à mesma, definidos anteriormente) e também realizamos a configuração do nosso módulo ESP8266 NodeMCU através da sentença WiFi.config(). Por fim, iniciamos o nosso Servidor Web por meio da sentença server.begin() (lembre-se que server é o objeto criado para representar o Servidor Web no código).

void setup() 
{
  WiFi.begin(ssid, password); 
  WiFi.config(ip, gateway, subnet);
  server.begin(); 
}

– Criando a página para responder à requisição do navegador

Nos artigos anteriores, elencados em nossa introdução, nós aprendemos como devemos proceder para elaborar uma página bem simples, contendo elementos escritos. Neste momento, como de praxe, nós também iremos inserir uma mensagem em nossa página, porém além desta, vamos fazer o famoso Hello World utilizando Javascript.

Você se lembra do cabeçalho padrão que enviamos para o navegador antes de enviarmos a página propriamente dita? Para ajudar, vamos colocá-lo aqui.

client.println("<body>");
  client.println("<h1>Exemplo com JavaScript</h1>");
  client.println("<script>");
    client.println ("alert('Esse é o meu primeiro código em JS');");
  client.println("</script>");                         
client.println ("</body>");                        

 


Considerações finais

Neste tutorial, demonstramos uma pequena introdução sobre a inclusão de códigos em JavaScript para personalizar o seu projeto de criação de interfaces web com o Módulo ESP8266 NodeMCU. Esta foi mais uma parte de uma série de artigos sobre a criação de Servidores Web, portanto, esperamos que continue nos acompanhando e sinta-se à vontade para nos dar sugestões. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Primeiros passos com o ESP8266 NodeMCU - Lendo o estado de um botão

Primeiros passos com o ESP8266 NodeMCU - Lendo o estado de um botão

No tutorial anterior nós mostramos como você deve fazer para ler o sinal de tensão proveniente de um potenciômetro com o seu módulo ESP8266 NodeMCU. Hoje você irá aprender algo um pouco parecido entretanto, que por sua vez, também servirá (assim como o potenciômetro) para a realização de acionamentos de dispositivos externos. Neste tutorial, nós vamos dar continuidade aos conteúdos voltados para o ensino dos conceitos básicos necessários para que você consiga começar a utilizar o seu NodeMCU e desenvolver os seus projetos de automação. O tópico deste conteúdo será a leitura do estado de botões utilizando o módulo ESP8266 NodeMCU.

[toc]

kit robotica educacional com Arduino ESP ou Microbit

As grandezas digitais e as portas digitais

Antes de aprendermos a efetuar leitura do estado de um botão, nós devemos entender o que são as grandezas digitais. Bem, as grandezas digitais são aquelas que são aquelas que podem ser definidas por meio de saltos entre valores bem estabelecidos dentro de um determinado intervalo. Como um exemplo de elementos que trabalham com estas grandezas nós podemos citar os relógios digitais, os quais, apesar do tempo em si variar continuamente, o visor dos mesmos mostra o tempo em saltos de um em um segundo (observe que os visores destes relógios nunca mostrarão algo tipo 25,8 segundos, pois, para eles, só existem 25 e 26 segundos, ou seja, qualquer valor intermediário não está definido).

O nosso módulo ESP8266 NodeMCU possui  vários pinos destinados a lidar com este tipo de grandeza, ou seja, pinos cujas funções são trabalhar com basicamente dois níveis de tensão bem definidos: 0V e 3,3V. Os pinos digitais estão identificados em nosso NodeMCU através da letra D e podem atuar de duas maneiras, ou seja, podem funcionar como entradas digitais ou como saídas digitais, de modo que, na primeira opção, os pinos em questão deverão detectar os dois níveis de tensão citados e na segunda eles proporcionarão estes níveis para que nós possamos utilizá-los no acionamento de dispositivos externos. Neste tutorial, nós iremos utilizar o pino D1 como um pino de entrada digital e em seguida efetuaremos a leitura do estado de um botão (isto é, se o botão estão pressionado ou não) conectado nele.

 


Mãos à obra - Efetuando a leitura de um potenciômetro

Componentes necessários

Montando o projeto

Circuito com o NodeMCU e push-button
Hardware utilizado

Programando

Este é o código que utilizaremos no desenvolvimento deste tutorial

float leitura;

 void setup() 
{ 
  pinMode(D1,INPUT);
  Serial.begin(115200);
  Serial.println("Estado do botão");
}

void loop() 
{
  if(digitalRead(D1) == 0)
  {
     Serial.println("Botão não pressionado");
  }
  else
  {
     Serial.println("Botão pressionado");
  } 
  delay(1500);  
}

Colocando para funcionar

Após compilarmos o código apresentado, nós teremos este resultado:

Apresentação dos estados do botão
Resultado final do projeto

Entendendo a fundo

Software

– Definindo as configurações iniciais

Dentro da função setup() nós vamos primeiramente definir o modo de operação do pino que nós vamos utilizar, de modo que, como nós queremos ler o estado de um botão, devemos fazer com que o pino em questão seja uma entrada digital, desta forma, nós vamos recorrer à função pinMode() para fazermos com que o pino D1 seja a entrada digital desejada. Posteriormente, nós iniciaremos a conexão com o Serial Monitor através da função Serial.begin() (passando como parâmetro o valor da taxa de transmissão de dados (como sugestão, utilize este valor)). Além disso, nós vamos utilizar a sentença Serial.println() para escrevermos na tela um título para a nossa aplicação, de modo que, este será "Estado do botão".

void setup() 
{ 
  pinMode(D1,INPUT); 
  Serial.begin(115200); 
  Serial.println("Estado do botão"); 
}  

– Lendo o estado do botão

O que nós vamos fazer aqui é algo muito simples e envolve alguns conceitos bem legais para você aprender. Primeiramente, nós vamos utilizar uma estrutura condicional chamada if(), de modo que, através deste função nós podemos conferir se uma determinada hipótese é verdadeira. O que nós vamos verificar neste tutorial é se o botão não está pressionado, ou seja, se existe um nível de tensão de 0V na porta de entrada digital D1. Este procedimento será feito por meio da comparação do resultado da função digitalRead() (que ao ser usada retorna 0 ou 1, caso o nível de tensão na porta de entrada digital em questão seja 0 ou 3,3V respectivamente) com o valor 0.

  if(digitalRead(D1) == 0)
  {
     Serial.println("Botão não pressionado");
  }

Caso esta hipótese seja verdadeira, o nosso módulo ESP8266 NodeMCU deverá escrever a frase "Botão não pressionado" no Serial Monitor.

Em contrapartida, caso o resultado da leitura do estado do botão seja 1, a frase que deverá ser escrita será "Botão pressionado". Este procedimento é realizado por meio do uso da estrutura condicional complementar else.

 else
  {
     Serial.println("Botão pressionado");
  } 

Por fim, utilizamos a função delay() para determinar o intervalo entre cada uma das aquisições.

delay(1500);

Veja como ficou a nossa função loop()

void loop() 
{
  if(digitalRead(D1) == 0)
  {
     Serial.println("Botão não pressionado");
  }
  else
  {
     Serial.println("Botão pressionado");
  } 
  delay(1500);  
}

 


Considerações finais

Neste tutorial, nós demonstramos como você pode fazer para realizar a leitura do estado de um botão através de um módulo ESP8266 NodeMCU. Esperamos que continue nos acompanhando e sinta-se à vontade para nos dar sugestões. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Primeiros passos com o ESP8266 NodeMCU - Utilizando sinais PWM

Primeiros passos com o ESP8266 NodeMCU - Utilizando sinais PWM

Até agora nós já aprendemos a realizar as leituras das portas de entrada analógica e digital do nosso módulo ESP8266 NodeMCU e também vimos como devemos proceder para poder acionar dispositivos que funcionam baseados em um comportamento ON/OFF por meio das portas de saída digital existentes no mesmo. Para completar este ciclo, nós devemos apenas falar sobre a utilização das portas de saída analógica fictícias existentes no NodeMCU visando a manipulação de dispositivos externos, portanto, neste tutorial, nós vamos discutir o que são sinais PWM, o que eles tem a ver com as eventuais saídas analógicas citadas e como utilizá-los.

Confira aqui o nossos tutoriais para iniciantes no mundo do ESP8266 NodeMCU:

  • O que é ESP8266 – A Família ESP e o NodeMCU 
  • Primeiros passos com o ESP8266 NodeMCU – Lendo um potenciômetro
  • Primeiros passos com o ESP8266 NodeMCU – Lendo o estado de um botão
  • Primeiros passos com o ESP8266 NodeMCU – Ligando e desligando um led

[toc]

kit robotica educacional com Arduino ESP ou Microbit

Simulando saídas analógicas com PWM

Apesar de possuir uma porta para realizar a leitura de variáveis analógicas, o módulo ESP8266 NodeMCU não conta com pinos que possam ser usados para fornecer sinais de tensão cujos módulos fazem parte dos valores intermediários do intervalo que vai de 0V e 3,3V. Entretanto, é possível utilizarmos as portas de saída digital para simularmos portas de saída analógica por meio do uso do PWM, que por sua vez, é uma técnica através da qual podemos obter resultados analógicos por meios digitais.

Este recurso consiste na geração de uma onda quadrada, na qual, controla-se a porcentagem do tempo em que a onda permanece em nível lógico alto. Esta porcentagem é chamada de Duty Cycle e sua alteração provoca mudança no valor médio da onda, indo desde 0V (0% de Duty Cycle) a 3,3V (100% de Duty Cycle) no caso do ESP8266 NodeMCU. O Duty Cycle a ser definido no projeto corresponde a um número inteiro, que é armazenado em um registrador 10 bits. Sendo assim, seu valor vai de 0 (0%) a 1023 (100%).

Figura 1 - Sinais PWM

Mãos à obra - Efetuando a leitura de um potenciômetro

Componentes necessários

Montando o projeto

Figura 2 - Hardware utilizado.

Programando

Este é o código que utilizaremos no desenvolvimento deste tutorial.

int pwm;

void setup() 
{ 
  pinMode(D1,OUTPUT);
  Serial.begin(115200);
}

void loop() 
{ 
       analogWrite(D1,pwm);
       Serial.print("O valor do pwm é: ");
       Serial.println(pwm);
       pwm = pwm +100;
       delay(1500);
       if(pwm>1023)
       {
            pwm = 0;
       }
}

Colocando para funcionar

Após compilarmos o código apresentado, nós teremos o seguinte resultado:

Figura 3 - Resultado obtido

Entendendo a fundo

Software

– Definindo as configurações iniciais

Dentro da função setup() nós vamos primeiramente definir o modo de operação do pino que nós vamos utilizar, de modo que, como nós queremos manipular um led, devemos fazer com que o pino em questão seja uma saída digital, desta forma, nós vamos recorrer à função pinMode() para fazermos com que o pino D1 seja a saída digital desejada. Posteriormente, nós iniciaremos a conexão com o Serial Monitor através da função Serial.begin() (passando como parâmetro o valor da taxa de transmissão de dados (como sugestão, utilize este valor)).

void setup() 
{ 
  pinMode(D1,OUTPUT);
  Serial.begin(115200);
}

– Utilizando os sinais PWM

A primeira coisa que nós devemos fazer para gerar um sinal PWM em uma determinada porta do nosso módulo ESP8266 NodeMCU será recorrer a função analogWrite(), que por sua vez, é responsável pelo sinal em questão. Esta função possui dois parâmetros, de modo que, o primeiro deles diz respeito ao pino que queremos utilizar e o segundo à magnitude do sinal PWM gerado.

 analogWrite(D1,pwm);

Em seguida, nós utilizamos as sentenças Serial.print() e Serial.println() para escrever no Serial Monitor a frase "O valor do pwm é:" seguido do valor utilizado no acionamento do nosso led.

Serial.print("O valor do pwm é: ");
Serial.println(pwm);

Após estes procedimentos, nós incrementamos o valor da variável pwm em 100 unidades para que no próximo ciclo este seja utilizado aumentando o brilho do led em questão.

pwm = pwm +100;

Sendo assim, terminamos adicionando a função delay() para determinar o intervalo de tempo entre duas incrementações de brilho e também colocamos uma estrutura condicional if() para que quando a variável pwm atingir um valor maior do que 1023, o valor zero deve ser atribuído a ela.

delay(1500);
if(pwm>1023)
{
   pwm = 0;
}

Veja como ficou a nossa função loop().

void loop() 
{ 
       analogWrite(D1,pwm);
       Serial.print("O valor do pwm é: ");
       Serial.println(pwm);
       pwm = pwm +100;
       delay(1500);
       if(pwm>1023)
       {
            pwm = 0;
       }
}

 


Considerações finais

Neste tutorial, nós demonstramos como você pode fazer para utilizar sinais pwm para acionar dispositivos através de um módulo ESP8266 NodeMCU. Esperamos que continue nos acompanhando e sinta-se à vontade para nos dar sugestões. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Osciloscópio Digital: Principais funcionalidades

Osciloscópio Digital: Principais funcionalidades

O osciloscópio digital é uma ferramenta de grande importância em um laboratório de eletrônica, permitindo visualizar a forma de onda de um sinal elétrico e analisar aspectos como frequência, amplitude e muitos outros. Neste tutorial iremos ver as funcionalidades básicas deste equipamento.

 

 

[toc]

kit robotica educacional com Arduino ESP ou Microbit

Canais de entrada

Primeiramente, um osciloscópio possui o que chamamos canais de entrada que são os locais por onde os sinais de tensão são lidos (normalmente, os osciloscópios possuem dois ou quatro canais). É necessário encaixarmos nessas entradas, cabos chamados de ponta de prova, a qual fará a conexão entre o circuito analisado e o osciloscópio. Note que para medir tensão nós precisamos de dois pontos, um para o sinal e outro para a referência, portanto a ponta de prova possui dois terminais para se conectar no circuito.

 

Display

Perceba que a tela do osciloscópio se assemelha a um gráfico, exibindo um sinal de tensão ao longo do tempo. Logo temos valores de tensão no eixo vertical e valores de tempo no eixo horizontal.

 


Funcionalidades

Configurações dos canais

Após conectadas as pontas de prova nas entradas do osciloscópio e nos pontos de medição do circuito, os sinais devem aparecer na tela. Caso não tenham aparecido, habilite-os no botão de seleção dos canais, que permitem escolher o que irá aparecer na tela. Feito isso, confira as configurações de medição do canal, sendo algumas opções:

  • Acoplamento: permite alternar o tipo de leitura do sinal, sendo CA (componente alternada) uma leitura apenas do desvio padrão do sinal; CC (componente contínua) uma leitura de qualquer valor absoluto do sinal, tanto componente contínua quanto alternada; GND (ground) uma leitura zerada.
  • Ganho: permite aplicar um multiplicador ao sinal de entrada. Algumas pontas de prova possuem fator atenuante de 10 vezes para acelerar a leitura, portanto a atenuação pode ser compensada pelo ganho do osciloscópio.

 

Ajuste de escala dos eixos

Podemos ajustar as escalas de tensão e tempo dos eixos por meio dos bornes correspondentes. Cada divisão dos eixos representa uma quantidade da escala escolhida, podendo variar o tempo de 5ns a 50s por divisão e a tensão de 1mV a 5V por divisão, dependendo do osciloscópio. Isso permite a leitura de sinais de frequências e amplitudes diversas. Existe também o botão Autoscale ou Auto Set que realiza esses ajustes automaticamente, exibindo na tela os canais formatados.

Deslocamentos vertical e horizontal

Juntamente dos bornes de ajuste das escalas dos eixos, existem outros dois bornes de ajuste de deslocamento vertical e horizontal, que permitem mover a referência dos canais para cima, para baixo ou para os lados. Dessa maneira pode-se adicionar um offset na visualização do sinal, tanto na escala de tempo quanto de amplitude.

 

Deslocamento vertical

Deslocamento horizontal

Configuração de trigger

Além desses ajustes, existe também um borne chamado Trigger, que serve para sincronizar as medições e a exibição no display. Ou seja, caso o sinal de algum canal estiver “louco” na tela, variando rapidamente de forma a impossibilitar a leitura, provavelmente o trigger está desajustado. O botão Set to 50% faz um ajuste automático desse parâmetro e deve ser o suficiente para as medições mais simples.

 

Canal matemática

Vimos como configurar e visualizar os canais do osciloscópio no display, mas além disso, o equipamento permite a exibição de uma terceira forma de onda chamada Math ou Matemática. Esse sinal tem duas utilidades: operações matemáticas e FFT (transformada rápida de Fourier). As operações matemáticas são geradas a partir dos canais 1 e 2 do osciloscópio, podendo somar, subtrair, multiplicar ou dividir tais sinais. A FFT gera no display a análise do espectro de frequência do sinal medido na entrada 1 ou 2.

 

Medidas dos sinais

É interessante além de visualizar as formas de onda dos sinais medidos, adquirir informações numéricas dos mesmos. Para isso o osciloscópio possui a funcionalidade Measure ou Medidas, que permite apresentar no display valores de alguns parâmetros dos sinais dos canais 1 e 2, ou mesmo do sinal Matemática. Pode ser lida informação de frequência, período, duty cycle, máximo, mínimo, média, RMS, tempo de subida, entre outros.

 

Cursores

Outra funcionalidade muito útil para medição dos sinais são os cursores. Com essa ferramenta, é possível ler o valor de tensão ou de tempo de um ponto específico da onda observada.

Cursor de tempo

Cursor de amplitude

Armazenamento USB

O osciloscópio possui também uma entrada USB para dispositivos de armazenamento, possibilitando salvar a imagem visualizada no display em um pendrive ou outra mídia de memória. Alguns dispositivos de memória não são reconhecidos pelo equipamento, por isso recomenda-se utilizar cartões ou pendrives de 2GB ou menos.


Considerações finais

Com este tutorial espero que você tenha aprendido o básico sobre o funcionamento do osciloscópio digital, que é um instrumento extremamente útil para quem trabalha com eletrônica. Agora é com você, a prática com esta ferramenta é essencial para que você se familiarize com todas as funcionalidades.


Primeiros passos com o ESP8266 NodeMCU - Ligando e desligando um led

Primeiros passos com o ESP8266 NodeMCU - Ligando e desligando um led

Em nossos tutoriais anteriores você aprendeu a ler as informações provenientes tanto da porta de entrada analógica existente em nosso módulo ESP8266 NodeMCU quanto das portas de entrada digital presentes na estrutura do mesmo. Neste tutorial, nós vamos dar continuidade aos conteúdos voltados para o ensino dos conceitos básicos necessários para que você consiga começar a utilizar o seu NodeMCU e desenvolver os seus projetos de automação. Aqui, nós realizaremos o  procedimento inverso do que foi feito até aqui, ou seja, aqui você verá como devemos agir para que ao invés de lermos o estado de uma determinada porta, nós possamos atuar sobre ela determinando o nível de tensão que ela deve disponibilizar para que seja possível conectarmos (e manipularmos) um elemento externo na mesma.

Confira aqui o nossos tutoriais para iniciantes no mundo do ESP8266 NodeMCU:

  • O que é ESP8266 – A Família ESP e o NodeMCU 
  • Primeiros passos com o ESP8266 NodeMCU – Lendo um potenciômetro
  • Primeiros passos com o ESP8266 NodeMCU – Lendo o estado de um botão
  • Primeiros passos com o ESP8266 NodeMCU – Utilizando sinais PWM

[toc]

kit robotica educacional com Arduino ESP ou Microbit

Os sinais digitais de tensão

Antes de qualquer coisa, nós devemos ter em mente que quando falamos em acionamentos de dispositivos através das portas de saída digital do nosso módulo ESP8266 NodeMCU estamos falando basicamente na manipulação de dois níveis de tensão definidos, de modo que, o nosso sistema embarcado possa fornece-los em suas portas de saída digital No caso do NodeMCU, estes valores são:

  • 3,3V, correspondente a um nível lógico alto;
  • 0V, correspondente a um nível lógico baixo;

É importante ressaltar que na prática existem faixas de valores próximos a esses números, as quais, o nosso módulo ESP8266 NodeMCU entende como nível alto ou nível baixo. Além disso, existe também uma faixa intermediária não definida que pode gerar resultados inesperados e que, portanto, deve ser evitada.


Mãos à obra - Ligando e desligando um led

Componentes necessários

Montando o projeto

Figura 1 - Hardware utilizado.

Programando

Este é o código que utilizaremos no desenvolvimento deste tutorial

void setup() 
{ 
  pinMode(D1,OUTPUT);
  Serial.begin(115200);
  Serial.println("Estado do led");
}

void loop() 
{ 
   digitalWrite(D1,HIGH);
   Serial.println("Ligado");
   delay(1500);  
   digitalWrite(D1,LOW);
   Serial.println("Desligado");   
   delay(1500);
}

Colocando para funcionar

Após compilarmos o código apresentado, nós teremos este resultado:

Figura 2 - Resultado obtido.

Entendendo a fundo

Software

– Definindo as configurações iniciais

Dentro da função setup() nós vamos primeiramente definir o modo de operação do pino que nós vamos utilizar, de modo que, como nós queremos ligar ou desligar um led, devemos fazer com que o pino em questão seja uma saída digital, desta forma, nós vamos recorrer à função pinMode() para fazermos com que o pino D1 seja a saída digital desejada. Posteriormente, nós iniciaremos a conexão com o Serial Monitor através da função Serial.begin() (passando como parâmetro o valor da taxa de transmissão de dados (como sugestão, utilize este valor)). Além disso, nós vamos utilizar a sentença Serial.println() para escrevermos na tela um título para a nossa aplicação, de modo que, este será "Estado do led".

void setup() 
{ 
  pinMode(D1,INPUT); 
  Serial.begin(115200); 
  Serial.println("Estado do led"); 
}  

– Ligando e desligando um led

O que nós vamos fazer aqui é algo que pode ser considerado o chamado "Hello World" no mundo da eletrônica. De uma maneira mais específica, nós vamos fazer com que o Led conectado na porta de saída digital D1 fique piscando em intervalos de 1,5 segundo.

Para atingirmos este objetivo, nós iremos necessitar apenas de três funções: a primeira delas será a função digitalWrite(), que por sua vez, será a responsável por disponibilizar o nível de tensão que queremos. Esta função aparecerá duas vezes no nosso código, entretanto, em cada uma destas, o segundo parâmetro presente em sua estrutura será diferente em virtude de em um determinado momento estarmos fazendo com que a porta em questão disponibilize nível alto (para isto utilizamos HIGH) e em outro, nível lógico baixo (neste momento, recorremos ao parâmetro LOW)).

A segunda função utilizada é justamente a função delay() cuja função será exatamente promover o intervalo entre o acionamento e o desligamento do led. Por fim, a terceira sentença que vamos ter em nosso código será a Serial.println(), que por sua vez, terá o propósito de mostrar na tela do Serial Monitor o estado do led, isto é, se ele estará aceso ou apagado.

void loop() 
{ 
   digitalWrite(D1,HIGH);
   Serial.println("Ligado");
   delay(1500);  
   digitalWrite(D1,LOW);
   Serial.println("Desligado");
   delay(1500);
}

 


Considerações finais

Neste tutorial, nós demonstramos como você pode fazer para ligar e desligar um led através de um módulo ESP8266 NodeMCU. Esperamos que continue nos acompanhando e sinta-se à vontade para nos dar sugestões. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Confeccionando de placas de circuito impresso com tinta fotossensível

Confeccionando PCB´s com tinta fotossensível

O método de confecção de placas de circuito impresso por tinta fotossensível consiste, de forma geral, em fixar tinta nas regiões da placa que serão trilhas do circuito. Com isso, quando a mesma for submetida ao processo de corrosão, essas regiões permanecerão com a camada de cobre. Esta técnica é uma excelente alternativa para confecção caseira de placas por ser relativamente simples e apresentar resultados finais extremamente satisfatórios. Entretanto, é necessário realizar os procedimentos com cuidado, pois, simples detalhes podem desencadear uma série de falhas no processo. Neste tutorial, nós vamos te ensinar o passo a passo para que você consiga confeccionar as suas próprias placas de circuito impresso.

O procedimento envolve uma série de produtos químicos que podem ocasionar situações perigosas. Portanto, é importante lembrar a importância da utilização de equipamentos de segurança.

[toc]

kit arduino robótica educacional


Mãos à obra - Confeccionando uma PCB

Componentes necessários

- Componentes de segurança

  • Luva (necessária no preparo de todas as soluções ou contato com tinta)
  • Óculos de segurança (necessário durante o preparo das soluções)
  • Máscara (necessária durante o preparo das soluções, corte e furos da placa)

- Componentes para impressão

  • Folha de papel transparente (ou também conhecida como transparência)

- Componentes para confecção da placa 

Procedimentos para serem realizados

- Layout do circuito

O circuito pode ser montado como um protótipo ou simulado e testado em um software de sua preferência. Uma vez verificado o funcionamento correto do mesmo, podemos começar a desenvolver o layout da placa de circuito impresso.

O layout deve ser impresso em papel transparente, e o conjunto funcionará como filtro para que a luz ultravioleta fixe apenas os trechos necessários para a confecção das trilhas condutoras, de modo que, no layout, estas trilhas devem ser transparentes e as demais partes pretas. Note que não é necessário imprimir o layout de forma espelhada.

 

Layout do circuito impresso em folha transparente

- Corte da placa

O próximo passo que devemos seguir é marcar a placa de fenolite com a dimensão da placa definida no layout, isso pode ser feito com uma caneta permanente.

Com as marcações feitas, podemos cortar as partes não utilizadas com auxílio da micro retífica e disco de corte. Essa etapa pode ser feita com outro instrumento de corte caso você julgue melhor.

 

Delimitação das dimensões da placa

 

Corte da placa de fenolite

- Aplicação da tinta

Com a placa corretamente dimensionada, podemos aplicar a tinta fotossensível. Antes da aplicação em si, é necessário limpar muito bem a face de cobre da placa para que não existam regiões oleosas ou pequenos sedimentos. Feito isso, pode-se aplicar uma fina e uniforme camada de tinta utilizando uma luva (apenas como dica, a aplicação pode ser feita com auxílio de um cartão).

Para deixar a distribuição de tinta completamente uniforme devemos fixar a placa na micro retífica com cola quente para que ela gire uniformemente e o excesso de tinta saia por ação centrífuga. A micro retífica pode ser substituída por outro equipamento, como uma furadeira de bancada ou algum motor. Alguns cuidados adicionais são necessários nessa etapa, são eles:

  • Garantir que a placa esteja bem fixada, caso contrário ela pode cair e borrar a tinta;
  • Ao girar o sistema muitas gotas de tinta serão lançadas horizontalmente, portanto isso deve ser feito dentro de uma caixa de papelão para conter a tinta;
  • Se a velocidade angular for muito alta alguns riscos de tinta podem ser formados na superfície da placa, mantenha uma velocidade intermediária.

 

Colagem da placa no eixo da micro retífica

 

Aplicação de tinta sobre a placa

 

Distribuição da tinta sobre toda superfície com auxílio de um cartão

 

Uniformização da tinta por ação centrífuga

 

Resultado final da aplicação de tinta

- Secagem da tinta

Retire cuidadosamente a placa da micro retífica. Em seguida, utilize um secador de cabelo durante cerca de 15 minutos para realizar a secagem, pois, é importante garantir que o secador não leve nenhum tipo de sujeira para placa. A secagem também pode ser feita em um forno, entretanto o procedimento pode gerar forte odor.

 

Secagem da tinta

- Transferência do circuito

Com a tinta completamente seca e uniforme nós já podemos transferir o circuito para placa. O primeiro passo é posicionar a folha transparente sobre a placa e em seguida coloque a uma placa de vidro sobre os dois para evitar que a folha saia da posição correta. A face da folha transparente que contém o layout deve estar em contato com a superfície coberta de tinta.   

Posteriormente, submeta a face citada a luz ultravioleta com uma distância de cerca de 10 centímetros por 3 minutos. Por motivos de segurança, evite contato direto com a luz.

 

Posicionamento do layout do circuito sobre a placa

 

Ação da luz ultravioleta sobre a placa

- Revelação

Neste ponto o circuito já está gravado na placa, portanto, nós precisamos “revelar” o mesmo, ou seja, precisamos retirar a tinta que não foi fixada pela luz ultravioleta. Isso pode ser feito mergulhando a placa em uma solução de barrilha (também chamada de revelador). Esta solução pode ser armazenada em uma vasilha de plástico comum e deve conter aproximadamente duas colheres de chá de barrilha por litro de água. O processo pode ser catalisado esfregando-se levemente a placa.

Uso de barrilha para revelar o circuito

 

Revelação do circuito

- Corrosão

Com o circuito completamente revelado, nós devemos corroer o cobre das regiões expostas. Para isso, utiliza-se o percloreto de ferro, que pode ser encontrado em líquido ou pó. Caso você tenha acesso à versão em pó, basta misturar o pó com água da seguinte maneira: primeiro acrescente água em seguida o pó pois a reação é exotérmica e muito calor pode ser liberado caso você tenha feito o contrário.

Coloque a solução em uma vasilha de plástico com a placa totalmente submersa (é interessante prender a placa por uma fita adesiva na parte externa da vasilha ou utilizar luvas para evitar contato direto com o percloreto de ferro durante a retirada da placa no fim da corrosão). Como dica, balance levemente a vasilha durante o processo para diminuir o tempo necessário para completa corrosão.

Verifique se todas as partes sem tinta foram completamente corroídas, em seguida retire e limpe a placa com água corrente. A solução de percloreto de ferro pode ser armazenada para uso posterior, mas com o uso sua intensidade é reduzida e será necessário renovar a solução com mais percloreto.

 

Corrosão do circuito por percloreto de ferro

 

Resultado final da corrosão

- Retirada da tinta restante

A tinta sobre as trilhas pode ser retirada submetendo a placa a uma solução de soda cáustica, que pode ser extremamente corrosiva de acordo com a concentração. Uma outra alternativa é retirar a tinta apenas esfregando com palha de aço.

 

Dissolução de soda cáustica em água

 

Placa de circuito impresso com toda tinta removida

- Adição de componentes

Com a placa completamente pronta resta apenas furar e soldar os componentes. Os furos podem ser feitos com um furador de placa ou furadeira de bancada e a solda pode ser feita de forma tradicional, com estanho e ferro de solda.      

 

Procedimento de furo da placa para adição dos componentes

 

Soldagem dos componentes

 

Resultado final

Considerações finais

Este foi mais um conteúdo feito especialmente para te auxiliar em seus projetos de eletrônica. Esperamos que você tenha aprendido um pouco sobre o processo de confecção de placas de circuito impresso. Qualquer dúvida ou sugestão, deixe nos comentários abaixo.


LTSpice: Primeiros passos

O software LTSpice

O LTSpice é um software produzido pela Linear Tehcnology e que agora é parte da Analog Devices cuja finalidade é a simulação e análise do comportamento de circuitos elétricos contendo os mais variados componentes: resistores, capacitores, diodos, amplificadores operacionais e outros. Neste tutorial iremos aprender como montar e simular circuitos práticos utilizando esta ferramenta. Com isso, podemos estimar os valores de tensão e corrente, bem como de resposta em frequência de nossos circuitos antes mesmo de executá-los na prática.

Para se realizar uma simulação no LTSpice, podemos inserir as informações de entrada de duas formas: através de uma sequência de linhas de descrição, ou através de sua interface gráfica que nos possibilita desenhar o circuito e selecionar a representação desejada dos resultados. Aqui, iremos focar na segunda maneira, ou seja, selecionando os componentes desejados e criando o desenho.

Neste tutorial usaremos o LTSpice XVII em sua versão mais atual.

[toc]

kit arduino robótica educacional


Mãos à obra - Como utilizar o LTSpice

Instalação

A primeira coisa que faremos será a instalação do software. Para isso, basta entrarmos no site da Analog Devices ->Design Center -> LTSpice e clicar na opção de download que corresponde ao seu sistema operacional. O link para o download é o seguinte:

https://www.analog.com/en/design-center/design-tools-and-calculators/ltspice-simulator.html

Figura 1 - Fazendo o download do LTSpice

Para instalarmos o LTSpice, basta clicarmos no arquivo de extensão .exe que foi baixado. Com isso a janela abaixo será aberta e se você concordar com os termos de instalação, basta clicar em ACCEPT:

Figura 2 - Instalando o LTSpice

Com isso, o botão INSTALL NOW será liberado e a instalação poderá ser iniciada clicando nele.

Figura 3 - Instalando o LTSpice

Depois de alguns minutos a instalação será concluída, clique em OK e depois de alguns segundos o software estará pronto para uso.

Criando o primeiro esquemático

Depois que o programa for aberto nosso primeiro passo será criar um novo esquemático a partir do qual poderemos desenhar o nosso circuito, para isso, basta apertar Ctrl+N ou clicar no local indicado de acordo com a figura abaixo:

Figura 4 - Criando um esquemático

Primeiramente, desenharemos um circuito RLC, selecionando um resistor, um capacitor e um indutor, como indicado abaixo através da barra de ferramentas ou apertando R para resistor, C para capacitor e L para indutor. Uma vez selecionado um tipo de componente, você poderá inserir quantos desejar e se quiser trocar de componente basta apertar ESC e selecionar o próximo.

Figura 5 - Selecionando capacitores, resistores e indutores

Usando MOVE, podemos selecionar e mover os componentes que já escolhemos e com ROTATE e MIRROR podemos rotacioná-los e espelhá-los para que assim possamos representar-los de uma melhor maneira em nosso circuito. O botão WIRE serve para desenharmos as conexões entre nossos componentes.

Figura 6 - Botões Wire, Ground, Component, Move, Rotate e Mirror.

 

Figura 7 - Fazendo as conexões entre os componentes

Clicando com o botão direito do mouse nos componentes selecionados, podemos inserir seus valores de resistência, capacitância ou indutância, lembrando que podemos inserir diretamente as letras k para multiplicar o valor por 1000, m para multiplicar por 0,001, u para multiplicar por 0,000001 e assim por diante. De forma semelhante, se você clicar com o botão direito em cima do nome do componente é possível alterá-lo,  no entanto, basta tomar cuidado para não atribuir o mesmo nome a dois componentes diferentes.

O próximo passo será inserirmos nossa fonte de sinal de entrada. Para isso clicamos em COMPONENT , escrevemos VOLTAGE e depois clicamos no botão OK.

Figura 8 - Inserindo uma fonte de sinal de entrada

O botão COMPONENT nos permite selecionar uma grande variedade de componentes eletrônicos mais específicos para aplicações mais avançadas.

Selecionada a fonte de sinal, basta clicarmos com o botão direito para atribuirmos um valor de tensão a ela. Entretanto, se você deseja que o sinal de sua fonte seja alternado ou que simplesmente varie com o tempo, temos que selecionar a opção ADVANCED, a partir da qual poderemos selecionar um sinal de tensão em forma de pulso, senoidal, exponencial e outros. Uma vez escolhido o tipo de sinal de entrada, basta preencher os campos correspondentes aos parâmetros do sinal, como amplitude, frequência, etc. Para o nosso exemplo usaremos um fonte senoidal com uma tensão de offset de 0V, uma amplitude de 2V e uma frequência de 100Hz.

Figura 9 - Configurando os parâmetros da fonte de sinal de entrada

Com isso, ligamos nossa fonte ao circuito e selecionamos GROUND para indicar onde será a referência de nosso circuito, que neste caso será na ligação inferior entre todos os componentes. Com isso, estaremos prontos para avaliarmos os valores de tensão e corrente em todos os pontos que desejarmos.

Figura 10 - Esquemático do circuito finalizado

 - Análise do circuito

Para analisarmos o circuito precisamos clicar em RUN, de modo que será aberta uma janela onde nós devemos inserir o intervalo de tempo em segundos no qual o programa analisará nossa montagem. No nosso exemplo colocamos 0.1s.

Figura 11 - Botão Run

 

Figura 12 - Analisando o circuito

Sendo assim, quando clicamos em cima de um dos componentes do circuito, o programa irá plotar o gráfico da corrente que passa por esse dispositivo durante o intervalo de tempo determinado. Se clicarmos em cima de uma das ligações ou nós o programa nos dará o gráfico da tensão correspondente àquele ponto em relação ao Ground. Vale lembrar que para o nosso exemplo, o gráfico da tensão em cada componente será igual ao da fonte, visto que eles se encontram em paralelo com ela.

- Imprimindo ou salvando o projeto

Podemos ainda imprimir ou salvar o nosso projeto através do menu FILE, selecionando a opção PRINT para imprimir ou SAVE AS para salvar em algum lugar desejado. Uma vez salvo, você pode abrir o arquivo sempre que desejar clicando nele ou escolhendo a opção OPEN do menu FILE.

Simulação e análise de um circuito mais complexo

- Utilizando um amplificador operacional

Um componente bastante usado em circuitos práticos é o amplificador operacional. Para usá-lo em um circuito é preciso selecioná-lo da mesma forma que a fonte de tensão. Clicando em COMPONENT e depois em OPAMPS. Será aberta uma janela com vários modelos de amplificadores, alguns baseados em CIs reais de mercado e outros que simulam o funcionamento ideal do dispositivo.

Para o próximo exemplo selecionamos o UniversalOpAmp2.

Figura 13 - Selecionando um amplificador operacional

Uma maneira prática de ligar a alimentação do amplificador é usando a opção NET NAME (F4), pois com ela, podemos igualar a tensão em um ponto com a tensão de outro sem necessitar de escrever ligações. Para isso, basta apertar F4 e escrever o nome da tensão de ponto e colocar o símbolo que surgir nos locais em que se deseja igualar as tensões, como está exemplificado na figura abaixo.

Figura 14 - Fazendo as ligações de alimentação do amplificador

Agora estamos prontos para simular um circuito mais avançado. O circuito que analisaremos é o Filtro Notch, um circuito famoso em projetos eletrônicos de baixíssima tensão cujo objetivo na maioria das vezes é eliminar o ruído de 60Hz da rede elétrica. Para isso, é necessário que você faça no seu LTSpice o seguinte desenho:

Figura 15 - Esquemático do circuito Filtro Notch

O circuito acima é chamado de Rejeita Faixa e seus valores de capacitores e resistores fazem com que essa rejeição seja de 60Hz (Fc = 1/2piRC). A análise desse circuito pode ser feita de forma mais apropriada através de sua resposta em frequência. Para isso, nas configurações da fonte, selecione apenas a amplitude AC, que pode ser de 1V:

Figura 16 - Alterando as configurações da fonte

Depois disso, no menu SIMULATE selecione a opção EDIT SIMULATION CMD e vá para a aba AC ANALYSIS. Nesta janela você poderá escolher a opção de representação do eixo das frequências, além da frequência de início e a de fim, bem como do número de pontos para análise no intervalo. Depois de preencher as opções com os dados adequados, clicamos em OK e colocamos a linha de comando em algum lugar perto do circuito.

Figura 17 - Editando as opções de simulação

 

Figura 18 - Editando as opções de simulação

Feito isso, colocamos para executar mais uma vez (RUN) e clicamos no ponto de tensão referente a saída, o gráfico gerado está na imagem abaixo:

Figura 19 - Gráfico gerado para análise do circuito

Neste gráfico, podemos ver o que acontece com a amplitude do sinal para diferentes frequências de entrada e também o que acontece com a fase. É fácil ver que o sinal é bastante atenuado para uma frequência próxima de 60Hz. Os resistores de 10k e 1k controlam o quanto é atenuado o sinal para frequências próximas a frequência de corte, você pode alterá-los e verificar o que acontece com a resposta do circuito para diferentes pares de valores.


Considerações finais

Com isso, concluímos nosso estudo sobre as funções básicas do software LTSpice. O programa é uma ferramenta muito poderosa e muito usada em disciplinas dos cursos de engenharia elétrica e eletrônica. Além disso, pode lhe poupar muito tempo no projeto de circuitos práticos que você se propor a fazer.


Medindo rotação de motores com osciloscópio

Medindo rotação de motores com osciloscópio

Osciloscópios são instrumentos de medição de sinais elétricos cujos resultados são apresentados como gráficos em dois eixos. Os eixos mais comuns são o de diferença de potencial (eixo vertical) e o eixo da frequência (eixo horizontal). Com o objetivo de medir a rotação de um motor, pode-se fazer o uso de diversos instrumentos de medição, entre eles o osciloscópio. Como comparação, o instrumento de medição mais comum usado em trabalho de instalações elétricas prediais, o multímetro, tem excelente aplicação quando os sinais analisados na medição tem alteração gradual. Todavia, caso a alteração seja dinâmica, ou a variável de interesse seja a própria alteração (crescimento da curva de tensão em um capacitor por exemplo) o osciloscópio se torna um equipamento bem mais interessante que o multímetro.

kit arduino robótica educacional

O osciloscópio

Os osciloscópios são capazes de fornecer valores de amplitude, frequência, largura do impulso, além da forma e do padrão do sinal que está sendo medido. A medida é obtida através de um processo semelhante ao que ocorre no caso dos multímetros, ou seja, são utilizados apenas dois cabos no local onde desejamos obter uma resposta. A vantagem sobre o multímetro é que o tempo de amostragem do osciloscópio é muito superior.

Figura 1: Exemplo de osciloscópio

Neste tutorial, apresento uma forma de utilizar o osciloscópio para medir a rotação de um motor elétrico, utilizando da ideia da taxa de amostragem e frequência de impulsos. Para esse uso é necessário introduzir o conceito de um componente que será utilizado, o sensor hall.

O sensor hall

Um sensor Hall ou sensor de efeito hall é um transdutor, isto é, um dispositivo utilizado em sistemas de medição que recebe um estímulo e responde com um sinal de tensão. No caso do sensor hall, esse estímulo é a presença de um campo magnético. Sensores Hall podem ser tanto analógicos, sendo capazes de enviar diferentes sinais de tensão para diferentes intensidades de campos magnéticos, quanto digitais, que enviam sinal lógico (alto ou baixo) na presença ou não do campo magnético. Por exemplo, um sensor hall digital alimentado com 5 Volts envia constantemente sinal lógico baixo 0 Volts em sua saída, na presença de um campo magnético que  ative o transdutor o sinal passa a ser alto até que o campo não seja mais sentido pelo dispositivo.

Mãos à obra - Medido a rotação com um osciloscópio

A fim de medir a rotação de um motor elétrico, um ímã é fixado em seu rotor. Um sensor hall digital é posicionado de modo que quando o ímã gira, seja possível captar o campo magnético através do sensor. Ademais, o sinal de saída do sensor de efeito hall é  ligado à ponta de prova do osciloscópio. O motor em funcionamento faz com que o ímã fixo no eixo do rotor acompanhe o movimento de rotação do motor e passe a girar também. O movimento do imã provoca uma reação no sensor com certa frequência e esse valor de frequência nos permite calcular a velocidade do motor.

Componentes necessários

  • Osciloscópio
  • Imã (o imã deve ser de tamanho e força de atração que não impossibilite a medição)
  • Sensor hall digital (olhar no datasheet do sensor a necessidade de um resistor entre os terminais do sensor)

Procedimento

Fixe o imã no eixo do motor que deseja medir a rotação. A nossa recomendação é que você utilize uma resina de base epóxi ou fita de alumínio. Uma vez que a alta velocidade do motor  pode forçar o ímã a ser arremessado, a fixação incorreta pode oferecer certo perigo.

 

Figura 2: Detalhe da fixação do ímã com fita de alumínio

 

Com o datasheet do sensor hall digital em mão, verifique a necessidade de um resistor entre os terminais dele. Depois alimente o sensor segundo as especificações do fabricante, através de uma fonte de bancada, baterias ou outros métodos.

 

Figura 3: Montagem do Sensor Hall na Protoboard

 

A ponta de prova do osciloscópio deve ser ligada na saída do sensor hall, e o outro terminal deve ser aterrado junto do GND (ground)  do sensor. Posicione o sensor de efeito hall próximo ao ímã, de modo que quando o motor girar o sensor seja capaz de sentir a presença do campo magnético. Esse procedimento é através de tentativa e erro, pois depende da intensidade do ímã utilizado e de quão sensível é o sensor escolhido.

 

Figura 4: Sensor Hall próximo ao ímã fixo no eixo do motor

 

Para exemplificar, um sensor hall KY_003 é capaz de sentir o campo proveniente de um ímã de neodímio a uma distância média de 1 cm entre eles.

 

Figura 5: Sensor KY_003

 

Ligue o motor, o osciloscópio e certifique que a medida está sendo realizada. Possíveis erros nessa etapa estão relacionados com mal contato dos componentes ou da ponta de prova do osciloscópio. Portanto, certifique que erros não estejam ocorrendo e prossiga . Outro erro possível está nas configurações do osciloscópio, que pode estar exibindo valores de tensão em uma faixa maior ou menor que a necessária. Verifique o manual dos equipamentos  faça os ajustes necessários.

 

Figura 6: Montagem de bancada

Resultados obtidos

Com base em todo o procedimento, observe o valor de frequência com que o pulso do sensor acontece. O valor informado diz quantas vezes o pulso acontece em um segundo, ou seja o número de voltas do motor em um segundo. Utilizando matemática simples é possível determinar o número de voltas por minutos, efetuando a seguinte regra de 3:

 

pulsos em um segundo — 1 segundo

velocidade em rpm — 60 segundos

 

O resultado desse cálculo fornece a velocidade do motor medida em rpm. É possível, conforme aplicação do motor, utilizar do mesmo sistema para medir a rotação e com alguns cálculos obter valores em m/s ou km/h.

Considerações finais

A possibilidade de adaptação do método existe, com a utilização de um Arduíno por exemplo. Os pulsos do sensor podem ser contados, e transformados em velocidade da mesma maneira. Um exemplo de utilização no Arduíno está relacionada ao acionamento e controle do motor utilizado o Arduíno. É possível utilizar o valor da velocidade tanto como feedback para o controlador, quanto para variável de saída.

Figura 7: Gráfico plotado no MatLab com dados adquiridos pelo Arduíno

Saber a velocidade do motor é útil em vários aspectos. Testes de bancadas para melhoria em plantas de controle por exemplo. Com base nos valores de velocidade oferecido pelo método e tensão/corrente pela fonte é possível modificar algum parâmetro da planta de controle. Seguindo esse raciocínio, a utilização do método é útil em um serie de aplicações e seu baixo custo o torna atrativo.


Utilizando um multímetro digital

O multímetro digital

Tensão, resistência e corrente elétrica. Em algum momento da vida, certamente você já ouviu falar dessas três grandezas físicas, tamanhas são as suas importâncias para o funcionamento do mundo hoje, desde iluminação pública e assistir a um jogo de futebol no sofá de sua casa até lançar foguetes no espaço. Neste tutorial, iremos aprender sobre as funções mais comuns de um multímetro digital, como utilizá-lo para medir tais grandezas e como interpretar as informações que ele nos fornece.

O multímetro, também chamado de multiteste, é um instrumento praticamente obrigatório no pacote de qualquer entusiasta da área.

Um multímetro digital

 

https://youtu.be/5gFsIrnbkhg

 


Mãos à obra - Conhecendo o multímetro

kit arduino robótica educacional

Componentes necessários

Este tutorial será feito baseado principalmente no multímetro digital HM-1100, disponível à venda no site da Vida de Silício. Contudo, as informações aqui contidas podem ser levadas para a grande maioria dos outros modelos de qualquer marca, pois o princípio de funcionamento destes são exatamente iguais, alterando-se características como os níveis de medição permitidos para cada grandeza, além de funções adicionais que podem ou não estar incluídas.

Alerta de segurança

Note que este multímetro possui a inscrição “CAT III” próxima ao terminal de entrada “COM”. Por vezes despercebida, essa é uma caracterização de extrema importância entre esses instrumentos pois ela diz respeito, basicamente, ao nível de proteção que o aparelho fornece ao usuário, variando do “CAT I” ao “CAT IV”, sendo o “CAT IV” o nível mais elevado de proteção. Para efeitos práticos, recomenda-se, em relação ao uso:

  • CAT I (ou superior): Equipamentos eletrônicos (sinais).
  • CAT II (ou superior): Redes domésticas (tomadas de alimentação de eletrodomésticos, etc).
  • CAT III (ou superior): Painel de distribuição; barramentos.
  • CAT IV: Linhas de baixa tensão (poste até residência).

Considera-se uma boa prática de operação sempre colocar uma ponta de prova preta no borne de entrada “COM”, que nada mais é que um borne comum a todos os outros, e nos demais, de acordo com a medição a ser realizada, uma ponta de prova vermelha.

Principais funcionalidades

- Medindo tensão elétrica

Uma das funções mais comuns de um multímetro é a medição de tensão elétrica entre dois pontos quaisquer (lembre-se que a tensão elétrica é simplesmente a diferença de potencial existente entre dois pontos). Essa tensão pode ser alternada (como nas tomadas residenciais) ou contínua (como baterias em geral).

Sabendo disso, se você deseja medir a tensão elétrica de uma fonte contínua, como a de uma pilha, o primeiro passo é posicionar a chave rotativa do aparelho de modo a deixá-la na posição de seção correspondente à tensão contínua conforme veremos em seguida. Note que, para esta seção, neste instrumento, teremos os seguintes valores:

  • 200 m (até 0,2 Volts em corrente contínua);
  • 2 (até 2 Volts em corrente contínua);
  • 200 (até 200 Volts em corrente contínua);
  • 600 (até 600 Volts em corrente contínua).

Se a faixa de grandeza da tensão a ser medida é desconhecida, é uma prática comum utilizar-se da maior escala disponível (nesse caso, 600 V) e efetuar a medição. Caso a escala escolhida seja muito superior ao valor mostrado, então altera-se a escala para a mais próxima e ainda superior ao valor lido e efetua-se novamente a medição. Assim, o valor lido terá uma precisão maior.

No caso de fontes de tensão contínua, como dissemos antes, é uma boa prática sempre conectar a ponta de prova preta, já conectada na entrada “COM” do instrumento, ao borne ou terminal negativo da fonte em questão e a ponta de prova vermelha, também já conectada à entrada referente à tensão, ao terminal positivo da fonte. Do contrário, como veremos mais adiante, o valor exibido pelo aparelho virá acompanhado de um sinal negativo, indicando que a polaridade está invertida.

Disposição de um voltímetro em um circuito elétrico

No caso de fontes de tensão alternadas, como a tomada de sua casa, por exemplo, essa polaridade não faz diferença, pois, como o nome sugere, as polaridades se alternam ao longo do tempo e por isso, não há um negativo ou um positivo. A medição é feita da mesma maneira que em uma fonte contínua, devendo-se apenas atentar-se para colocar a chave rotativa na posição referente à medição de tensão alternada conforme veremos em seguida.

- Medindo resistência elétrica

Atenção: Por questões de segurança, sempre que se for medir a resistência elétrica de um qualquer componente, certifique-se de que o mesmo não está energizado.

Na prática, a medição de resistência elétrica seguirá os mesmos preceitos dos enunciados acima, em tensão elétrica. Todos os multímetros digitais possuem a característica de um único borne de entrada tanto para tensão quanto para resistência. De fato, note que o modelo utilizado (HM 1100), inclusive, ainda usa esse mesmo borne para a medição de corrente elétrica na escala de miliamperes - essa configuração final pode variar de instrumento para instrumento, alguns possuindo um borne adicional para essa última grandeza.

Assim, para medir a resistência elétrica entre dois pontos, basta conectar as pontas de provas à estes pontos (lembre-se de que o circuito deve estar desenergizado).

- Medindo corrente elétrica

A “função amperímetro” de qualquer multímetro é um quesito bastante sensível enquanto que na “função voltímetro” bastava ligar as pontas de prova do instrumento aos terminais do elemento que se pretendia medir, em uma configuração que chamamos de ligação em paralelo. Para medir a corrente elétrica de um componente em um circuito precisa-se posicioná-lo de forma a deixá-lo em série (ligação em série) com o componente em questão. E, claro, se desejamos medir a corrente elétrica, é necessário que o circuito esteja energizado, ou seja, em pleno funcionamento (nos casos da tensão elétrica e resistência elétrica, este não era um requisito).

Disposição de um amperímetro em um circuito elétrico

Note que, para a ligação em série, seria necessário desconectar o componente da fonte de alimentação, de modo a colocar o multímetro entre estes dois elementos (assim, a corrente que passar pelo componente também passará pelo multímetro).

Atenção: Se conectarmos o multímetro em paralelo com o componente e utilizarmos a escala de corrente, certamente criaremos um curto-circuito que poderá danificar instantaneamente o instrumento, além de um possível acidente. Isto ocorre porque na função amperímetro, o multímetro fica com a resistência elétrica quase nula (de fato, quanto menor for este valor, melhor será a medição do aparelho) e com isso, é necessário que haja pelo menos uma resistência em série com o mesmo para o controle da corrente elétrica. Note que, pela Lei de Ohm, temos:

I = V/R

em que i representa a intensidade da corrente elétrica, em amperes (A); V representa a tensão elétrica, em Volts (V); e R representa a resistência elétrica, em Ohms (Ω). Como na função amperímetro R estará próximo de zero, para qualquer valor de V teremos facilmente uma corrente absurdamente alta, caracterizando um curto-circuito.

Pelas razões acima, não recomenda-se o uso do multímetro para medição de corrente elétrica - especialmente para valores em que seja necessário utilizar a escala de amperes (A), em detrimento da de miliamperes (mA). Recomenda-se, para a medição de correntes, o uso de alicates amperímetros, cuja operação é extremamente intuitiva e mais segura.

Realizando experiências práticas

Pegue uma pilha nova e vamos confirmar sua tensão. Primeiro, como já sabemos, conectamos as pontas de provas no multímetro de modo que, a ponta preta no borne de entrada “COM” e a vermelha, no borne de entrada com o símbolo “V”, referente à Volts. Em sequência, colocamos o multímetro na escala de tensão contínua neste ponto, é importante observarmos que como o valor máximo esperado é de 1,5 V, deixaremos a chave rotativa em “2”, pois assim, o multímetro estará preparado para fazer uma medição de tensão contínua de no máximo 2 Volts.

Agora, basta conectar a ponta de prova vermelha ao terminal positivo da pilha e simultaneamente colocar a ponta de prova preta em seu terminal negativo; dessa forma, o multímetro deverá informar a diferença de potencial existente entre os terminais da pilha.

Medindo a tensão de uma pilha

Se invertermos a ligação das pontas de provas em relação aos terminais da pilha, como já dito, teremos um sinal negativo no display do multímetro, de forma a sinalizar que a polaridade está invertida

Medindo a tensão de um pilha

Para tensão alternada, o procedimento é o mesmo. Desta vez, porém, não haverá “polaridade invertida”, visto que não há terminais positivos e negativos fixos (daí o nome “alternada”). Certamente as tomadas de sua casa possuem esse tipo de tensão e para medir ela procedemos da seguinte maneira: em primeiro lugar, para alterar a escala do multímetro, recomenda-se desconectar pelo menos uma das pontas de prova, para evitar contato com possíveis partes energizadas de circuitos. Feito isso, posicionamos a chave giratória na parte de tensão alternada. No nosso caso, temos duas possibilidades: 600 e 200. Como não sabemos se determinada tomada é 127 V ou 220 V, escolhemos “600”, ou seja, deixamos o multímetro preparado para uma medição de tensão alternada de no máximo 600 Volts. Assim feito, reconectamos a ponta de prova previamente retirada do borne de entrada e procedemos da mesma maneira que em tensão contínua.

Medindo a tensão de uma tomada

A leitura obtida foi de 119V, que é menor que 200V. Assim, a escala mais indicada para essa leitura é a de “200”. Desconectamos novamente uma das pontas de prova do borne de entrada (e também da tomada), e mudamos a chave giratória para “200”. Fazemos a medição novamente.

Medindo a tensão de uma tomada

Note que a leitura do multímetro agora é mais precisa, com mais algarismos significativos. Isso porque agora a escala está melhor ajustada para este valor de tensão. Se invertermos a polaridade das pontas de prova em relação à tomada, nenhuma diferença será notada. Além disso o valor lido pode ser um pouco oscilante, devido à instabilidade da tensão da rede de energia.

Por fim, mediremos resistência elétrica. Pode-se medir a resistência de qualquer componente, mas, por simplificação, mediremos a resistência elétrica de nosso próprio corpo. Posicionaremos o multímetro em sua função “ohmímetro”, na escala para resistência elétrica. Em nosso caso, como não sabemos a resistência de nosso corpo, deixaremos no valor máximo, que no multímetro utilizado é “20M”, equivalente a 20 milhões de Ohms - dessa forma, o multímetro estará preparado para medir uma resistência elétrica de até 20.000.000 Ohms.

Seguramos uma ponta de prova em uma mão, e a outra ponta de prova com a outra mão.

Medindo a resistência elétrica interna do corpo de uma pessoa

O valor obtido com essa prática foi de 1.58, o que equivale a uma resistência elétrica interna de aproximadamente 1,58MΩ de nosso corpo. Esse valor varia consideravelmente dependendo da força com que as pontas são seguradas, a área de contato dos dedos com essas pontas, umidade do corpo, entre outros parâmetros. Qual o valor obtido por você? Maior ou menor que o nosso? Quem estaria mais “protegido” em caso de tomar o mesmo choque elétrico? Deixe sua resposta nos comentários!


Desafio

Faça a medição de resistência elétrica em outros pontos de seu corpo, como, por exemplo, entre a mão esquerda e o antebraço esquerdo; entre a mão esquerda e sua perna direita; entre outros. O que você pôde observar dos valores obtidos? Entre quais pontos você afirmaria obter o maior valor possível?


Considerações finais

Esperamos que tenha gostado deste tutorial que, embora seja de um instrumento relativamente simples, é, sem dúvida alguma, um dos mais utilizados no meio da elétrica e eletrônica em geral. Lembramos que, ainda, este equipamento não se limita às funções aqui explicitadas: há ainda funções como continuidade, diodo e outros (alguns multímetros têm inclusive uma parte para teste de transistores!). Este com certeza um equipamento must have para todo e qualquer entusiasta da área, e, com sorte, acrescentamos aqui algo ao seu conhecimento! Qualquer dúvida, sugestão, elogio ou crítica, basta deixar nos comentários.


Aprendendo a crimpar cabos de rede

Aprendendo a crimpar cabos de rede

Redes de computadores estão por todo lado, seja para uso profissional - onde tais redes podem comportar centenas de computadores - ou até mesmo para uso doméstico, com pelo menos duas máquinas. Apenas como curiosidade, em 2016, segundo o IBGE, o Brasil possuía em torno de 116 milhões de pessoas conectadas à internet. Neste tutorial iremos aprender a como deixar os cabos de rede perfeitos para uso.

Um ponto crucial para o funcionamento correto dessas redes são as suas conexões, isto é, a forma com que esses dispositivos irão se comunicar uns com os outros. A forma mais segura (menos suscetível à instabilidades por fatores externos) e rápida (velocidade de conexão) de fazê-lo é utilizando-se cabos de rede.

kit robotica educacional com Arduino ESP ou Microbit


Mãos à obra - Crimpando cabos de rede

Componentes utilizados

  • Alicate crimpador
  • Conectores RJ-45
  • Cabo de Rede (também conhecido como Cabo de Par Trançado ou Cabo UTP)
  • Estilete
  • Alicate de Corte
  • Testador Cabo de Rede

Esquemas de cores

Figura 1 - Esquema de cores de um cabo de rede

Primeiramente, para preparar o cabo para receber os conectores, retira-se, em ambas as pontas do mesmo, a capa de isolamento azul em um comprimento de aproximadamente 3 cm. Para realizar esta tarefa, recomenda-se utilizar o estilete, tendo cuidado para não forçar demais sua lâmina e ferir os cabos que são protegidos por este isolante. Uma vez retirada esta capa, nota-se que existem 4 pares de fios, sendo cada um destes formado por dois fios entrelaçados. Desenrole todos os fios e deixe-os lado a lado, o mais reto possível. No desenvolvimento desta experiência, siga o padrão de disposição de cores que julgar conveniente, no entanto, neste tutorial utilizaremos o padrão EIA/TIA 568A.

Figura 2 - Ponta de um cabo de rede sem a capa de isolamento azul

Além do estilete, pode-se também optar por usar a parte de corte do alicate crimpador, com o qual é possível descascar o revestimento azul sem ferir os pares internos.

Figura 3 - Alicate crimpador

Uma vez acertada a disposição escolhida, deve-se comparar o comprimento dos 8 fios com o espaço do conector RJ-45, ajustando-o de forma que base inteira do conector coincida com a parte de proteção azul do cabo. Esse passo é importante pois essa base será fortemente prensada contra o cabo, de modo a não permitir-lo sair do conector facilmente, dessa forma, é mais seguro deixar que esta força atue contra essa capa de proteção, mais resistente mecanicamente que os fios em si. Do contrário, os fios podem ser danificados, causando mal funcionamento e diminuindo vida útil do cabo. 

Figura 4 - Cabo de rede com o conector RJ-45 na ponta

Observado o comprimento ideal, corta-se então os fios nessa medida, utilizando-se o alicate de corte. Feito isso, não é necessário desencapar a ponta dos fios: basta introduzi-los no conector RJ-45, sempre respeitando o padrão de cores escolhido. Deve-se empurrar os fios até o final do conector, garantindo que todos estes cheguem até os contatos metálicos dourados da extremidade oposta do conector. Confira novamente se as cores estão de acordo com o padrão pré-determinado. Se houver divergência, é aconselhável repetir o processo.

O padrão de cores a ser utilizado é mostrado na figura a abaixo:

Figura 5 -  Padrão de cores

Na figura, vemos que olhando de frente para os contatos metálicos, o padrão de cores dos fios será:

  • Branco/Verde;
  • Verde;
  • Branco/Laranja;
  • Azul;
  • Branco/Azul;
  • Laranja;
  • Branco/Marrom;
  • Marrom.

Em alguns cabos, a cor branco/verde é  na realidade um verde mais claro, o branco/azul é um azul mais claro e assim por diante.

Feito isto, basta encaixar o conector na parte reservada a este do alicate crimpador e pressionar esta ferramenta até o seu travamento (geralmente é possível ouvir um “click”) e pronto! Repita o processo com a outra ponta do cabo e este estará pronto para uso. Caso todos os cuidados aqui relatados tenham sido seguidos, você provavelmente evitará quaisquer manutenções futuras por mal funcionamento.

Figura 6 - Crimpando um cabo de rede

É possível, ainda, testar a disposição do cabo de rede com um aparelho chamado “testador de cabo”. Basta colocar cada uma das duas pontas do cabo, já com seus devidos conectores, no aparelho e ligá-lo. Os LEDs que se acendem no aparelho fazem referência à disposição dos fios do cabo, assim, se de um lado acende o LED referente ao número 1, a outra parte do aparelho que recebe a outra ponta do cabo deve acender o LED referente ao número 1, indicando que o sinal foi enviado e recebido no fio de posição 1; em seguida, ambos devem mudar para a posição 2, e assim deve ocorrer sucessivamente até o número 8, demonstrando que todas as posições estão corretamente interligadas.

Figura 7 - Aparelho utilizado para testar a disposição do cabo de rede

Os cabos de rede UTP são os mais amplamente usados, pois possibilitam a transmissão de informações em alta velocidade, cerca de 100Mbps na categoria 5E, que é a que utilizamos neste tutorial. Além disso, o fatos de ser composto por pares de fios trançados possibilita uma melhor qualidade na transmissão, eliminando interferências eletromagnéticas externas e entre fios.

Considerações finais

Agora que você viu como é simples o procedimento de crimpagem de cabos de rede, pode fazer seus próprios cabos do tamanho que precisar para estender sua conexão com a internet. Espero que tenha gostado deste tutorial e fique bem conectado!


Soldando componentes eletrônicos

A solda eletrônica

A solda eletrônica é um procedimento muito recorrente para quem trabalha com circuitos eletrônicos. Aprender a soldar é bastante útil para quem pensa em começar a mexer com equipamentos, manutenção e até mesmo criações próprias. Neste tutorial veremos os procedimentos básicos para realizar a solda de componentes eletrônicos.

[toc]

kit robotica educacional com Arduino ESP ou Microbit

Ferramentas

Antes de mais nada vamos conhecer as ferramentas mais comuns para solda eletrônica.

Ferro de solda

Figura 1 - Ferro de solda

O ferro de solda é uma das principais ferramentas para soldar componentes. Existem vários modelo de ferro de solda que, por sua vez, são voltados para os mais diversos tipos de aplicações, apresentando portanto características diferenciadas entre si como potência, ajuste de temperatura e diâmetro da ponta. Para quem faz trabalhos mais caseiros ou quer mexer com eletrônica por hobby, um ferro de solda de 25W a 45W sem ajuste de temperatura já é o suficiente.

Estanho

O estanho também é um material indispensável para soldar componentes. Sua composição consiste em uma liga metálica normalmente de estanho e chumbo que derrete em temperatura alta e possibilita a conexão elétrica entre um componente e uma placa. Existem vários tipos de estanho, com composições e espessuras diferentes, sendo recomendado os fios por volta de 0,5 mm para soldar componentes eletrônicos. Por conter chumbo, esse material deve ser manuseado com atenção e em local ventilado, evitando respirar a fumaça expelida durante seu aquecimento.

Figura 2 - Fios de estanho

Esponja vegetal

A esponja vegetal é extremamente útil para se limpar a ponta do ferro de solda ao longo do processo de soldagem. Em virtude de ser rígida quando está seca, ela deve ser molhada para ficar macia e adequada para o uso.

Figura 3 - Esponja vegetal

Pasta de solda

Figura 4 - Pasta de solda

A pasta de solda é um produto opcional no procedimento de soldagem. Consiste em uma pasta que se liquefaz quando aquecida e facilita o espalhamento e adesão do estanho em outros metais. Normalmente usada em componentes ou placas com efeitos de oxidação ou de difícil acesso.

Sugador de solda

O sugador de solda não é uma ferramenta essencial para soldagem, mas ajuda bastante tanto na retirada dos excessos de estanho quanto no processo de dessoldagem de componentes.

Figura 5 - Sugador de solda

Mãos à obra - Soldando componentes

Componentes necessários

Preparativos

Ligue o ferro de solda na tomada e espere de 2 a 3 minutos enquanto ele aquece. Verifique se o ferro de solda já está quente encostando o estanho na sua ponta, quando derreter facilmente é sinal de que o ferro esquentou. Molhe a esponja vegetal na água sem encharcá-la, apenas deixando ela úmida. Em seguida limpe o ferro de solda passando sua ponta na esponja úmida.

Procedimento

As etapas para realizar a soldagem de um componente eletrônico são:

  • Etapa 1: encaixe o componente na placa. Passe o componente pelos furos e dobre o seus terminais sobre a placa para facilitar a soldagem.

 

Figura 6 - Encaixando um componente na placa furada

 

Figura 7 - Componente encaixado na placa
  • Etapa 2: com o uso do pincel passe um pouco de pasta de solda sobre o local que quer soldar e retire o excesso.
  • Etapa 3: com o ferro de solda, toque o local onde quer soldar e aproxime o estranho.
Figura 8 - Soldando um componente na placa
  • Etapa 4: espere o estanho escorrer pelo local e aderir tanto à placa quanto ao componente.
  • Etapa 5: remova o ferro de solda e espere o estanho esfriar
  • Etapa 6: verifique se ficou bem firme.
  • Etapa 7: para dar acabamento, corte o excesso do terminal que acabou de ser soldado.
Figura 9 - Cortando o excesso de material que foi soldado
  • Etapa 8: para soldar itens maiores, é válido estanhar antes o terminal. Por exemplo, caso desejo soldar um fio na minha placa, estanho o terminal do fio e depois o soldo na placa. O procedimento em si é o mesmo.
Figura 10 -Soldando um componente na placa
  • Etapa 9: para remover o excesso de solda, armamos o sugador de solda, aquecemos o local da solda com o ferro de solda e aproximamos e apertamos o botão do sugador, que puxa o estanho aquecido e desarma o sugador.
Figura 11 - Usando o sugador de solda

Dicas

  • A prática é essencial para ter domínio de soldagem.
  • Uma boa solda é aquela na qual o estanho fica uniformemente espalhado e brilhando. Para isso é necessário ter um equilíbrio entre a quantidade de estanho aplicado e a temperatura do ferro de solda.
  • Se o estanho ficou fosco, esbranquiçado ou aparenta não ter aderido bem à placa e/ou ao componente, verifique se o ferro de solda está quente o suficiente ou se o estanho utilizado passou da validade.
  • Cuidado com o tempo de aplicação da ponta do ferro na placa, pois alguns componentes podem ser danificados se forem esquentados por muito tempo.
  • A fim de aperfeiçoar a técnica, encontre um circuito eletrônico antigo e sem uso, como placa-mãe velha, e tente remover e soldar novamente os componentes.

Considerações finais

Espero que tenha gostado desse tutorial e comece suas próprias criações eletrônicas agora que já sabe soldar. Uma solda de qualidade é um processo que requer tempo e a melhor de forma de melhorar a técnica é através da prática. Então não perca tempo e comece a soldar! Sucesso!


Utilizando fontes de bancada

Utilizando fontes de bancada

As fontes de bancada são equipamentos essenciais para o desenvolvimento da grande maioria dos projetos de eletrônica e serão o assunto deste tutorial. A utilização desse tipo de fonte é bastante simples, entretanto, é importante dominar o assunto para trabalhar em seus futuros projetos com tranquilidade e segurança.

kit robotica educacional com Arduino ESP ou Microbit

Introdução

É comum no cotidiano dos estudantes, profissionais ou pessoas aficionadas por eletrônica a necessidade de utilização de um nível contínuo de tensão ou corrente para alimentação de circuitos, sensores, módulos, microcontroladores e vários outros elementos. É possível suprir esta demanda com baterias ou fontes de tensão, no entanto, a vantagem de se utilizar a segunda opção está no fato de que pode-se variar a tensão e corrente máxima fornecidas dentro de de um intervalo especificado pelo fabricante.

O objetivo primordial de uma fonte de bancada é receber a tensão alternada de alimentação proveniente da rede elétrica e gerar níveis contínuos de tensão e corrente conforme definidos pelo operador, normalmente por potenciômetros. As estratégias para conversão de tensão alternada em contínua  são variadas e os circuitos das fontes relativamente complexos, portanto as definições de hardware não serão discutidas neste tutorial.


Tipos de fontes

Fonte com um canal

Inicialmente, vamos definir os elementos externos de uma fonte de tensão. A figuras a seguir ilustram a configuração típica de uma fonte com um canal ajustável e seu esquemático simplificado, respectivamente:

Exemplo de uma fonte de bancada

 

Esquemático simplificado de uma fonte de bancada

Neste tipo de configuração existem três bornes de saída disponíveis. O borne negativo (preto) fornece acesso ao referencial adotado pelo instrumento, ou seja, o referencial ou terra do circuito externo a ser alimentado. Já o borne positivo (vermelho) fornece um nível de tensão em relação ao referencial citado anteriormente. Por exemplo, quando se ajusta a fonte para fornecer 5 Volts, existirá uma diferença de potencial igual a 5 Volts entre os bornes positivo e negativo.

O terceiro borne disponível é o GND (verde), através dele é possível ter acesso ao aterramento da estrutura física da fonte. É importante não confundir o negativo do circuito com este terminal de aterramento, eles não são equivalentes.

Note também a existência de quatro potenciômetros que funcionam como chaves para ajustes. Dois deles são para ajuste do nível de tensão e os outros dois para ajuste da corrente máxima fornecida. Em ambos os casos um dos potenciômetros é para ajuste grosso e o outro para ajuste fino, caso a aplicação demande maior precisão de valores das respectivas grandezas.

Uma prática comum para verificar o nível máximo de corrente ajustado é curto circuitar os terminais positivo e negativo da fonte com os cabos de alimentação por um breve período, ou seja, um cabo é conectado ao borne positivo e outro ao borne negativo e posteriormente deve-se encostar um cabo no outro. O circuito para este caso é:

Curto circuito em fonte de bancada.

Pela Lei de Ohm temos que:

Como a resistência é nula obteríamos uma corrente infinita, entretanto ela está limitada ao valor de limite de corrente da fonte. É por isso que um curto circuito nesses terminais da fonte de bancada nos permite visualizar e ajustar o limite de corrente da mesma. 

Quando sabemos de antemão qual é a corrente máxima requerida pelo circuito a ser alimentado, devemos ajustar o limite de corrente, pois, em caso de anomalias como um curto circuito, por exemplo, a corrente não excederá o valor definido como usual e o circuito ou equipamento externo não será danificado.

De forma geral, as fontes também apresentam dois visores digitais que mostram os valores de corrente e tensão e também dois LEDs, C.C e C.V., que acendem quando os limites de corrente e tensão são atingidos, respectivamente.

Fonte com dois canais

Existem outras fontes de bancada comerciais que, ao contrário da anterior, possuem dois canais para uso, ou seja, existem duas fontes de alimentação dentro da fonte de bancada que podem se relacionar de diferentes formas. A figura a seguir ilustra esta configuração:

Exemplo de fonte de bancada com dois canais

Algumas variações podem ser observadas entre os modelos, como a existência ou não de um potenciômetro para ajuste fino e a presença de terminais com um nível fixo de tensão, normalmente 5 Volts - na imagem acima, esses terminais são os dois posicionados mais à direita.

Como exposto anteriormente, é possível variar o estado dos dois botões no centro da fonte para fazer com que os canais se relacionem de três formas diferentes, são elas:

- Independentes

Os dois canais são independentes e podem ser utilizados para aplicações distintas simultaneamente.

Esquemático simplificado de uma fonte bancada com os canais selecionados no modo “independente”

- Em série

Os canais são associados em série, de modo que a tensão fornecida seja a soma das contribuições de cada um deles.

Esquemático simplificado de uma fonte bancada com os canais selecionados no modo “série”

- Em paralelo

Os canais são associados em paralelo, de modo que a corrente total fornecida seja a soma das corrente de cada um. Com esta configuração é possível extrair maior corrente da fonte de bancada e alimentar equipamentos que demandam maior potência, como motores elétricos.

     

Esquemático simplificado de uma fonte bancada com os canais selecionados no modo “paralelo”

Informações adicionais

Regular tensão e corrente antes de ligar a fonte ao circuito ou equipamento e zerar esses valores antes de a desligar são boas práticas que evitam. respectivamente, expor a o objeto alimentado a regimes indesejados e surpreender o próximo usuário da fonte de bancada.

É importante lembrar que todas as fontes de alimentação reais possuem uma impedância interna associada aos seus terminais. No entanto, para aplicações convencionais, não é preciso se preocupar com esse fato.

Além disso, o valor indicado no visor de uma fonte não apresenta grande exatidão. Portanto, caso a aplicação demande, é necessário conferir o valor com um instrumento de medição apropriado - um multímetro, por exemplo.   

Por fim, o layout de outras fontes pode se distinguir em alguns aspectos dos apresentados aqui. Entretanto, eles são normalmente intuitivos e em pouco tempo de uso você estará familiarizado!  


Considerações finais

Fontes de bancadas são equipamentos essenciais para o desenvolvimento de hardware ou teste de equipamentos. Em relação à baterias ou pilhas, elas nos permitem obter maior controle sobre o fornecimento de tensão e corrente.

É importante conhecer bem o aparelho para otimizar seu uso no cotidiano e evitar submetê-lo a situações perigosas ou que possam danificar o mesmo. Planeje bem como a fonte será utilizada em seus experimento e mãos à obra!


Lendo um potenciômetro com o ESP8266 NodeMCU

Lendo um potenciômetro com ESP8266 NodeMCU

Neste tutorial, nós vamos dar início a uma grande quantidade de conteúdos voltados para o ensino dos conceitos básicos necessários para que você consiga começar a utilizar o seu NodeMCU e desenvolver os seus projetos de automação, seja para sua escola, para sua casa ou até mesmo para uma indústria. Hoje, nós vamos te mostrar como você deve proceder para ler as informações provenientes de um potenciômetro com o seu ESP8266 NodeMCU.

[toc]

kit robotica educacional com Arduino ESP ou Microbit

As grandezas analógicas e a porta de entrada analógica A0

Antes de aprendermos a efetuar  leitura de um potenciômetro, nós devemos definir o que são as grandezas analógicas. Bem, as grandezas analógicas são aquelas que, ao contrário das grandezas digitais, podem assumir infinitos valores de amplitude dentro de uma faixa de valores. Imagine por exemplo, o velocímetro de um carro. Este instrumento pode ser considerado como sendo um medidor analógico, pois o ponteiro gira continuamente conforme o automóvel acelera ou freia. Se o ponteiro girasse em saltos, o velocímetro seria considerado digital.

O módulo ESP8266 NodeMCU possui um pino destinado a lidar com a leitura deste tipo de grandeza, ou seja, um pino cuja função é receber níveis de tensão e em seguida traduzir os mesmos em uma linguagem adequada para que possamos manipulá-los. Este processo ocorre da seguinte maneira: o NodeMCU que estamos utilizando suporta sinais de tensão entre 0 e 3,3V em suas entradas, portanto, caso nós coloquemos um sinal de tensão de 0 volts na porta de entrada analógica A0, o nosso módulo irá associar esta informação ao número 0 (zero) . Em contrapartida, caso o sinal em questão tenha magnitude de 3,3V, o NodeMCU irá referenciar este valor ao número 1023.

Conversão dos valores de tensão em valores numéricos
Figura 1 - Conversão dos valores de tensão em valores numéricos

 


Mãos à obra - Efetuando a leitura de um potenciômetro

Componentes necessários

Montando o projeto

Hardware utilizado
Figura 2 - Hardware utilizado

Hardware montado

Hardware montado
Figura 3 - Hardware montado

Programando

Este é o código que utilizaremos no desenvolvimento deste tutorial

float leitura;

 void setup() 
{ 
  Serial.begin(115200);
  Serial.println("Leitura do potenciometro");
  Serial.println("Valor        Volts");
}

void loop() 
{
  Serial.print(analogRead(A0));
  Serial.print("         ");
  leitura = (analogRead(A0)*3.3/1023);
  Serial.println(leitura);
  delay(1500);  
}

Colocando para funcionar

Após compilarmos o código apresentado, nós teremos este resultado:

Resultado obtido
Figura 4 - Resultado obtido

Entendendo a fundo

Software

– Declarando a variável global para armazenar o valor convertido do nível de tensão

Inicialmente, nós vamos declarar uma variável do tipo float para que ao efetuarmos os cálculos referentes à conversão do nível de tensão presente no potenciômetro, esta possa armazenar o resultado da maneira desejada, isto é, sob a forma de números com casas decimais.

float leitura;

– Definindo as configurações iniciais

Dentro da função setup() nós iniciamos a conexão com o Serial Monitor através da função Serial.begin() (passando como parâmetro o valor da taxa de transmissão de dados (como sugestão, utilize este valor)). Além disso, nós vamos utilizar a sentença Serial.println(). Para escrever na tela um título para a nossa aplicação, de modo que, este será "Leitura do potenciômetro". Por fim, recorremos à sentença Serial.println() novamente e enviamos através da porta serial o cabeçalho da tabela que estamos criando (repare que nós demos alguns espaços entre as duas palavras deste cabeçalho justamente para a tabela fique mais agradável de ser visualizada).

 void setup() 
{ 
  Serial.begin(115200); 
  Serial.println("Leitura do potenciômetro"); 
  Serial.println("Valor        Volts"); 
}  

– Lendo o valor do potenciômetro

A primeira ação que nós realizaremos dentro da função loop() será enviarmos o valor referente ao sinal de tensão já convertido na escala de 0 a 1023 através da porta serial para ser apresentado no Serial Monitor com a utilização da sentença Serial.print(). Em seguida, utilizamos a sentença Serial.print() novamente para enviar uma série de espaços para que o valor que virá depois (convertido para volts) esteja organizado logo abaixo da palavra Volts que faz parte do cabeçalho da tabela (note que aqui nós utilizamos somente as funções print() e não println() pois assim nós conseguimos escrever coisas na mesma linha).

Posteriormente, nós convertemos o valor obtido através da entrada analógica do nosso módulo ESP8266 NodeMCU para uma escala em volts e inserimos o resultado na variável leitura, de modo que, após este procedimento, nós utilizamos a sentença Serial.println() para fazer com que este valor seja enviado para o Serial Monitor. Por fim, utilizamos a função delay() para determinar o intervalo entre cada uma das aquisições.

void loop() 
{
  Serial.print(analogRead(A0));
  Serial.print("         ");
  leitura = (analogRead(A0)*3.3/1023);
  Serial.println(leitura);
  delay(1500);  
}

Considerações finais

Neste tutorial, nós demonstramos como você pode fazer para realizar a leitura de valores de sinais de tensão provenientes de um potenciômetro através de um módulo ESP8266 NodeMCU.  Esperamos que continue nos acompanhando e sinta-se à vontade para nos dar sugestões. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Display LCD TfT 2.4"- Primeiros passos com Touchscreen

Display LCD TfT 2.4" - Primeiros passos com touchscreen

Neste tutorial iremos dar continuidade a utilização do display TfT no Arduíno Uno. Caso não tenha lido esse tutorial, recomendo fortemente que o veja aqui, pois nele ensinamos o processo de configuração da tela. Já nesta parte do tutorial, iremos aprender a como configurar, calibrar e utilizar o touchscreen disponível no display.

kit robotica educacional com Arduino ESP ou Microbit

[toc]

Evolução da interface homem máquina (IHM)

Durante o desenvolvimento de qualquer tipo de sistema computacional, é fundamental que a elaboração de interfaces para visualização e controle destes sistemas sejam elaboradas levando em consideração fatores como facilidade de uso e layout agradável. Com isso, muito vem se evoluindo no que tange o desenvolvimento de intefaces homem máquina, e algo que permitiu um salto significativo na evolução destas interfaces foi o desenvolvimento das telas de toque, ou TouchScreen.

As telas TouchScreen podem ser consideradas como uma evolução para o desenvolvimento de interfaces homem máquina mais robustas. Isso se deve ao fato de que através de uma tela TouchScreen, é possível elaborar interfaces dinâmicas, com imagens e comandos intuitivos ao usuário final. Além disso, seu uso pode reduzir significativamente o tamanho final de um produto, uma vez que dispensa a necessidade de outros periféricos de interface humana, como botões, teclados, e mouse. E levando em consideração o barateamento desta tecnologia seu uso ainda reduz o preço final de um produto.

 

Diferença entre paineis clássicos e paineis de controle TouchScreen

O surgimento da considerada primeira "tela" touchscreen

 

Considerada como um "acidente", a primeira tela touchscreen surgiu em meados dos anos 70. Em virtude da necessidade de se criar um meio mais simples para interação com planos cartesianos, o engenheiro George Samuel Hurst, conseguiu, através de uma malha condutiva, ler as coordenadas de um plano cartesiano ao pressionar um ponto desta malha com uma caneta, criando assim o que pode ser considerado a primeira "tela" touchscreen.

Como funciona

Telas TouchScreen são subdivididas entre duas categorias, denominadas resistivas e capacitivas.

  • Tela Resistiva: Uma tela resistiva é composta basicamente por duas camadas, sendo a primeira camada um material condutor e a segunda camada composta por vidro. No momento em que uma pressão é realizada sob a tela e essa pressão é capaz de fazer com que a camada de vidro toque a camada condutora, uma variação no campo elétrico é detectada e com base nessa variação o sistema é capaz de informar o ponto onde o toque ocorreu.
Tela de toque resistiva
  • Tela Capacitiva: Composta por um material condutor carregado eletricamente e um controlador capaz de detectar variações no campo elétrico em regiões distintas um ponto de toque é detectado no momento em que ocorre uma variação no campo elétrico decorrente ao toque de um material condutor na superfície.
Funcionamento tela capacitiva.

Shield Lcd TFT 2.4″ Touchscreen

Neste tutorial iremos utilizar o shield LCD TFT 2.4" como base para o nosso projeto de controle de acesso. Se você ainda não sabe como configurar, instalar driver e renderizar informações nesta tela, você pode conferir um tutorial neste link:

O shield Lcd TFT 2.4″ possui uma resolução de 240×320, além de possuir uma interface touchscreen resistiva por onde é possível interagir com a tela sem a necessidade de botões. A tela conta com um total de 13 pinos distribuídos entre alimentação, controle do touch e controle do display.

Tela utilizada

É importante que para o uso correto deste display, você utilize o tutorial anterior e consiga assim configurar e instalar as bibliotecas corretas.

 

 


Mãos a obra - Primeiros passos com Touchscreen

Componentes utilizados

Instalando bibliotecas necessárias

Para implementarmos as aplicações propostas, nós iremos primeiramente baixar a biblioteca TouchScreen da Adafruit, que pode ser facilmente encontrada através da opção Gerenciar Biblioteca dentro do menu Sketch como mostra a figura abaixo:

Baixando biblioteca Touchscreen através do Gerenciador de Biblioteca.

Calibração da tela

Com a biblioteca instalada, iremos agora iniciar o processo de calibração da tela, que consiste basicamente em encontrar os valores de extremidade da nossa tela. Esse processo é extremamente importante, pois será através dos valores obtidos desta calibração que sistema será capaz de identificar qual ponto da tela foi pressionado. Para iniciarmos o processo de calibração, iremos executar um dos exemplos disponibilizados pela biblioteca MCU_FRIEND de nome TouchScreen_Calibr_native como mostra a imagem a seguir:

Exemplo a ser executado para calibração da tela.

 

Se todo processo de instalação da biblioteca tiver sido feito corretamente, você verá a seguinte imagem no display.

Informações sobre como realizar a calibração.

A tela em questão informa tudo que deve ser feito para realização do processo de calibração, que consiste apenas em pressionar alguns quadrados que vão estar posicionados nas extremidades da tela. Para prosseguir até a próxima tela, basta tocar a tela em qualquer lugar. Logo após clicarmos na tela, seremos direcionado a imagem abaixo:

Tela de calibração.

Nessa tela, você deve pressionar sequencialmente todos os quadrados o mais próximo possível do sinal de + e manter pressionado até que a mensagem PRESS, mude para RELEASE. O processo deve ser feito em TODOS os quadrados, sendo um por vez e sempre levando em consideração que o quadrado que deve ser pressionado estará com uma cor branca mais forte. Ao fim do procedimento você será direcionado para uma segunda tela, onde as configurações de calibração estarão seguindo o formato da imagem abaixo:

Resultado da calibração.

Anote todas as configurações, elas serão fundamentais para qualquer projeto que você queira utilizar o Touchscreen.

 

No caso da minha tela, foi gerada a seguinte configuração:

Modo Retrato:

  • x = map(p.x,LEFT=184,RT=924,0,240)
  • y = map(p.y,TOP=177,BOT=901,0,320)

Modo Paisagem:

  • x = map(p.y, LEFT=177,BOT=902,0,320)
  • y = map(p.x, TOP=924, BOT=184,0,240)

As duas configurações em questão, estão diretamente relacionadas a forma como a tela ficará posicionada. Sendo assim caso queira utilizar a tela em modo retrato, utilize a primeira configuração, caso contrário a segunda.

 

- Programando

Agora que instalamos a biblioteca Touchscreen, e realizamos a calibração da tela, podemos prosseguir para a parte do código. O código abaixo é responsável por renderizar todos os componentes da tela  e responder a toques na tela.

#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
#include <TouchScreen.h>

#define TAMANHOMAXSENHA 9
#define SENHAVALIDA "01234"
#define MINPRESSURE 300
#define MAXPRESSURE 2000
#define PRETO   0x0000
#define VERMELHO     0xF800
#define VERDE   0x07E0
#define BRANCO   0xFFFF

#define XP 6
#define XM A2
#define YP A1
#define YM 7

#define TS_LEFT 170
#define TS_RT 901
#define TS_TOP 932
#define TS_BOT  159


TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
Adafruit_GFX_Button botoes[12];
MCUFRIEND_kbv tft;

bool pressionado = false;
int posX;
int posY;
String senha = "";


bool obterToque(void){
    TSPoint p = ts.getPoint();
    pinMode(YP, OUTPUT);      
    pinMode(XM, OUTPUT);
    digitalWrite(YP, HIGH);   
    digitalWrite(XM, HIGH);
    bool pressed = (p.z > MINPRESSURE);
    if (pressed) {
        posX = map(p.y, TS_LEFT, TS_RT, 0, 320); 
        posY = map(p.x, TS_TOP, TS_BOT , 0, 240);
        return true;
    }
    return false; 
}



void setup() {
  uint16_t ID = tft.readID();
  tft.begin(ID);
  tft.setRotation(1);
  telaInicial();
}

void telaInicial(){
  senha = "";
  tft.fillScreen(PRETO);
  botoes[0].initButton(&tft,  60, 100, 30, 40, BRANCO, VERDE, PRETO, "1", 2);
  botoes[1].initButton(&tft, 110, 100, 30, 40, BRANCO, VERDE, PRETO, "2", 2);
  botoes[2].initButton(&tft, 160, 100, 30, 40, BRANCO, VERDE, PRETO, "3", 2);
  botoes[3].initButton(&tft, 210, 100, 30, 40, BRANCO, VERDE, PRETO, "4", 2);
  botoes[4].initButton(&tft, 260, 100, 30, 40, BRANCO, VERDE, PRETO, "5", 2);
  botoes[5].initButton(&tft, 60,  150, 30, 40, BRANCO, VERDE, PRETO, "6", 2);
  botoes[6].initButton(&tft, 110, 150, 30, 40, BRANCO, VERDE, PRETO, "7", 2);
  botoes[7].initButton(&tft, 160, 150, 30, 40, BRANCO, VERDE, PRETO, "8", 2);
  botoes[8].initButton(&tft, 210, 150, 30, 40, BRANCO, VERDE, PRETO, "9", 2);
  botoes[9].initButton(&tft, 260, 150, 30, 40, BRANCO, VERDE, PRETO, "0", 2);
  botoes[10].initButton(&tft, 85, 200, 80, 40, BRANCO, VERDE, PRETO, "Acesso", 2);
  botoes[11].initButton(&tft, 235, 200, 80, 40, BRANCO, VERDE, PRETO, "Apagar", 2);

  for (int i=0; i<12; i++){
    botoes[i].drawButton(false);
  }
  escreveSenha();
  
}

void TeclaPressionada(bool teclaTocada){
  for (int i=0; i<12; i++){
    botoes[i].press(teclaTocada && botoes[i].contains(posX,posY));
  }
  checkPressedButton();

}

void checkPressedButton(){
  for (int i=0; i<12; i++){
    if (botoes[i].justPressed()){
      checkPressed(i);
    }
  }
}

void esperaSoltar(){
  while (obterToque()){
    delayMicroseconds(50);
  }

}

void escreveSenha(){
  tft.fillRect(70, 30, 190, 30, BRANCO);
  tft.setCursor(74,35); 
  tft.setTextColor(PRETO); 
  tft.setTextSize(3);
  tft.print(senha+"_"); 
}


void apagarUltimocaractere(){
  if (senha.length()>0){
    senha.remove (senha.length () - 1);
  }
}
void checkPressed(int button){
    botoes[button].drawButton(true);
    esperaSoltar();
    botoes[button].drawButton();
    if(senha.length()<TAMANHOMAXSENHA || button == 10 || button == 11){
    switch (button){
        case 0:
          senha = senha + "1";
        break;
        case 1:
          senha = senha + "2";
        break;
        case 2:
          senha = senha + "3";
        break;
        case 3:
          senha = senha + "4";        
        break;
        case 4:
          senha = senha + "5";
        break; 
        case 5:
          senha = senha + "6";
        break;
        case 6:
          senha = senha + "7";
        break;
        case 7:
          senha = senha + "8";
        break;
        case 8:
          senha = senha + "9";
        break;
        case 9:
          senha = senha + "0";
        break;
        case 10:
        validarAcesso();
        break; 
        case 11:
        apagarUltimocaractere();
        break;  
    }
    escreveSenha();
    }
}




void validarAcesso(){

  if (senha == SENHAVALIDA){
     tft.fillScreen(PRETO);
     tft.setCursor(10,100);
     tft.setTextColor(VERDE);
     tft.setTextSize(3);
     tft.print("Acesso Autorizado");
     delay(3000);
     telaInicial();
  }
  else{ // Caso contrário
     tft.fillScreen(PRETO);
     tft.setCursor(40,100);
     tft.setTextColor(VERMELHO); 
     tft.setTextSize(3); 
     tft.print("Acesso Negado"); 
     delay(3000); 
     telaInicial();
  }
  
}

void loop() {
  bool toque = obterToque();
  TeclaPressionada(toque);
}

 

Colocando pra funcionar


Entendendo a Fundo

Software

- Bibliotecas utilizadas

Neste tutorial, iremos precisar de três bibliotecas para construir o nosso sistema de controle de acesso. Essas bibliotecas serão responsáveis por fornecer os objetos necessários para comunicação entre o display e o microcontrolador.

#include <Adafruit_GFX.h> // Biblioteca gráfica Adafruit
#include <MCUFRIEND_kbv.h> // Biblioteca do display
#include <TouchScreen.h> // Biblioteca do Touchscreen

- Defines

Alguns defines também serão criados para facilitar a modificação de parâmetros conforme a necessidade, sendo eles:

  1. TAMANHOMAXSENHA: Define o tamanho máximo que a senha pode ter.
  2. SENHAVALIDA: Serve apenas para testar o código, você pode adaptar o código por exemplo para ler os dados de um cartão sd.
  3. MINPRESSURE:  Valor mínimo de força a ser considerado como um toque pelo código.
  4. MAXPRESSURE: Valor máximo de força a ser considerado como um toque pelo código.
  5. PRETO, VERMELHO, VERDE, BRANCO: Código hexadecimal das cores utilizadas neste código.
  6. XP XM, YP, YM: Pinos utilizados para comunicação com módulo touchscreen.
  7. TS_LEFT, TS_RT, TS_TOP, TS_BOT: Valores limites da tela que foram obtidos através do código de calibração.
#define TAMANHOMAXSENHA 9 // Tamanho máximo da senha
#define SENHAVALIDA "01234" // Senha válida
#define MINPRESSURE 300 // Pressão minima para a tela considerar um toque
#define MAXPRESSURE 2000 // Pressão máxima que a tela deve considerar
#define PRETO   0x0000 // Cor preta
#define VERMELHO     0xF800 // Cor vermelha
#define VERDE   0x07E0 // Cor verde
#define BRANCO   0xFFF // Cor branca

// Pinos do touchscreen
#define XP 6 
#define XM A2
#define YP A1
#define YM 7

// Pontos de extremidade do touchscreen
#define TS_LEFT 170
#define TS_RT 901
#define TS_TOP 932
#define TS_BOT  159

- Objetos criados

Para elaboração da interface gráfica, iremos utlizar um total de 12 botões, sendo 10 botões representando os valores entre 0 e 9 e os outros dois botões utilizados para realizar uma tentativa de acesso e apagar o último caractere escrito. Sabendo disso, iremos utilizar um recurso muito interessante disponível na biblioteca Adafruit_GFX, que são os Adafruit_GFX_Button. Essa funcionalidade permite com que criemos botões de forma bem transparente e simplificada, onde passando alguns parâmetros criamos botões selecionaveis com bastante facilidade. Neste exemplo iremos instanciar um vetor contendo 12 desses botões, o fato de utilizar um vetor ao invés de criar uma variável para cada botão é o fato de que conseguimos reduzir bastante o nosso código utilizando o comando for para acesso a cada um deles.

Adafruit_GFX_Button botoes[12];

Além disso, iremos instânciar um objeto do tipo Touchscreen, que será responsável por estabelecer a comunicação entre o nosso código e o touchscreen da tela. Ele recebe como parâmetros os pinos onde o touchscreen está conectado e um valor que representa o nível de força mínimo na tela para que seja considerado um toque.

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); // Instancia do objeto ts do tipo touchscreen

Por fim, mas não menos importante, o objeto responsável por estabelecer a comunicação entre nosso código e a tela, de nome tft também será instanciado.

MCUFRIEND_kbv tft; // Instancia do objeto tft, responsável por se comunicar com a tela

- Variáveis globais

Um conjunto de 4 variáveis globais serão criadas neste código, sendo elas:

  • pressionado: informa se o touchscreen está sendo pressionado ou não.
  • posX: Armazena a posição X onde a tela foi pressionada.
  • posY: Armazena a posição Y onde a tela foi pressionada.
  • senha: Armazena a senha digitada pelo usuário.

- Função setup

dentro da função setup, iremos inicializar o nosso display, através do método tft.begin() e rotacionar a tela para o modo paisagem, e por fim chamar a função responsável por desenhar todo o nosso painel de acesso.

void setup() {
  uint16_t ID = tft.readID();
  tft.begin(ID);
  tft.setRotation(1);
  telaInicial();
}

-Função telaInicial

Esta função, tem como objetivo construir todo o desenho do nosso painel de acesso. Para fazer isso, iremos initialmente escurecer toda a tela com o comando tft.fillScreen(PRETO). Logo em seguinda inicializamos os botões que iremos utilizar para digitar a senha de acesso, fazemos isso através do método initButton que recebe como parâmetros:

  1.  Referência do objeto de acesso a tela - tft
  2.  Posição X na tela.
  3.  posição Y na tela.
  4.  Altura.
  5.  Largura.
  6.  Cor da borda.
  7.  Cor de preenchimento do botão.
  8.  Cor de preenchimento do botão ao ser apertado.
  9.  O que deve ser escrito no botão.
  10.  Tamanho da fonte.

Neste trecho de código inicializamos todos os 12 botões seguindo essa ordem:

  botoes[0].initButton(&tft,  60, 100, 30, 40, BRANCO, VERDE, PRETO, "1", 2);
  botoes[1].initButton(&tft, 110, 100, 30, 40, BRANCO, VERDE, PRETO, "2", 2);
  botoes[2].initButton(&tft, 160, 100, 30, 40, BRANCO, VERDE, PRETO, "3", 2);
  botoes[3].initButton(&tft, 210, 100, 30, 40, BRANCO, VERDE, PRETO, "4", 2);
  botoes[4].initButton(&tft, 260, 100, 30, 40, BRANCO, VERDE, PRETO, "5", 2);
  botoes[5].initButton(&tft, 60,  150, 30, 40, BRANCO, VERDE, PRETO, "6", 2);
  botoes[6].initButton(&tft, 110, 150, 30, 40, BRANCO, VERDE, PRETO, "7", 2);
  botoes[7].initButton(&tft, 160, 150, 30, 40, BRANCO, VERDE, PRETO, "8", 2);
  botoes[8].initButton(&tft, 210, 150, 30, 40, BRANCO, VERDE, PRETO, "9", 2);
  botoes[9].initButton(&tft, 260, 150, 30, 40, BRANCO, VERDE, PRETO, "0", 2);
  botoes[10].initButton(&tft, 85, 200, 80, 40, BRANCO, VERDE, PRETO, "Acesso", 2);
  botoes[11].initButton(&tft, 235, 200, 80, 40, BRANCO, VERDE, PRETO, "Apagar", 2);
 for (int i=0; i<12; i++){
   botoes[i].drawButton(false);
 }
 escreveSenha();

E por fim, desenhamos os botões na tela utilizando o comando drawButton(), o resultado será semelhante ao da imagem abaixo:

 

 

Botões de acesso

- Função escreveSenha

como o próprio nome diz, esta função serve simplemente para escrever a senha de acesso na tela, para fazer isso, iremos criar um retângulo branco na tela, onde a string será escrita a medida em que os botões forem sendo pressionados.

Tela de acesso.

- Função loop

no trecho de loop do nosso código, iremos estar sempre conferindo se o botão foi de fato pressionado ou não através da função obterToque(), e logo em seguida checamos se algum desses botões foram pressionados ou não através do método TeclaPressionada().

void loop() {
  bool toque = obterToque();
  TeclaPressionada(toque);
}

-Função obterToque

A função obterToque, como o próprio nome diz é responsável por descobrir se a tela foi pressionada ou não, e além disso determinar em qual posição (x,y) a tela foi pressionada. Para fazer isso iremos utilizar o objeto ts instanciado no início do código e seu método getPoint().

    TSPoint p = ts.getPoint();

Além disso, iremos configurar os pinos XP e XM como saída e habilitar seu nível lógico para alto.

    pinMode(YP, OUTPUT);      
    pinMode(XM, OUTPUT);
    digitalWrite(YP, HIGH);   
    digitalWrite(XM, HIGH);

Para determinarmos se de fato um clique na tela foi feito, utilizamos o bloco if e verificamos se a força feita é maior do que o valor mínimo determinado.

bool pressed = (p.z > MINPRESSURE);

Se o botão tiver sido de fato pressionado, a variável pressed receberá o valor true, caso contrário terá como resultado false. esse valor será posteriormente utilizado em um bloco if onde caso o botão tenha sido realmente pressionado iremos além de atualizar a variável pressionado para true, obteremos as cordenadas x e y de onde foi feito o toque.

    if (pressed) {
        posX = map(p.y, TS_LEFT, TS_RT, 0, 320); 
        posY = map(p.x, TS_TOP, TS_BOT , 0, 240);
        return true;
    }
    return false;

Você se lembra dos valores obtidos logo no começo deste tutorial para calibração ? eles são necessários neste ponto do código, onde iremos determinar qual coordenada foi tocada pelo usuário. Para fazer isso basta obter, as coordenadas x e y fornecidas pelo objeto p e realizar  uma operação map sob estes dados levando em consideração a resolução desta tela, que no caso é 320 por 240 pixels. Por fim, retornamos true caso o botão tenha sido pressionado ou else caso contrário.

-Função TeclaPressionada

dentro da função TeclaPressionada iremos determinar se uma tecla foi pressionada ou não. Para isso, utilizando o método press(), executamos a seguinte operação lógica sob todos os botões:

  • Percorremos todo o vetor de botões 0 até 11 determinando se um botão foi pressionado ou não da seguinte forma:
    • Se a tela foi tocada e o meu botão está dentro das coordenadas definidas, houve um clique no botão
    • Caso contrário o botão não foi tocado

 

void TeclaPressionada(bool teclaTocada){
  for (int i=0; i<12; i++){
    botoes[i].press(teclaTocada && botoes[i].contains(posX,posY));
  }
  checkPressedButton();
}

Ao fim desse código verificamos qual botão foi apertado através da função checkPressedButton().

 

-Função checkPressedButton

dentro da função checkPressedButton, iremos simplesmente verificar qual botão foi apertado, para isso basta verificarmos através de um for, qual botão está com retorno true para função justPressed().

void checkPressedButton(){
  for (int i=0; i<12; i++){
    if (botoes[i].justPressed()){
      checkPressed(i);
    }
  }
}

Caso o botão da iteração atual esteja sendo pressionado a funão checkPressed será invocada recebendo como parâmetro o indice do botão em questão.

-Função checkPressed

Essa função será responsável por executar todos os comandos associados aos botões, sendo eles:

  • Escrever adicionar a senha digitos de 0 a 9.
  • Apagar o último caractere digitado.
  • Realizar uma tentativa de acesso ao sistema.
  • Mudar a animação do botão quando ele for pressionado.

 

void checkPressed(int button){
    botoes[button].drawButton(true);
    esperaSoltar();
    botoes[button].drawButton();
    if(senha.length()<TAMANHOMAXSENHA || button == 10 || button == 11){
    switch (button){
        case 0:
          senha = senha + "1";
        break;
        case 1:
          senha = senha + "2";
        break;
        case 2:
          senha = senha + "3";
        break;
        case 3:
          senha = senha + "4";        
        break;
        case 4:
          senha = senha + "5";
        break; 
        case 5:
          senha = senha + "6";
        break;
        case 6:
          senha = senha + "7";
        break;
        case 7:
          senha = senha + "8";
        break;
        case 8:
          senha = senha + "9";
        break;
        case 9:
          senha = senha + "0";
        break;
        case 10:
        validarAcesso();
        break; 
        case 11:
        apagarUltimocaractere();
        break;  
    }
    escreveSenha();
    }
}

Inicialmente, mudamos a animação de algum dos botões através da função drawButton(true), ao receber o parâmetro true altera a cor do botão para preto, que definimos no início do código através do initButton. Logo em seguida, chamamos uma função denominada esperaSoltar(). Esta função ( que pode ser melhorada e fica de desafio :) ) será responsável por travar o código até que o usuário pare de tocar o botão na tela. Ela consiste basicamente em um while onde utilizamos a função obterToque para descobrir se o botão foi de fato solto ou não.

void esperaSoltar(){
  while (obterToque()){
    delayMicroseconds(50);
  }
}

Logo após o botão ser solto, retornamos o botão para sua cor inicial (verde) atavés da função drawButton().

botoes[button].drawButton();

Em seguida iremos executar o comando ao qual o botão está associado, para isso devemos sempre levar em consideração que a nossa senha não pode ultrapassar o valor definido em TAMANHOMAXSENHA. Com isso, iremos restringir a execução dos botões números quando a senha for igual ao valor máximo através do if abaixo:

if(senha.length()<TAMANHOMAXSENHA || button == 10 || button == 11)

Esse comando if permite apenas que o bloco delimitado seja executado caso a senha não tenha atingido seu valor máximo, ou o botão apertado seja aqueles utilizados para apagar caracteres ou realizar uma tentativa de acesso. Por fim, o bloco swich-case, será responsável por de fato executar os comandos.

    switch (button){
        case 0:
          senha = senha + "1";
        break;
        case 1:
          senha = senha + "2";
        break;
        case 2:
          senha = senha + "3";
        break;
        case 3:
          senha = senha + "4";        
        break;
        case 4:
          senha = senha + "5";
        break; 
        case 5:
          senha = senha + "6";
        break;
        case 6:
          senha = senha + "7";
        break;
        case 7:
          senha = senha + "8";
        break;
        case 8:
          senha = senha + "9";
        break;
        case 9:
          senha = senha + "0";
        break;
        case 10:
        validarAcesso();
        break; 
        case 11:
        apagarUltimocaractere();
        break;  
    }

do case 0 até 9 basicamente incrementamos a string com um novo caractere e dentro dos cases 10 e 11 realizamos uma tentativa de acesso e apagamos o último caractere respectivamente.

- Função validarAcesso

Dentro da função validar acesso, iremos realizar a validação da senha, comparando a senha digitada pelo usuário e a senha padrão. Para isso, iremos simplesmente comparar a nossa string senha com o define SENHAVALIDA, caso o valor seja igual, mostramos a mensagem "Acesso Autorizado", aguardamos um total de 3 segundos e voltamos a tela de acesso. Caso contrário mostramos a mensagem "Acesso Negado" aguardamos um total de 3 segundos e voltamos a tela de acesso.

void validarAcesso(){

  if (senha == SENHAVALIDA){
     tft.fillScreen(PRETO);
     tft.setCursor(10,100);
     tft.setTextColor(VERDE);
     tft.setTextSize(3);
     tft.print("Acesso Autorizado");
     delay(3000);
     telaInicial();
  }
  else{ // Caso contrário
     tft.fillScreen(PRETO);
     tft.setCursor(40,100);
     tft.setTextColor(VERMELHO); 
     tft.setTextSize(3); 
     tft.print("Acesso Negado"); 
     delay(3000); 
     telaInicial();
  }
  
}
Tela de acesso negado
Tela de acesso autorizado

 

- Função apagarUltimocaractere()

Já a função apagarUltimocaractere será responsável por apagar o último digito feito pelo usuário, para fazer isso iremos simplesmente verificar se a senha é maior que zero. Caso seja apagamos o último caractere digitado pegando o tamanho total da string através da função length e removendo o último caractere através da função remove().

void apagarUltimocaractere(){
  if (senha.length()>0){
    senha.remove (senha.length () - 1);
  }
}

Desafio

Como dito anteriormente, a função esperaSoltar, pode ser melhorada para que o código não trave enquanto o usuário mantiver o botão pressionado. O desafio deste tutorial será exatamente pensar numa lógica para que isso aconteça.

Considerações Finais

Este tutorial, teve como objetivo mostrar como podemos utilizar o touchscreen disponível na shield ftf, passando pelo processo de calibração e uso final da funcionalidade. Espero que tenham gostado do conteúdo apresentado, sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Utilizando CSS3 para customizar interface Web

Utilização de CSS3 para customizar interfaces web de controle

Se você acompanha os nossos tutoriais envolvendo a utilização da linguagem HTML com as placas Arduino, este será mais um conteúdo muito interessante que você  certamente irá gostar. Neste tutorial vamos apresentar uma melhoria no tutorial que fizemos sobre a leitura de um sensor de temperatura LM35 utilizando o Arduino como um Servidor Web, de modo que, aproveitaremos a ideia do tutorial citado entretanto vamos utilizar CSS3 para customizar de forma inteligente as informações referentes aos valores provenientes do sensor existente em nosso projeto.

Confira também nossos tutoriais anteriores sobre a utilização do Arduino UNO como um Servidor Web:

[toc]

kit robotica educacional com Arduino ESP ou Microbit

O que é CSS3?

Nós sabemos que ao desenvolvermos o código HTML de uma aplicação, devemos sempre utilizar as tags que melhor representam os significados das várias partes constituintes do mesmo, pois, como vimos em nossos outros tutoriais, uma das funções da linguagem HTML é atribuir sentido semântico aos elementos existentes em uma determinada página. Entretanto, a utilização das tags estruturais mais adequadas não é suficiente para que a aplicação possua uma aparência estética bem elaborada, pois, o uso das mesmas produz resultados contidos em uma espécie de estilo padrão. Sendo assim, podemos supor que exista alguma maneira de driblarmos este impasse através da possibilidade de customização do design dos elementos de uma página web.

Antigamente estes procedimentos de customização eram feitos no através de algumas tags do próprio HTML. Se você quisesse, por exemplo, escrever um título com a tag de cabeçalho h1 em vermelho, bastaria utilizar a tag <font>, veja:

<h1><font color="red">Como controlar o meu Arduino pela internet? - Volume II</font></h1>");

Além da tag <font>, várias outras tags de estilo também existiam, no entanto, este procedimento de estilização ficou para trás e apesar de alguns navegadores ainda reconhecerem as mesmas, utilizá-las nos dias de hoje constitui uma má prática. Como alternativa para realizar a customização dos elementos de uma página web, surgiu o CSS (Cascading Style Sheets), que por sua vez, consiste em um recurso semelhante a uma linguagem de marcação, como o HTML, porém totalmente distinta do mesmo, com objetivo único de cuidar dos procedimentos de estilização.

Customização de interface Web com CSS3
Figura 1 - Logo do CSS3

Uma das vantagens da utilização do CSS é a possibilidade de personalizar os objetos contidos em uma página web sem que seja necessário misturar as regras de estilização com os objetos citados (como acontecia anteriormente).

 

Sintaxe do CSS3

A sintaxe do CSS consiste em uma simples declaração de propriedades e valores, separados entre si por um sinal de dois pontos ":".

color: red; 
background-color: blue;

 

CSS3 em um código HTML

Basicamente existem três forma de utilizar os códigos de CSS3 para customizar os elementos existentes em uma página web, entretanto, neste momento vamos nos ater apenas à forma que utiliza o atributo style como porta de entrada para as personalizações dos mesmos. O procedimento a ser seguido é bem simples, de modo que, basta adicionar o atributo style na tag do objeto que você quer manipular. Veja o código abaixo:

<h1 style=propriedade:valor>Vida de Silício</h1>"));

Neste exemplo, a frase "Vida de silício" será exibida com o sentido semântico de uma tag de cabeçalho h1, no entanto, terá sua aparência alterada de acordo com a propriedade e o valor atribuídos à mesma. Perceba que esta maneira de utilizar o CSS3 é praticamente igual ao modo que as customizações eram feitas antigamente (somente com a utilização da linguagem HTML). Além disso, o exemplo apresentado contém apenas um atributo, no entanto, podemos utilizar múltiplos atributos:

<h1 style=color: red; background-color: blue;>Vida de Silício</h1>"));

No código em questão nós declaramos a propriedade color e atribuímos à mesma o valor red (isto significa que a frase citada seja exibida pelo navegador na cor vermelha). Por outro lado, temos também a propriedade background-color, que por sua vez, está associada ao valor blue (este procedimento fará com que a frase "Vida de Silício" seu fundo na cor azul). Existem uma infinidade de atributos que podem ser utilizados para customizar a sua interface de controle, basta fazer uma breve pesquisa que você certamente encontrará uma vasta gama de opções.

 


Mãos à obra - Monitorando sensores com um Servidor Web

Nesta seção iremos demonstrar todos os passos que você deve seguir para utilizar o CSS3 para customizar o valor de temperatura em sua interface de monitoramento.De maneira mais específica, vamos replicar o projeto em que o usuário consiga monitorar valores de temperatura provenientes de um sensor LM35 (não esqueça de conferir nosso tutorial sobre o sensor de temperatura LM35 clicando aqui) e fazer com que o valor seja apresentado de maneiras diferentes utilizando o CSS3.

Componentes necessários

Para reproduzir este projeto, você irá precisar dos seguintes componentes:

Montando o projeto

Na figura abaixo você pode conferir o hardware pronto para ser utilizado.

Hardware utilizado - Arduino Uno, Shield Ethernet e sensor de temperatura LM35 na Customização de interface Web com CSS3
Figura 2 - Hardware utilizado - Arduino Uno, Shield Ethernet e sensor de temperatura LM35

Gostaríamos de sugerir que você tenha bastante cuidado no momento em que for encaixar o Shield Ethernet W5100 no Arduino UNO, pois, além da possibilidade de entortar os pinos do shield, você também pode se machucar.

Lembre-se que o shield em questão possui uma série de pinos em sua parte inferior, tanto nas laterais como em sua parte dianteira, portanto, antes de pressionar o mesmo sobre o Arduino UNO, certifique-se de que os pinos estejam levemente posicionados em suas respectivas entradas para que então você possa ir realizando o encaixe lentamente.

Realizando as conexões

Para reproduzir este projeto, garanta que o seu Shield Ethernet W5100 esteja ligado corretamente a uma das portas LAN presentes no seu modem ou roteador.

Programando

Nesta seção apresentaremos o código da nossa aplicação

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 25, 16); 
EthernetServer server(80);     

void setup() 
{
    Ethernet.begin(mac, ip);  
    server.begin();           
} 


void loop() {

    EthernetClient client = server.available();  

    if (client) 
    {    
        boolean currentLineIsBlank = true;
        while (client.connected()) 
        {
            if (client.available()) 
            {   
                char c = client.read(); 
                
                if (c == '\n' && currentLineIsBlank) {
                  
                    client.println("HTTP/1.1 200 OK");
                    client.println("Content-Type: text/html");
                    client.println("Connection: close");
                    client.println("Refresh: 2");
                    client.println();
                    
                    client.println("<!DOCTYPE html>");
                    client.println("<html>");
                       client.println("<head>");
                          client.println("<title>Servidor Web VDS</title>");
                       client.println("</head>");
                       client.println("<body>");
                          client.println("<h1 style=\"color:#4279c7\">Servidor Web do Vida de Sil&iacute;cio</h1>");
                          client.println("<hr/>");
                          client.println("<h1>Temperatura</h1>");
                          int valor = analogRead(A0); 
                          float temperatura = (((valor*5)/1023)-0.5)*100; 
                          if(temperatura >=50) 
                          { 
                              client.println("<p style=\"color:rgb(255,0,0)\">"); 
                              client.println(LM35: );
                              client.println(temperatura); 
                              client.println("graus"); 
                              client.println("</p>"); 
                          } 
                          else 
                          { 
                              client.println("<p style=\"color:rgb(0,0,0)\">"); 
                              client.println(LM35: );
                              client.println(temperatura); 
                              client.println("graus"); 
                              client.println("</p>"); } 
                        client.println("</body>");
                     client.println("</html>");
                     break;
                     }
                     if (c == '\n') 
                     {    
                     currentLineIsBlank = true;
                     } 
                     else if (c != '\r') 
                     {
                        currentLineIsBlank = false;
                     }
                 } 
              }  
        delay(1);      
        client.stop(); 
    } 
} 

Colocando para funcionar

Veja como ficou nosso segundo Servidor Web.

Figura 3 - Aplicação finalizada.

 


Entendendo a fundo

Antes de começarmos com a explicação do código, gostaríamos de ressaltar que iremos apresentar os detalhes apenas dos tópicos não contemplados nos nossos outros tutoriais, pois, desta maneira, será mais fácil focarmos nas partes referentes às modificações feitas sobre o programa já existente, portanto, caso você tenha alguma dúvida sobre alguma parte do programa que não seja explicada neste momento, sugerimos que acesse o nosso material citado anteriormente.

Software

- Definindo os pré-requisitos para o funcionamento do código

Inicialmente, devemos incluir duas bibliotecas no código para que o mesmo pudesse funcionar corretamente. A biblioteca SPI.h, responsável pela comunicação dos módulos do shield com o Arduino UNO utilizando o protocolo SPI e a biblioteca Ethernet.h que atua possibilitando a conexão do conjunto, em um primeiro momento, com uma rede local.

Após a inclusão das bibliotecas citadas, devemos definir um endereço MAC (lembre-se que este pode ser qualquer um, desde que seja único em sua rede local) e um endereço IP (este deve ser um endereço válido  e disponível dentro da sua rede local). Além disso, devemos criar o objeto que será responsável por representar o Servidor Web no código (aqui, chamamos este de server) e relacioná-lo com a porta 80.

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 25, 16); 
EthernetServer server(80);

- Definindo as configurações iniciais

Dentro da função setup() nós iniciamos a conexão com a rede local através da função Ethernet.begin() (passando como parâmetro os endereços MAC e IP definidos anteriormente) e também iniciamos o Servidor Web por meio da sentença server.begin() (lembre-se que server é o objeto criado para representar o Servidor Web no código).

void setup() 
{
    Ethernet.begin(mac, ip);  
    server.begin();           
}

- Criando a página para responder à requisição do navegador

No artigo anterior foi possível compreender como devemos proceder para elaborar uma página bem simples, contendo apenas elementos escritos e também estáticos, ou seja, que não sofriam nenhum tipo de alteração. Neste momento, iremos incrementar o programa criado anteriormente, portanto, vamos deixar de lado a parte referente ao processo de requisição do navegador (já explicado) e iremos focar apenas na elaboração da página que cumpra o objetivo proposto neste material.

Você se lembra do cabeçalho padrão que enviamos para o navegador antes de enviarmos a página propriamente dita? Para ajudar, vamos colocá-lo aqui.

client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();

Definindo tempo de atualização da página 

A primeira modificação que faremos neste momento será a inclusão de uma linha de código que faça com que a página seja atualizada em intervalos de tempo definidos. Isto é importante para este projeto em virtude de estarmos trabalhando com aquisição de variáveis, portanto, devemos atualizar a página periodicamente para que seja possível visualizarmos sempre os valores atuais das variáveis envolvidas. Sendo assim, utilizamos a seguinte sentença para que a página seja atualizada de 2 em 2 segundos.

client.println("Refresh: 2");

Veja como ficará o nosso cabeçalho padrão

client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println("Refresh: 2");
client.println();

A estrutura da página em HTML

O próximo passo que faremos será construir, de fato, a página que será enviada ao navegador. Com uma breve recapitulação, devemos lembrar que todo conteúdo que compõe a página deve estar dentro da seguinte estrutura:

client.println("<!DOCTYPE HTML>");
client.println("<html>");
           . 
           .
***** Conteúdo da página *****
           .
           .
client.println("</html>"); 

Como ressaltado anteriormente, dentro desta estrutura temos o conteúdo da página que queremos enviar para o navegador, de modo que, nesta, devemos ter pelo menos dois blocos, um responsável pelas informações gerais do documento, limitado pelo uso do par <head></head> e o outro, por sua vez, deve conter o corpo da página e está entre as tags <body> e </body>.

client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head>");
           .
           .
   ***** Bloco 1 *****
           .
           .
client.println("</head>");
client.println("<body>");
           .
           .
   ***** Bloco 2 *****
           .
           .
client.println("</body>");
client.println("</html>");

Definido o título para a página

Neste momento, vamos utilizar apenas uma tag dentro do bloco 1, denominada <title>, cuja função consistirá em definir um título para a página (este título aparecerá na aba do navegador). Para executarmos a ação proposta, devemos colocar o título desejado entre o par <title></title>.

client.println("<!DOCTYPE HTML>");
client.println("<html>");

client.println("<head>");
client.println("<title>Servidor Web VDS</title>"); 
client.println("</head>");

client.println("<body>");
           .
           .
   ***** Bloco 2 *****
           .
           .
client.println("</body>");
client.println("</html>");

Veja como ficou o título da nossa página:

servidor Shield Ethernet W5100 - Monitorando sensores com um Servidor Web
Figura 4 - Título da página.

Escrevendo o corpo da página web

Quanto ao corpo da página (entre o par <body></body>), a primeira coisa que faremos será colocar um título visível na própria página. Para realizar este procedimento, utilizaremos a tag <h1>, que por sua vez, consiste em uma tag para apresentar um determinado texto em um modelo predefinido. Além disso, utilizaremos também o atributo style, através do qual, poderemos fazer alterações no título produzido.

client.println("<h1 style=\"color:#4279c7\">Servidor Web do Vida de Sil&iacute;cio</h1>");

Alguns pontos no trecho de código acima devem ser ressaltados:

  1. Tudo que estiver escrito entre o par <h1></h1> estará pré formatado no estilo deste cabeçalho.
  2. O atributo style é responsável por modificar alguma característica relativa à formatação de uma determinada porção de texto. Para isto, devemos colocar o nome da característica que queremos modificar, após o sinal de igual (=), sendo assim, quando escrevemos <style=\"color:#4279c7\">, estamos indicando que a porção de texto entre o par <h1></h1> deverá está colorida em um certo tom de azul (dado pelo código RGB em hexadecimal #4279c7).
  3. Repare que a palavra Silício foi escrita no código como Sil&iacute;cioEsta forma de escrita é necessária sempre que temos a utilização de algum tipo de acento, pois, nem todos os dispositivos estão configurados para apresentar caracteres acentuados da mesma forma. Sendo assim, utilizamos o comando &iacute; para colocar o acento agudo na letra da palavra Silício.

Veja o resultado deste procedimento na figura abaixo:

acessando Servidor Web Shield Ethernet W5100
Figura 5 - Título da aplicação

Posteriormente, vamos inserir uma barra horizontal para separar o título criado no passo anterior dos textos que ainda serão criados, através do comando <hr/>.

client.println("<hr/>");

Após a inserção da barra citada, nossa página ficará da seguinte maneira:

Figura 6 - Linha horizontal divisória

Imprimindo a tempertatura

Em seguida, escrevemos outro texto utilizando o modelo de cabeçalho h1 referente ao valor que será obtido pelo sensor de temperatura LM35.

client.println("<h1>Temperatura</h1>");

Com este passo, a página será apresentada assim:

Figura 7 - Escrevendo o titulo da seção

Em seguida, vamos trabalhar sobre a porção de código responsável por exibir a leitura do sensor de temperatura LM35. Primeiramente, utilizamos a função analogRead() para obter o sinal proveniente do sensor de temperatura LM35 e armazená-lo em uma variável do tipo int. Em seguida, realizamos os cálculos para converter o valor obtido pela porta de entrada analógica e inserimos o resultado do mesmo em uma variável do tipo float chamada temperatura, de modo que, caso o valor em questão seja maior do que 50, nós vamos escrever a frase LM35: x graus, entretanto, caso o valor citado seja menor do que 50, a mesma frase será escrita desta maneira LM35: x graus função. Repare que para realizar esta comparação nós utilizamos um conjunto if()/else.

int valor = analogRead(A0); 
float temperatura = (((valor*5)/1023)-0.5)*100; 
if(temperatura >=50) 
{ 
   client.println("<p style=\"color:rgb(255,0,0)\">"); 
   client.println(LM35: );
   client.println(temperatura); 
   client.println(" graus"); 
   client.println("</p>"); 
} 
else 
{ 
   client.println("<p style=\"color:rgb(0,0,0)\">"); 
   client.println(LM35: );
   client.println(temperatura); 
   client.println("graus"); 
   client.println("</p>"); 
}

A apresentação do valor de temperatura ficará conforme a figura abaixo:

interface Web com CSS3
Figura 8 - Apresentando os valores de temperatura

Considerações finais

Neste tutorial, demonstramos como você utilizar CSS3 para personalizar alguns elementos do seu projeto, utilizando um Arduino UNO e um Shield Ethernet W5100. Esta foi mais uma parte de uma série de artigos sobre a criação de Servidores Web, portanto, esperamos que continue nos acompanhando e sinta-se à vontade para nos dar sugestões. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Módulo TM1637 - Display 4 dígitos com Arduino

Módulo TM1637 - Display 4 dígitos com Arduino

Muitas vezes, nós desenvolvemos alguns projetos de automação, os quais, para desempenharem as suas respectivas funções, necessitam da existência de uma interação entre os mesmos e o usuário. Quando falamos especificamente em sistemas de monitoramento a interação citada pode ser obtida através da utilização de dispositivos como leds, displays LCD e displays de 7 segmentos. Neste tutorial, nós vamos te mostrar como manipular um display de 7 segmentos com 4 dígitos utilizando o módulo TM1637 com display de 4 dígitos em conjunto com uma placa Arduino.

Projeto com ESP usando o módulo TM1637 4 digitos
Projeto com ESP usando o módulo TM1637 4 digitos

[toc]

kit robotica educacional com Arduino ESP ou Microbit

A importância das Interfaces Homem-Máquina

Como dissemos anteriormente, em alguns tipos de aplicações é essencial que exista uma possibilidade de interação entre o sistema propriamente dito e o usuário. Dessa forma, nós precisamos de um caminho que torne essa interação possível. O nome desse caminho de comunicação chama-se IHM (Interface Homem Máquina).

IHM é um caminho pelo qual o homem e um projeto de automação podem se comunicar e interagir, visando atingir um objetivo comum.

Geralmente uma IHM é dada por algum tipo de saída como indicadores de velocidades, monitores, displays, auto-falantes, entre outros e algum tipo de entrada, como por exemplo, botões, telas do tipo touchscreen, microfones, câmeras, além de uma infinidade de outros elementos.

 

Exemplo de IHM
Exemplo de IHM

 

Neste momento que os displays de 7 segmentos tomam a atenção para si, pois, uma vasta gama de dispositivos automatizados faz o uso destes elementos pelos motivos que veremos em seguida. Confira aqui os nossos outros tutoriais sobre elementos integrantes de IHMs:

Os displays de 7 segmentos

Display 7 segmentos de 4 dígitos mostrando hora.
Display 7 segmentos de 4 dígitos mostrando hora.

Como dissemos anteriormente, os displays de 7 segmentos são muito utilizados para comunicação visual em projetos de automação, estando presentes em diversos equipamentos, tais como: relógios, calculadoras e multímetros. Por serem simples de usar, robustos e seguirem um padrão em sua estrutura, estes que permitem imprimir os algarismo arábicos (0 a 9) e até mesmo algumas letras (no caso de displays alfanuméricos).

 

Display de 7 segmentos

 

Como o próprio nome aponta, esse displays possuem 7 segmentos, de modo que, cada um destes corresponde a um led, os quais, são ligados em conjunto, podem formar um algarismo ou uma letra. Os segmentos deste display são identificados por letras que vão de a a g. Além disso, estes também possuem um ponto decimal, normalmente identificado pelas letras dp, veja a disposição dos segmentos conforme a figura abaixo:

 

Detalhe dos segmentos do display
Detalhe dos segmentos do display

Como podemos perceber, a representação de algarismos utilizando um único display é restrita à apresentação dos números contidos no intervalo de 0 a 9, de modo que, para fazermos com que o mesmo mostre algum sinalize algum numeral basta que os segmentos corretos sejam acionados ao mesmo tempo. Por exemplo, caso nosso desejo seja representar o número 0 (zero) nós devemos acender os segmentos a,b,c,d,e,f.

O módulo TM1637

O módulo TM1637 possui um display de 7 segmentos de 4 dígitos (que podem ser tratados como 4 displays de 7 segmentos em conjunto). Ao contrário de uma associação de displays "tradicional" que faria o uso de muitos pinos (no mínimo 7 pinos mais um para ligar e desligar cada display) de uma placa Arduino UNO, este módulo permite que os 4 displays sejam manipulados somente com 2 pinos.

Módulo TM1637 com display 4 dígitos 
Módulo TM1637 com display 4 dígitos

Ao todo, o módulo TM1637 possui 4 pinos, sendo que, dois deles, conforme falamos anteriormente referem-se à manipulação dos displays e os outros 2 possuem a função de alimentar o módulo. Repare que além dos segmentos destinados à representação dos algarismos, existem também segmentos para serem utilizados como ":" (dois pontos) para representação de horas.


Mãos à obra - Utilizando o módulo TM1637 com Arduino

Componentes necessários

Para desenvolver este projeto, precisaremos dos seguintes componentes:

Montando o projeto

Hardware utilizado para montagem do projeto usando Arduino Uno e Módulo TM1637
Hardware utilizado para montagem do projeto usando Arduino Uno e Módulo TM1637

Programando

Neste tutorial, nós vamos implementar uma aplicação na qual o usuário irá digitar um valor numérico de até 4 algarismos no Serial monitor e este mesmo valor será apresentado nos displays existentes no módulo TM1637.

#include <TM1637Display.h>

TM1637Display display(6,7);

int valorfinal;

void setup()
{
  Serial.begin(9600); 
  display.setBrightness(0x0f);
}

void loop() 
{ 
   char comando; 
   String numero; 
   if(Serial.available()>0) 
   { 
      for( int i = 0; i<4; i++) 
      { 
         comando = Serial.read(); 
         numero = numero + comando; 
      }
    valorfinal = numero.toInt(); 
   } 
   display.showNumberDec(valorfinal, false); 
}

Colocando para funcionar

Arduino imprimindo numero de 4 dígitos no módulo TM1637
Arduino uno imprimindo numero de 4 dígitos no módulo TM1637

Entendendo a fundo

Software

Neste ponto, serão demonstrados todos os passos para o desenvolvimento do código que deve ser inserido no Arduino UNO para que seja possível a realização da apresentação de algarismos em nosso display 4 dígitos com o módulo TM1637.

– Incluindo a biblioteca que será utilizada

O primeiro passo que devemos realizar para atingir o objetivo proposto consiste na inclusão das bibliotecas adequadas para permitir a interação do módulo TM1637 com o  Arduino UNO. Neste tutorial, nós vamos utilizar a biblioteca TM1637Display.h, que por sua vez, pode ser obtida neste link.

#include <TM1637Display.h>

– Criando o objeto da classe TM1637Display

Na parte de criação de objetos, nós devemos declarar dois parâmetros da implementação do objeto necessário para a manipulação do módulo, de modo que, o primeiro deles diz respeito ao clock, enquanto o segundo refere-se ao pino que será utilizado para a transmissão de dados.

TM1637Display display(6,7);

– Declarando a variável global do projeto

Posteriormente, nós declaramos a variável global valorfinal para armazenar o número inteiro que irá ser apresentado no display.

int valorfinal;

– Definindo as configurações iniciais

Na função setup() nós vamos iniciar a comunicação serial através da sentença Serial.begin() com uma taxa de 9600 bps.

void setup() 
{
  Serial.begin(9600);
  display.setBrightness(0x0f);
}

– Realizando as medidas de temperatura

Dentro da função loop(), nós criamos primeiramente duas variáveis que serão utilizadas para armazenar os valores que serão enviados para o Arduino através da porta serial. A variável comando receberá cada caractere presente na porta serial e a variável numero será responsável por conter o resultado da concatenação dos caracteres que chegarem na variável comando.

O procedimento de escrita dos valores no display tem seu início com a verificação da existência de caracteres para serem lidos no buffer da porta serial através da sentença Serial.available(). Caso exista algo para ser lido, utilizamos uma estrutura de repetição for para realizarmos a leitura de 4 caracteres e em seguida armazená-los na variável numero. Em seguida, convertemos o valor em questão de string para inteiro, que por sua vez, será utilizado como o primeiro argumento da sentença display.showNumberDec() (apenas como curiosidade, o segundo argumento da sentença em questão corresponde a opção de fazer com que o display apresente zeros para completar os 4 algarismos.

void loop()
{
  char comando;
  String numero;
  if(Serial.available()>0)
    {
      for( int i = 0; i<4; i++)
      {
        comando = Serial.read();
        numero = numero + comando;
      }
        valorfinal = numero.toInt();  
    }
  display.showNumberDec(valorfinal, false); 
}

Hardware

Alguns pontos importantes sobre este tutorial

Normalmente, além do que já foi dito, quando falamos em displays de 7 segmentos, nós também abordamos 2 pontos muito pertinentes quanto à manipulação dos mesmos, de modo que, o primeiro deles refere-se à maneira de como os segmentos estão interligados, que por sua vez, caracteriza os displays em questão como displays catodo comum ou anodo comum. Essa característica está ligada . Neste momento nós não vamos abordar este assunto, pois, como veremos posteriormente, a utilização do módulo TM1637 faz com que não seja necessário nos preocuparmos com configuração dos segmentos do display embutido no mesmo, portanto, este assunto será trazido à tona em um outro tutorial mais oportuno.

Além disso, o segundo ponto importante que citamos diz respeito ao procedimento utilizado quando queremos associar dois ou mais displays (utilizando os mesmos pinos de um Arduino para cada um) para mostrarem simultaneamente os diversos algarismos de um mesmo número. Geralmente, nestes casos, utiliza-se uma forma de multiplexar os displays, fazendo acionamentos e desligamentos dos mesmos, em instantes definidos e muito rápidos, porém, da mesma maneira, este assunto não será abordado neste tutorial, pois, a utilização do módulo TM1637 torna a representação de números de mais de um algarismo com mais de um display muito mais fácil.


Considerações finais

Neste tutorial, demonstramos como você deve proceder para utilizar o módulo TM1637 para controlar 4 displays de 7 segmentos. Esperamos que você continue nos acompanhando e sinta-se à vontade para nos dar sugestões. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Controle remoto e módulo receptor Infravermelho com Arduino

Controle remoto IR com Arduino

Ao longo dos nossos tutoriais nós apresentamos uma infinidade de soluções para que você pudesse desenvolver sistemas de acionamento com botões, com comandos através da IDE do Arduino, com elementos criados a partir de códigos HTML, entre outros. Neste tutorial, nós vamos aprender a realizar acionamentos com mais um elemento, ou melhor, um conjunto de elementos, o kit controle remoto IR + receptor IR.

Controle remoto controlando tv

[toc]

kit robotica educacional com Arduino ESP ou Microbit

O kit Controle remoto IR + Receptor IR

O kit controle remoto IR + Receptor IR consiste em um conjunto composto por um controle remoto dotado de uma bateria, um módulo receptor de infravermelho, um led infravermelho e alguns jumpers para que o usuário utilize caso seja necessário.

Figura 1 - Kit controle remoto IR + Receptor IR

Como funciona o controle remoto infravermelho

Um controle remoto IR é composto por um teclado com diversos botões, um microcontrolador e um LED emissor infravermelho, que em geral ficar em sua parte superior.

Seu princípio de funcionamento é bem simples. No momento em que um dos seus botões é pressionado, uma sequência de pulsos luminosos é emitida através do LED infravermelho. Esta sequência corresponde a um número em hexadecimal, que por sua vez, diz respeito ao código em questão.

Os equipamentos a serem controlados possuem um módulo receptor de infravermelho que recebe os pulsos luminosos e traduz os mesmos em uma sequência de pulsos elétricos.

Módulo receptor infravermelho
Exemplo de módulo receptor infravermelho

Sabendo disso, quando vamos implementar alguma aplicação com um controle remoto, nós devemos primeiramente mapear o controle, pois, nós não sabemos o código proveniente de cada botão logo de início. Após conhecermos o resultado de cada um dos comandos de um determinado controle, já podemos partir para o desenvolvimento de alguma solução de automação utilizando o mesmo.

- Modulação Infravermelha

A luz infravermelha é um tipo de radiação emitida pelo sol, lâmpadas e qualquer outra coisa que emane calor. Para que estes outras fontes de radiação infravermelha não interfiram no sinal transmitido entre controle e receptor, é utilizada a técnica de modulação de sinal.

Nessa técnica, inserimos a informação transmitida dentro de outra frequência, que no nosso caso será de 38kHz. Para isso precisamos de um modulador e um demodulador.

Comparação entre informação e informação modulada pelo módulo receptor infravermelho
Comparação entre informação e informação modulada.

O modulador existente dentro do controle remoto transforma o código em hexadecimal que representa o botão pressionado em um sinal dentro da frequência de 38kHz. Posteriormente, o sinal em questão é enviado pelo LED IR.

O demodulador fará parte do módulo receptor, o qual, recebe a informação modulada e faz a demodulação para recuperar a informação original.

esquema modulação infravermelho indo do controle remoto ao Arduino
Esquema modulação infravermelho indo do controle remoto ao Arduino

A seguir é possível comparar o sinal transmitido e o modulado no osciloscópio.

Sinal modulado IR no osciloscópio
Sinal modulado Infravermelho no osciloscópio

Em cima vemos o sinal modulado em 38Khz e em baixo vemos o sinal desmodulado.


Mãos à obra - Acionando saídas digitais com o kit Controle remoto IR + Receptor IR

Componentes necessários

Para desenvolver este projeto, precisaremos dos seguintes componentes:

Montando o projeto

Esquema de montagem do projeto com Arduino Uno e Módulo receptor infravermelho
Esquema de montagem do projeto com Arduino Uno e Módulo receptor infravermelho

Programando

Neste momento nós iremos apresentar o primeiro código que deve ser utilizado. O programa em questão serve para ajudar o usuário a mapear os botões do controle, ou seja, serve para que o operador do sistema saiba qual será o dado que chegará para a nossa placa Arduino quando um determinado botão for acionado.

#include <IRremote.h>
 
IRrecv receptor(10);
 
decode_results resultado;
 
void setup()
{
  Serial.begin(9600);
  receptor.enableIRIn(); 
}
void loop() 
{
  if (receptor.decode(&resultado)) 
  {
    Serial.println(resultado.value, HEX);
    receptor.resume(); 
  }
  delay(100);
}

Após compilarmos o código apresentado, basta pressionarmos os botões do controle, um a um, para então anotarmos os códigos relacionados a cada um dos mesmos.

Mapeamento do controle remoto
Mapeamento do controle remoto

Em seguida, nós vamos utilizar um outro código, que por sua vez, será o responsável pelo desenvolvimento da aplicação propriamente dita.

#include <IRremote.h>  
    
IRrecv receptor(10);  
decode_results resultado; 
int codigo; 
  
void setup()  
{  
  pinMode(5, OUTPUT);    
  receptor.enableIRIn(); 
  Serial.begin(9600);
}  
   
void loop()  
{  
  if (receptor.decode(&resultado))  
  {  
    Serial.print("Codigo do botao: ");  
    Serial.println(resultado.value, HEX);  
    codigo = resultado.value; 
    switch (codigo)  
    {  
      case (0xFF6987):   
      digitalWrite (5,HIGH);    
      break;   

      case (0xFF9867): 
      digitalWrite (5,LOW); 
      break;  
    }  
  receptor.resume();  
  }
  delay(100);  
}

Colocando para funcionar

[ Vou incluir uma foto do hardware montado aqui Allan, o que acha?]


Entendendo a fundo

Software - Mapeamento dos botões

Neste ponto, serão demonstrados todos os passos para o desenvolvimento do código que deve ser inserido no Arduino UNO para que seja possível mapearmos os botões do nosso controle IR.

– Incluindo as bibliotecas que serão utilizadas

O primeiro passo que devemos realizar para atingir o objetivo proposto consiste na inclusão da biblioteca adequada para permitir a interação do receptor IR com o Arduino UNO. Neste tutorial, nós vamos utilizar uma biblioteca chamada IRremote.h, que por sua vez, pode ser obtida aqui.

#include <IRremote.h>

– Criando o objeto da classe IRrecv

Na parte de criação de objetos, nós devemos criar um objeto chamado receptor, que por sua vez, está atrelado ao pino que será utilizado para o recebimento de dados por meio do receptor IR.

– Definindo as configurações iniciais

Na função setup() nós vamos iniciar a comunicação serial através da sentença Serial.begin() e em seguida vamos iniciar o funcionamento do nosso receptor IR por meio da sentença receptor.enableIRIn().

– Criando o objeto da classe IRrecv

Na parte de criação de objetos, nós devemos criar um objeto chamado receptor, que por sua vez, está atrelado ao pino que será utilizado para o recebimento de dados por meio do receptor IR.

– Declarando uma variável para armazenar o valor dos botões

Após a criação dos objetos nós devemos declarar um variável do tipo inteiro, cuja função será armazenar o valor recebido pelo receptor IR, para que este possa ser posteriormente utilizado no acionamento de uma saída digital.

int codigo;

– Definindo as configurações iniciais

Na função setup() nós vamos iniciar a comunicação serial através da sentença Serial.begin() e em seguida vamos iniciar o funcionamento do nosso receptor IR por meio da sentença receptor.enableIRIn(). Por último, nós definimos o modo de operação do pino 5 do Arduino UNO para que este atue como uma saída digital.

– Acionando saídas digitais

Dentro da função loop() nós devemos primeiramente criar uma estrutura condicional if() cujo argumento será a sentença receptor.decode(&resultado). A função do procedimento citado consiste em fazer com que a nossa placa Arduino aguarde até o momento em que um botão do controle remoto seja pressionado, de modo que, somente após este ato, ocorrerá o prosseguimento da execução do programa.

Caso algum botão do controle seja pressionado, o Arduino deverá apresentar a frase "Codigo do botão:" seguida do valor em hexadecimal atrelado ao botão em questão em virtude das sentenças do tipo Serial.print() Serial.println(). Posteriormente, nós armazenamos o valor citado na variável código, que por sua vez, será testada em uma estrutura do tipo switch/case, de modo que, caso o mesmo corresponda ao valor FF6987, a porta de saída digital 5 deverá ter nível alto em seu terminal, ao passo que, caso o valor citado corresponda à opção FF9867, o terminal citado deverá estar com nível baixo.

Assim como no caso anterior, para um melhor funcionamento da aplicação, utilize a função delay() no final da mesma para que a leitura realizada pelo receptor IR seja realizada da maneira adequada.

void loop()  
{  
  if (receptor.decode(&resultado))  
  {  
    Serial.print("Codigo do botao: ");  
    Serial.println(resultado.value, HEX);  
    codigo = resultado.value; 
    switch (codigo)  
    {  
      case (0xFF6987):   
      digitalWrite (5,HIGH);    
      break;   

      case (0xFF9867): 
      digitalWrite (5,LOW); 
      break;  
    }  
  receptor.resume();  
  }
  delay(100);  
}

Considerações finais

Neste tutorial, demonstramos como você deve proceder para realizar acionamentos com o kit controle remoto IR + Receptor IR. Esperamos que você continue nos acompanhando e sinta-se à vontade para nos dar sugestões. Lembre-se de deixar suas dúvidas nos comentários abaixo.