MicroControladores II

Microcontroladores II 



Material para Práticas:

- Componentes Básicos da Eletrônica
- Arduino Uno ou Superior e ESP32
- Módulo BlueTooth
- Sensores Diversos

Aula 1 - Revisão

Atividade 1- Leitura de Sensores e acionamento PWM:

Execute o código abaixo em Hardware real, utilizando impressão simultânea na porta serial e LCD:

// Início do código

//Código em Boas Práticas par interpretação de sensores de saídas analógicas

/*  Parte 1 - Cabeçalho
  Título: Controle de Sensores
  Nome: Luis Antonio Aransegui
  Empresa: Escola Técnica Parobé
  Data: 12/03/2019
  Midificado em 20/08/2019
  Versão: 0.1.0

  Descrição:
  Entradas Analógicas, Saída Analógica, Saida serial
  Este circuito lê a entrada analógica, mapeia e joga o resultado para a saída analógica.
  Também imprime na saída serial.

  O circuito:

   Potenciômetro ligado ao pino analógico A0.
    O centro do potenciômetro vai ao pino..
    Os demais lados em +5V e GND
    Led conectado no pino 9 ao terra

  criado em 11/03/2019
  modificado em 12/03/2019  por Luis
  Referências em:
  http://www.arduino.cc/en/Tutorial/AnalogInOutSerial
  Fim do Cabeçalho

*/

// Parte 2 - Inclusão de bibliotecas

#include <Arduino.h> // Biblioteca padrão

// Parte 3 - Planejamento - Definição dos pinos

#define sensorPino A0 //  define rótulo ao pino
#define pinoSaida 13 //define ao rótulo ao pino 13

// Parte 4 Definição de variáveis

int valorSensor = 0;        // valor inicial do sensor
int valorSaida = 0;        // valor inicial da saída

// Parte 5  faz o setup do hardware
void setup() {

  Serial.begin(9600);// inicializa a porta serial- reservar pinos 0 e 1
}
// Parte 6 - função principal- corpo do programa

void loop() {

  leituraSensor();
  acionaMotor();
  // imprime no monitor serial
  imprimeSerial();
  imprimeLcd();
  delay(100);// aguarda 2 ms
}

void imprimeSerial() {

  Serial.print("sensor = "); // imprime a palavra sensor
  Serial.print(valorSensor);// imprime o valor da entrada
  Serial.print("\t saida = ");// tabula /t e imprime a palavra saida
  Serial.println(valorSaida);// imprime em nova linha o valor saida

}

void leituraSensor() {

  valorSensor = analogRead(sensorPino);// lê entrada A0) de 0 a 1023
  valorSaida = map(valorSensor, 0, 1023, 0, 255);// converte entrada para saída - resolução

}
// Rotina para Acionar motor
void acionaMotor() {
  analogWrite(pinoSaida, valorSaida); //escreve na saida
}
// Imprime na Serial
void imprimeLcd() {
  // aqui vai o codigo
}


Aula 2 - Interrupções

Usando Interrupções:

Interrupções são úteis para fazer coisas automaticamente em programas de microcontroladores, e podem ajudar a resolver problemas de temporização. Boas tarefas para se udar uma interrupção podem icnluir a leitura de um codificador rotativo, ou monitorar entradas de dados pelo usuário.

Supomos que você quisesse ter certeza que um programa sempre captura os pulsos de um codifcador rotativo, sem nunca perder um pulso, seria muito complicado criar um programa que pudesse fazer qualquer outra coisa além disso, porque o programa precisaria checar constantemente os pinos do codificador, para capturar os pulsos exatamente quando eles ocorreram. Outros sensores são similarmente dinâmicos também, como um sensor de som que pode ser usado para capturar um clique, ou um sensor infravermelho (foto-interruptor) para capturar a queda de uma moeda. Em todas essas situações, usar uma interrupção pode permitir o microcontrolador trabalhar em outras tarefas sem perder a interrupção.

Sintaxe:

attachInterrupt(digitalPinToInterrupt(pino), ISR, modo); (Recomendado)
attachInterrupt(interrupção, ISR, modo); (Não recomendado)
attachInterrupt(pino, ISR, modo); (Não recomendado. Além disso, essa sintaxe só funciona em placas Arduino SAMD, Uno WiFi Rev2, Due, e 101)

Parâmetros:

interrupção: o número da interrupção (int)
pino: o número do pino
ISR: a ISR a ser chamada quando a interrupção ocorre; essa função deve não tomar nenhum parâmetro nem retornar nada. Essa função é chamada de rotina de serviço da interrupção ou ISR (do Inglês, interrupt service routine).
modo: define quando a interrupção deve ser ativada. Quatro constantes estão predefinidas como valores válidos:

LOW acionar a interrupção quando o estado do pino for LOW,

CHANGE acionar a interrupção quando o sempre estado do pino mudar

RISING acionar a interrupção quando o estado do pino for de LOW para HIGH apenas,

FALLING acionar a interrupção quando o estado do pino for de HIGH para LOW apenas.

Placas Due, Zero e MKR1000 suportam também:

HIGH acionar a interrupção quando o estado do pino for HIGH.

Código de Exemplo:

O código abaixo usa uma interrupção para capturar a mudança no estado do pino 2 e acender o LED de acordo. Toda a documentação descrita está disponível em: https://www.arduino.cc/reference/pt/language/functions/external-interrupts/attachinterrupt/.

// Início do Código

const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;

void setup() {

  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}

void loop() {
  digitalWrite(ledPin, state);
}

void blink() {
while(true)
            {
  state = !state;
             }
}

// Fim do Código


Atividade - Descrição:


Utilize nossos exemplos anteriores e o conhecimento para interromper a leitura dos sensores da atividade anterior e acionar uma rotina de alarme.



Aula 3- Timers


Consulte a documentação em: https://www.arduino.cc/reference/pt/language/functions/time/millis/

Descrição:

Retorna o número de milissegundos passados desde que a placa Arduino começou a executar o programa atual. Esse número irá sofrer overflow (chegar ao maior número possível e então voltar pra zero), após aproximadamente 50 dias.

Sintaxe
time = millis()

Código de Exemplo:

O código imprime na porta serial o tempo em milissegundos passado desde que a placa Arduino começou a executar o código em si.

// Início do código
unsigned long time;

void setup() {
  Serial.begin(9600);
}
void loop() {
  Serial.print("Time: ");
  time = millis();

  Serial.println(time); // imprime o tempo desde que o programa iniciou
  delay(1000);          // espera um segundo, para não enviar quantidades massivas de dados
}

// Fim do código

Notas e Advertências:

Note que o valor retornado por millis() é unsigned long, erros podem ser gerados se o programador tentar fazer operações matemáticas com outros tipos de dados, como int.
Até mesmo o tipo long com sinal pode causar erros, já que seu valor máximo é metade de sua contraparte sem sinal.

Exercício: Execute o código acima e veja o seu efeito.


Atividades - Descrição:

1- Implemente a impressão do tempo de funcionamento em LCD e Serial em nosso projeto de leitura de sensores anterior, com parada de emergência.

2- Programe o funcionamento do circuito temporizado por apenas 30 segundos, com parada de emergência, mnão esquecendo que o processo continua monitorado pelo display e porta serial.


Avaliação - Sensores, PWM, Timers e Interrupção:


Protótipo - Controle de Nível para Fluídos:

Considerando que você avançou com sucesso até agora, chegou o momento de desenvolver uma atividade funcional, para isto siga as premissas:

- Reservatório com medida de 100 litros;
- Enchimento automático ao atingir 10 litros e parada automática ao completar o reservatório;
- Monitoramento do tempo de funcionamento do motor, volume (0 a 100 litros), potencia do motor (0 a 100%) em LCD e serial;
- A bomba se água deverá iniciar em rotação total e desacelerar conforme o nível for chegando ao limite, até a parada total  potência o motor deverá ser monitorada em LCD e Serial..
- Parada de emergência por interrupção com alarme sonoro;
- Sinalização Luminosa vermelho para nível baixo(<10%); amarelo(entre 10% e 75%  e Verde para nível acima de 75%);

Observações:

- Desenvolvimento e layout livres;
- Programa em boas práticas com comentários e controle de versão;
- Montagem em Hardware real;
- Timer, interrupção, monitoramento serial e LCD obrigatórios;
- Duplas que clonarem códigos de outras, terão suas avaliações desconsideradas;
- Melhorias no projeto receberão pontuação extra.

Critérios de Avaliação:

- Execução em duplas;
- Apresentar o protótipo em Hardware Real;
- Gerar um pdf contendo título, foto,diagrama elétrico e código fonte;
- Compartihar na nuvem com aransegui@gmail.com.



-


Comentários

Mais acessadas