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

De IFSC
Ir para navegação Ir para pesquisar
imported>Fargoud
imported>Fargoud
 
(39 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 13: Linha 13:
* 1 resistor de 200 Ω
* 1 resistor de 200 Ω
* 3 resistores de 1kΩ
* 3 resistores de 1kΩ
* 1 led RGB;
* 1 led RGB anodo comum;
* 1 diodo 1N4148
* 1 diodo 1N4148
* 1 diodo 1N4001  
* 1 diodo 1N4001  
Linha 61: Linha 61:


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%).
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%).
[[imagem: dutycicleanim.gif|center]]
[[imagem: dutycicleanim2.gif|center]]


=Usos do PWM=
=Usos do PWM=
Linha 86: Linha 91:
===Controlando a cor de um led RGB===
===Controlando a cor de um led RGB===


Fonte: [https://www.electronicshub.org/rgb-led-with-arduino/ LED RGB com arduino]
Fonte: [https://www.electronicshub.org/rgb-led-with-arduino/ 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:
O led RGB, que na verdade são 3 leds (um vermelho, um verde e um azul) no mesmo encapsulamento, tem a seguinte pinagem:
Linha 106: Linha 111:
[[image: MIC2ledRGB4.png|center]]
[[image: MIC2ledRGB4.png|center]]


E o código:
O led RGB obedece à [https://celke.com.br/artigo/tabela-de-cores-html-nome-hexadecimal-rgb codificação RGB de cores], que permite usar 8 bits para a quantidade de vermelho, 8 bits para a quantidade de verde e 8 bits para a quantidade de azul.
 
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(255,0,0); // Red
  delay(2000);
  coresPrimarias(0,255,0); // Green
  delay(2000);
  coresPrimarias(0,0,255); // Blue
  delay(2000);
  coresPrimarias(255,255,0); // Yellow
  delay(2000);
  coresPrimarias(255,0,255); // Magenta
  delay(2000);
  coresPrimarias(0,255,255); // Cyan
  delay(2000);
  coresPrimarias(255,255,255); // 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(100);
  }
}
---------------
 
 
 
OBSERVAÇÃO: se o led for ANODO COMUM, o código terá que ser o abaixo:
 


  const int redPin = 6;
  const int pinoVerm = 6;
  const int greenPin = 5;
  const int pinoVerde = 5;
  const int bluePin = 3;
  const int pinoAzul = 3;
   
   
  void setup()  
  void setup()  
  {
  {
   pinMode(redPin,OUTPUT);
   pinMode(pinoVerm,OUTPUT);
   pinMode(greenPin,OUTPUT);
   pinMode(pinoVerde,OUTPUT);
   pinMode(bluePin,OUTPUT);
   pinMode(pinoAzul,OUTPUT);
  }
  }
   
   
Linha 122: Linha 210:
  {
  {
   delay(1000);
   delay(1000);
   primaryColors(1,0,0); // Red
   coresPrimarias(0,255,255); // Red
   delay(2000);
   delay(2000);
   primaryColors(0,1,0); // Green
   coresPrimarias(255,0,255); // Green
   delay(2000);
   delay(2000);
   primaryColors(0,0,1); // Blue
   coresPrimarias(255,255,0); // Blue
   delay(2000);
   delay(2000);
   primaryColors(1,1,0); // Yellow
   coresPrimarias(0,0,255); // Yellow
   delay(2000);
   delay(2000);
   primaryColors(1,0,1); // Magenta
   coresPrimarias(0,255,0); // Magenta
   delay(2000);
   delay(2000);
   primaryColors(0,1,1); // Cyan
   coresPrimarias(255,0,0); // Cyan
   delay(2000);
   delay(2000);
   primaryColors(1,1,1); // White
   coresPrimarias(0,0,0); // White
   delay(2000);
   delay(2000);
    
    
   RGBFading();
   DegradeRGB();
  }
  }
  void primaryColors(int redValue, int greenValue, int blueValue)
  void coresPrimarias(int valorVerm, int valorVerde, int valorAzul)
  {
  {
   digitalWrite(redPin, redValue);
   analogWrite(pinoVerm, valorVerm);
   digitalWrite(greenPin, greenValue);
   analogWrite(pinoVerde, valorVerde);
   digitalWrite(bluePin, blueValue);
   analogWrite(pinoAzul, valorAzul);
  }
  }
   
   
  void RGBFading()
  void DegradeRGB()
  {
  {
  int x;   
  int x;   
  int redBrightness;
  int brilhoVerm;
  int greenBrightness;
  int brilhoVerde;
  int blueBrightness;
  int brilhoAzul;
   
   
  for (x = 0; x < 768; x++)
  for (x = 0; x < 768; x++)
Linha 157: Linha 246:
   if (x <= 255)
   if (x <= 255)
   {
   {
     redBrightness = 255 - x;
     brilhoVerm= x;         //0 a 255
     greenBrightness = x;
     brilhoVerde= 255 - x;   //255 a 0
     blueBrightness = 0;
     brilhoAzul= 255;       //não varia
   }
   }
   else if (x <= 511)
   else if (x <= 511)
   {
   {
     redBrightness = 0;
     brilhoVerm= 255;       //não varia
     greenBrightness = 255 - (x - 256);
     brilhoVerde= x - 256;   //0 a 255
     blueBrightness = (x - 256);
     brilhoAzul= 511 - x ;   //255 a 0
   }
   }
   else
   else
   {
   {
     redBrightness = (x - 512);
     brilhoVerm= 767 - x;   //255 a 0
     greenBrightness = 0;
     brilhoVerde = 255;       //não varia
     blueBrightness = 255 - (x - 512);
     brilhoAzul= x - 512;     //0 a 255
   }
   }
      
      
   analogWrite(redPin, redBrightness);
   analogWrite(pinoVerm, brilhoVerm);
   analogWrite(bluePin, blueBrightness);
   analogWrite(pinoAzul, brilhoAzul);
   analogWrite(greenPin, greenBrightness);
   analogWrite(pinoVerde, brilhoVerde);
   
   
   delay(10);
   delay(100);
   }
   }
  }
  }
Linha 186: Linha 275:
---------------
---------------


==Controle de velocidade de motor CC de 5V, sem fonte externa:==
==Controle de velocidade de motor CC de 5V==
 
Na maioria das abordagens em robótica faz-se necessária a utilização de motores DC em diversos tipos de locomoção de robôs, movimentação de braços mecânicos, etc.
 
Os motores DC (''direct current'' ou '''corrente continua''') são cargas indutivas que, em geral, demandam uma quantidade de corrente superior à que as portas do Arduino conseguem fornecer.
 
[[image: MIC2minimotor.png]]
 
Sendo assim, não devemos ligar estes motores diretamente nas portas do Arduino, pois se o motor demandar uma corrente acima de 40 mA nas portas digitais (máxima fornecida pelo Arduino) '''pode queimar a porta e danificar a placa'''.
 
Um micromotor CC de 5V normalmente utiliza correntes da ordem de 70 mA, a vazio e que podem chegar até 1,70 A, com carga plena!!!
 
O arduino, porém, só consegue fornecer até 40 mA por pino digital.


Regulador de velocidade simples para motores CC de 5V:
[[imagem: MIC2micromotor5V.png|center]]
 
 
Nessa aula, para solucionar a questão da alta corrente vamos usar transistores especiais, chamados  [https://blogdaeletrica.com.br/2021/07/30/como-funciona-o-transistor-darlington/'''Darlingtons"], os quais, na verdade são dois transistores, um alimentando a base do outro, de forma a amplificar a corrente com alto ganho, e alimentar adequadamente o motor.
 
Porém, pode ser que seja necessário controlar o sentido de giro do motor, o que veremos na aula subsequente.
 
 
===Regulador de velocidade simples para motores CC de 5V:===


'''Componentes:'''
'''Componentes:'''
Linha 194: Linha 303:
* Arduino
* Arduino
* protoboard e fios
* protoboard e fios
* 1 resistência de 222&Omega;  
* 1 resistência de 220&Omega;  
* 1 transistor TIP120 [[imagem: pintransistor.png]] !!!!!
* 1 transistor TIP120 ou TIP122 ([[media: dsheetTIP120.pdf | Datasheet TIP120 ]] )[[imagem: pintransistor.png]] !!!!!
* 1 diodo 1N4148 [[imagem: pindiodo.png]]
* 1 diodo 1N4148 [[imagem: pindiodo.png]]
* 1 potenciômetro de 10 K&Omega;
* 1 potenciômetro de 10 K&Omega;
* 1 micro motor de 5V
* 1 micro motor de 5V


Um micromotor CC de 5V normalmente utiliza correntes da ordem de 70mA, a vazio e até 170mA, com carga plena.


O arduino, porém, só consegue fornecer até 40mA por pino digital.
[[imagem: esqmontagemmotor1tip.png|center]]


[[imagem: MIC2micromotor5V.png|center]]
O potênciometro envia a informação da velocidade para o pino analógico 0.


Assim, é necessário uma configuração de transistores, montados como amplificador, para elevar a corrente de alimentação do motor.
Na indisponibilidade dos transistores Darlington da Texas, pode-se fazer:
 
* Na verdade, foram utilizados um BC548 e BD137, ligados pelo emissor do primeiro na base do segundo, e pelos coletores (Darlington).
 
[[imagem: esqmontagemmotor1.png|center]]
 
O potênciometro envia a informação da velocidade para o pino analógico 0.
Na indisponibilidade dos transistores Darlington da Texas, fizemos:


[[imagem: esqmontagemmotor2.png|center]]
[[imagem: esqmontagemmotor2.png|center]]
Linha 221: Linha 322:


[[imagem: montagemfinalpwm.png|center]]
[[imagem: montagemfinalpwm.png|center]]
* 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: [https://www.youtube.com/watch?v=1iKTvWCd2dM Acionando motor 5V com Arduino]
link para o vídeo: [https://www.youtube.com/watch?v=1iKTvWCd2dM Acionando motor 5V com Arduino]
Linha 227: Linha 330:
   
   
  int potPin = 0;            // Pino analógico 0 conectado no potênciometro  
  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 transistorPin = 9;      // Base do transistor conectada pelo pino digital 9  
  int potValue = 0;          // Valor lido no potênciometro
  int potValue = 0;          // Valor lido no potênciometro
  /*** FUNÇÃO setup() ***/
  /*** FUNÇÃO setup() ***/
Linha 235: Linha 338:
  /*** FUNÇÃO loop() ***/
  /*** FUNÇÃO loop() ***/
  void loop() {                         
  void loop() {                         
   potValue = analogRead(potPin) / 4;  // lê o potênciometro, converte a leitura para valor entre 0 e 255  
   potValue = analogRead(potPin) / 4;  // lê o potênciometro, e converte para valor [0,255]
                                       //para usar na saída PWM
                                       //para usar na saída PWM
   analogWrite(transistorPin, potValue); //potValue altera a alimentação do motor através do transistor
   analogWrite(transistorPin, potValue); //potValue altera a alimentação do motor  
  }
  }


Linha 247: Linha 350:
'''Código 2:'''
'''Código 2:'''
   
   
  int potPin = 0;             // Pino analógico 0 conectado no potênciometro  
  int potPin = 0;           // Pino analógico 0 conectado no potênciometro  
  int transistorPin = 11;     // Base do transistor conectada ao arduino pelo pino digital 9
  int transistorPin = 11;   // Base do transistor conectada ao arduino pelo pino digital 11
  int potValue = 0;           // Valor lido no potênciometro
  int potValue = 0;         // Valor lido no potênciometro
int potValuePWM = 0;
  int LED1 = 3, LED2 = 5, LED3 = 6, LED4 = 9;
  int LED1 = 3, LED2 = 5, LED3 = 6, LED4 = 9;
  /*** FUNÇÃO setup() ***/
  /*** FUNÇÃO setup() ***/
Linha 261: Linha 365:
  /*** FUNÇÃO loop() ***/
  /*** FUNÇÃO loop() ***/
  void loop() {                         
  void loop() {                         
   potValue = analogRead(potPin) / 4;  // lê o potênciometro, converte a leitura para valor entre 0 e 255  
   potValue = analogRead(potPin);  // lê o potênciometro  
                                      //para usar na saída PWM
  potValuePWM = potValue/4;      //converte a leitura para valor [0,255] p/saída PWM
   analogWrite(transistorPin, potValue); //potValue altera a alimentação do motor através do transistor
  if(potValue<254){ //acende só o primeiro led do bargraph
   analogWrite(transistorPin, potValuePWM); //potValue altera a alimentação do motor  
     analogWrite(LED1,254);  
  if(potValue<255){ //acende só o primeiro led do bargraph
     analogWrite(LED1,potValue);  
     analogWrite(LED2,0);  
     analogWrite(LED2,0);  
     analogWrite(LED3,0);  
     analogWrite(LED3,0);  
     analogWrite(LED4,0);  
     analogWrite(LED4,0);  
   }  
   }  
   if(potValue>254 and potValue<511){ //acende dois leds do bargraph
   if(potValue>255 and potValue<511){ //acende dois leds do bargraph
   analogWrite(LED2,254);  
  analogWrite(LED1,255);
   analogWrite(LED2,potValue - 256);  
   analogWrite(LED3,0);  
   analogWrite(LED3,0);  
   analogWrite(LED4,0);  
   analogWrite(LED4,0);  
  }  
  }  
  if(potValue>511 and potValue<765){ //acende três leds do bargraph
  if(potValue>511 and potValue<765){ //acende três leds do bargraph
   analogWrite(LED3,254);  
  analogWrite(LED1,255);
  analogWrite(LED2,255);
   analogWrite(LED3,potValue - 512);  
   analogWrite(LED4,0);  
   analogWrite(LED4,0);  
  }  
  }  
  if(potValue>765){ //acende todos os leds do bargraph
  if(potValue>765){ //acende todos os leds do bargraph
   analogWrite(LED4,254);  
  analogWrite(LED1,255);
  analogWrite(LED2,255);
  analogWrite(LED3,255);
   analogWrite(LED4,potValue - 766);  
  }  
  }  
  }
  }
Linha 334: Linha 446:
   }  
   }  
   if(value>254 and value<511){ //acende dois leds do bargraph
   if(value>254 and value<511){ //acende dois leds do bargraph
     analogWrite(led2,254);  
    analogWrite(led1,255);
     analogWrite(led2,value - 254);  
     analogWrite(led3,0);  
     analogWrite(led3,0);  
     analogWrite(led4,0);  
     analogWrite(led4,0);  
   }  
   }  
   if(value>511 and value<765){ //acende três leds do bargraph
   if(value>511 and value<765){ //acende três leds do bargraph
     analogWrite(led3,254);  
    analogWrite(led1,254);
    analogWrite(led2,254);
     analogWrite(led3,value - 512);  
     analogWrite(led4,0);  
     analogWrite(led4,0);  
   }  
   }  
   if(value>765){ //acende todos os leds do bargraph
   if(value>765){ //acende todos os leds do bargraph
     analogWrite(led4,254);  
    analogWrite(led1,254);
    analogWrite(led2,254);
    analogWrite(led3,254);
     analogWrite(led4,value - 765);  
   }  
   }  
  }
  }


==Acionamento de motor de passo com drive ULN2003==
[[imagem: MIC2stepuln2003.png|center]]
#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: [https://www.robocore.net/tutorials/97.html Robocore]
----
----


Linha 354: Linha 504:
! style="background: #cdc5bf;" | [[AULA 5 - Microcontroladores - Engenharia| Leitura e escrita nas portas analógicas ]]  
! style="background: #cdc5bf;" | [[AULA 5 - Microcontroladores - Engenharia| Leitura e escrita nas portas analógicas ]]  
! style="background: #cdc5bf;" | AULA 6 -  PWM e acionamento motores
! style="background: #cdc5bf;" | AULA 6 -  PWM e acionamento motores
! style="background: #cdc5bf;" | [[AULA 7 - Microcontroladores - Engenharia| Programação C >> ]]
! style="background: #cdc5bf;" | [[AULA 7 - Microcontroladores - Eng| Ponte H >> ]]
|}
|}

Edição atual tal como às 14h33min de 14 de setembro de 2023

<< 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%).


Arquivo:Dutycicleanim.gif

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

O led RGB obedece à codificação RGB de cores, que permite usar 8 bits para a quantidade de vermelho, 8 bits para a quantidade de verde e 8 bits para a quantidade de azul.

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(255,0,0); // Red
  delay(2000);
  coresPrimarias(0,255,0); // Green
  delay(2000);
  coresPrimarias(0,0,255); // Blue
  delay(2000);
  coresPrimarias(255,255,0); // Yellow
  delay(2000);
  coresPrimarias(255,0,255); // Magenta
  delay(2000);
  coresPrimarias(0,255,255); // Cyan
  delay(2000);
  coresPrimarias(255,255,255); // 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(100);
 }
}


OBSERVAÇÃO: se o led for ANODO COMUM, o código terá que ser o abaixo:


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(0,255,255); // Red
  delay(2000);
  coresPrimarias(255,0,255); // Green
  delay(2000);
  coresPrimarias(255,255,0); // Blue
  delay(2000);
  coresPrimarias(0,0,255); // Yellow
  delay(2000);
  coresPrimarias(0,255,0); // Magenta
  delay(2000);
  coresPrimarias(255,0,0); // Cyan
  delay(2000);
  coresPrimarias(0,0,0); // 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= x;          //0 a 255
    brilhoVerde= 255 - x;   //255 a 0
    brilhoAzul= 255;        //não varia
  }
  else if (x <= 511)
  {
    brilhoVerm= 255;        //não varia
    brilhoVerde= x - 256;   //0 a 255
    brilhoAzul= 511 - x ;   //255 a 0
  }
  else
  {
    brilhoVerm=  767 - x;    //255 a 0
    brilhoVerde = 255;        //não varia
    brilhoAzul=  x - 512;     //0 a 255
  }
   
 analogWrite(pinoVerm, brilhoVerm);
 analogWrite(pinoAzul, brilhoAzul);
 analogWrite(pinoVerde, brilhoVerde);

 delay(100);
 }
}



Controle de velocidade de motor CC de 5V

Na maioria das abordagens em robótica faz-se necessária a utilização de motores DC em diversos tipos de locomoção de robôs, movimentação de braços mecânicos, etc.

Os motores DC (direct current ou corrente continua) são cargas indutivas que, em geral, demandam uma quantidade de corrente superior à que as portas do Arduino conseguem fornecer.

MIC2minimotor.png

Sendo assim, não devemos ligar estes motores diretamente nas portas do Arduino, pois se o motor demandar uma corrente acima de 40 mA nas portas digitais (máxima fornecida pelo Arduino) pode queimar a porta e danificar a placa.

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

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

MIC2micromotor5V.png


Nessa aula, para solucionar a questão da alta corrente vamos usar transistores especiais, chamados Darlingtons", os quais, na verdade são dois transistores, um alimentando a base do outro, de forma a amplificar a corrente com alto ganho, e alimentar adequadamente o motor.

Porém, pode ser que seja necessário controlar o sentido de giro do motor, o que veremos na aula subsequente.


Regulador de velocidade simples para motores CC de 5V:

Componentes:

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


Esqmontagemmotor1tip.png

O potênciometro envia a informação da velocidade para o pino analógico 0.

Na indisponibilidade dos transistores Darlington da Texas, pode-se fazer:

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 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, e converte para valor [0,255] 
                                      //para usar na saída PWM
 analogWrite(transistorPin, potValue); //potValue altera a alimentação do motor 
}

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 [0,255] p/saída PWM

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

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 Ponte H >>