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.


Controlando seu projeto usando Telegram

Controlando seu projeto usando Telegram - ESP

Controlando seu projeto com Telegram

Imagine uma automação ou projeto que permite você “conversar” com seu Microcontrolador (MCU) e também receber comandos, parece difícil, mas é bem simples. Aprenderemos a usar o Telegram para criar automações e projetos das mais diversas possibilidades e utilidades que estabelece uma comunicação amigável com o MCU. Para essa experiência usaremos o NodeMCU 8266, mas você pode fazer com outros ESPs, tal como os da linha ESP8266 e o ESP32.

 

[toc]

O Telegram

Podemos fazer desde simples controles de LEDs, ou até uma automação residencial controlada pelo Telegram, já que os BOTs permitem controle total de informações.

 

Usaremos o Telegram pois nos permite criar “BOTs”. Estes BOT's, são como robôs virtuais e com eles, conseguimos criar uma interface IHM (Interface Homem-Máquina). Este método, permite o fluxo de informações de ambos sentidos (Input e Output), então conseguimos controlar o sistema e também ser notificado pelo sistema.

 

Criando seu Bot no Telegram

1-) Pesquise pelo "BotFather" no menu de pesquisa do Telegram, entre nele e clique em "Começar ou Reiniciar".

 

 

 

2-) Pelo BotFater podemos criar novos Bots, configura-los e muito mais. Para criar, faça:

  1. Digite "/newbot".
  2. Digite o nome do seu novo Bot.
  3. Digite o usuário do Bot com a terminação "bot".

 

3-) Logo após a criação, o BotFater enviará uma mensagem com o link do Bot e logo abaixo o Token do Bot. Você pode clicar neste link para abrir a conversa com seu Bot ou pode pesquisa-lo futuramente.

Você precisa desse Token para inserir no código!

 

Mãos a obra

Componentes necessários

Para este projeto, usaremos o ESP8266 (versão NodeMCU). Entretanto, pode ser feito igualmente com o ESP32, sendo necessário alguns pequenos ajustes.

  • 1x – ESP8266. (Usaremos o NodeMCU).
  • 1x – Telegram no Celular.
  • 1x - LED. (Usaremos o LED OnBoard da placa).

- Biblioteca utilizada

Clique AQUI para ir a pagina de download da biblioteca "UniversalTelegramBot" utilizada.

Alguns usuários relatam erro com a biblioteca "ArduinoJson".  Caso aconteça com você, será necessário instalar a biblioteca na Arduino IDE.

Para isso vá em "Gerenciador de bibliotecas", procure pela biblioteca "ArduinoJson", instale-a e reinicie a Arduino IDE.

- Código do projeto

Não se esqueça de alterar as credenciais do WiFi e também o Token do seu Bot. Sem isso não irá funcionar.

Vários usuários relatam erro com a versão 2.5 do esp8266 (core) instalado na Arduino IDE, que é resolvido instalando a 2.4.0.

 

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#define BOTtoken "135924:AAErDKEJaQpEnqs_xj35asdGQ5kK6dQet4"//Define o Token do *seu* BOT

WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);

String id, text;//Váriaveis para armazenamento do ID e TEXTO gerado pelo Usuario
unsigned long tempo;

void setup()
{
   pinMode(D4, OUTPUT);//LED conectado à saida
   WiFi.mode(WIFI_STA);//Define o WiFi como Estaçao
   connect();//Funçao para Conectar ao WiFi
}

void loop()
{
   if (millis() - tempo > 2000)//Faz a verificaçao das funçoes a cada 2 Segundos
   {
      connect();//Funçao para verificar se ainda há conexao
      readTel();//Funçao para ler o telegram
      tempo = millis();//Reseta o tempo
   }
}

void connect()//Funçao para Conectar ao wifi e verificar à conexao.
{
   if (WiFi.status() != WL_CONNECTED)//Caso nao esteja conectado ao WiFi, Ira conectarse
   {
      WiFi.begin("SUA REDE", "SUA SENHA");//Insira suas informaçoes da rede
      delay(2000);
   }
}

void readTel()//Funçao que faz a leitura do Telegram.
{
   int newmsg = bot.getUpdates(bot.last_message_received + 1);

   for (int i = 0; i < newmsg; i++)//Caso haja X mensagens novas, fara este loop X Vezes.
   {
      id = bot.messages[i].chat_id;//Armazenara o ID do Usuario à Váriavel.
      text = bot.messages[i].text;//Armazenara o TEXTO do Usuario à Váriavel.
      text.toUpperCase();//Converte a STRING_TEXT inteiramente em Maiuscúla.

      if (text.indexOf("ON") > -1)//Caso o texto recebido contenha "ON"
      {
         digitalWrite(D4, 0);//Liga o LED
         bot.sendMessage(id, "LED ON", "");//Envia uma Mensagem para a pessoa que enviou o Comando.
      }

      else if (text.indexOf("OFF") > -1)//Caso o texto recebido contenha "OFF"
      {
         digitalWrite(D4, 1);//Desliga o LED
         bot.sendMessage(id, "LED OFF", "");//Envia uma Mensagem para a pessoa que enviou o Comando.
      }

      else if (text.indexOf("START") > -1)//Caso o texto recebido contenha "START"
      {
         bot.sendSimpleMessage(id, id, "");//Envia uma mensagem com seu ID.
      }

      else//Caso o texto recebido nao for nenhum dos acima, Envia uma mensagem de erro.
      {
         bot.sendSimpleMessage(id, "Comando Invalido", "");
      }
   }

}

Colocando para funcionar

Após a criação do BOT e upload do código, podemos ver funcionando. Veja o BOT respondeu como o esperado aos comandos:

 


Entendendo a fundo

Software

-Função UniversalTelegramBot::sendMessage()

bot.sendMessage(id, "LED OFF", "");

Com esta função, é feito o envio da mensagem para o determinado ID (referente ao ID de quem enviou a mensagem ao Bot). Logo ao iniciar seu BOT, automaticamente é enviado uma mensagem "/START", e nosso sistema irá responder com o seu ID do Telegram; você pode usar isso para aceitar apenas comandos de seu ID.

 

-Variável id

id = bot.messages[i].chat_id;

Toda vez que o Bot receber um novo update (mensagem), irá armazenar o ID da pessoa que enviou a mensagem na variável id.

 

-Variável text

text = bot.messages[i].text;

Toda vez que o Bot receber um novo update (mensagem), irá armazenar o texto na variável text.

 

A biblioteca do Telegram permite mais opções interessantes, como por exemplo obter o horário em que a mensagem foi enviada ao Bot! Dê uma olhada na referência da biblioteca.

 

-Função UniversalTelegramBot::getUpdates()

int newmsg = bot.getUpdates(bot.last_message_received + 1);

Esta função faz a verificação de novas mensagens, sempre será lido da última (mais recente), para a primeira (mais antiga) mensagem no buffer do Bot. Isto será feito até que se tenha lido todas as mensagens disponíveis então tome cuidado para não travar ou atrasar o resto do seu código!


Desafio

Qualquer pessoa que adicionar seu Bot (basta pesquisar), pode enviar comandos e controla-lo. Você terá que criar algum tipo de “cadeado” para aceitar apenas comandos de pessoas autorizadas. Cada usuário no Telegram tem um ID, então você pode usar isso à seu favor e fazer o sistema aceitar apenas comandos de algumas pessoas.

Fechamento

Podemos facilmente incluir este controle com o Telegram em diversos projetos, permitindo que o mesmo seja controlado à distancia e até mesmo que você seja notificado, como por exemplo um alarme para sua casa que mande mensagem para seu celular ao detectar movimento. As aplicações são imensas, dependendo apenas da sua criatividade. Dúvidas? Sugestões? Críticas? Comente!


Arduino - Grandezas digitais, analógicas e PWM

Arduino - Grandezas digitais, analógicas e PWM

Antes de partirmos para o desenvolvimento de aplicações praticas utilizando algum tipo de sistema embarcado como por exemplo, uma placa Arduinoé necessário que o leitor tenha o conhecimento necessário para diferenciar uma grandeza analógica de uma grandeza digital. O domínio destes conceitos é muito importante para que seja possível aprender como estes sistemas trabalham com essas grandezas (de maneira mais específica, como estes sistemas realizam os processos de conversão entre as mesmas). Sendo assim, este tutorial visa trazer informações referentes aos tipos de grandezas citadas, para que então, o leitor possa adentrar com maior segurança em outros conteúdos.

[toc]

 

Diferença entre grandezas digitais e analógicas

Primeiramente, as grandezas digitais são aquelas que podem ser definidas por meio de saltos entre valores bem definidos dentro de uma faixa de valores. Um exemplo de elementos que trabalham com estas grandezas são os relógios digitais, de modo que, nestes, 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 30,4 segundos, pois, para eles, só existem 30 e 31 segundos, ou seja, qualquer valor intermediário não está definido).

Em contrapartida, 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. O velocímetro de um carro, por exemplo, pode ser considerado 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.

Uma analogia interessante que pode ser feita é a comparação de uma escada com uma rampa, pois, enquanto uma rampa sobe de forma contínua, assumindo todos os valores de altura entre a base e o topo, a escada sobe em saltos, com apenas alguns valores de altura definidos entre a base e o topo. A escada representa, portanto, uma grandeza digital, enquanto a rampa representa uma grandeza analógica.

É importante observar que a quantidade de degraus em uma escada define quais e quantas posições pode-se escolher. Por exemplo, suponha que um determinado degrau em uma escada está a 1,00 m de altura do solo e o próximo está a 1,20 m da mesma referência, note que, neste caso, não é possível ocupar uma posição a 1,15 m do solo porque não existe um degrau lá.

Portanto, percebe-se que ao adicionar mais degraus em uma escada, mais perto de uma rampa esta se aproximará.


Entradas e saídas digitais

Os circuitos e equipamentos elétricos ditos digitais trabalham com apenas dois níveis de tensão definidos. No caso do Arduino UNO, estes são:

  • Um nível lógico alto, correspondente a 5V;
  • Um nível lógico baixo, correspondente a 0V.

Na prática existem faixas de valores próximos a esses números em que o circuito digital entende como nível alto ou baixo. De maneira complementar, existe também uma faixa intermediária não definida que pode gerar resultados inesperados e que, portanto, deve ser evitada.

No Arduino UNO, as entradas e saídas digitais estão localizadas desde pino 0 até o pino 13. Note que, estes pinos devem ser configurados previamente para que atuem como entradas ou saídas (é importante ressaltar que alguns destes pinos possuem funções especiais, no entanto, isto será tratado posteriormente. Neste momento basta salientar a função destes enquanto entradas e saídas digitais).

Entradas digitais do Arduino Uno
Entradas digitais do Arduino Uno

 

Características de uma entrada digital

Quando configuramos um pino como entrada digital ele apresentará uma característica chamada alta impedância. Isso significa que uma pequena corrente consegue fazer com que seu estado mude. Utiliza-se essa configuração, por exemplo, para ler botões, fotodiodos entre outros, de modo que, a partir do estado lido ou das mudanças desses estados conclui-se o que está acontecendo no mundo externo e então pode-se tomar decisões baseadas nessas medidas.

Caso um determinado pino seja configurado como entrada digital mas não esteja conectado a nada, seu estado poderá ser alterado aleatoriamente em virtude de ruídos elétricos do ambiente. Para evitar esse problema utiliza-se um resistor de pull up ou pull down, cuja função é fazer com que a tensão na entrada em questão esteja bem definida quando a mesma não estiver conectada a nada.

As figuras abaixo mostram três ligações de um botão a um pino configurado como entrada digital de um Arduino UNO. Observe o que acontece em cada caso :

  • Caso 1: O estado do pino não estará bem definido fazendo com que este esteja suscetível a ruído.

 

 

  • Caso 2: Neste caso devido à presença do resistor de pull-down seu estado está bem definido e ele enxergará GND (0V). Como consequência seu estado será definido como baixo.

 

Botão com Pull-down no Arduino Uno
Botão com Pull-down

 

  • Caso 3: Neste caso devido à presença do resistor de pull-up, seu estado está bem definido e ele enxergará 5V. Sendo assim, seu estado estará definido como alto.

 

Botão com Pull-up no Arduino Uno
Botão com Pull-up

 

Como curiosidade, vale ressaltar que os microcontroladores presentes nas placas Arduino possuem resistores de pull-up construídos internamente que podem ser acessados por software.

 

Características de uma saída digital

Quando configurados nesse estado os pinos podem fornecer 0 ou 5 V fazendo com que eles drenem ou forneçam corrente. O valor máximo dessa corrente varia de placa para placa, mas, em geral, é de 30mA. Note que esta corrente é mais do que suficiente para ligar um LED de alto-brilho e alguns sensores, porém não é suficiente para ligar a maioria dos relés e motores.

Deve-se ter cuidado, pois, caso uma corrente maior que o limite passe por um pino, este poderá ser danificado.


Entradas analógicas

Com um pouco de observação, pode-se notar que o mundo é quase todo formado por variáveis analógicas, tais como posição, temperatura e pressão, de forma que, torna-se necessário saber trabalhar com esses tipos de grandezas. Um Arduino UNO, por exemplo, possui um conjunto de pinos destinados a serem utilizados como entradas analógicas.

Entradas analógicas no Arduino Uno
Entradas analógicas no Arduino Uno

Como no Arduino UNO tudo é processado de forma digital, é necessário converter as grandezas analógicas em digitais. Para realizar esta tarefa existem conversores já embutidos na placa, de forma que, deve-se apenas compreender o básico do processo de conversão para poder utilizar portas analógicas citadas anteriormente.

De volta no exemplo da escada e da rampa, a quantidade de degraus que temos em uma escada nos podemos associar o conceito de resolução. A resolução de um conversor indica o número de valores discretos (degraus) que o mesmo pode produzir. Quanto mais intervalos (degraus) existirem, mais perto estará um sinal digital de um sinal analógico.

Características de uma entrada analógica

Os conversores analógico-digital do Arduino UNO possuem uma resolução de 10 bits e o intervalo de tensão no qual são realizadas as discretizações (degraus da escada) é de 0 a 5V, ou seja, este intervalo será dividido em 1024 pedaços (210, onde 10 é a resolução do conversor ) , de forma que, o valor atribuído à tensão presente em um determinado pino será o valor discreto (um dos 1024 valores) mais próximo da mesma.

Em outras palavras, com 10 bits de resolução e um intervalo de 0 a 5V de tensão pode-se representar 1024 degraus, os quais, cada um representa um salto de 0,0048828 V (este resultado foi obtido através da razão 5/1024).

Por exemplo, suponha uma tensão de 3,25 V. o valor retornado pela conversão será:

O resultado deve ser inteiro para que o conversor consiga representá-lo, portanto, o valor 666 será escolhido por ser o degrau mais próximo. Esse valor representa uma tensão de 3,251953125 V. Repare que a utilização deste valor insere um erro de 0,001953125 V na medida em questão.


PWM - Simulando saídas analógicas

Além de possuir portas para realizar a leitura de variáveis analógicas, o Arduino UNO conta também com pinos que podem ser usados para simularem saídas analógicas através do PWM, que por sua vez, é uma técnica para obter resultados analógicos por meios digitais. No Arduino UNO, os pinos em questão são: 3,4,6,9,10 e 11, mostrados conforme a figura abaixo.

Saídas PWM
Saídas PWM

 

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 5V (100% de Duty Cycle) no caso do Arduino UNO.

O Duty Cycle a ser definido no projeto corresponde a um número inteiro, que é armazenado em um registrador 8 bits. Sendo assim, seu valor vai de 0 (0%) a 255 (100%).

 

 

De maneira mais detalhada, o Duty Cycle é a razão entre o tempo em que o sinal permanece na tensão máxima (5V no Arduino UNO) e o tempo total de oscilação, conforme ilustrado na figura abaixo:

O  Duty Cycle pode ser calculado da seguinte maneira:

Da mesma forma, pode-se também calcular o valor médio da tensão que está sendo entregue pela saída utilizada.


CONSIDERAÇÕES FINAIS

Este conteúdo foi totalmente voltado para esclarecer alguns pontos à respeito dos tipos de grandezas encontradas ao utilizar uma placa Arduino. Esperamos que você tenha gostado deste conteúdo, sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.

Este conteúdo consiste em uma modificação/revisão do tutorial sobre grandezas digitais, analógicas e PWM do autor Ronan Largura (Eng Elétrica - UFES).

 

Apostila Arduino Básico