AULA 3 - Microcontroladores - Engenharia

De IFSC
Revisão de 15h37min de 27 de outubro de 2021 por imported>Fargoud (→‎Exercícios)
Ir para navegação Ir para pesquisar

<< Página do curso


PLANO DE AULA


CARGA HORÁRIA: 5 h
CARGA HORÁRIA TEÓRICA: 2 h CARGA HORÁRIA PRÁTICA: 3 h

MATERIAIS

Por aluno:

  • 1 placa Arduino Uno
  • cabo de comunicação/alimentação USB
  • 1 computador PC com software Arduino IDE instalado
  • 1 proto shield para montagens
  • 8 leds vermelhos;
  • 1 led azul, 1 led verde e 1 led branco;
  • 8 resistores de 150 ou 200 Ω
  • 4 chaves digitais tipo push-button;
  • 1 buzzer;
  • cabos fêmea-macho

METODOLOGIA

  • Exposição dialogada dos conteúdos disponíveis, em projetor multimídia.
  • Navegação assistida em outros sites e portais, de conteúdos relacionados.
  • Montagens práticas e desenvolvimento em computador de aplicativos.
  • Testes de verificação e validação.


Bibliotecas e shields

Assim como a IDE já vem com diversas funções pré-definidas, o Arduino possui outras bibliotecas para controle de servomotores, displays LCD, geração de áudio, recepção de sinais de sensores e outros dispositivos (como teclado PS/2), dentre muitas outras coisas!

E quem pensa que essa estensibilidade toda se restringe ao software está muito enganado: o Arduino possui o que chamamos de shields, que são placas que se acoplam à placa original, agregando funcionalidades à mesma.

Existem shields dos mais variados tipos, para as mais diversas funções: Lista oficial.

Alguns servem como entrada, outros como saída, e ainda outros como entrada e saída.

Com os shields conseguimos, por exemplo, fazer o Arduino se comunicar numa rede Ethernet, ou ainda transmitir dados para qualquer dispositivo via Bluetooth, Wi-Fi ou Zigbee.

Existem shields com circuitos integrados prontos para controlarmos motores, sem que precisemos nos preocupar com complicações eletrônicas envolvidas, outros possuem leitor de cartão SD, acelerômetro, GPS e diversos outros sensores que podem gerar dados importantes para o software que está rodando no microcontrolador.

Shield.jpg

Existem também outros shields mais elaborados, que são sistemas completos.

Shield2.jpg
Shield3.jpg
Shield4.jpg

Um deles, por exemplo, cria uma plataforma para desenvolvimento de jogos no Arduino: o Video Game Shield10, que possui uma saída RCA e duas entradas para controles Numchuck do Nintendo Wii.

Além do hardware, existe uma biblioteca para ser utilizada em conjunto, que já possui várias funções pré-programadas para fazermos desenhos na televisão e capturar os dados dos movimentos nos controles.


Site com preços de shields: [1]

Leitura de portas digitais

Utilizamos as portas digitais quando precisamos trabalhar com valores bem definidos de tensão. Apesar de nem sempre ser verdade, geralmente trabalhamos com valores digitais binários, ou seja, projetamos sistemas que utilizam apenas dois valores bem definidos de tensão.

Existem sistemas ternários, quaternários, mas focaremos no binário, já que é esse o utilizado pelo Arduino.

Como o sistema é binário, temos que ter apenas duas tensões. São elas:

  • 0V e
  • 5V

Dessa forma, as portas digitais do Arduino podem trabalhar apenas com essas duas tensões, e o software que desenvolveremos poderá requisitar ao microcontrolador do Arduino que leia o valor de uma determinada porta (e obterá 0V ou 5V, como resposta).

O Arduino Uno possui 14 portas digitais que estão destacadas na figura a seguir:

Portasdig.jpg

Apesar de ser possível, não é recomendável utilizar as portas 0 e 1 pois elas estão diretamente ligadas ao sistema de comunicação do Arduino (pinos RX e TX - recepção e transmissão, respectivamente) e, por isso, seu uso pode conflitar com o upload do software.

Caso queira utilizá-las, certifique-se de desconectar quaisquer circuitos conectados a ela no momento do upload.

Utilizaremos as funções digitalRead e digitalWrite para ler e escrever, respectivamente, nas portas digitais.


A função digitalWrite já foi exemplificada em nosso exemplo Blink.

Leitura de Estado de Chave digital

Para exemplificar a função digitalRead utilizaremos um botão, tipo push-button, como nos diagramas a seguir:

Leituradig2-2.jpg
Leituradig2.jpg

O botão push-button também é chamado micro switch e tem o seguinte funcionamento:

Push.jpg

Vídeo sobre o uso do botão push-button para acionar led: [2]


Montado o circuito acima, vamos programar o Arduino com o seguinte código:

#define BOTAO 6
#define LED 13
void setup() {
   pinMode(LED, OUTPUT);
   pinMode(BOTAO, INPUT);
 }
void loop() {
   if (digitalRead(BOTAO) == HIGH) 
      digitalWrite(LED, LOW);
   
   else 
      digitalWrite(LED, HIGH);
   
 }


A função digitalRead nos retorna o valor correspondente à tensão que está na porta que passamos entre parenteses.

Em nosso exemplo, utilizamos a porta BOTAO (que na verdade é uma constante, definida através da diretiva #define), cujo valor é 6.

O valor retornado é uma constante, mapeado da seguinte forma:

  • HIGH, caso a tensão na porta seja 5V
  • LOW, caso a tensão na porta seja 0V


O que o programa faz, então, é apagar o LED caso o botão esteja pressionado e acendê-lo, caso não esteja.

Um circuito alternativo, mais indicado, por não deixar a entrada digital "flutuando", quando a chave está aberta, é o abaixo:

Pushleitura.jpg

Neste caso, o pino 7 está ligado a um resistor de pull-up, se a chave estiver aberta (neste caso, fica com nível lógico alto), ou aterrado (nível lógico baixo), quando a chave fecha:

Esquemaleit2.jpg

O programa ficaria:

#define BOTAO 7
#define LED 13
void setup() {
   pinMode(LED, OUTPUT);
   pinMode(BOTAO, INPUT);
 }
void loop() {
   if (digitalRead(BOTAO) == HIGH) 
      digitalWrite(LED, LOW);
   
   else 
      digitalWrite(LED, HIGH);
   
 }


E, neste caso, o LED permanece apagado, se a chave estiver aberta;

Ardleitura02.png

e acende, quando o botão for pressionado.

Ardleitura03.png


Leitura Sensor de Distância Ultrassônico

Neste exemplo vamos utilizar um sensor ultrassônico chamado HC-SR04, para estimar distância no Arduino. Aqui você poderá acessar o Datasheet do sensor.

Especificações e características:

– Tensão de operação: 5VDC
– Corrente de operação: 15mA
– Faixa de detecção (ângulo): ±15º
– Alcance: 2cm a 4m
– Margem de erro: ±3mm

O primeiro passo é incluir a biblioteca do Sensor.

A maneira mais fácil de fazer a inclusão de uma biblioteca é, na própria IDE, clicar no menu Sketch>Incluir Biblioteca>Gerenciar Bibliotecas:

MIC2incluirBIB.png

A IDE abre uma janela de busca, aonde vc vai digitar o sensor em questão, no caso, HCSR04:

MIC2incluirBIB2.png

E pronto!!! Sua biblioteca foi buscada diretamente na web e já foi instalada!!!

Depois, monte o sensor da seguinte forma:

MIC2hcsr04.png

e compile e carregue o código abaixo:


#include <HCSR04.h>

// Inicializa o sensor usando pinos digitais 13 (trigger) e 12 (echo)
int triggerPin = 13;
int echoPin = 12;
UltraSonicDistanceSensor distanciaSensor(triggerPin, echoPin);

void setup () {
    Serial.begin(9600);  // We initialize serial connection so that we could print values from sensor.
}

void loop () {
    // A cada 100 ms, faz uma medida de distancia e imprime, em cm, no Monitor Serial
    double distancia = distanciaSensor.measureDistanceCm();
    Serial.print(distancia);
    Serial.println(" cm");
    delay(100);
}

A saída será do tipo:

MIC2saidahcsr04.png

Exercícios

1. Altere o programa Button para trocar o estado do LED quando o botão é pressionado.

Sugestão de Solução:

#define LED 13
#define BOTAO 6

void setup() {
pinMode(LED, OUTPUT);
pinMode(BOTAO, INPUT);
}

void loop() {
static int flag=0;
if(digitalRead(BOTAO)==HIGH)
{   if(!flag)
  {   digitalWrite(LED, HIGH);
      flag = 1;
      delay(2000); }
   else
   {   digitalWrite(LED, LOW);
      flag = 0;
      delay(2000); }
 }
}
2. Explique e implemente o código abaixo:
#define BOTAO 6
#define LED 13
void setup() {
  pinMode(LED, OUTPUT);
  pinMode(BOTAO, INPUT);
 }
void loop() {
   digitalWrite(LED, !digitalRead(BOTAO));
}

Dica: o operador !, em linguagem C, significa negação (not) e tem como finalidade complementar a expressão que segue à sua direita.

3. Faça algumas animações com 8 LEDs, acionadas por um botão* externo :

(* não aparece na montagem - pode ser o do protoshield)

Anim8leds.jpg
Resposta:  Código exemplo que implementa animação disparada por botão
4. Faça um contador binário crescente com 8 LEDs: toda vez que o botão da direita for pressionado (entrada digital 8), uma contagem é realizada nos leds acionados pelos pinos digitais 0 a 7.
Contad8e2chvsleds.jpg

Sugestão com 4 leds:

#define LED1 8
#define LED2 9
#define LED3 10
#define LED4 11
#define BOTAO 7

void contabincresc(void);
void apagaleds(void);

void setup() {
 pinMode(LED1, OUTPUT);
 pinMode(LED2, OUTPUT);
 pinMode(LED3, OUTPUT);
 pinMode(LED4, OUTPUT);
 pinMode(BOTAO, INPUT);
}

void loop() {
 if(digitalRead(BOTAO)==LOW)
    contabincresc();
 else
    apagaleds();
}

void contabincresc()
{  int i, j, k, l;

    apagaleds();
    for(i=0;i<2;i++)
    {  for(j=0;j<2;j++)
       {  for(k=0;k<2;k++)
          {
           for(l=0;l<2;l++)
           { 
             digitalWrite(LED4,l);
             digitalWrite(LED3,k);
             digitalWrite(LED2,j);
             digitalWrite(LED1,i);
             delay(1000);
           }
          }
       }
    }
}

void apagaleds()
{
    digitalWrite(LED1, LOW);
    digitalWrite(LED3, LOW);
    digitalWrite(LED2, LOW);
    digitalWrite(LED4, LOW);
}


5. Faça um contador binário crescente/decrescente com 8 LEDs: toda vez que o botão da direita for pressionado, uma contagem crescente binária é realizada. E toda vez que o botão da esquerda for pressionado, uma contagem binária decrescente é realizada.
6. Simule um sistema de controle de acesso com 4 chaves push-button (senha de 6 "dígitos" com 4 possíveis símbolos diferentes). Caso o usuário acerte a sua senha de entrada (cadastre no mínimo 10 senhas diferentes), um led é aceso, representando abertura da porta. Cadastre também uma senha especial, de Administrador, que acende outro led, indicando prioridade.
7. Simule o brinquedo GENIUS, que acende uma sequência aleatória de leds (cada um associado a uma chave, que o usuário pressiona no tempo certo), cada vez mais longa. O usuário passa para o próximo "nível" do jogo, quando acerta a sequência de leds que acenderam, ou perde, quando erra a sequência, ou demora demais para pressionar a chave correta.

Dica: utilize as funções C srand(), rand() e randomize(), de geração aleatória de números.


<< Página do curso

Arquitetura do Arduíno AULA 3 - Leitura das portas digitais Uso da comunicação serial>>