AULA 6 - Microcontroladores - Engenharia: mudanças entre as edições

De IFSC
Ir para navegação Ir para pesquisar
imported>Fargoud
imported>Fargoud
Linha 142: Linha 142:
  void coresPrimarias(int valorVerm, int valorVerde, int valorAzul)
  void coresPrimarias(int valorVerm, int valorVerde, int valorAzul)
  {
  {
   digitalWrite(pinoVerm, valorVerm);
   analogWrite(pinoVerm, valorVerm);
   digitalWrite(pinoVerde, valorVerde);
   analogWrite(pinoVerde, valorVerde);
   digitalWrite(pinoAzul, valorAzul);
   analogWrite(pinoAzul, valorAzul);
  }
  }
   
   

Edição das 14h50min de 4 de setembro de 2019

<< Página do curso

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
  • 1 potenciômetro de 10kΩ;
  • 1 led vermelho;
  • 1 resistor de 200 Ω
  • 3 resistores de 1kΩ
  • 1 led RGB anodo comum;
  • 1 diodo 1N4148
  • 1 diodo 1N4001
  • 1 motor CC de 5V;
  • 1 transistor TIP120 ou um transistor BC548 e um BD137;
  • 1 bateria de 9V para o motor;
  • 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.

Sinal PWM – Pulse Width Modulation

(Modulação por Largura de Pulso)

PWM (Pulse Width Modulation – Modulação por Largura de Pulso) é uma técnica para obter resultados analógicos por meios digitais.

Essa técnica consiste na geração de uma onda quadrada em uma frequência muito alta em que pode ser controlada a porcentagem do tempo em que a onda permanece em nível lógico alto.

Esse tempo é chamado de Duty Cycle (Ciclo de trabalho) e sua alteração provoca mudança no valor médio da onda, indo desde 0V (0% de Duty Cycle) a 5V (100% de Duty Cycle) no caso do Arduino.

O Arduino UNO possui 6 (seis) portas PWM, 3, 5, 6, 9, 10 e 11.

O sinal PWM pode variar de 0 a 255 e para ativá-lo basta usar a seguinte instrução em uma das portas PWM:

  analogWrite(pin, sinal_pwm);

Note que as portas PWM são todas digitais, porém o sinal é modulado “como se fosse” um sinal analógico.

Ciclo de Trabalho – Duty-Cicle

O sinal PWM possui um ciclo de trabalho que determina com que frequência o sinal muda do nível lógico HIGH para o nível lógico LOW e vice versa.

No Arduino a frequência do PWM pode ser definida entre 32Hz até 62kHz.

Duty cicle = (100% * largura do pulso) / período
Dutycicle.png
Dutycicle2.png
Dutycicle32.png

O valor do Duty Cycle usado pelo Arduino é um inteiro armazenado em 8 bits, de forma que seu valor vai de 0 (0%) a 255 (100%).

Usos do PWM

Geração de tensão analógica de 0 a 5V:

Para um sinal PWM de valor 200 temos:

Se 255 é 100%, 200 é aproximadamente 78,4%.
Como a tensão máx de saída do Arduino é 5V a tensão média do sinal PWM será:
Vmédio = Vmax*Duty Cycle(%)
Vmédio=5*78,4%
Vmédio=3,92V

Acionamento analógico de atuadores:

Controlando a intensidade de um led

Neste exemplo, a intensidade de um led de alto brilho, que depende da tensão sobre o LED, será alterada com sinal PWM

Dutycicle4.png

Controlando a cor de um led RGB

Fonte: Eletronics Hub - LED RGB com arduino

O led RGB, que na verdade são 3 leds (um vermelho, um verde e um azul) no mesmo encapsulamento, tem a seguinte pinagem:

MIC2ledRGB1.png

O led pode ser catodo comum, ou anodo comum.

MIC2ledRGB2-1.png
MIC2ledRGB2-2.png

O esquema de montagem é:

MIC2ledRGB3.png

Fotografia:

MIC2ledRGB4.png

E o código:

const int pinoVerm = 6;
const int pinoVerde = 5;
const int pinoAzul = 3;

void setup() 
{
  pinMode(pinoVerm,OUTPUT);
  pinMode(pinoVerde,OUTPUT);
  pinMode(pinoAzul,OUTPUT);
}

void loop()
{
  delay(1000);
  coresPrimarias(1,0,0); // Red
  delay(2000);
  coresPrimarias(0,1,0); // Green
  delay(2000);
  coresPrimarias(0,0,1); // Blue
  delay(2000);
  coresPrimarias(1,1,0); // Yellow
  delay(2000);
  coresPrimarias(1,0,1); // Magenta
  delay(2000);
  coresPrimarias(0,1,1); // Cyan
  delay(2000);
  coresPrimarias(1,1,1); // White
  delay(2000);
  
  DegradeRGB();
}

void coresPrimarias(int valorVerm, int valorVerde, int valorAzul)
{
  analogWrite(pinoVerm, valorVerm);
  analogWrite(pinoVerde, valorVerde);
  analogWrite(pinoAzul, valorAzul);
}

void DegradeRGB()
{
int x;  
int brilhoVerm;
int brilhoVerde;
int brilhoAzul;

for (x = 0; x < 768; x++)
{
  if (x <= 255)
  {
    brilhoVerm= 255 - x;
    brilhoVerde= x;
    brilhoAzul= 0;
  }
  else if (x <= 511)
  {
    brilhoVerm= 0;
    brilhoVerde= 255 - (x - 256);
    brilhoAzul= (x - 256);
  }
  else
  {
    brilhoVerm= (x - 512);
    brilhoVerde= 0;
    brilhoAzul= 255 - (x - 512);
  }
   
 analogWrite(pinoVerm, brilhoVerm);
 analogWrite(pinoAzul, brilhoAzul);
 analogWrite(pinoVerde, brilhoVerde);

 delay(10);
 }
}



Controle de velocidade de motor CC de 5V

Regulador de velocidade simples para motores CC de 5V:

Componentes:

  • Arduino
  • protoboard e fios
  • 1 resistência de 220Ω
  • 1 transistor TIP120 ou TIP122 Pintransistor.png !!!!!
  • 1 diodo 1N4148 Pindiodo.png
  • 1 potenciômetro de 10 KΩ
  • 1 micro motor de 5V

Um micromotor CC de 5V normalmente utiliza correntes da ordem de 70mA, a vazio e que podem chegar até 1,70A, com carga plena!!!

O arduino, porém, só consegue fornecer até 40mA por pino digital.

MIC2micromotor5V.png

Assim, é necessário uma configuração de transistores, montados como amplificador, para elevar a corrente de alimentação do motor.


Esqmontagemmotor1.png

O potênciometro envia a informação da velocidade para o pino analógico 0. Na indisponibilidade dos transistores Darlington da Texas, fizemos:

Esqmontagemmotor2.png

As pinagens destes transistores são:

Pinagemtransist.png
Montagemfinalpwm.png
* Na verdade, foram utilizados um BC548 e BD137, ligados pelo emissor do primeiro na base do segundo, e pelos coletores (Darlington).

link para o vídeo: Acionando motor 5V com Arduino

Código:

int potPin = 0;             // Pino analógico 0 conectado no potênciometro 
int transistorPin = 9;      // Base do transistor conectada ao arduino pelo pino digital 9 
int potValue = 0;           // Valor lido no potênciometro
/*** FUNÇÃO setup() ***/
void setup() {                   // Seta o transistor (pino 9) como saída
  pinMode(transistorPin, OUTPUT);
}
/*** FUNÇÃO loop() ***/
void loop() {                         
 potValue = analogRead(potPin) / 4;   // lê o potênciometro, converte a leitura para valor entre 0 e 255 
                                      //para usar na saída PWM
 analogWrite(transistorPin, potValue); //potValue altera a alimentação do motor através do transistor
}

Para indicar a faixa de velocidade do motor, com algumas modificações no circuito e no código, pode-se acionar também um bargraph:

Esqmontagemmotor3.png


Código 2:

int potPin = 0;           // Pino analógico 0 conectado no potênciometro 
int transistorPin = 11;   // Base do transistor conectada ao arduino pelo pino digital 11 
int potValue = 0;         // Valor lido no potênciometro
int potValuePWM = 0;
int LED1 = 3, LED2 = 5, LED3 = 6, LED4 = 9;
/*** FUNÇÃO setup() ***/
void setup() {                   // Seta o transistor (pino 9) como saída
  pinMode(transistorPin, OUTPUT);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
}
/*** FUNÇÃO loop() ***/
void loop() {                         
 potValue = analogRead(potPin);   // lê o potênciometro 
 potValuePWM = potValue/4;       //converte a leitura para valor entre 0 e 255 para usar na saída PWM

 analogWrite(transistorPin, potValuePWM); //potValue altera a alimentação do motor através do transistor

if(potValue<255){ //acende só o primeiro led do bargraph
   analogWrite(LED1,potvalue); 
   analogWrite(LED2,0); 
   analogWrite(LED3,0); 
   analogWrite(LED4,0); 
 } 
 if(potValue>255 and potValue<511){ //acende dois leds do bargraph
  analogWrite(LED1,255); 
  analogWrite(LED2,potvalue - 256); 
  analogWrite(LED3,0); 
  analogWrite(LED4,0); 
} 
if(potValue>511 and potValue<765){ //acende três leds do bargraph
  analogWrite(LED1,255); 
  analogWrite(LED2,255); 
  analogWrite(LED3,potvalue - 512); 
  analogWrite(LED4,0); 
} 
if(potValue>765){ //acende todos os leds do bargraph
  analogWrite(LED1,255); 
  analogWrite(LED2,255); 
  analogWrite(LED3,255); 
  analogWrite(LED4,potvalue - 766); 
} 
}

Controle de velocidade de motor CC de 12V, com bargraph:

Regulador de velocidade simples para motores CC de 12V:

Componentes:

  • Arduino
  • protoboard e fios
  • 4 leds
  • 4 resistências de 220ohm
  • 1 resistência de 1 K
  • 1 transistor TIP122
  • 1 diodo 1N4001
  • 1 capacitor de 1 microF
  • 1 potenciômetro de 10 K
  • 1 motor de 12v
  • 1 fonte de 12v
Montagemmotor4.png

link para o vídeo: Acionando motores de 12V com arduino

Código:

/*variáveis globais */
int led1=6; 
int led2=9; 
int led3=10; 
int led4=11; 
int trimpot=5; 
int motor=3; 
/* Função setup() de inicialização */
void setup(){ 
 pinMode(led1,OUTPUT); 
 pinMode(led2,OUTPUT); 
 pinMode(led3,OUTPUT); 
 pinMode(led4,OUTPUT); 
 pinMode(trimpot,INPUT); 
} 
/* Função loop() */
void loop(){ 
  int value = analogRead(trimpot); //lê valor de velocidade no potenciômetro
  analogWrite(motor,value/4); //envia sinal PWM para motor pelo pino 3
  if(value<254){ //acende só o primeiro led do bargraph
    analogWrite(led1,value); 
    analogWrite(led2,0); 
    analogWrite(led3,0); 
    analogWrite(led4,0); 
  } 
  if(value>254 and value<511){ //acende dois leds do bargraph
   analogWrite(led1,255); 
   analogWrite(led2,value - 254); 
   analogWrite(led3,0); 
   analogWrite(led4,0); 
 } 
 if(value>511 and value<765){ //acende três leds do bargraph
   analogWrite(led1,254); 
   analogWrite(led2,254); 
   analogWrite(led3,value - 512); 
   analogWrite(led4,0); 
 } 
 if(value>765){ //acende todos os leds do bargraph
   analogWrite(led1,254); 
   analogWrite(led2,254); 
   analogWrite(led3,254);
   analogWrite(led4,value - 765); 
 } 
}

Acionamento de motor de passo com drive ULN2003

MIC2stepuln2003.png
#include "Stepper.h"

const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution
// for your motor

// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

int stepCount = 0;         // number of steps the motor has taken

void setup() {
  // initialize the serial port:
  Serial.begin(9600);
}

void loop() {
  // step one step:
  myStepper.step(1);
  Serial.print("steps:");
  Serial.println(stepCount);
  stepCount++;
  delay(5);
}


Outro exemplo: Robocore


<< Página do curso

Leitura e escrita nas portas analógicas AULA 6 - PWM e acionamento motores Projeto 1 >>