Arduino: Entradas e Saidas
Curso: Arduíno e eletrônica de interface com o mundo físico
- Professor Evandro Cantú
- Instituto Federal do Paraná - Campus Foz do Iguaçu
Este curso tem como objetivos realizar uma introdução ao microcontrolador Arduíno e a eletrônica de interface com o mundo físico a partir de atividades teóricas e práticas.
O curso está organizados em módulos, cada um deles trabalhando conceitos específicos sobre o microcontrolador Arduíno e os correspondentes conceitos de eletricidade e eletrônica envolvidos nos sensores e atuadores de interação com o mundo físico.
- Carga Horária
- O curso completo tem carga horária de 20 horas. Entretanto, como está organizado em módulos, pode ser adaptado para uma carga horária menor, reduzindo o número de módulos a serem trabalhados.
- Realizações
- Curso para alunos voluntários IFPR 2016 (12 horas)
- Curso para professores e alunos IFSC 2017 (12 horas)
- Oficina Sepin IFPR 2017 (2 horas)
- Curso para alunos voluntários IFPR 2017 (12 horas)
- Módulo de Introdução o Arduíno (4 horas) realizado anualmente (2016, 2017) nas disciplinas:
- Introdução a Computação - Técnico em Informática
- Introdução a Computação - TADS
- Informática Aplicada ao Ensino de Física - Licenciatura em Física
Conceitos preliminares sobre eletricidade e eletrônica
- Componentes Eletrônicos
- Resistores, Capacitores, Indutores, Diodos, Transistores e Amplificadores Operacionais.
- Eletricidade Básica
- Tensão, Corrente e Resistência Elétrica
- Eletrônica Digital
- Portas lógicas, flip-flops, contadores, decodificadores e outros.
- Corrente Contínua e Corrente Alternada
- Tensão alternada da rede de distribuição de energia e tensão contínua das pilhas, baterias e fontes de alimentação.
- Frequência e período de um sinal periódico
- Sinais e formas de onda periódicas.
- Conversão Analógico Digital
- Número de bits do conversor.
Características do microcontrolador Arduíno
Saídas digitais
- O Arduíno UNO possui 14 Entradas/Saídas Digitais
- As entradas/saídas digitais estão localizadas nos pinos 0 a 13.
- Estas entradas/saídas operam com valores digitais LOW e HIGH, os quais correspondem aos valores de tensão 0 V e 5 V, respectivamente..
- Cada pino fornece corrente de até 20 mA, sendo que qualquer corrente solicitada acima de 40mA pode danificar o Arduíno.
- pinMode
- Comando da linguagem de programação do Arduíno que configura o pino digital como entrada (INPUT) ou saída (OUTPUT).
- Exemplo:
pinMode(13, OUTPUT);
- digitalWrite
- Comando para escrever na saída digital.
digitalWrite(13, HIGH/LOW);
Laboratório 1: Saída digital
- digitalWrite
- Carregar no Arduíno o programa exemplo Arquivo/Exemplos/Basic/Blink para piscar o led do pino 13, mantendo acesso por 1 seg e em seguida apagada por 1 seg. O led do pino 13 é um led instalado na própria placa do Arduíno.
- Modificar o tempo (delay) e verificar a mudança na frequência do piscar do led.
- A função delay(1000); estabelece um atraso em ms (mili segundos), logo 1000 ms = 1 s.
Leds
Um led é um diodo emissor de luz (light emitting diode). Ele se comporta como um Diodo, conduzindo apenas quanto polarizado diretamente.
Para utilizar um led é necessário alguns conceitos de Eletricidade Básica.
Um led não pode receber tensão diretamente em seus terminais sob risco de colocar o componente em curto-circuito. A corrente elétrica no led deve ser limitada, tipicamente entre 15 mA a 30 mA por um resistor externo.
A queda de tensão direta nos leds depende da cor do led. De modo simplificado, tipicamente se usa-se queda de tensão de 2 V.
- Exemplo cálculo do resistor de proteção de um circuito com led
- Supondo:
Iled = 10 mA
Soma das tensões ao longo da malha (2a Lei de Kirchhoff):
V = Vled + R.I
- Isolando R:
R = (V - Vled) / I
- Atribuindo valores:
V = 5V, Vled = 2V, I = 10mA (Prefixos SI)
- Calculando:
R = (5 - 2)/10 . (1/10-3) = 3/10 . 103 = 300Ω
- Valores comerciais:
270Ω ou 330Ω
Laboratório 2: Semáforo automatizado com leds
- Semáforo
- Montar hardware para acionamento de 3 leds (vermelho, verde e amarelo), comandados por 3 saídas digitais independentes do Arduíno, utilizando resistores de proteção adequados.
- Modificar programa Arquivo/Exemplos/Basic/Blink para acionar os leds como um semáforo, com temporização adequada para cada cor.
Entradas digitais
Um pino digital do Arduíno pose ser definido como entrada (INPUT).
pinMode(2, INPUT);
- digitalRead
- Comando para ler o estado de uma entrada digital.
int estadoPino; estadoPino = digitalRead(2);
Neste caso o Arduíno vai ler se o estado do pino é LOW (0 V) ou HIGH (5 V).
Chave digital
Uma chave digital fornecerá 0 V (LOW) ou 5 V (HIGH) caso estiver aberta ou fechada.
Funcionamento:
- Caso a chave estiver aberta, não haverá corrente no o resistor e a tensão entregue ao pino do Arduíno será 0 V.
- Caso a chave estiver fechada, haverá corrente no resistor e a tensão entregue ao pino do Arduíno será 5 V.
Corrente no resistor:
V = R I (Lei de Ohm)
- Isolando I:
I = V / R
- Atribuindo valores:
V=5V, R=10k(Ω) (Prefixos SI)
- Calculando:
I = 5/10 . (1/103) = 0,5 . 10-3 = 0,5 mA
- Corrente desprezível para o Arduíno.
Laboratório 3: Chave digital
- digitalRead
- Montar hardware com chave (push botton), utilizando resistores de proteção de 10 KΩ.
- Carregar programa exemplo Arquivo/Exemplos/Digital/Button para ligar ou desligar led em função de pressão em chave digital.
- Carregar programa exemplo Arquivo/Exemplos/Basic/DigitalReadSerial para verificar no terminal serial o valor da chave digital.
Laboratório 4: Coreografia com leds
Implementar uma coreografia de luzes com 6 leds e 2 chaves digitais, de forma que, a cada combinação de chaves acionadas uma coreografia de luzes seja executada.
Entradas Analógicas
- O Arduíno UNO possui 6 entradas analógicas
- As entradas analógicas utilizam um processo de Conversão Analógico Digital (ADC) para obter valores digitais correspondentes a cada entrada.
- As entradas analógicas são nomeadas de A0 até A5.
- Cada entrada analógica recebe valores analógicos entre 0 V e 5 V.
- Os valores analógicos são convertidos para valores digitais com 10 bits de resolução (valores entre 0 (0000000000) a 1023 (1111111111).
- analogRead
- Comando para ler entrada analógica.
int valorPino; valorPino = analogRead(A0);
Divisor de Tensão
Quando uma tensão é aplicada sobre resistores em série, a tensão total sobre os dois resistores é igual a somas das quedas de tensão sobre cada resistor.
- Quedas de tensão ao longo da malha (2a Lei de Kirchhoff)
V = I.R1 + I.R2
- Isolando I:
I = V / (R1 + R2)
- Mas:
V1 = R1.I
- Substituindo I temos:
V1 = R1/(R1 + R2) . V
- O mesmo para V2:
V2 = R2/(R1 + R2) . V
- Note que, Se:
R = R1 = R2
- Temos:
V1 = V2 = R/(R + R) . V = R/(2.R) . V = V / 2
- Simulação do funcionamento do Divisor de Tensão
- Circuits -> Basic -> Voltage Divider
Potenciômetros
São resistências variáveis através de um cursor.
- Na figura, através de um potenciômetro é possível implementar um divisor de tensão com uma tensão variável Vx obtida a partir do terminal central do potenciômetro.
- Simulação do funcionamento do Potenciômetro Divisor de Tensão
- Circuits -> Basic -> Potentiometer Divider
Laboratório 5: Leitura de entrada analógica
- analogRead
- Montar hardware com utilizando o ponto central de um potenciômetro conectado a entrada analógica A0 (com os demais terminais conectados ao GND e 5V, respectivamente).
- Carregar programa exemplo Arquivo/Exemplos/Basic/AnalogReadSerial e verificar o valor da entrada analógica no monitor serial.
- Carregar programa exemplo Arquivo/Exemplos/Basic/ReadAnalogVoltage e verificar o valor da entrada analógica em Volts no monitor serial.
- Carregar programa exemplo Arquivo/Exemplos/Analog/AnalogInput e verificar o valor da frequência do pulsar do led em função do valor do potenciômetro.
Sensores baseados em resistência variável para Arduíno
Sensores de luminosidade (LDR) e sensores de temperatura (como o NTC) possuem um resistor variável em função da grandeza que estão medindo.
Laboratório 6: Sensor de luminosidade LDR
- LDR
- O LDR (Light Dependent Resistor) é um resistor dependente de luz ou fotoresistor, o qual varia sua resistência em função da luminosidade.
- Montar hardware com o sensor LDR, conforme mostrado na figura acima.
- Testar o código exemplo Arquivo/Exemplos/Analog/AnalogInput, e verificar o valor da frequência do pulsar do led em função do valor da luminosidade.
- Carregar programa exemplo Arquivo/Exemplos/Basic/AnalogReadSerial e verificar o valor da entrada analógica gerada pelo LDR no monitor serial.
Laboratório 7: Sistema indicador de luminosidade
- LDR
- Montar hardware com sensor LDR utilizando divisor de tensão para o sensor e uma coluna de 5 leds utilizando um resistor de proteção para cada led.
- Construir programa para ir acendendo os leds a medida que aumenta a luminosidade.
- Use o programa exemplo Arquivo/Exemplos/Basic/AnalogReadSerial para verificar como a luminosidade do ambiente interfere no LDR.
Saídas Analógicas
O Arduíno emula saídas analógicas através de modulação PWM (Pulse Width Modulation).
O sinal PWM é uma onda quadrada, com frequência constante, mas a fração de tempo em que o sinal é HIGH (5V) (duty cycle) pode variar entre 0 e 100%, fornecendo uma média de tensão variável na saída [1].
As 6 Saídas PWM são identificadas pelo sinal ~ e fornecem saídas analógicas através de pulsos PWM de 8 bits, possibilitando, portanto, 256 valores diferentes de tensão analógica entre 0V e 5V, com passos de 0 a 255.
Laboratório 8: Saída analógica
- analogWrite
- analogRead
- map;
- Montar hardware para acionamento de led conectado ao pino 9, escolhendo resistor de proteção adequado;
- Carregar programa exemplo Arquivo/Exemplos/Basic/Fade e verificar a variação da luminosidade do led da porta 9.
- Montar hardware com utilizando o ponto central de um potenciômetro conectado a entrada analógica A0 (com os demais terminais conectados ao GND e 5V, respectivamente).
- Carregar programa exemplo Arquivo/Exemplos/Analog/AnalogInOutSerial e verificar a variação da luminosidade do led da pino 9 em função do potenciômetro.
Comunicação Serial
A comunicação serial permite enviar dados do computador ao Arduíno pela interface serial.
Laboratório 9: Comunicação serial
- Carregar programa exemplo Arquivo/Exemplos/Communication/PhysicalPixel e acionar o led do pino 13 a partir de comandos H e L enviados pelo terminal serial.
- Montar hardware para acionamento de led conectado ao pino 9, escolhendo resistor de proteção adequado;
- Carregar programa exemplo Arquivo/Exemplos/Communication/Dimmer e controlar a intensidade do led do pino 9 a partir do envio de valores entre 0 e 255 pelo terminal serial.
- No programa exemplo acima, trocar a linha:
brightness = Serial.read();
- por
brightness = Serial.parseInt();
- para converter os caracteres ASCII lidos para inteiros.
Led RGB
Um led RGB apresenta em um único led a possibilidade de fornecer todas as cores, obtidas a partir da mistura das cores primárias luz, ou cores primárias aditivas, que são vermelho (Red), verde (Green) e azul (Blue).
- As cores primárias não resultam da mistura de nenhuma cor.
- A cor branca é a soma das três cores primárias.
- As cores secundárias são misturas de duas cores, como o amarelo, ciano e magenta.
- A cor preta é a ausência de cores.
- As demais cores requerem mistura das três cores primárias em quantidades específicas.
COLOR PICKER
A ferramenta color picker é utilizada para obter as misturas das cores primárias utilizada na Linguagem HTML com uma paleta de 256 cores RBG.
A quantidade de cada cor RGB está expressa em hexadecimal de 8 bits, por exemplo, o amarelo é #FFFF00, ou seja, é o resultado da mistura do vermelho (FF ou 255) e do verde (FF ou 255), sem nada de azul (00 ou 0) .
A quantidade de cada cor RGB também é mostrada em valores de 0 a 255.
Leds RGB
Os leds RGB são encontrados em duas estruturas:
- Anodo comum;
- Catodo comum.
Laboratório 10: Led RGB
- Cores primárias
- digitalWrite.
- Montar hardware para led RGB anodo comum utilizando resistores de proteção adequados.
- Modificar programa blink para piscar cores vermelho (R), verde (G) e azul (B) alternadamente;
- Variar a frequência do piscar de leds RGB nos seguintes valores:
- 1 Hz
- 10 Hz
- 100 Hz
- 1000Hz
- Verificar o resultado nas cores observadas.
- Misturando as cores primárias
- analogWrite
- Montar hardware para led RGB anodo comum utilizando os pinos 3, 5 e 6 respectivamente.
- Carregar programa exemplo Arquivo/Exemplos/Communication/ReadASCIIString e misturar as cores do led RGB utilizando quantidades de RGB de 0 a 255, de modo a obter as cores mostrada na tabela de cores acima.
Sensor de Temperatura NTC 10k
O sensor de temperatura NTC 10k é um thermistor, isto é, um resistor cuja resistência varia com a temperatura, podendo medir de −90 °C a 130 °C.
Existem dois tipos de thermistores:
- NTC (Negative Temperature Coefficient), no qual a resistência diminui com o aumento da temperatura;
- PTC (Positive Temperature Coefficient), no qual a resistência aumenta com o aumento da temperatura.
Para leitura com o Arduíno, o sensor NTC 10k é utilizado numa estrutura com um divisor de tensão com um resistor de 10K Ω.
Esquema de ligação com Arduíno:
- Cálculo da resistência do NTC
- Na temperatura de 25 °C a resistência do NTC é 10 k Ω, variando linearmente com a temperatura.
- Portando, quando:
RNTC = 10k Ω (25 °C)
- Temos:
leitura_analógica = 512 (Vdivisor = 2,5V)
- Logo, para qualquer leitura analógica temos:
RNTC = 10k . (1023/leitura_analógica - 1)
- Equação de Steinhart–Hart
- A equação de Steinhart–Hart (https://en.wikipedia.org/wiki/Thermistor), detalha a operação do thermistor NTC relacionando a variação de temperatura (Kelvin) com a resistência (Ω).
- onde a, b e c são parâmetros de Steinhart–Hart específicos para cada dispositivo.
- Valores típicos para um thermistor com resistência de 10K Ω na temperatura de (25 °C = 298.15 K) é:
- a = 0.001129148,
- b = 0.000234125,
- c = 0.0000000876741.
Laboratório 11: Sensor de Temperatura com NTC
- Monte o hardware para o sensor de temperatura NTC10k;
- Carregue e teste o código abaixo (adaptado de [2]):
//Sensor de temperatura NTC10k
#include <math.h>
const double a = 0.001129148; //
const double b = 0.000234125; //Parâmetros de Steinhart–Hart
const double c = 0.0000000876741; //
void setup()
{
Serial.begin(9600);
}
void loop()
{
double R; //Resistência do NTC
double T; //Temperatura em Kelvin
int leitura; //Leitura analógica (0 a 1023)
leitura = analogRead(A0);
R = (10000.0 * ((float)1023/leitura - 1)); //Calcula valor de R em função da leitura
T = 1 / (a + (b * log(R)) + (c * pow(log(R),3))); //Equação de Steinhart–Hart
T = T - 273.15; //Converte Kelvin para Celcius
Serial.print("Temperatura: ");
Serial.print(T);
Serial.println(" oC");
delay(1000);
}
Sensor de temperatura (LM35)
- Funcionamento do sensor LM35
- O LM35 é um circuito integrado exclusivo para medir temperatura com uma tensão de saída variando linearmente com a temperatura em graus Célsius.
- Na configuração básica este sensor mede temperaturas entre 2oC e 150oC, variando a saída em função da temperatura de 0 mV + 10mV por 1oC.
- Com a configuração mostrada em [3] é possível medir temperatura de -55oC e 150oC.
- Esquema de ligação com Arduíno
_______ | | | LM 35 | |_______| | | | (+5v) ----+ | +---- (Ground) | Analog Pin 0mV + 10mV / oC
- Leitura pela entrada analógica do Arduíno
- O valor de tensão (entre 0V e 5V) lido pelo Arduíno na entrada analógica é convertido um número digital com 10 bits de magnitude, ou seja, 210 (1024) valores (entre 0 e 1023).
- Para obter o valor de tensão, para uso no cálculo da temperatura, multiplica-se o valor digital obtido na leitura por 5/1023.
- Como a tensão medida pelo sensor varia de 0 mV + 10mV/1oC, se multiplicarmos por 100, teremos o valor em graus Celsius:
Laboratório 12: Sensor de temperatura LM35
- Monte o hardware com LM35 conforme a figura, utilizando a entrada analógica A0 para leitura.
- Carregue o código exemplo abaixo e verifique o funcionamento do sensor:
//Sensor de temperatura LM35
float valorSensor;
float temperatura;
void setup() {
Serial.begin(9600);
}
void loop() {
valorSensor = analogRead(A0) * 5.0 / 1023.0;
temperatura = valorSensor * 100.0;
Serial.print("Temperatura: ");
Serial.println(temperatura);
delay(2000); //Tempo entre as leituras em ms
}
Sensor de Temperatura e Humidade DHT11
O DHT11 é um sensor de temperatura e humidade. Este sensor inclui um medidor de humidade resistivo e um sensor de temperatura tipo NTC conectado a um microcontrolador de 8 bits [4].
O DHT11 possui uma biblioteca com funções prontas para seu funcionamento, documentada em [5].
- Esquema de ligação com Arduíno
_______ | | | DHT11 | |_______| | | | (Ground) ----+ | +---- (+5v) | Analog Pin 1
Laboratório 13: Sensor de temperatura DHT11
- Monte o hardware com DHT11 conforme a figura, utilizando a entrada analógica A1 para leitura.
- Baixe a biblioteca DHT11.zip e salve no computador (Última versão disponível em [6]).
- A biblioteca DHT11, contida no arquivo DHT11.zip, é formada por dois arquivos:
- dht11.h
- dht11.cpp
- A biblioteca DHT11, contida no arquivo DHT11.zip, é formada por dois arquivos:
- Insira a biblioteca DHT11.zip no ambiente da IDE do Arduíno:
Sketch -> Incluir Biblioteca -> Adicionar biblioteca .ZIP
- As bibliotecas são instaladas por padrão no diretório:
~/Arduino/libraries
- Carregue o código exemplo abaixo e verifique o funcionamento do sensor:
//Sensor de temperatura LDHT11
#include <dht11.h>
dht11 sensor; //Inicializa sensor
void setup() {
Serial.begin(9600);
delay(1000);
}
void loop() {
sensor.read(A1);
Serial.print("Temperatura (oC): ");
Serial.println(sensor.temperature);
Serial.print("Unidade (%): ");
Serial.println(sensor.humidity);
delay(2000); //Tempo entre as leituras em ms
}
Acionamento de Cargas com Relés
Um relé é um interruptor eletromecânico ou eletrônico que pode ser utilizado para ligar ou desligar cargas conectadas em 127/220V CA (Corrente Alternada).
O acionamento do relé pelo Arduíno é realizado a partir de uma saída digital, além do fornecimento das tensões 5V e GNG para alimentar o relé.
A carga CA é conectada nos terminais de potência do relé, o qual geralmente apresenta três terminais:
- NA - Normalmente Aberto
- COM - Comum
- NF - Normalmente Fechado
Para acionamento de uma carga simples, como uma lâmpada, utilizar NA-COM como chave liga-desliga.
Laboratório 14: Acionamento de uma lâmpada com relé
- LDR e relé
- Montar hardware com sensor LDR e um relé para acionamento pelo Arduíno de uma lâmpada 127/220V.
- O circuito da lâmpada na rede 127/220 V CA é mostrado na figura abaixo.
Sensor Piezoelétrico
Um sensor piezoelétrico é um dispositivo eletrônico que gera uma tensão quando é atingido por uma vibração, onda sonora ou uma tensão mecânica [7].
Para usar o sensor piezoelétrico com o Arduíno, utiliza-se analogRead() para ler uma tensão de 0 a 5V, a qual será convertida pelo Conversor Analógico Digital para valores digitais 0 a 1023.
Se a tensão lida for maior que um limiar, supõe-se que o sensor piezoelétrico detectou uma vibração.
- Circuito
- O sensor piezoelétrico tem polaridade. O terminal negativo deve ser ligado a terra, em paralelo com um resistor de 1 M Ω. O terminal positivo deve ser ligado a entrada analógica.
Laboratório 15: Sensor Piezoelétrico
- Monte o hardware para o sensor piezoelétrico e teste o código abaixo (adaptado de [7]).
- Pode ser necessário testar vários valores para o limiar para definir o melhor funcionamento do sensor piezoelétrico.
//Sensor Piezoelétrico
const int limiar = 100; // tensão de limiar
int leituraSensor = 0; // veriável com leitura do sensor
int estadoLed = LOW; // estado inicial do led
void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600);
}
void loop() {
leituraSensor = analogRead(A0);
if (leituraSensor >= limiar) {
estadoLed = !estadoLed; //inverte estado do led
digitalWrite(13, estadoLed);
Serial.println("Vibração detectada!");
}
delay(100);
}
Referências
- ↑ https://www.arduino.cc/en/Tutorial/SecretsOfArduinoPWM
- ↑ http://playground.arduino.cc/ComponentLib/Thermistor2
- ↑ http://www.ti.com/lit/ds/symlink/lm35.pdf
- ↑ http://www.micro4you.com/files/sensor/DHT11.pdf
- ↑ http://playground.arduino.cc/main/DHT11Lib
- ↑ https://github.com/adafruit/DHT-sensor-library
- ↑ 7,0 7,1 https://www.arduino.cc/en/Tutorial/Knock
--Evandro.cantu (discussão) 16h33min de 12 de setembro de 2016 (BRT)