Arduino
Arduino
4ª SEMANA
MARCELO ALUISIO SILVA DE OLIVEIRA
1
APRESENTAÇÃO
2
cursos de formação, dando novas alternativas de trabalho e
formando o cidadão que procura aperfeiçoar seu conhecimento
melhorando sua vida.
3
INTRODUÇÃO
4
Fritzing
5
estudos e projetos, apesar de muita gente usar como produto
final.
Eletrônica Básica
6
potencial (sentido convencional). Como analogia podemos
pensar na água armazenada em dois recipientes conectados por
um cano. A água irá fluir do recipiente com maior quantidade de
água para o menor.
7
A movimentação das cargas elétricas através do condutor pode
encontrar elementos que oferecem certa resistência a passagem
dessas cargas. Na figura acima, por exemplo, a resistência a
passagem da corrente elétrica faz com que a lâmpada gere calor
no seu filamento e fique incandescente. É esse mesmo efeito
que permite que a água de um chuveiro seja aquecida ao passar
pela resistência.
I=V/R
8
sobre uma resistência de 220 Ω irá produzir uma corrente de
0,022A ou 22mA.
Principais Componentes
9
São componentes não polarizados, ou seja, podem ser instalados
em qualquer sentido no circuito elétrico, sem preocupação com
os polos negativos ou positivos. O valor de um resistor pode ser
determinado através de uma tabela código de cores, conforme
ilustrado abaixo.
10
Por exemplo, se compararmos um capacitor com uma pilha
temos que o capacitor pode descarregar toda sua carga em uma
pequena fração de segundo, já a pilha demoraria vários minutos
para descarregar. Uma aplicação típica de capacitores e no flash
de câmera, a pilha (ou bateria) carrega o capacitor por vários
segundos, e então o capacitor descarrega toda a carga
armazenada para que a lâmpada do flash seja acionada
imediatamente. Existem diversos tipos de capacitores sendo
alguns polarizados e outros não, a unidade de medida de um
capacitor é o Farad (F).
11
Um diodo é um componente semicondutor que permite que a
corrente flua em apenas um sentido.
12
Os transistores são componentes semicondutores e foram os
principais responsáveis pela revolução da eletrônica e da
informática na década de 1960, pois, permitiram substituir as
válvulas nos equipamentos. Um transistor é praticamente cem
vezes menor que uma válvula, não necessita de tempo para
aquecimento, consome menos energia, sendo muito mais rápido
e confiável. Apresenta inúmeras aplicações, sendo as principais,
a atuação como uma “chave” eletrônica e amplificador de sinal.
13
Os circuitos integrados consistem em transistores e vários outros
componentes eletrônicos miniaturizados e montados num único
chip. A integração em larga escala permite colocar cerca de 1
milhão de transistores por mm² proporcionando um alto nível de
miniaturização dos circuitos eletrônicos além de uma grande
redução de custos.
14
Os pinos dos componentes devem ser conectados sempre em
linhas diferentes, enquanto conexões entre componentes
diferentes ocorrem em uma mesma linha.
15
Apresenta 13 pinos que podem ser utilizados como entradas ou
saídas digitais (pinos 1 a 13), sendo que os pinos 3, 5, 6, 9, 10 e
11 podem ser utilizados para obter saídas analógicas (Pulse
Width Modulation – PWM). Os pinos A0 a A5 correspondem às
entradas analógicas, enquanto os pinos 3,3V, 5V e GND
permitem alimentar os componentes dos circuitos conectados ao
Arduino.
16
Projetos Arduino
17
Faça também com que pisque de forma que fique mais tempo
apagado que aceso.
01 - LEITURA DE BOTÕES
INGREDIENTES
● ▪ Botão de pressão
● ▪ Resistor 10kΩ
● ▪ 1 Resistor 470 Ω
● ▪ 1 LED 5mm
● ▪ Fios Jumper’s
● ▪ Protoboard
18
● ▪ Arduino Uno ou outro
MISTURANDO OS INGREDIENTES
LEVANDO AO FORNO
19
selecionada e se a placa configurada é a que você está usando
(board).
PREPARANDO A COBERTURA
Agora temos que dar vida ao Arduino. Para isso, dentro da IDE
Arduino: abra o menu File > Examples > 01. Basics > Button.
/*
Button
*/
// Variáveis
int buttonState = 0; // Variável para leitura do estado do botão
20
pinMode(buttonPin, INPUT); // Inicializa o pin do botão como entrada (INPUT)
}
EXPERIMENTANDO O PRATO
21
ENTENDENDO O PROGRAMA
▪ Constantes
▪ Comando pinMode
22
por definir se um pino é uma entrada (INPUT) ou uma saída
(OUTPUT).
void setup() {
pinMode(ledPin, OUTPUT); //Inicializa o pino do LED como saída (OUTPUT)
pinMode(buttonPin, INPUT); // Inicializa o pin do botão como entrada (INPUT)
▪ Comando digitalRead
23
Na função Loop temos o programa que rodará ciclicamente em
nosso Arduino. Como desejamos acender um LED a partir de um
botão, primeiramente devemos ler o seu estado. Para isso,
usamos o comando digitalRead, que retorna o valor de estado de
uma entrada digital passada como parâmetro.
// Comando que lê o estado do botão (HIGH -> +5V -> botão press.) (LOW -> 0V)
buttonState = digitalRead(buttonPin);
▪ Bloco IF
24
Vamos voltar à receita do bolo. Caso esse bolo seja para uma
festa de aniversário, é interessante que se faça uma cobertura,
caso contrário, podemos deixar o bolo sem cobertura. Veja como
ficaria o algoritmo para essa situação:
Função bolo(){
Faça o bolo;
Se o bolo é de aniversário {
Faça uma cobertura;
}Senão
Não faça uma cobertura
}
fim
Veja que usamos um parâmetro para decidir se iremos ou não
executar uma atividade. Veja o fluxograma a seguir.
Dessa forma, em nosso exemplo, caso buttonState seja igual a 1
(botão pressionado), devemos acender o LED, caso contrário,
devemos apagá-lo.
No programa fica assim:
Operadores Lógicos
25
Para usar blocos lógicos, tal como o bloco IF, usaremos
operadores lógicos. Os operadores lógicos, junto aos
parâmetros, são responsáveis por criar as condições de execução
de um bloco lógico.
Voltando ao bolo, caso você não tenha leite condensado, será
inviável fazer uma cobertura de brigadeiro.
Dessa forma, o número de latas de leite condensado disponíveis
deve ser maior ou igual a 1 latas para que seja viável fazer essa
cobertura.
26
INGREDIENTES
● Potenciômetro linear 10k Ω
● Fios jumper’s
● Protoboard
MISTURANDO OS INGREDIENTES
LEVANDO AO FORNO
27
PREPARANDO A COBERTURA
Para isso, dentro da IDE Arduino: abra o menu File > New ou
aperte “ctrl+N”. Uma nova janela, em branco deve ser aberta.
// Esta função "setup" roda uma vez quando a placa e ligada ou resetada
28
unsigned int valorLido;
void setup() {
Serial.begin(9600); //Inicia porta serial e define a velocidade de transmissão
}
// Função que se repete infinitamente quando a placa é ligada
void loop() {
valorLido = analogRead(A0);
Serial.println(valorLido);
delay(1000); // Espera um segundo
}
EXPERIMENTANDO O PRATO
Para essa experiência, você terá que abrir o serial Monitor que
será melhor explicado mais à frente. Para isso, o serial monitor
pode ser aberto pelo ícone mostrado na figura a seguir.
29
Caso tenha ocorrido tudo como esperado, conforme você varie a
resistência do potenciômetro, girando seu eixo, aparecerá no
serial monitor um valor de 0 a 1023.
ENTENDENDO O HARDWARE
Potenciômetro e trimpot
Divisor de tensão
30
Como a corrente do circuito é calculada pela divisão da tensão
em cima de todos os resistores dividido pela soma dos resistores,
teremos a tensão em cima de um resistor igual a resistência
desse resistor vezes a tensão total dividida pela soma dos
resistores.
ENTENDENDO O PROGRAMA
31
A leitura da entrada analógica é feita com a função analogRead,
que recebe como parâmetro o pino analógico a ser lido e retorna
o valor digital que representa a tensão no pino. Como o
conversor analógico-digital do Arduino possui uma resolução de
10 bits, o intervalo de tensão de referência, que no nosso caso é
5 V, será dividido em 1024 pedaços (2^10) e o valor retornado
pela função será o valor discreto mais próximo da tensão no
pino.
unsigned int valorLido = analogRead(A0);
2 x 1024 / 5 = 409,6
32
inserindo um erro de 0,001953125 em nossa medida devido a
limitação de nossa resolução.
Comunicação serial
▪ Serial Monitor
33
O Serial Monitor disponibiliza uma interface gráfica que facilita a
comunicação entre o Arduino e um computador. Após
selecionarmos a porta serial adequada, o serial monitor pode ser
aberto pelo ícone no canto superior direito da janela, onde é
representado por uma lupa.
Serial.begin(9600); //Inicia porta serial e define a velocidade de transmissão
▪ Enviando Dados
Na maioria das vezes, o envio de dados pela porta serial pode ser
feito através das funções print e println. A função print imprime
os dados na serial utilizando o código ASCII. Essa função recebe
dois parâmetros e retorna à quantidade de bytes que foram
escritos.
Serial.print(var); // Imprime a variável var
Serial.print(“olá”);// Imprime o texto olá
O parâmetro “var” recebe o valor a ser impresso. A função é
sobrecarregada de modo a ser capaz de receber qualquer tipo
padrão (char, int, long, float etc).
34
Quando o texto estiver entre aspas, isso simboliza que você
deseja imprimir um texto. Caso contrário, você deseja imprimir
uma variável.
35
ao valor médio da onda. Isso permite que se possa, por exemplo,
controlar a intensidade do brilho de um LED, ou a velocidade de
um motor de corrente contínua.
INGREDIENTES
36
Garanta que seu Arduino esteja desligado durante a montagem e
que o seu LED esteja conectado corretamente, com a perna mais
longa (Anodo) conectado ao resistor e a perna menor (catodo)
ao GND.
LEVANDO AO FORNO
37
PREPARANDO A COBERTURA
EXPERIMENTANDO O PRATO
ENTENDENDO O PROGRAMA
38
Como já explicado no início do capítulo, o PWM pode ser usado
para simular uma saída analógica. Variando um sinal de saída de
PWM de 0 a 255, estamos variando o Duty Cycle, que por sua
vez, resulta numa saída de 0V a 5V.
39
Depois de mudarmos de escala, basta escrevermos o valor de
PWM na saída do LED.
analogWrite(led,pwm);//Escreve no led um sinal PWM proporcional ao valorLido
04 - SEMÁFORO
40
Componentes necessários
● Protoboard
Conectando os componentes
41
Digite o código
42
Código
// Semáforo
int ledDelay = 10000; // espera entre as alterações
int redPin = 10;
int yellowPin = 9;
int greenPin = 8;
void setup() {
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
}
void loop() {
digitalWrite(redPin, HIGH); // acende a luz vermelha
delay(ledDelay); // espera 5 segundos
digitalWrite(yellowPin, HIGH); // acende a luz amarela
delay(2000); // espera 2 segundos
digitalWrite(greenPin, HIGH); // acende a luz verde
digitalWrite(redPin, LOW); // apaga a luz vermelha
digitalWrite(yellowPin, LOW); // apaga a luz amarela
delay(ledDelay); // espera ledDelay milissegundos
digitalWrite(yellowPin, HIGH); // acende a luz amarela
digitalWrite(greenPin, LOW); // apaga a luz verde
delay(2000); // espera 2 segundos
digitalWrite(yellowPin, LOW); // apaga a luz amarela
// agora nosso loop se repete
}
05 - SEMÁFORO INTERATIVO
43
quando o botão for pressionado, alterando o estado das luzes
para que os carros parem e os pedestres possam atravessar em
segurança.
Componentes necessários
● 4 resistores
● Botão
44
O botão é às vezes chamado pelos fornecedores de interruptor
tátil, e é perfeito para ser utilizado com a protoboard.
Conectando os componentes
Digite o código
45
Digite o código abaixo, verifique-o e faça seu upload. Quando
você executar o programa, ele iniciará com o semáforo no verde,
para permitir que os carros passem, e a luz para pedestres no
vermelho.
46
int carRed = 12; // estabelece o semáforo para carros
int carYellow = 11;
int carGreen = 10;
int pedRed = 9; // estabelece o semáforo para pedestres
int pedGreen = 8;
int button = 2; // pino do botão
int crossTime = 5000; // tempo para que os pedestres atravessem
unsigned long changeTime; // tempo desde que o botão foi pressionado
void setup() {
pinMode(carRed, OUTPUT);
pinMode(carYellow, OUTPUT);
pinMode(carGreen, OUTPUT);
pinMode(pedRed, OUTPUT);
pinMode(pedGreen, OUTPUT);
pinMode(button, INPUT); // botão no pino 2
// acende a luz verde
digitalWrite(carGreen, HIGH);
digitalWrite(pedRed, HIGH);
}
void loop() {
int state = digitalRead(button);
/* verifica se o botão foi pressionado e se transcorreram 5 segundos desde a última
vez que isso ocorreu */
if (state == HIGH && (millis() - changeTime) > 5000) {
47
digitalWrite(pedGreen, HIGH); // acende o verde dos pedestres
delay(crossTime); // espera por um intervalo de tempo predefinido
// pisca o verde dos pedestres
for (int x=0; x<10; x++) {
digitalWrite(pedGreen, HIGH);
delay(250);
digitalWrite(pedGreen, LOW);
delay(250);
}
// acende o vermelho dos pedestres
digitalWrite(pedRed, HIGH);
delay(500);
digitalWrite(carYellow, HIGH); // acende o amarelo
digitalWrite(carRed, LOW); // apaga o vermelho
delay(1000);
digitalWrite(carGreen, HIGH); // acende o verde
digitalWrite(carYellow, LOW); // apaga o amarelo
// registra o tempo desde a última alteração no semáforo
changeTime = millis();
// depois retorna para o loop principal do programa
}
Análise do código
48
criou um tipo de dado long, que pode armazenar um número
entre -2.137.483.648 e 2.147.483.647. Entretanto, você
especificou um unsigned long, o que significa que a variável não
pode armazenar números negativos, assim o intervalo vai de 0 a
4.294.967.295. Se você estivesse utilizando um inteiro para
armazenar o intervalo de tempo desde a última troca no
semáforo, teria um tempo máximo de apenas 32 segundos,
antes que a variável atingisse um número maior do que o valor
que ela pode armazenar.
49
• 1.193 horas = 49 dias
50
Cada tipo de dado utiliza determinada quantidade de memória:
algumas variáveis utilizam apenas 1 byte de memória, enquanto
outras, 4 bytes ou mais (não se preocupe em saber o que é um
byte por enquanto; discutiremos isso futuramente). Note que
você não pode copiar dados de um tipo de dados para outro. Em
outras palavras, se x for um int e y uma string, x = y não dará
certo, pois os tipos de dados são diferentes.
51
corretos. Como você utilizou int (que usa até 2 bytes, e pode
armazenar um número de até 32.767) para armazenar o número
de seu pino, que poderia ser no máximo 13 em seu Arduino (e 54
no Arduino Mega), acabou consumindo mais memória do que o
necessário. Poderíamos ter economizado memória utilizando o
tipo de dados byte, que pode armazenar um número entre 0 e
255 — intervalo mais do que suficiente para armazenar o
número de um pino de entrada/saída.
Em seguida, temos
pinMode(button, INPUT);
52
valor do pino digital 2. A instrução digitalRead lê o estado do
pino dentro dos parênteses, retornando esse estado para o valor
inteiro ao qual você o atribuiu. Depois, você pode verificar o
valor em state para ver se o botão foi ou não pressionado:
if (state == HIGH && (millis() - changeTime) > 5000) {
// Chama a função para alterar as luzes
changeLights();
}
A instrução if é um exemplo de uma estrutura de controle, cujo
propósito é verificar se determinada condição foi ou não
atingida. Caso a condição seja verdadeira, a instrução executa o
código dentro de seu bloco de código. Por exemplo, se você
quisesse acender um LED, caso uma variável x atingisse um valor
superior a 500, poderia escrever o seguinte:
if (x>500) {digitalWrite(ledPin, HIGH);
53
state será HIGH, pois você já definiu este como o valor a ser lido
do pino digital 2. Você também está conferindo se o valor de
millis() - changeTime é maior que 5000 (utilizando o comando
lógico E, &&). millis() é uma função integrada à linguagem do
Arduino, que retorna o número de milissegundos desde que o
Arduino iniciou a execução do programa atual. Sua variável
changeTime inicialmente não armazenará nenhum valor, mas
depois que a função changeLights() tiver sido executada,
changeTime será definida como o valor atual de millis().
54
e o cálculo é um exemplo de um operador booleano. Nesse caso,
ele significa E. Para entender o que isso quer dizer, vamos
analisar todos os operadores booleanos:
• && E lógico
• || OU lógico;
• ! NÃO
55
A instrução ! (NÃO) é verdadeira apenas se o operando for falso;
assim, a instrução if a seguir será executada se x for falso, ou
seja, igual a zero:
if (!x) {.......
56
Esse é um exemplo de uma chamada de função. Uma função é
simplesmente um bloco de código separado que recebeu um
nome. Entretanto, funções também podem receber parâmetros
e/ou retornar dados. Nesse caso, você não passou nenhum dado
à função, nem fez com que ela retornasse dados.
57
veículos muda de vermelho para verde, passando pelo amarelo e
retornando, dessa forma, ao seu estado normal.
Análise do hardware
58
pull-down, elemento essencial para garantir que botões
funcionem corretamente. Farei uma breve pausa para explicar
resistores pull-up e pull-down.
Estados lógicos
59
imaginado como 0 e o estado fechado como 1, em um circuito
lógico.
Resistores pull-down
60
A figura abaixo mostra um esquema em que um resistor pull-
down é utilizado.
61
volt, quando o botão não estiver pressionado, e para 5 V quanto
ele estiver pressionado. Em outras palavras, com isso você
impede que o pino flutue entre dois valores.
Resistores pull-up
62
fonte de alimentação. Graças ao resistor, não temos mais um
curto-circuito, pois o resistor limita a quantidade de corrente. O
resistor pull-up é mais comumente utilizado em circuitos digitais.
63
pressionado. Se o resistor não estivesse presente, o fio do pino
de entrada não estaria conectado a nada e estaria flutuando. O
Arduino poderia ler isso como um estado HIGH ou LOW, o que
poderia resultar em falsos registros de botões apertados.
64
Resistores pull-up internos do Arduino
Finalizando
65
Existem diversos projetos que você pode ver no material
complementar, são projetos práticos, divertidos, uteis ou
somente para estudos.
Vejam nas vídeo aulas estes projetos que estão aqui nesta última
semana.
66
REFERÊNCIAS
67
68