Circuitos Microcontrolados (Arduino) - V2023
Circuitos Microcontrolados (Arduino) - V2023
Circuitos Microcontrolados (Arduino) - V2023
Microcontrolados
Os microcontroladores estão escondidos dentro de inúmeros produtos atualmente. Se um forno de microondas tem
um LED ou visor LCD e teclado, ele contém um microcontrolador. Todos os automóveis modernos contêm ao menos
um microcontrolador (e podem ter até 6 ou 7): o motor é controlado por um microcontrolador, bem como os freios
antitravamento o controle de velocidade de viagem e assim por diante. A maioria dos aparelhos com controle remoto
contém um microcontrolador: TVs, VCRs e sistemas de som de alta fidelidade entram nesta categoria.
Além disso, também têm microcontroladores: câmeras SLR e câmeras digitais, telefones celulares,
filmadoras, impressoras a laser, telefones (as que possuem identificador de chamadas, memória para 20 números,
etc.), pagers, além de refrigeradores, lava-louças, lavadoras de roupas e secadoras (os que possuem visores e
teclados). Basicamente, qualquer produto ou dispositivo que interaja com o usuário possui um microcontrolador
interno.
Conceitualmente, quando seu software é utilizado, ele monta todas as placas sobre uma programação de
conexão serial RS-232, mas a maneira que é implementado no hardware varia em cada versão. Suas placas
seriais contêm um simples circuito inversor para converter entre os sinais dos níveis RS-232 e TTL.
Atualmente, existem alguns métodos diferentes para realizar a transmissão dos dados, como por placas
programáveis via USB, adicionadas através de um chip adaptador USB-para-Serial como o FTDI FT232.
Algumas variantes, como o Arduino Mini e o não oficial Boarduino, usam um módulo, cabo adaptador
USB, bluetooth ou outros métodos. Nestes casos, são usados com ferramentas microcontroladoras ao invés
do Arduino IDE, utilizando assim a programação padrão AVR ISP.
A maioria dos pinos de E/S dos microcontroladores são para uso de outros circuitos. A versão Diecimila,
que substituiu a Duemilanove, por exemplo, disponibiliza 14 pinos digitais, 6 das quais podem produzir
sinais MLP, além de 6 entradas analógicas. Estes estão disponíveis em cima da placa, através de
conectores fêmeas de 0,1 polegadas (ou 0,25centímetros).
O modelo Nano, Boarduino e placas compatíveis com estas, fornecem conectores machos na parte de
baixo da placa, para serem plugados em protoboards.
O conceito de algoritmo é frequentemente ilustrado pelo exemplo de uma receita culinária, embora
muitos algoritmos sejam mais complexos. Eles podem repetir passos (fazer iterações) ou necessitar de
decisões (tais como comparações ou lógica) até que a tarefa seja completada. Um algoritmo corretamente
executado não irá resolver um problema se estiver implementado incorretamente ou se não for
apropriado ao problema.
O conceito de um algoritmo foi formalizado em 1936 pela Máquina de Turing de Alan Turing e pelo
cálculo lambda de Alonzo Church, que formaram as primeiras fundações da Ciência da computação.
C é uma das linguagens de programação mais populares e existem poucas arquiteturas para as quais
não existem compiladores para C. C tem influenciado muitas outras linguagens de programação, mais
notavelmente C++, que originalmente começou como uma extensão para C.
5. Linguagem C++
C++ (em português lê-se "cê mais mais", em inglês lê-se see plus plus) é uma linguagem de
programação multi-paradigma e de uso geral. A linguagem é considerada de médio nível, pois combina
características de linguagens de alto e baixo níveis. Desde os anos 1990 é uma das linguagens comerciais
mais populares, sendo bastante usada também na academia por seu grande desempenho e base de
utilizadores.
Bjarne Stroustrup desenvolveu o C++ (originalmente com o nome C with Classes, que significa C com
classes em português) em 1983 no Bell Labs como um adicional à linguagem C. Novas características foram
adicionadas com o tempo, como funções virtuais, sobrecarga de operadores, herança múltipla, gabaritos
e tratamento de exceções. Após a padronização ISO realizada em 1998 e a posterior revisão realizada em
2003, uma nova versão da especificação da linguagem foi lançada em setembro de 2011, conhecida
informalmente como C++11 ou C++0x.
Exemplo
#include <cstdlib> Adição de comandos que o
#include <iostream> computador conheça
using namespace std;
int main()
{ Inicio
printf("Programa teste");
cout<<"\n\n\n";
system("PAUSE"); Programa
return EXIT_SUCCESS;
} Fim
O comando #include é usado para adicionarmos as Bibliotecas, uma biblioteca no arduino seria fazer
o arduino entender algum tipo de comando, como ainda não temos nenhuma noção de arduino vou dar
um exemplo do que seria essas bibliotecas se fossem aplicadas em uma pessoa, nesse momento imagine
que a pessoa não tenha nenhum conhecimento, e vamos adicionar as bibliotecas:
#include <Direção> neste exemplo essa biblioteca faria com que a pessoa passasse a entender o que
é cima, baixo, direita, esquerda, sul, leste, etc.
#include <Português> neste exemplo essa biblioteca faria com que a pessoa passasse a entender o
idioma português.
#include <Matemática> neste exemplo essa biblioteca faria com que a pessoa passasse a entender a
matemática: soma, subtração, multiplicação, seno, tangente, etc.
No caso do arduino muitas bibliotecas já estão inclusas de fábrica, e você só irá precisar de adicionar
uma biblioteca caso coloque algum dispositivo especifico a ele como por exemplo um servo motor ou um
display de LCD.
O comando #define permite ao programador criar um nome para um número fixo. Exemplo:
Acima foi definido que welbert equivale a 200, sempre que digitarmos welbert nas linhas de
programação posterior a esse comendo, o Arduino entenderá 200.
Mas em que isso é vantajoso? Vamos supor que você precisa formar um quadrado com lado de
tamanho 200 então a programação seria algo assim:
Se precisarmos trocar o tamanho do quadrado acima para 350 teríamos que ir nas 4 linhas de
programação e substituir o 200 por 350.
Se precisarmos trocar o valor para 350, faríamos uma única alteração na linha do comando #define.
O comando int serve para criar uma variável numérica inteira (número sem parte decimal), essa
variável pode ou não receber um valor inicial, o valor salvo dentro da variável pode ser trocado a
qualquer momento, exemplo:
int welbert;
welbert = 200;
Linha para direita com tamanho welbert;
Linha para baixo com tamanho welbert;
welbert = 350;
Linha para esquerda com tamanho welbert;
Linha para cima com tamanho welbert;
Dessa vez ao fazer as linhas da direita e baixo elas vão possuir um tamanho de 200, já quando for
feitas as linhas da esquerda e cima elas terão um tamanho de 350. Podemos juntar as duas primeiras
linhas de programação colocando apenas: int welbert = 200;
O comando float tem a mesma funcionalidade do comando int porém o float permite que o número
seja com ou sem parte decimal, com ele podemos por exemplo criar uma variável com valor de 3,14
porem ao digitar usaremos o ponto ao invés de virgula (O programa tem base americana e eles usam
ponto ao invés de virgula).
Como o comando float aceita números inteiros e decimais poderíamos pensar em utiliza-lo sempre
no lugar do int, porem alguns comandos que iremos estudar posteriormente requer que o número seja
inteiro, então se usarmos o comando float no programa dará um erro de programação. Um exemplo
clássico disso seria se tivéssemos que saber se um número é par ou ímpar sabemos que o 2 é par, o 3 é
impar e o 2,5? Números decimais não existe par ou ímpar, logo se formos montar uma programação
onde verifica se o número é par não podemos utilizar a variável do tipo float.
O comando char é similar ao int e float porem nele é colocado um único caractere, esse caractere deve
ser colocado entre apostrofo. Um caractere pode ser um número (0, 1, 2, ..., 9), uma letra (A, a, B, b, ...,
Z, z) ou um símbolo (!, $, +, ., ...).
O comando const tem a mesma função do comando #define, ele vai definir um valor fixo a um nome
qualquer, ele trabalha junto com os comandos int, float e char, exemplo:
nesse exemplo acima o valor de welbert está definido para 200 e por causa do const no restante da
programação não conseguimos alterar esse valor.
Após colocarmos as bibliotecas, constantes e variáveis vamos configurar nosso hardware, ou seja,
configurar o que será usado ao arduino, exemplo de componentes que possa ser acoplado ao arduino:
botões, LEDs, reles, sensores, motores de baixa potência, LDRs, potenciômetros, displays, etc. Para isso
usamos uma tarefa de configuração definida como void setup ( ) esse comando é seguido por uma
abertura de chaves e logo depois configuramos cada componente que vamos utilizar em uma linha de
programação (cada tipo de componente tem um código especifico que iremos aprender em outro
momento), após adicionado todos os componentes finalizamos com o fechamento da chaves. Como por
exemplo para adicionarmos um display de lcd, um botão e um led nessa parte da programação, o código
gerado seria desse modo:
void setup( )
{
lcd.begin(16, 2);
pinMode(Bot, INPUT);
pinMode(led, OUTPUT);
}
Após configurarmos nosso hardware, vamos programar o que cada componente irá fazer e quando irá
fazer, no caso do arduino todos os comandos devem ser feitos entre as chaves do void loop ( ).
O void loop é uma tarefa cíclica, ou seja, assim que sua programação terminar, ele irá repeti-la novamente
em um ciclo infinito os comandos durante a programação também obedece a um código especifico.
Note que:
Algumas entradas possuem um til (3, 5, 6, 10, 11) essas
saídas podem ser utilizadas como PWM.
Os pinos 0 e 1 são utilizados para comunicação serial,
evite utilizar esses dois pinos nas montagens.
Próximo ao pino 13 existe um LED smd, sempre que o
pino 13 esta como saída e acionamos ele, esse Led acende.
A alimentação de entrada e saída deve ser aproximadamente +5v para nível logico 1 e 0v para nível
logico 0, sendo que o valor máximo de cada pino é de 40mA (para acionarmos cargas com corrente
elevada basta colocarmos um relé na saída desejada).
Comando de configuração:
Comando de função:
Faça a montagem e programação de um LED que deverá ficar piscando sendo o tempo ligado de 2
segundos e o tempo desligado de 1 segundo.
void setup ( )
{
pinMode (Pedro, OUTPUT);
}
void loop ( )
{
digitalWrite (Pedro, 1);
delay (2000);
digitalWrite (Pedro, 0); .
delay (1000);
}
• Const int Pedro = 3; esse comando define que Pedro vale 3 (este valor é 3 pois o Led foi colocado
no pino 3, o programador resolveu chamar o Led de Pedro).
• void setup ( ) note que após esse comando a uma chaves aberta e ela é fechada duas linhas
abaixo a sua abertura, todos os comandos entre essas chaves pertencem a instrução void setup.
Basicamente nessa parte da programação você deve configurar o que você vai utilizar, através de
outros comandos.
• pinMode (Pedro, OUTPUT); estamos configurando que Pedro vai ser uma saída (OUTPUT= saída
em inglês).
• Void loop ( ) também apresenta as chaves, tudo dentro dessas chaves pertence a esse comando.
É nessa parte que iremos construir como nossos componentes iram funcionar. void significa
função em inglês e Loop significa ciclo, ou seja, tudo que estiver dentro dessas chaves será
repetida em um ciclo infinito, sendo que o Arduino irá ler cada linha e executar sua função
sempre de cima para baixo.
• digitalWrite (Pedro, 1); esse comando faz o Led ligar, Write é escrever em inglês, logo você está
escrevendo 1 em Pedro, em binário 1 significa ligado.
• delay(2000); este comando faz o programa ficar parado nessa linha por 2000 mili segundos (2
segundos), delay significa demora.
• digitalWrite (Pedro, 0); esse comando faz o Led desligar, pois estamos escrevendo 0 em Pedro,
em binário 0 significa desligado.
• delay(1000); este comando faz o programa ficar parado nessa linha por 1 segundo.
Faça a montagem e programação de dois LEDs que deverá ficar piscando sendo o tempo do primeiro
LED ligado é de 2 segundos e o tempo dele desligado de 1 segundo, já o segundo LED deverá funcionar
de forma contrária, quando o primeiro LED está aceso o segundo LED deverá estar apagado e quando o
primeiro LED estiver apagado o segundo LED deverá estar aceso.
void setup ( )
{
pinMode (Pedro, OUTPUT);
pinMode (Maria, OUTPUT);
}
void loop ( )
{
digitalWrite (Pedro, 1);
digitalWrite (Maria, 0);
delay (2000);
Obs.: conforme dito anteriormente o programa é Case-sensitive, ou seja, diferencia maiúscula e minúscula
então bastante cuidado ao digitar os comando, como exemplo em digitalWrite note que o W deve ser
maiúsculo e o restante deve ser minúsculo, já o comando OUTPUT deve ser todo maiúsculo, e o comando
delay todo em minúsculo, cada comando tem um jeito único de ser escrito e caso não coloque exatamente
desse jeito o programa acusará que existe erros de programação e sua programação não poderá ser
transferida para o arduino.
Se o comentário for feito todo em uma única linha basta colocar duas barras antes do comentário
//comentário
Se o comentário for ocupar diversas linhas basta colocar /* para iniciar o comentário e */ para finalizar o
comentário
/* comentário
comentário
comentário
comentário */
Exemplo:
/*
Este programa abaixo é apenas um exemplo
de como aplicar os comentários, sua função
seria piscar um LED.
*/
//Configurando o Hardware
void setup ( )
{
pinMode (LED, OUTPUT); //define o LED como saída
}
//Código funcional
void loop ( )
{
digitalWrite (LED, 1); //Faz com que o LED ligue
delay (500); //esperar 0,5 segundos
digitalWrite (LED, 0); //Faz com que o LED desligue
delay (500); //esperar 0,5 segundos
}
2 – Faça um pisca-pisca com dois leds de forma que eles fiquem iguais, sempre que 1 dos leds estiver
aceso o outro também deverá ficar aceso, e sempre que um tiver apagado o outro também deverá estar
apagado, o valor dos tempos do pisca-pisca fica a seu critério.
3 – Faça um pisca-pisca com dois leds de forma que eles fiquem alternados, sempre que 1 dos leds estiver
aceso o outro deverá estar apagado, o valor dos tempos do pisca-pisca fica a seu critério.
4 – Faça um pisca-pisca com quatro leds de forma que leds 1 e 2 fique iguais, leds 3 e 4 fiquem iguais, e
leds 1 e 3 fiquem alternados, ou seja, leds 1 e 2 acendem depois troca para leds 3 e 4, depois volta para
leds 1 e 2 e assim por diante, o valor dos tempos do pisca-pisca fica a seu critério.
5 – Faça a montagem de um Arduino com 5 LEDs e programe-o para acionar em ciclo de acordo com a
tabela a seguir.
Pull-Up ou Direta:
Pull-Down:
Comandos de configuração:
utilizado nos sistemas Pull-Up e Pull-Down para definir o pino como uma entrada.
Comandos de função
* digitalRead (NumeroDoPino)
Exemplo: Faça a montagem de um led e um botão conectado a um arduino e na programação faça o led
ligar quando o botão estiver pressionado.
void setup ( )
{
pinMode (LED, OUTPUT);
pinMode (BOT, INPUT);
}
void loop ( )
{
digitalWrite (LED, digitalRead(BOT));
}
void setup()
{
pinMode(led_1, OUTPUT);
pinMode(led_2, OUTPUT);
pinMode(led_3, OUTPUT);
pinMode(bot_1,INPUT);
pinMode(bot_2,INPUT);
}
void loop()
{
if( digitalRead(bot_1)==0 &&
digitalRead(bot_2)==0 )
{
digitalWrite(led_1, 0);
digitalWrite(led_2, 0);
digitalWrite(led_3, 0);
}
if( digitalRead(bot_1)==1 && digitalRead(bot_2)==0 )
{
digitalWrite(led_1, 1);
digitalWrite(led_2, 0);
digitalWrite(led_3, 0);
}
if( digitalRead(bot_1)==0 && digitalRead(bot_2)==1 )
{
digitalWrite(led_1, 0);
digitalWrite(led_2, 1);
digitalWrite(led_3, 0);
}
if( digitalRead(bot_1)==1 && digitalRead(bot_2)==1 )
{
digitalWrite(led_1, 0);
digitalWrite(led_2, 0);
digitalWrite(led_3, 1);
}
}
Vamos analisar o primeiro if, após ele a um parêntese, dentro dele colocamos nossa condição, e
após ele colocamos chaves, todos os comandos que estão dentro dessas chaves só irão ser realizados se
a condição dentro do parêntese for verdadeira. Dentro desse parêntese tem mais dois outros separados
por &&, isso aconteceu porque temos duas condições, e queremos que as duas condições sejam
verdadeiras, nesse primeiro if queremos saber se os dois botões estão desapertados. Como vimos antes
botão desapertado vale zero, então foi perguntado se o botão em especifico vale zero, usando o
símbolo de dois sinais de igual.
• && = and = nesse caso as duas tem que ser verdadeiras para que o if seja verdadeiro
• || = or = nesse caso qualquer uma das condições verdadeiras já deixa o if verdadeiro
Através do comando #define visto anteriormente podemos diminuir os comandos da questão anterior
para ficarem mais fácil na hora de criar o código.
#define pm pinMode
#define dr digitalRead
#define dw digitalWrite
const int led_1=2, led_2=3, led_3=4, b1=7, b2=13;
void setup()
{
pm(led_1, OUTPUT);
pm(led_2, OUTPUT);
pm(led_3, OUTPUT);
pm(b1,INPUT);
pm(b2,INPUT);
}
void loop()
{
if( dr(b1)==0 && dr(b2)==0 )
{
dw(led_1, 0);
dw(led_2, 0); Observe que nos #define abreviamos 3 itens:
dw(led_3, 0);
}
• pinMode passou a ser apenas pm
• digitalRead passou a ser apenas dr
if( dr(b1)==1 && dr(b2)==0 ) • digitalWrite passou a ser apenas dw
{
dw(led_1, 1);
dw(led_2, 0);
dw(led_3, 0);
}
Obs: Na declaração de variáveis no software do
if( dr(b1)==0 && dr(b2)==1 )
{ TINKERCAD não se pode usar B1 (com o B
dw(led_1, 0); maiúsculo) este já é um comando interno, e se
dw(led_2, 1); declarado o programa apresentará erro ao tentar
dw(led_3, 0); compilar.
}
Como temos 2 botões havia 4 possibilidades: os dois despressionados, apenas o primeiro pressionado,
apenas o segundo pressionado e os dois pressionados, como trabalhamos com else if (senão for o
anterior e se for) podemos colocar na última condição apenas else, pois se nenhuma das condições
anteriores não são verdade, logo os dois botões estarão obrigatoriamente pressionados.
Nas condições digitais (0 ou 1) podemos também remover o ==1 quando for perguntar se está em nível
lógico alto, e remover o ==0 desde que adicione uma exclamação antes, conforme o exemplo:
Podemos substituir:
Por:
8 – Faça a montagem de um arduino com 5 leds, 2 botões pulsantes e 2 botões retentivos. E programe-o
para:
• Ao pulsar o botão pulsante 1 o led 1 deverá ligar, e o led 2 deverá desligar.
• Ao pulsar o botão pulsante 2 o led 2 deverá ligar, e o led 1 deverá desligar.
• Se os botões retentivos 1 e 2 estiverem desapertados então os leds 3, 4 e 5 devem desligar.
• Se o botão retentivo 1 estiver pressionado o led 3 deverá ligar.
• Se o botão retentivo 1 estiver desapertado e o botão retentivo 2 estiver pressionado então o led
4 e 5 devem ligar.
• Se os botões 1 e 2 retentivos estiverem pressionados então o led 4 deve desligar e o led 5 deve
ligar.
• Ao pressionar abrir se o motor estiver parado então ligará o motorcima, até desatuar o sensor
fim de curso SA.
• Ao pressionar fechar se o motor estiver parado então ligará o motorbaixo, até atuar o sensor fim
de curso SB.
• Ao pressionar o
botão parar o motor
deve desligar
Na figura acima o LED RGB acenderia na cor amarela se aplicarmos a mesma tensão elétrica nos
pinos vermelho (R) e verde (G), porém se trabalharmos com uma tensão ou corrente variável e aplicarmos
mais tensão no terminal vermelho e um pouco menos no terminal verde, teríamos uma luz terciária, no
caso um laranja, usando uma tensão variável podemos gerar qualquer tipo de cor no nosso LED, mas
nesse momento iremos trabalhar apenas com a parte digital, mas pra frente iremos estudar sobre o PWM
que fará esse controle para gerar as outras cores, conforme mencionado no exemplo da cor laranja.
O pino comum (C) pode ser o terminal anodo (+) ou o terminal catodo (-):
Obs.: No caso do LED RGB no software TINKERCAD só temos a opção de catodo comum.
Exemplo: Faça a montagem de um LED RGB e um botão pulsante conectado ao arduino, e programa-o
para quando o botão for pressionado o LED acenda na cor amarela, após 1 segundo mude para cor azul,
após 3 segundos mude para cor amarela, após 2 segundos mude para cor azul, após 1 segundo mude
para cor amarela e após 4 segundos apague.
const int botao=10, vm=5, az=3, vd=2; const int botao=10, vm=5, az=3, vd=2;
void setup() void setup()
{ {
pinMode(botao, INPUT); pinMode(botao, INPUT);
pinMode(vm, OUTPUT); pinMode(vm, OUTPUT);
pinMode(az, OUTPUT); pinMode(az, OUTPUT);
pinMode(vd, OUTPUT); pinMode(vd, OUTPUT);
} }
void loop() void amarelo()
{ {
if(digitalRead(botao)==1) digitalWrite(vm, 1);
{ digitalWrite(az, 0);
digitalWrite(vm, 1); digitalWrite(vd, 1);
digitalWrite(az, 0); }
digitalWrite(vd, 1); void azul()
delay(1000); {
digitalWrite(vm, 0);
digitalWrite(vm, 0); digitalWrite(az, 1);
digitalWrite(az, 1); digitalWrite(vd, 0);
digitalWrite(vd, 0); }
delay(3000); void desligar()
{
digitalWrite(vm, 1); digitalWrite(vm, 0);
digitalWrite(az, 0); digitalWrite(az, 0);
digitalWrite(vd, 1); digitalWrite(vd, 0);
delay(2000); }
void loop()
digitalWrite(vm, 0); {
digitalWrite(az, 1); if(digitalRead(botao)==1)
digitalWrite(vd, 0); {
delay(1000); amarelo();
delay(1000);
digitalWrite(vm, 1); azul();
digitalWrite(az, 0); delay(3000);
digitalWrite(vd, 1); amarelo();
delay(4000); delay(2000);
azul();
digitalWrite(vm, 0); delay(1000);
digitalWrite(az, 0); amarelo();
digitalWrite(vd, 0); delay(4000);
} desligar();
} }
}
17 – DESAFIO – Faça a montagem de um Arduino com 1 LED RGB e 7 botões retentivos, e programe-o:
Outro comando muito utilizado em programação C++ é o while esse comando permite o programa ficar
preso a um grupo de instruções se uma determinada condição for verdadeira, seu jeito de aplicação é
similar ao if, porém no if se a condição for verdadeira ele irá fazer os comandos após o parêntese uma
única vez, já no while enquanto a condição for verdadeira ele irá repetir os comandos.
Exemplo: Faça a montagem de um arduino com um botão retentivo e 2 LEDs, e programa-o para:
#define dr digitalRead
#define dw digitalWrite
const int led_1=3, led_2=4, b1=7;
void setup()
{
pinMode(led_1, OUTPUT);
pinMode(led_2, OUTPUT);
pinMode(b1,INPUT);
}
void loop()
{
if(dr(b1)==0)
{
dw(led_1, 0);
dw(led_2, 0);
}
if(dr(b1)==1)
{
dw(led_1, 1);
delay(2000);
while(dr(b1)==1)
{
dw(led_1, 0);
dw(led_2, 1);
}
}
}
O goto é um comando utilizado para mudar de uma linha de programação para outra linha qualquer,
para isso usamos:
No exemplo anterior vamos fazer a Obs: Quando temos apenas uma linha de
programação substituindo o while pelo goto: programação dentro de um if ou um while
podemos eliminar as chaves.
if(dr(b1)==0) if(dr(b1)==0)
{ {
dw(led_1, 0); dw(led_1, 0);
dw(led_2, 0); dw(led_2, 0);
} }
if(dr(b1)==1) if(dr(b1)==1)
{ {
dw(led_1, 1); dw(led_1, 1);
delay(2000); delay(2000);
while(dr(b1)==1) xis:
{ dw(led_1, 0);
dw(led_1, 0); dw(led_2, 1);
dw(led_2, 1); if(dr(b1)==1)
} goto xis;
} }
} }
Obs: Neste último if não foi necessário abrir e
fechar parênteses pois só temos uma linha de
código.
Exercício D
18 – Faça a montagem de um Arduino com 3 LEDs e 2 botões retentivos, e programe-o para:
• Enquanto os botões estiverem ambos desapertados ou ambos pressionados os LEDs devem estar
apagados.
• Se apenas o botão 1 estiver pressionado então o LED 1 deverá ligar e após 1s o LED 2 deverá ligar
e após mais um segundo o LED 3 deverá ligar.
• Se apenas o botão 2 estiver pressionado então o LED 2 deverá acender por 1s, após isso o LED 2
apaga e o LED 1 e 3 devem acender.
20 – Faça a montagem de um Arduino com 1 led, 2 botões retentivos e 1 botão pulsante, e programe-o para:
• Enquanto os botões retentivos estiverem ambos desapertados o LED deve estar apagado.
• Se o botão 1 retentivo estiver pressionado e o botão 2 retentivo estiver desapertado então o LED deverá
ficar piscando em intervalos de 1 segundo aceso e 1 segundo apagado, e enquanto segurar o botão
pulsante o LED para de piscar e deverá ficar apenas aceso.
• Se o botão 2 retentivo estiver pressionado e o botão 1 retentivo estiver desapertado então o LED deverá
ficar piscando em intervalos de 2 segundo aceso e 2 segundo apagado, e enquanto segurar o botão
pulsante o LED para de piscar e deverá ficar apenas apagado.
• Enquanto os botões retentivos estiverem ambos apertados o LED deve piscar 3 vezes em intervalos de 1,5
segundo ligado e 1,5 segundo desligado e logo depois ficar apenas aceso.
21 – DESAFIO – Faça a montagem de um arduino com 5 leds, 1 botão pulsante. E programe-o para:
• Ao pressionar o botão “D1”, significa que uma pessoa está dentro do elevador querendo descer, então a
lâmpada “LB2” deve acender, e depois de 2 segundos o elevador começa a descer, quando o elevador chegar
em “S1” ele deverá parar de descer, e desligar “LB1”.
• Ao pressionar o botão “D2”, significa que uma pessoa está dentro do elevador querendo subir, então a
lâmpada “LB1” deve acender, e depois de 2 segundos o elevador começa a subir, quando o elevador chegar
em “S2” ele deverá parar de subir, e desligar “LB2”.
• Ao pressionar o botão “F1”, significa que uma pessoa está
no 1º andar querendo subir, então a lâmpada “LB2” deve
acender, e depois de 2 segundos o elevador começa a
descer, quando o elevador chegar em “S1” ele deverá parar
de descer, e desligar “LB1”.
• Ao pressionar o botão “F2”, significa que uma pessoa está
no 2º andar querendo descer, então a lâmpada “LB1” deve
acender, e depois de 2 segundos o elevador começa a subir,
quando o elevador chegar em “S2” ele deverá parar de
subir, e desligar “LB2”.
Deverá haver um botão retentivo com a função automático/manual, estando em automático funcionará
conforme descrito acima, estando em manual dois botões pulsantes farão o controle de ligar a bomba
ignorando o nível do sensor, ou seja, enquanto o botão pulsante 1 estiver pressionado a bomba 1 deve
ficar ligada e enquanto o botão pulsante 2 estiver pressionado a bomba 2 deve estar acionada.
• Quando um carro atuar “S1” e houver vagas a cancela referente ao M1 deverá levantar (“S4” indica
cancela de “M1” totalmente levantada), após o carro passar pelo sensor “S2” a cancela deverá fechar
(“S3” indica cancela de “M1” totalmente abaixada).
• Quando um carro atuar “S6” a cancela referente ao M2 deverá levantar (“S8” indica cancela de “M2”
totalmente levantada), após o carro passar pelo sensor “S5” a cancela deverá fechar (“S7” indica cancela
de “M2” totalmente abaixada).
• Se houver 6 carros dentro do estacionamento então não poderá mais entrar (pois o estacionamento
estará lotado).
É um display composto de 7 leds colocados de forma estratégica para conseguir formar qualquer número
do sistema decimal, esse led também é capaz de exibir algumas letras.
Exemplo: Monte um circuito com arduino com um display de 7 segmentos anodo comum que faça a
contagem continua dos números de 0 a 3, alternando de 1 em 1 segundo.
#define dw digitalWrite
const int A=11, B=10, C=12, D=3, E=4, F=5, G=4;
void setup() void dois()
{ {
pinMode(A, OUTPUT); dw(A, LOW);
pinMode(B, OUTPUT); dw(B, LOW);
pinMode(C, OUTPUT); dw(C, HIGH);
pinMode(D, OUTPUT); dw(D, LOW);
pinMode(E, OUTPUT); dw(E, LOW);
pinMode(F, OUTPUT); dw(F, HIGH);
pinMode(G, OUTPUT); dw(G, LOW);
} }
void zero() void tres()
{ {
dw(A, LOW); dw(A, LOW);
dw(B, LOW); dw(B, LOW);
dw(C, LOW); dw(C, LOW);
dw(D, LOW); dw(D, LOW);
dw(E, LOW); dw(E, HIGH);
dw(F, LOW); dw(F, HIGH);
dw(G, HIGH); dw(G, LOW);
} }
void um() void loop()
{ {
dw(A, HIGH); zero();
dw(B, LOW); delay(1000);
dw(C, LOW); um();
dw(D, HIGH); delay(1000);
dw(E, HIGH); dois();
dw(F, HIGH); delay(1000);
dw(G, HIGH); tres();
} delay(1000);
}
• Quando o botão retentivo estiver desapertados e pulsar o botão pulsante 1 então o display deverá
mostrar “1”, após 2 segundos “2”, após mais 2 segundos “3”, após 2 segundos apagar.
• Quando o botão retentivo estiver desapertados e pulsar o botão pulsante 2 então o display deverá
mostrar “3”, após 2 segundos “2”, após mais 2 segundos “1”, após 2 segundos apagar.
• Quando o botão retentivo estiver pressionado e pulsar o botão pulsante 1 então o display deverá
mostrar “A”, após 2 segundos “B”, após mais 2 segundos “C”, após 2 segundos apagar.
• Quando o botão retentivo estiver pressionado e pulsar o botão pulsante 2 então o display deverá
mostrar “C”, após 2 segundos “B”, após mais 2 segundos “A”, após 2 segundos apagar.
Obs: se o display estiver no nove e der um pulso em botão 1 então ele deverá ir para o 0, e se tiver no zero e der
um pulso no botão 2 ele deve ir para o 9.
31 – SEPARADOR: Após pressionar B1 liga o processo, que só deligará ao pressionar B2, o botão B3 deverá zerar o
display de 7 segmentos. O Processo funcionará da seguinte forma:
Será colocado uma garrafa na posição I (inicial), se ela for metálica a esteira deve move-la para direita até cair na
caixa, se ela não for metálica a esteira deverá move-la para esquerda até cair na caixa. Só será colocada uma
garrafa por vez.
S1, S3 e S4 são sensores capacitivos (detectam qualquer garrafa), S2 é um sensor indutivo (detecta apenas
garrafas metálicas).
Caso o display chegue a 9, após a próxima garrafa cair na caixa ele deverá ir para zero, e começa o processo cíclico
A corrente máxima fornecida pelos pinos do arduino é de 40mA, como a corrente do motor costuma exceder este
valor o ideal é usar uma fonte externa para energizar o motor, outra vantagem da fonte externa é que poderemos
trabalhar com valor de tensão superior a 5v.
Relé
O relé consiste em uma bobina que quando energizada irá mudar um ou vários contatos, ao desligarmos sua bobina
os contatos voltam a sua posição de repouso. No caso ao colocarmos um relé no arduino devemos escolher um que
sua bobine ative com 5v.
L293D
void setup()
{
pinMode(md, OUTPUT);
pinMode(me, OUTPUT);
pinMode(b1, INPUT);
pinMode(b2, INPUT);
}
void loop()
{
if(digitalRead(b1)==0 &&
digitalRead(b2)==0)
{
digitalWrite(md, 0);
digitalWrite(me, 0);
}
if( digitalRead(b1)==1 &&
digitalRead(b2)==0 )
{
digitalWrite(md, 0);
digitalWrite(me, 1);
}
if( digitalRead(b1)==0 &&
digitalRead(b2)==1 )
{
digitalWrite(md, 1);
digitalWrite(me, 0);
}
}
• Ao pressionar bot2 o motor gira em sentido horário, e só parará quando pressionar bot1.
• Enquanto segurar bot3 o motor gira em sentido horário.
• Ao pressionar bot4 o motor gira em sentido anti-horário, e só parará quando pressionar bot1.
• Enquanto segurar bot5 o motor gira em sentido anti-horário.
35 – BRAÇO TEMPORIZADO – o braço robótico é composto por 3 motores, motor 1 faz o movimento direita,
esquerda, motor 2 faz o movimento subir e descer, motor 3 faz o movimento abrir e fechar garra, usar o motor CC
para eles. No projeto há o sensor S1 que indica se a mais garrafas dentro da caixa, e dois outros sensores
posicionados na esteira movimentada por um motor conforme a figura seguinte, ao pressionar o botão liga inicia
o processo cíclico até que as garrafas da caixa sejam colocadas todas na esteira, o processo consiste:
Serial.begin(9600);
Serial.read()
Exemplo: Faça um programa em arduino que peça ao usuário para digitar a letra A e informe quando ele
acertar.
char letra;
void setup()
{
Serial.begin(9600);
Serial.println("Digite a letra A");
}
void loop()
{
if (Serial.available())
{
letra=Serial.read();
if(letra=='a')
{
Serial.println("a minusculo nao e valido");
}
else if(letra=='A')
{
Serial.println("Obrigado");
}
else
{
Serial.print("voce digitou ");
Serial.print(letra);
Serial.println(" essa nao foi a letra solicitada");
}
}
}
37 – Faça a montagem de um arduino com um led. E programe-o para quando o usuário digitar no serial monitor:
• L = o led deverá ficar ligado
• D = o led deverá ficar apagado
• T se o led estiver apagado = o led acenderá por apenas um segundo depois desligará.
• T se o led estiver aceso = o led apagará por apenas um segundo depois acenderá.
• Qualquer outra coisa deverá ser exibido código invalido.
38 - Faça a montagem de um arduino com 1 led RGB e 3 botões pulsantes. E programe-o para quando o usuário
digitar no serial monitor:
39 - Faça a montagem de um arduino conectado à 2 botões retentivos (BR1, BR2), 2 botões pulsantes (BP1, BP2),
1 Display de 7 segmentos, 1 LED e programe para:
• Se BR1 e BR2 estiverem desapertados e pressionar BP1 então o LED deverá ligar e o display mostrará a
letra “U”
• Se BR1 e BR2 estiverem desapertados e pressionar BP2 então o LED deverá desligar e o display mostrará a
letra “P”
• Se BR1 estiver pressionado e BR2 estiver desapertado o display deverá aparecer a letra “H” e o LED
deverá ficar piscando (intervalo de 200ms ligado e 200ms desligado).
• Se BR1 estiver desapertado e BR2 estiver pressionado o display deverá aparecer a letra “L” e o LED deverá
ficar aceso.
• Se BR1 e BR2 estiverem pressionados e digitar no serial monitor:
• “A” então aparecerá a letra A no display de 7 segmentos
• “B” então aparecerá a letra B no display de 7 segmentos
• “L” então o led deverá ligar
• “D” então o led deverá apagar
LDR
O LDR (Light Dependent Resistor) consiste em uma resistência dependente da luz, ou
seja, quando a incidência de luz sobre ele o componente apresenta uma baixa resistência
(apenas algumas dezenas de ohms), quando ele está em um ambiente escuro sua
resistência aumenta (podendo chegar a alguns mega ohms).
Exemplo: Faça um circuito que ligue uma lâmpada quando o ambiente estiver escuro.
int lamp=12;
void setup()
{
pinMode(lamp, OUTPUT);
}
void loop()
{
if(analogRead(A0)<200)
digitalWrite(lamp, 1);
if(analogRead(A0)>=200)
digitalWrite(lamp, 0);
Exemplo:
o valor de y será um valor entre 100 e 200, pois ele recebe o valor de x que pode variar proporcionalmente entre
0 e 50, ou seja:
Exercício H
40 - Faça uma montagem de um arduino com um LDR, uma lâmpada, um botão retentivo e dois botões
pulsantes.
• Se o botão retentivo estiver desapertado significa modo manual então:
• Ao pressionar bot_pul_1 a lâmpada deve ligar
• Ao pressionar bot_pul_2 a lâmpada deve desligar
41 – Faça uma montagem de um arduino com um LDR e uma lâmpada. O arduino deve utilizar o serial
monitor para informar a luminosidade do ambiente de 0 a 100% e quando for menor que 40% acender
uma lâmpada, quando for maior que 40% apagar a lâmpada.
42 – CORTINA – Faça a montagem e programação de uma cortina automatizada controlada por arduino,
com as seguintes configurações:
• Haverá um botão retentivo que definirá o tipo de controle manual/automático.
• Ao colocar no modo automático:
• Se estiver escuro a cortina deverá fechar (haverá um sensor
que indicará quando a cortina fechar totalmente)
• Se estiver claro a cortina deverá abrir (haverá um sensor que
indicará quando a cortina abrir totalmente)
• Ao colocar no modo manual os 4 botões pulsantes passará a
funcionar:
• Botão 1 = ao ser pulsado a cortina fechará totalmente
• Botão 2 = enquanto for segurado a cortina fechará
• Botão 3 = ao ser pulsado a cortina abrirá totalmente
• Botão 4 = enquanto for segurado a cortina abrirá
Onde:
PWM pode ser usada para diversas aplicações, como por exemplo:
A placa Arduino Uno possui pinos específicos para saídas PWM e são indicados pelo carácter ‘~’ na frente de seu
número, conforme exibido a seguir:
Para utilizar a função analogWrite() , deve-se configurar o pino correspondente como saída digital. É interessante
notar que essas saídas não são conversores digital-analógico como o nome sugere, e estes pinos não estão
relacionados às entradas analógicas.
analogWrite(pino, valor);
Onde:
O valor deve ser de 0 a 255 onde com 0 a saída permanece sempre em nível baixo e 255 a saída permanece
sempre em nível alto.
void setup()
{
pinMode(led, OUTPUT);
}
void loop()
{
valor = map(analogRead(A5), 0, 1023, 0, 255);
analogWrite(led, valor);
}
• Ao pulsar bot1 o motor deverá girar com 25% de sua velocidade total
• Ao pulsar bot2 o motor deverá girar com 50% de sua velocidade total
• Ao pulsar bot3 o motor deverá girar com 75% de sua velocidade total
• Ao pulsar bot4 o motor deverá girar com 100% de sua velocidade
• Ao pulsar bot5 o motor deverá parar
• Ao pulsar bot1 o motor deverá girar com 30% de sua velocidade total para direita
• Ao pulsar bot2 o motor deverá girar com 65% de sua velocidade total para direita
• Ao pulsar bot3 o motor deverá girar com 100% de sua velocidade para direita
• Ao pulsar bot4 o motor deverá girar com 50% de sua velocidade total para esquerda
• Ao pulsar bot5 o motor deverá girar com 100% de sua velocidade para esquerda
• Ao pulsar bot6 o motor deverá parar
• Se o potenciômetro estiver todo para a esquerda o motor deverá estar na velocidade máxima para a
esquerda, à medida que for girando o potenciômetro para direita o motor vai diminuindo sua velocidade
proporcionalmente, quando o potenciômetro estiver no meio o motor deverá ficar parado, e se continuar
girando o potenciômetro para a direita o motor vai aumentando a velocidade proporcionalmente girando
para direita, quando o potenciômetro estiver no máximo para a direito o motor também deverá estar com
velocidade máxima para a direita.
Obs: Nesta void o tempo passa de forma diferente e um delay(1000) não corresponde a 1 segundo, então não é
comum usar o comando delay dentro de uma void de interrupção.
Nem todos os pinos digitais podem ser usados para interrupção, os pinos e quantidade variam de acordo com o
modelo usado, segue alguns modelos com os possíveis pinos:
Para criarmos a interrupção dentro da função void setup inserimos a linha de código:
modo: define quando a interrupção deve ser ativada. Quatro constantes estão predefinidos como valores válidos:
Obs: caso o programa possua duas interrupções ele executará uma de cada vez, por ordem de acionamento.
void setup() {
attachInterrupt(digitalPinToInterrupt(b2), welbert, HIGH);
pinMode(verm, OUTPUT);
pinMode(verd, OUTPUT);
pinMode(b1, INPUT);
pinMode(b2, INPUT);
}
void welbert() {
xis=1;
}
void loop() {
if (digitalRead(b1)==1)
{
xis=0;
digitalWrite(verm, 1);
delay(2000);
digitalWrite(verm, 0);
if (xis==1)
{
digitalWrite(verd, 1);
delay(2000);
digitalWrite(verd, 0);
}
}
}
Exercício J
Faça as questões deste exercício usando Interrupção, não é valido usar o comando millis();
49 - Faça um programa que contenha dois botões pulsantes e dois leds, e faça:
• delay (“tempo”); = Pausa o programa por um tempo, este tempo é colocado em milissegundos, ou seja, se
colocar tempo de 1000 equivalerá a 1 segundo.
• delayMicroseconds (“tempo”); = Pausa o programa por um tempo, este tempo é colocado em
microssegundos, ou seja, se colocar tempo de 1000 equivalerá a 0,001 segundo. O valor máximo é de
16383.
• millis(); = Retorna quanto tempo se passou em milissegundos desde que o arduino foi ligado, esse tempo
é reiniciado caso o arduino fique aproximadamente 50 dias ligado.
• micros(); = Retorna quanto tempo se passou em microssegundos desde que o arduino foi ligado, esse
tempo é reiniciado caso o arduino fique aproximadamente 70 minutos ligado. Observação o arduino não
contará de 1 em 1 microssegundos, o valor pode ser de 4 em 4 microssegundos, 8 em 8 microssegundos,
ou outro valor dependerá do modelo de seu arduino.
Obs: para variáveis inteiras normalmente usávamos o “int”, porem para o comando millis é aconselhável usar o
comando “unsigned long”, devido o número gerado poder exceder o comportado em um número do tipo “int”,
as variáveis funcionam com a seguinte capacidade:
Exemplo: Faça a montagem de um arduino com dois botões pulsantes e um led, e faça uma programação que
ligue o led por 8 segundos caso o botão 1 seja pressionado, porem se o botão 2 for pressionado durante os 8
segundos o led deverá apagar no mesmo instante.
void setup()
{
pinMode(b1, INPUT);
pinMode(b2, INPUT);
pinMode(led, OUTPUT);
}
void loop()
{
if (digitalRead(b1)==1)
{
tempo = millis();
while (digitalRead(b2)==0 && (millis()-tempo)<8000)
digitalWrite(led, 1);
digitalWrite(led, 0);
}
}
51 - Faça um programa que contenha dois botões pulsantes e dois leds, e faça:
52 – Faça um programa que contenha dois botões pulsantes, 1 botão retentivo e 2 Leds, e faça:
24. Sensores
Ultrassônico HC-SR04
O Sensor Ultrassônico é um sensor usado para medir distância entre ele e o objeto à frente dele, o modelo HC-
SR04 permite que você faça leituras de distâncias entre 2 cm e 4 metros, com precisão de 3 mm.
O funcionamento se baseia no envio (trigger) de sinais ultrassônicos pelo sensor, que aguarda o retorno (echo) do
sinal, e com base no tempo entre envio e retorno, calcula a distância entre o sensor e o objeto detectado.
void setup()
{
pinMode (trig, OUTPUT);
pinMode (echo,INPUT);
digitalWrite(trig, 0);
Serial.begin (9600);
}
void loop()
{
digitalWrite(trig, 1);
delay(10);
digitalWrite(trig, 0);
O comando conta o tempo em nível lógico alto (HIGH ou 1) ou o tempo em nível logico baixo (LOW ou 0), no
exemplo acima está contando o tempo de nível logico alto que o pino echo recebe, quando o pino recebe nível
lógico alto ele começa a contar o tempo em microssegundos, ao mudar o nível logico para baixo ele retorna o
valor do tempo em distância. Esse comando consegue contar tempos de 10 microssegundos a 3 minutos de
duração.
Ao invés de distancia/58 é comum encontramos um calculo como distancia*0.0170145 que é similar, pois dividir
por 58 é o mesmo que multiplicar por 0,017, mas de onde vem esse número? Basicamente o sensor envia um
sinal que trabalha com a velocidade do som que é 340,29 m/s, como estamos trabalhando com milissegundos ao
invés de segundos e centímetro ao invés de metro o valor a ser multiplicado devia ser 0,034 porem o sinal é
enviado bate no objeto para depois voltar, ou seja, o tempo está dobrado pois está contando ida e volta do sinal,
então dividido 0,034 por 2 temos 0,017.
void setup()
{
pinMode (sig, OUTPUT);
Serial.begin (9600);
digitalWrite(sig, 0);
}
void loop()
{
pinMode(sig, OUTPUT);
digitalWrite(sig, HIGH);
delay(10);
digitalWrite(sig, LOW);
pinMode(sig, INPUT);
distancia = pulseIn(sig, HIGH);
distancia = distancia/58;
Serial.print (distancia);
Serial.println ("cm");
}
Sensor de Umidade
O Sensor de umidade (1) é usado para medir a umidade presente no
solo, sua ligação é similar ao de leitura de um potenciômetro, ou seja,
possui 3 pinos +Vcc, GND e Sinal, o pino de sinal irá em um pino de
entrada analógica do arduino.
Sensor de Força
O Sensor de força (2) é usado para medir a força que está sendo
aplicada a ele, sua ligação é similar ao de LDR, ou seja, possui 2 pinos
então é necessário acrescentarmos um resistor para termos os 3
pontos +Vcc (pino isolado do sensor), GND (Pino isolado do resistor) e
Sinal (pino comum entre resistor e sensor), o pino de sinal irá em um
pino de entrada analógica do arduino.
Sensor Flexível
O Sensor Flexível (3) é usado para medir o ângulo da inclinação entre
sua ponta e sua base, sua ligação é similar ao de LDR, ou seja, possui 2
pinos então é necessário acrescentarmos um resistor para termos os 3
pontos +Vcc (pino isolado do sensor), GND (Pino isolado do resistor) e
Sinal (pino comum entre resistor e sensor), o pino de sinal irá em um
pino de entrada analógica do arduino.
• O arduino deve mostrar no serial monitor a distância em centímetros, que ele se encontra do objeto,
porem ele só deverá mostrar valores quando sofrer alteração, ou seja, se ele medir um objeto a 15cm e
este objeto não mover, ele não poderá ficar repetindo 15cm, ele só mostrará outro valor após esse objeto
afastar ou aproximar.
54 – Faça a montagem de um arduino com um sensor de umidade, um sensor de força e um sensor flexível, e
programe-o para aparecer no serial monitor:
55 – PORTÃO – Faça a lógica de um portão conforme descrito a seguir (SP será um sensor ultrassônico)
58 – ESTACIONAMENTO: Faça a lógica de um estacionamento conforme descrito a seguir (S1 será um sensor
ultrassônico de 4 pinos e S2 um sensor ultrassônico de 3 pinos)
• No inicio
#include <LiquidCrystal.h>
LiquidCrystal lcd(A, B, C, D, E, F);
• Na void setup() devemos informar o display para que o arduino o reconheça, com o comando:
lcd.begin(16, 2);
Exemplo: Monte um circuito com 1 arduino, 3 botões e um display de LCD 16x2, e faça:
A placa I2C converte os pinos usados no display para dois únicos pinos denominados SDA e SCL, assim
podemos usar essas respectivas portas do arduino para o display, e liberar os pinos digitais para as demais
ligações que o circuito poderá prover.
Por:
#include <Adafruit_LiquidCrystal.h>
Adafruit_LiquidCrystal lcd(0);
60 – Faça a montagem de um arduino com um display LCD de 16x2, 3 botões pulsantes e programe-o:
61 - Faça a montagem de um arduino conectado à 1 display de LCD, 2 botões pulsantes, 1 LED RGB e
programe para:
• No display aparecerá na 1ª linha (cor selecionada:) e na 2ª linha (“cor atual que o led está exibindo”)
• Os botões devem trocar as cores do LED, sendo:
• Botão 1 avança as cores
• Botão 2 retorna as cores
• A ordem das cores serão (Transparente, Vermelho, Azul Escuro, Azul Claro, Amarelo, Verde, Rosa, Branco)
• As cores devem rodar em ciclo, ou seja, se der mais um pulso após chegar na cor Branca, ele deve voltar
ao Transparente.
64 – DESAFIO – JOGO GENIUS 2: O jogo funcionará similar ao anterior porém a cada rodada ele não
deve repetir a sequência anterior e aumentar mais uma cor, nesta versão a cada rodada os leds devem ser
escolhidos aleatoriamente, mas sempre aumentando um a cada rodada.