arduino como ferramenta de aquisição de dados · o que faremos hoje? atividades •...

42
Laboratório de FIS14 Arduino como ferramenta de aquisição de Dados Prof. Douglas M G Leite [email protected] Sala 2628

Upload: hoangdien

Post on 07-Feb-2019

213 views

Category:

Documents


0 download

TRANSCRIPT

Laboratório de FIS14

Arduino como ferramenta de

aquisição de Dados

Prof. Douglas M G Leite

[email protected]

Sala 2628

O que faremos HOJE?

Atividades

• Apresentação do Professor (30min)

• Projetos Básicos do Arduino – alunos montam e apresentam (60min)

• Experimento com Arduino – alunos montam e apresentam (60min)

Avaliação

• Apresentar cada um dos Projetos Básicos para o Professor/Monitor (R)

• Apresentar o Experimento em funcionamento para o professor (B-L)

• Prazo: 16:30 de hoje

Conteúdo Apresentação

• Introdução ao Arduino

• Hardware/Software Arduino

• Projetos Básicos

• Experimento com Arduino – Pêndulo Simples

O que é?

• Arduino é uma plataforma aberta de protótipos eletrônicos baseados em hardware e software flexíveis e fáceis de usar.

O que é?

• O Arduino é o que chamamos de plataforma de computação física ou embarcada, ou seja, um sistema que pode interagir com seu ambiente por meio de hardware e software.

Aplicações

Tipos de Arduino

Arduino Mega 2560

Arduino

LilyPad

Arduino Uno

DIY ArduinoBoarduino Kit

Hardware

Arduino UNO

14 Pinos Digitais I/O (06 PWM – Pulse Width Modulation)

Usados para detecção outransmissão de con-troles digitais.

06 Pinos AnalógicosPinos de

alimentação

Microcontrolador

Porta USB – Universal

Serial Bus

Usados para leituras desinais de sensores.Usados para ali-

mentação de circui-tos externos.

Usada para comu-nicação serial com ocomputador.

Alimentação

Externa

Usada para alimentar ohardware com umafonte externa. Ex.:Bateria de 9V

Atmega 328

PWM – Pulse Width Modulation

• é uma técnica utilizada por sistemas digitais para variação do valor médio de uma forma de onda periódica. A técnica consiste em manter a frequência de uma onda quadrada fixa e variar o tempo que o sinal fica em nível lógico alto. Esse tempo é chamado de duty cycle, ou seja, o ciclo ativo da forma de onda.

Características Básicas

Software

• Possui compatibilidade com as linguagens de programação C e C++.

• Utiliza filosofia de projeto aberto.

• Escrever e Salvar o código do programa.

• Verificar e Compilar o código do programa.

• Transportar o código para a placa Arduino.

Esquema de Funcionamento

Servomotor

Motor de passo

LEDDisco piezo

Software

Área de notificação do programa

Barra de status

Gravar o programa na placa

Verificar se o programa tem algum problema

Novo programa

Abrir programa

Salvar programa

Sketch - Área de programação

Menu principal

Monitor Serial

• Comunicação

Executa só uma vez. Funciona como uma função deinicialização. Contém as principais configurações. Executasomente ao ligar ou resetar o Arduino

Executa infinitas vezes. Toda a operação doArduino deve estar aqui.

Código

Símbolos:� {{{{ }}}} Dentro das chaves vão os procedimentos que a função deve executar;

� ; O ponto e vírgula é usado para marcar o final do procedimento;

� //////// Comentário de uma linha;

� /*/*/*/*............*/*/*/*/ Comentário em várias linhas.

Linguagem - Constantes

No Arduino existem algumas constantes previamente defini-das e são consideradas palavras reservadas.

As constantes definidas são:

TRUE – indica valor lógico verdadeiro.

FALSE – indica valor lógico falso.

HIGH – indica que uma porta está ativada, ou seja, está em 5 V.

LOW – indica que uma porta está desativada, ou seja, está em 0 V.

INPUT – indica que uma porta será de entrada de dados.

OUTPUT– indica que uma porta será de saída de dados.

Linguagem - Funções

�Pinos Digitais I/O� pinMode()� digitalWrite()� digitalRead()� analogWrite()-PWM� pulseln()

�Pinos Analógicos I

� analogRead()

�Avançado I/O� tone()� noTone()� shiftOut()� pulseIn()

�Tempo� millis()� micros()� delay()� delayMicrosecond()

�Matemática� min()� max()� abs()� constrain()� map()� pow()� sqrt()

Linguagem - Funções

�Trigonométricas� sin()� cos()� tan()

�Numeros aleatórios� randomSeed()� random()

� Interrupções externas� attachInterrupt()� detachInterrupt()

� Interrupções� interrupts()� noInterrupts()

�Bits e Bytes� lowByte()� highByte()� bitRead()� bitWrite()� bitSet()� bitClear()� bit()

Linguagem - Funções

� Interrupções externas� attachInterrupt()� detachInterrupt()

� Interrupções� interrupts()� noInterrupts()

�Comunicação Serial� Serial.print()� Seiral.println()� Serial.read()� Serial.begin()� Serial.available()� Serial.end()

� Controle de Fluxo� if� if...else� if...else...if� while� do...while� for� switch...case

Linguagem – Procurando por mais...

KIT Arduino

• Arduino UNO + cabo USB

• Protoboard

• Resistores

• LEDs

• Potenciômetro

• LDR

• Jumpers

Protoboard

Trilhas que não estão conectadas

Resistores

LED

• Diodo Emissor de Luz – Light Emitting Diode

Potenciômetro

• Resistência variável entre A e C ou entre C e B

• Funciona como Divisor da Tensão entre A e B, com coleta em C

LDR

• Foto-Resistor – Light Dependent Resistor

• Sua resistência diminui quando a luz é muito alta, e quando a luz é baixa, a resistência no LDR aumenta.

Projeto 1: Ligar e desligar um LED por um segundo.

Circuito básico

� � �. � � � �/� � � �5,0– 1,6�/0,020

� � �,�

�,���� � 170Ω ���������������� � 170Ω.

Arduino – saída: 5 voltsLed vermelho: 1,6 voltsCorrente do Led: aprox. 20 !

Código

//Ligar e desligar um LED por um segundo

void setup() {

pinMode(12,OUTPUT); // Inicializa o pin 12 como uma saída

}

void loop()

{

digitalWrite(12,HIGH); // Liga o LED

delay(1000); // Temporiza um segundo (1s = 1000ms)

digitalWrite(12,LOW); // Desliga o LED

delay(1000); // Temporiza um segundo (1s = 1000ms)

}

Projeto 1: Ligar e desligar um LED por um segundo.

Código básico

Colocando para Funcionar:

• Escrever o código no programa Arduino.

• Verificar se está tudo correto.

• Ligar o cabo ao computador e à placa.

• Conectar o Arduino na porta serial certa.

• Carregar o código na placa.

Projeto 1: Ligar e desligar um LED por um segundo.

• Objetivo: regular a intensidade de um LED com o potenciômetro via Arduino

• Utilize uma porta Analógica para leitura do valor de tensão sobre o terminal C do potenciômetro

• Utilize uma porta Digital PWM (~) para saída de tensão para alimentar o LED

• Utilize a função “map()” - converter entrada analógica (0 – 1023) em escrita digital (0 – 255) PWM

• Utilize a função “Serial.print()” - imprimir valor lido no potenciômetro e valor escrito na porta PWM

Projeto 2: Dimmer Digital

Projeto 2: Dimmer Digital

• Exibição dos impressos pela função Serial.print()

• Monitor Serial

• Plotter Serial

// Dimmer Digital

int ledpin = 10;

int potpin = A5;

int valorpot = 0; // armazena o analogico entre 0 e 1023

float luminosidade = 0; // valor da luminosidade do led PWM entre 0 e 255

void setup() {

Serial.begin(9600); // inicializa comunicação serial na velocidade 9600 bits/s

pinMode(ledpin, OUTPUT);

pinMode(potpin, INPUT);

}

void loop() {

valorpot = analogRead(potpin); // leitura da porta analógica (potenciômetro)

luminosidade = map(valorpot, 0, 1023, 0, 255); // converte valor "valorport" em "luminosidade"

Serial.print(valorpot); // imprime o valor lido no potenciometro

Serial.print(", "); // imprime um separador " , "

Serial.println(luminosidade); // imprime o valor da luminosidade e faz a quebra de linha

analogWrite(ledpin, luminosidade); // escreve o valor da luminosidade na porta PWM acendendo o LED

delay(200);

}

Projeto 2: Dimmer Digital - código

• Objetivo: Acender ou apagar um LED conforme variação de luminosidade do ambiente

• Usar Comando “if() {}” para tomar decisão se acender ou não o LED em referência à luminosidade medida pelo LDR

Projeto 3: Fotocélula

Projeto 3: Fotocélula – Serial Plotter

Leitura do LDR

Valor para tomada de decisão (limiar)

Estado do LED

int ledpin = 10;int LDRpin = A5;int estado = 0;

void setup() {pinMode(ledpin, OUTPUT);pinMode(LDRpin, INPUT);Serial.begin(9600);}

void loop() {int leitura = analogRead(LDRpin); int limiar = 800;Serial.print(leitura);Serial.print(", ");Serial.print(limiar);Serial.print(", ");Serial.println(estado);if(leitura>limiar) { digitalWrite(ledpin,HIGH);estado=500;} else { digitalWrite(ledpin,LOW);estado=0;}}

Projeto 3: Fotocélula - códigos

• int ledpin = 10;

• int LDRpin = A5;

• void setup() {

• pinMode(ledpin, OUTPUT);

• pinMode(LDRpin, INPUT);

• Serial.begin(9600);

• }

• void loop() {

• int estado = analogRead(LDRpin);

• Serial.println(estado);

• if(estado>995) {

• digitalWrite(ledpin,HIGH);

• }

• else {

• digitalWrite(ledpin,LOW);

• }

• }

Experimento – Pêndulo Simples com Arduino

Objetivo:

• Medir o período de um Pêndulo Simples da FORMA MAIS PRECISA POSSÍVEL utilizando o Arduino como sistema de aquisição de dados

Desafios:

• A) Fazer estatística de várias medidas e apresentar o valor médio mais desvio padrão do período no Monitor Serial

• B) Apresentar tendência de variação do período conforme a diminuição do ângulo de oscilação no Serial Plotter

Experimento – Pêndulo Simples com Arduino

IMPORTANTE:

• Meçam todas as características do pêndulo que julgarem importante

• Anotem e guardem estes valores assim como os dados do período medido

• NÃO DESMONTEM O PÊNDULO: Mantenham o pêndulo com as mesmas características após a desmontagem do experimento.

• Vocês utilizarão este mesmo pêndulo semana que vem com um outro método de aquisição e farão a comparação dos métodos!

Experimento – Pêndulo Simples com ArduinoPossíveis Problemas

• Delay � limita a precisão da medida

• Largura da Sombra � erro sistemático � diminui o valor do período medido

0

0,2

0,4

0,6

0,8

1

1,2

1,4

lum

ino

sid

ad

e

tempo

C

t1 t2

Delay

Leitura do LDR

Valor para tomada de decisão (limiar)

Contagem – início/fim do período

Valor computado do período

Experimento – Pêndulo Simples - Sugestão Código

• int ledpin = 10;

• int LDRpin = A5;

• int estado = 0;

• int tempo0 = 0;

• int tempo1 = 0;

• int periodo = 0;

• void setup() {

• pinMode(ledpin, OUTPUT);

• pinMode(LDRpin, INPUT);

• Serial.begin(9600);

• }

• void loop() {

• int leitura = analogRead(LDRpin);

• int limiar = 800;

• Serial.print(leitura);

• Serial.print(", ");

• Serial.print(limiar);

• Serial.print(", ");

• Serial.print(periodo);

• Serial.print(", ");

• Serial.println(estado);

• if(leitura>limiar) {

• digitalWrite(ledpin,HIGH);

• if(estado==0){

• tempo0 = tempo1;

• tempo1 = millis();

• periodo = tempo1 - tempo0;

• }

• estado=500;

• }

• else {

• digitalWrite(ledpin,LOW);

• estado=0;

• }

• }