Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
http://www.kemper.com.br Mini Curso de Arduino Helmut Kemper 1 http://www.kemper.com.br Agradecimentos •Prof. Anderson Luiz •Prof. Lelino Pontes •Ednarde Bezerra •Gabriel Liberal 2 http://www.kemper.com.br Agradecimentos •A todos os meus alunos •A todos os meus professores •Ao pessoal do IFPE 3 http://www.kemper.com.br Lei de Ohm 4 http://www.kemper.com.br Lei de Ohm + 5 http://www.kemper.com.br Lei de Ohm + Bateria Resistor Corrente 6 http://www.kemper.com.br Lei de Ohm + Volts ( V ) Ohm ( Ω ) Ampere ( A ) 7 http://www.kemper.com.br Lei de Ohm + U R I U = R x I 8 http://www.kemper.com.br Lei de Ohm U = R x I U R I 9 http://www.kemper.com.br Associação de Resistores 10 http://www.kemper.com.br Associação de Resistores Paralelo 11 http://www.kemper.com.br Associação de Resistores Paralelo 12 http://www.kemper.com.br Associação de Resistores Paralelo 1_Re= 1_R1 1_R2 1_R3 1_R4 1_Rn+ + + + 13 http://www.kemper.com.br Associação de Resistores Paralelo Se: R1=R2=R3=R4=Rn 14 http://www.kemper.com.br Associação de Resistores Paralelo Re = _Rn 15 http://www.kemper.com.br Associação de Resistores Paralelo R1 x R2 R1 + R2_______Re = 16 http://www.kemper.com.br Associação de Resistores Paralelo •A corrente varia para cada resistor •A tensão é a mesma em todos os resistores 17 http://www.kemper.com.br Associação de Resistores Série 18 http://www.kemper.com.br Associação de Resistores Série 19 http://www.kemper.com.br Associação de Resistores Série Re = R1 + R2 + R3 20 http://www.kemper.com.br Associação de Resistores Série •A corrente é a mesma para todos os resistores •A tensão varia para cada resistor 21 http://www.kemper.com.br Associação de Resistores Divisor de tensão 22 http://www.kemper.com.br Associação de Resistores Divisor de tensão + 23 http://www.kemper.com.br Associação de Resistores Divisor de tensão + U1 U2 24 http://www.kemper.com.br Associação de Resistores Divisor de tensão + R1 R2 25 http://www.kemper.com.br Associação de Resistores Divisor de tensão + R1 R2 U1 U2 = U1 x R2_______R1 + R2 26 http://www.kemper.com.br Lei de Potência 27 http://www.kemper.com.br Lei de Potência + U R I 28 http://www.kemper.com.br Lei de Potência + U R I P = U * I 29 http://www.kemper.com.br Lei de Potência + P = U * I P (( )) Potência em Watts Desperdício na forma de calor 30 http://www.kemper.com.br Lei de Potência •Calor é igual a desperdício; •Excesso de temperatura pode causar uma falha catastrófica no Arduino. 31 http://www.kemper.com.br Lei de Ohm e Potência 32 http://www.kemper.com.br Diodo 33 http://www.kemper.com.br Diodo •Semicondutor •É um componente ativo •Tem poder sobre a corrente 34 http://www.kemper.com.br Diodo + Corrente Polarização Direta 35 http://www.kemper.com.br Diodo + Corrente Polarização Reversa 36 http://www.kemper.com.br Diodo •Serve para controlar o sentido da corrente; •Tem tensão de manutenção; •Tem corrente de fuga. 37 http://www.kemper.com.br Diodo •A corrente só consegue passar se estiver no sentido ânodo cátodo. 38 http://www.kemper.com.br Diodo •Tensão de manutenção é uma característica de todo semicondutor e reduz a tensão entregue ao resto do circuito 39 http://www.kemper.com.br Diodo •A tensão de manutenção do diodo de silício gira em torno de 0,7V 40 http://www.kemper.com.br Diodo + U U U-0,7 41 http://www.kemper.com.br Diodo •Corrente de fuga existe quando o diodo é polarizado inversamente e é proporcional a temperatura. 42 http://www.kemper.com.br LED 43 http://www.kemper.com.br LED •Diodo Emissor de Luz •Só acende se for ligado no sentido correto •A tensão de manutenção varia de acordo com o modelo 44 http://www.kemper.com.br LED + U R LED 45 http://www.kemper.com.br LED + U R LED Lei de Ohm: U = R x I 46 http://www.kemper.com.br LED + U R LED Lei de Ohm: U - ULED = R x 0,020 47 http://www.kemper.com.br LED + U R LED U = 5V ULED = 1.8V ILED = 20mA 48 http://www.kemper.com.br LED U = 5V ULED = 1.8V ILED = 20mA U - ULED = R x 0.02 5 - 1.8 = R x 0.02 3.2 = R x 0.02 R = 3.2 / 0.02 R = 160Ω 49 http://www.kemper.com.br Arduino 50 http://www.kemper.com.br Arduino 51 http://www.kemper.com.br Arduino •Projeto Italiano de baixo custo •Arquitetura de 8-bits •Portas analógicas e digitais •Serial emulada por USB 52 http://www.kemper.com.br Arduino •Compilador gratuito •Framework Wiring •Programação C / C++ 53 http://www.kemper.com.br Arduino Digital 54 http://www.kemper.com.br Arduino Alimentação 55 http://www.kemper.com.br Arduino Analógico 56 http://www.kemper.com.br Arduino USB 57 http://www.kemper.com.br Arduino Alimentação 58 http://www.kemper.com.br Programação 59 http://www.kemper.com.br Programação •Estrutura básica baseada no framework Wiring •setup () • loop () 60 http://www.kemper.com.br setup () •É a primeira função a ser chamada •Recebe as configurações iniciais •Roda apenas uma única vez •Função obrigatória 61 http://www.kemper.com.br loop () •Recebe o código fonte •É um laço infinito •Função obrigatória 62 http://www.kemper.com.br Exemplo void setup () { //Recebe as configurações iniciais } void loop () { //Recebe o código fonte } 63 http://www.kemper.com.br Pinos Digitais •Podem ser configurados como entrada ou saída •Podem ler e escrever apenas valores digitais •Podem drenar mais corrente do que fornecer 64 http://www.kemper.com.br Pinos Digitais •Funções digitais: •pinMode ( n°, INPUT / OUTPUT); •digitalWrite ( n°, HIGH / LOW ); •digitalRead ( n° ); 65 http://www.kemper.com.br Exemplo void setup () { pinMode ( 3, INPUT ); } ( Continua ) 66 http://www.kemper.com.br Exemplo void loop () { digitalWrite ( 3, HIGH ); delay ( 300 ); digitalWrite ( 3, LOW); delay ( 300 ); } 67 http://www.kemper.com.br Dica para Iniciante 68 http://www.kemper.com.br Dica para Iniciante •Primeiro use a função pinMode() dentro da função setup() como no exemplo anterior; 69 http://www.kemper.com.br Dica para Iniciante •pinMode() recebe uma das duas constantes, INPUT ou OUTPUT, para entrada ou saída respectivamente. 70 http://www.kemper.com.br Dica para Iniciante •digitalWrite() aceita duas constantes, HIGH ou LOW, para ligar ou desligar um pino digital; 71 http://www.kemper.com.br Dica para Iniciante •digitalWrite ( 13, HIGH ) faz o pino 13 da placa Arduino apresentar 5V na saída e acender o LED da própria placa. 72 http://www.kemper.com.br Dica para Iniciante •digitalWrite ( 13, LOW ) faz o pino 13 da placa Arduino apresentar 0V na saída e apagar o LED da própria placa. 73 http://www.kemper.com.br Dica para Iniciante •variavel_qualquer = digitalRead ( 13 ) faz a variável conter a constate true se o pino 13 estiver alimentado com 5V, ou false se o pino 13 estiver alimentado com 0V. 74 http://www.kemper.com.br Resistor de pull-up 75 http://www.kemper.com.br Resistor de pull-up Chave simples Erro - O valor lido é indeterminado pino Arduino 76 http://www.kemper.com.br Resistor de pull-up Resistor de pull-up Chave simples pino Arduino Correto! 77 http://www.kemper.com.br Resistor de pull-up •Entradas digitais ligadas a chaves mecânicas requerem um resistor para garantir o valor lido; •Entradas ligadas a circuitos digitais não requerem resistor de pull-up. 78 http://www.kemper.com.br Resistor de pull-up •Use digitalWrite ( n°, HIGH ) em um pino configurado como entrada para habilitar o resistor de pull-up. 79 http://www.kemper.com.br Resistor de pull-up •Use digitalWrite ( n°, LOW ) em um pino configurado como entrada para desabilitar o resistor de pull-up. 80 http://www.kemper.com.br Resistor de pull-up •O valor do resistor de pull-up gira em torno de 20kΩ; •Resistor de pull-up só se aplica a entradas flutuantes ( sem ligação ). 81 http://www.kemper.com.br Resistor de pull-up void setup () { pinMode ( 3, INPUT ); //Ligar pull-up digitalWrite ( 3, HIGH ); } 82 http://www.kemper.com.br Resistor de pull-up void setup () { pinMode ( 3, INPUT ); //Desligar pull-up digitalWrite ( 3, LOW ); } 83 http://www.kemper.com.br Pisca LED forte const unsigned char pino_led = 13; void setup () { pinMode ( pino_led, OUTPUT ) } 84 http://www.kemper.com.br Pisca LED forte void loop () { digitalWrite ( pino_led, HIGH ); delay ( 300 ); digitalWrite ( pino_led, LOW); delay ( 300 ); } 85 http://www.kemper.com.br Pisca LED fraco const unsigned char pino_led = 13; void setup () { pinMode ( pino_led, INPUT ) } _____ 86 http://www.kemper.com.br Pisca LED fraco void loop () { digitalWrite ( pino_led, HIGH ); delay ( 300 ); digitalWrite ( pino_led, LOW); delay ( 300 ); } 87 http://www.kemper.com.br Memória 88 http://www.kemper.com.br Memória Código Dados _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 89 http://www.kemper.com.br Memória •Dividida em blocos de 8-bits chamados de bytes; •Arquiva apenas dados binários; •Números binários são apenas uma convenção para representar números ou letras. 90 http://www.kemper.com.br Memória •É dividida em dois blocos •Dados •Código 91 http://www.kemper.com.br Memória de Dados •Pouco espaço, 128 ou 256 bytes dependendo do modelo do Arduino; •Volátil - Perde os dados quando o circuito é desligado; •Serve para arquivar variáveis. 92 http://www.kemper.com.br Memória de Código •Arquiva o programa; •Grande quantidade de espaço quando comparada à memória de dados; •Não perde os dados quando o circuito é desligado. 93 http://www.kemper.com.br Memória de Código •Os dados não podem ser alterados pelo código fonte do usuário; •Serve para arquivar as constantes do programa. 94 http://www.kemper.com.br Tipos de Dados e Memória 95 http://www.kemper.com.br Tipos de Dados e Memória •A escolha correta do tipo de dado economiza memória e deixa o programa mais rápido; •Escolha sempre o tipo de dado que ocupe o mínimo de espaço possível. 96 http://www.kemper.com.br Tipos com sinal e sem sinal 97 http://www.kemper.com.br Tipos com sinal e sem sinal •Dados podem ter sinal ou não; •Quanto o tipo tiver sinal, o bit mais significativo será usado como sinal; 98 http://www.kemper.com.br Tipos com sinal e sem sinal •O tipo inteiro ocupa 16 bits; •Valores entre 0 e 65,535, ou 2¹⁶-1; 99 http://www.kemper.com.br Tipos com sinal e sem sinal •Porém, como o bit mais significativo é usado como sinal, o tipo inteiro passa a ter 15 bits, ou 2¹⁵-1; •Valores entre 0 e 32,768; 100 http://www.kemper.com.br Tipos com sinal e sem sinal Decimal S. Sinal C. Sinal -7 - 1001 -5 - 1011 -1 - 1111 0 0000 0000 1 0001 0001 5 0101 0101 7 0111 0111 101 http://www.kemper.com.br Tipo Inteiro com Sinal • int - Inteiro: •Ocupa dois bytes; •Pode arquivar números entre -32,768 e 32,767; 102 http://www.kemper.com.br Tipo Inteiro sem Sinal •unsigned int - Inteiro Sem Sinal •Ocupa dois bytes •Pode arquivar números entre 0 e 65,535 103 http://www.kemper.com.br Exemplo int pino_led = 13; void setup () { pinMode ( pino_led, OUTPUT ); } 104 http://www.kemper.com.br Exemplo •Qual o erro conceitual do exemplo anterior? 105 http://www.kemper.com.br Exemplo int pino_led = 13; void setup () { pinMode ( pino_led, OUTPUT ); } 106 http://www.kemper.com.br Exemplo int pino_led = 13; • O tipo inteiro ocupa dois bytes sem necessidade; 107 http://www.kemper.com.br Exemplo int pino_led = 13; • Está sendo reservado um espaço da memória de código para arquivar um dado que não vai mudar durante a execução do código. 108 http://www.kemper.com.br _____ • O correto seria: Exemplo const byte pino_led = 13; 109 http://www.kemper.com.br _____ • const - Permite arquivar um dado na memória de código. Exemplo const byte pino_led = 13; 110 http://www.kemper.com.br _____ • byte - Como o próprio nome diz, ocupa apenas 1 byte em vez de 2 bytes. Exemplo const byte pino_led = 13; 111 http://www.kemper.com.br Exemplo const byte pino_led = 13; void setup () { pinMode ( pino_led, OUTPUT ); } _____ 112 http://www.kemper.com.br Tipos de dados mais comuns Tipo S/ S. C/ S. Espaço byte byte - 1 byte bollean bollean - 1 byte char unsigned char char 1 byte int unsigned int int 2 bytes 113 http://www.kemper.com.br Tipos de dados mais comuns Tipo S/ S. C/ S. Espaço word word - 2 bytes long unsigned long long 4 bytes float - float 4 bytes double - double 4 bytes 114 http://www.kemper.com.br Tipos de dados mais comuns •void •void não é um tipo, porém, é usado para indicar que uma função não retornará nada. 115 http://www.kemper.com.br Tipos de dados mais comuns •Array •Array não é exatamente um tipo, é uma forma de se agrupar dados de um determinado tipo. 116 http://www.kemper.com.br Tipos de dados mais comuns Exemplo de array: int inteiros[6]; int pinos[] = {2, 4, 8, 3, 6}; int dados[6] = {2, 4, -8, 3, 2}; char mensagem[9] = "Olá mundo"; 117 http://www.kemper.com.br Exemplos •unsigned char letra = ‘a’; Reserva um espaço de 1 byte para arquivar uma variável tipo letra e atribui o valor equivalente a letra ‘a’. 118 http://www.kemper.com.br Exemplos •unsigned int contador = 0; Reserva 2 bytes na memória de dados para receber valores entre 0 e 65,535 e atribui o valor 0. 119 http://www.kemper.com.br Exemplos •const unsigned int = 0; •Reserva 2 bytes na memória de código e atribui o valor 0. 120 http://www.kemper.com.br Dica para Iniciante •O símbolo de igualdade ( = ) é usado para atribuição, onde o valor a direita da expressão é atribuído a esquerda da expressão; 121 http://www.kemper.com.br Dica para Iniciante •unsigned char letra = ‘a’; Cria uma variável de rótulo ‘letra’ e atribui o valor equivalente a letra ‘a’; 122 http://www.kemper.com.br Dica para Iniciante •Todas as variáveis devem ser criadas nas primeiras linhas do código, antes das funções setup() e loop(); 123 http://www.kemper.com.br Variáveis Locais e Globais 124 http://www.kemper.com.br Variáveis Locais e Globais •Todas as variáveis criadas antes de setup() e loop() são globais, ou seja, elas existem em todo o programa; 125 http://www.kemper.com.br Variáveis Locais e Globais •Variáveis criadas dentro de uma função só existe dentro da função e não podem ser vistas do lado de fora; •Elas são locais. 126 http://www.kemper.com.br Exemplos unsigned int contador; void setup () { //contador é uma variável //global e existe em todo o código contador = 0; } 127 http://www.kemper.com.br Exemplos void setup () { unsigned int contador; } void loop () { //contador só existe dentro de setup() contador = 0; } ( Erro! ) 128 http://www.kemper.com.br Exemplos void setup () { //contador é destruído quando setup() acabar unsigned int contador; } void loop () { //contador será destruído e criado a cada interação de loop() unsigned int contador; } ( Correto! ) 129 http://www.kemper.com.br Operações de Comparação 130 http://www.kemper.com.br Operações de Comparação •Compara dois valores e retorna as constantes true ou false, caso a comparação seja verdadeira ou falsa; 131 http://www.kemper.com.br Operações de Comparação •Os valores comparados não são alterados; •O lado esquerdo ( E ) é sempre comparado ao lado direito ( D ); 132 http://www.kemper.com.br Operações de Comparação Operação Símbolo Descrição Exemplo igualdade == compara se E é igual a D ( E == D ) maior que > compara se E é maior do que D ( E > D ) menor que < compara se E é menor que D ( E < D ) 133 http://www.kemper.com.br Operações de Comparação Operação Símbolo Descrição Exemplo maior igual que >= compara se E é maior igual a D ( E >= D ) menor igual que <= compara se E é menor igual a D ( E <= D ) diferença != compara se E é diferente de D ( E != D ) 134 http://www.kemper.com.br Operações Lógicas 135 http://www.kemper.com.br Operações Lógicas •É uma operação entre dois ou mais valores lógicos, true ou false, com resultado lógico predefinido. 136 http://www.kemper.com.br Operações Lógicas •Elas servem de complemento para as operações de comparação; •Os valores usados na operação não são alterados. 137 http://www.kemper.com.br Operações Lógicas Operação Símbolo Exemplo AND && ( A >= B ) && ( C == B ) OR || ( A >= B ) || ( C == B ) NOT ! ! (( A == B ) || ( C == D )) 138 http://www.kemper.com.br Lógica AND Direita Esquerda Saída false false false false true false true false false true true true 139 http://www.kemper.com.br Lógica OR Direita Esquerda Saída false false false false true true true false true true true true 140 http://www.kemper.com.br Lógica NOT Entrada Saída false true true true 141 http://www.kemper.com.br Operações Aritméticas Nome Símbolo Exemplo Atribuição = A = 9; Soma + A = A + 1; Subtração - B = A - 1; Multiplicação * A = 3 * 2; Divisão / A = A / 2; Módulo % A = 9 % 2; 142 http://www.kemper.com.br Operações Aritméticas Nome Símbolo Exemplo Soma += A += 1; Soma ++ A ++; Subtração -= B -= 5; Subtração -- B --; Multiplicação *= A *= 3; Divisão /= A /= 2; 143 http://www.kemper.com.br Controle de Fluxo 144 http://www.kemper.com.br Controle de Fluxo •Permite dividir o código em blocos de execução; •Os comandos dos blocos devem ficar contidos entre chaves ( ‘{’ e ‘}’ ); 145 http://www.kemper.com.br Controle de Fluxo •Os blocos podem ter sua execução controlada por operações lógicas ou de comparação; 146 http://www.kemper.com.br Controle de Fluxo Condicional Operação Símbolo Exemplo Se if if ( A >= B ) { ... } Se ... Então if ... else if ( A >= B ) { ... }else { ... } Caso ... então switch switch ( A ) { case 1: ... case 2: ... case 3: ... } 147 http://www.kemper.com.br Controle de Fluxo if ( condição ) if ( A == B ) { digitalWrite ( pino_led, HIGH ); } 148 http://www.kemper.com.br Controle de Fluxo if ( condição ) if ( A == B ) { digitalWrite ( pino_led, HIGH ); } else [ Opcional ] { digitalWrite ( pino_led, LOW ); } 149 http://www.kemper.com.br Controle de Fluxo if ( condição ) if ( A == B ) { digitalWrite ( pino_led, HIGH ); } else if ( A < B ) { digitalWrite ( pino_led, LOW ); } 150 http://www.kemper.com.br Controle de Fluxo if ( condição ) if ( A == B ) { digitalWrite ( pino_led, HIGH ); } else if ( A < B ) { digitalWrite ( pino_led, LOW ); } else { ... } 151 http://www.kemper.com.br Controle de Fluxo switch ( condição ) switch ( variavel_qualquer ) { case 0: ... break; case 1: ... break; case 100 ... break; } 152 http://www.kemper.com.br Controle de Fluxo switch ( condição ) •Todas as comparações são do tipo igualdade; •O código começa após ‘case’ e só para quando encontra ‘break’; • ‘break’ é opcional; 153 http://www.kemper.com.br Controle de Fluxo switch ( condição ) Veja a estrutura abaixo: switch ( A ) { case 1: case 2: case 33: ... break; } 154 http://www.kemper.com.br Controle de Fluxo switch ( condição ) Ela é equivalente a: if ( (A == 1) || (A == 2) || (A == 33) ) { ... } 155 http://www.kemper.com.br Controle de Fluxo switch ( condição ) Veja a estrutura abaixo: switch ( A ) { case 1: case 2: ... break; default: ... } 156 http://www.kemper.com.br Controle de Fluxo switch ( condição ) Ela é equivalente a: if ( (A == 1) || (A == 2) ) { ... } else { ... } 157 http://www.kemper.com.br • ‘default’ - É executado se o valor contido na variável não tiver correspondência dentro da estrutura ‘case’ Controle de Fluxo switch ( condição ) 158 http://www.kemper.com.br Controle de Fluxo Laço Operação Símbolo Exemplo contagem for () for (A = 0; A != 10; A ++) laço com teste prévio while () while ( A != 10 ) laço com teste posterior do { ... } while () do { ... } while ( A != 10 ) 159 http://www.kemper.com.br Laço - for () •Recebe três parâmetros separados por ponto e vírgula; •1° p. Valor inicial; •2° p. Condição ( enquanto ‘true’ ); •3° p. Valor por interação 160 http://www.kemper.com.br •Os parâmetros são opcionais e se não forem usados devem haver obrigatoriamente ponto e vírgula; •A condição deve ser verdadeira para a primeira interação; Laço - for () 161 http://www.kemper.com.br for ( a = 0; a != 10; a ++ ) { . . . } Exemplo 162 http://www.kemper.com.br Exemplo for ( a=1, b=2; a==10||b==5; ) { . . . } 163 http://www.kemper.com.br Exemplo for ( ; true ; ) { . . . } 164 http://www.kemper.com.br Laço - while () •Aceita apenas um parâmetro ou condição; •A condição tem que ser verdadeira para que a primeira interação possa ocorrer; 165 http://www.kemper.com.br Exemplo while ( a != 10 ) { . . . } 166 http://www.kemper.com.br Laço - do {}while() •Aceita apenas um parâmetro ou condição; •A condição é checada após a interação; •A condição deve ser verdadeira para que possam haver mais interações; 167 http://www.kemper.com.br Exemplo do { . . . } while ( a != 10 ); 168 http://www.kemper.com.br Sensores 169 http://www.kemper.com.br Sensores •Ultrasom 170 http://www.kemper.com.br Sensores • HC-SR04 - Sensor ultrasom de baixo custo - $9.90; http://iteadstudio.com/ 171 http://www.kemper.com.br Sensores •HC-SR04: Tem quatro pinos, Vcc, Trigger, Echo e Gnd; Alimentação de 5V; 172 http://www.kemper.com.br Sensores •HC-SR04: A documentação e bibliotecas podem ser encontradas no site da loja; 173 http://www.kemper.com.br Exemplo Ultrasonic nome_construtor ( n° pino ping, n° pino echo ); void setup () { pinMode ( n° pino ping, OUTPUT ); pinMode ( n° pino echo, OUTPUT ); } void loop () { distancia = nome_Construtor.Ranging ( CM ); } 174 http://www.kemper.com.br Sensores • SEN136B5B - Sensor ultrasom de baixo custo - $15.00; http://www.seeedstudio.com 175 http://www.kemper.com.br Sensores • SEN136B5B - Tem apenas três pinos, economizando espaço; • Alimentação de 5V; • Distância de 3cm a 4m. 176 http://www.kemper.com.br Sensores • SEN136B5B - O exemplo de uso pode ser encontrado no fórum da loja e não requer instalação de biblioteca. 177 http://www.kemper.com.br Motores & PWM 178 http://www.kemper.com.br Motores & PWM •Sempre use PWM para ligar motores comuns; 179 http://www.kemper.com.br Motores & PWM •PWM é uma técnica onde a potência total do circuito é entregue a carga, porém, o tempo ligado/desligado varia. 180 http://www.kemper.com.br Exemplo 181 http://www.kemper.com.br Exemplo •O gráfico representa um sinal digital, ligado / desligado, onde a relação entre os tempos é usada para controlar a potência final entregue ao motor. 182 http://www.kemper.com.br Exemplo 20% 80% •Como o tempo do circuito ligado representa apenas 20% do total, o motor tem menos velocidade. 183 http://www.kemper.com.br Motores & PWM 50% 50% • Quando a relação entre os tempos ligado e desligado varia, a velocidade do motor varia também; 184 http://www.kemper.com.br Motores & PWM 20% 80% 50% 50% 185 http://www.kemper.com.br Motores & PWM •PWM dissipa menos calor do que circuitos analógicos; 186 http://www.kemper.com.br Exemplo 187 http://www.kemper.com.br Exemplo •O próximo exemplo usa um motor comum e um resistor de 6Ω ligado em série para diminuir a potência do motor. 188 http://www.kemper.com.br Exemplo •Temos um motor imaginário de 24V consumindo 2A quando trabalha sem carga aplicada ao eixo. 189 http://www.kemper.com.br Exemplo •A lei de potência diz que: •P = U * I •P = 24V * 2A •P = 48W 190 http://www.kemper.com.br Exemplo •A lei de Ohm diz que: •U = R * I •24V = R * 2A •R = 12Ω 191 http://www.kemper.com.br Exemplo •A resistência interna do motor é de 12Ω e a potência nominal é de 48W; 192 http://www.kemper.com.br Exemplo •Agora imagine ligar um resistor de 6Ω em série com o nosso motor imaginário; 193 http://www.kemper.com.br Exemplo •A lei de Ohm diz que: •U = R * I •U = (Rmotor + Rsérie) * I •24V = ( 12Ω + 6Ω ) * I •I = 1,33A 194 http://www.kemper.com.br Exemplo •Aplicando-se a lei de Ohm para medir a tensão em cima do novo resistor temos: 195 http://www.kemper.com.br Exemplo •U = R * I •U = 6Ω * 1,33A •UResistor = 8V 196 http://www.kemper.com.br Exemplo •Aplicando-se a lei de potência em cima do resistor temos: 197 http://www.kemper.com.br Exemplo •P = U * I •P = 8V * 1,33 •P = 10,66W 198 http://www.kemper.com.br Exemplo •O circuito consome ~32W de potência total; •O resistor desperdiça 10,66W na forma de calor; •1/3 da energia aplicada ao circuito é jogada fora na forma de calor! 199 http://www.kemper.com.br Conclusão 200 http://www.kemper.com.br Conclusão •Controlar a potência entregue a uma carga qualquer de forma analógica desperdiça energia e gera muito calor. 201 http://www.kemper.com.br Motores & PWM •PWM, ou Modulação por Largura de Pulso, pode ser usado para diversas finalidades, como motores, LEDs, e circuitos de potência em geral; 202 http://www.kemper.com.br Motores & PWM •O Arduino não pode ligar motores diretamente; •Deve haver um driver de corrente específico para motores; 203 http://www.kemper.com.br Motores & PWM •O Arduino tem várias saídas PWM misturadas com os pinos digitais; •Os pinos D5 e D6 têm os timers usados para outras funções e o valor gerado contêm erro; 204 http://www.kemper.com.br Motores & PWM •Use o comando analogWrite ( n°, valor ) para gerar o PWM; •n° representa o pino digital específico do PWM; 205 http://www.kemper.com.br Motores & PWM •O valor deve ficar entre 0 e 255, onde 0 representa 0% e 255 representa 100%; 206 http://www.kemper.com.br L293D 207 http://www.kemper.com.br L293D •O L293D contêm 4 drivers na forma de meia ponte ‘H’; 208 http://www.kemper.com.br L293D •Ponte ‘H’ é uma forma de ligar motor, onde 4 transistores na forma de um ‘H’ com o motor no centro pode controlar o sentido do motor; 209 http://www.kemper.com.br L293D 210 http://www.kemper.com.br L293D Vcc1 - Alimentação do integrado 4,5V a 7V Vcc2 - Alimentação do motor Vcc1 a 36V VOH - Tensão de manutenção por driver do motor Vcc2 - 1,4V Dissipação de calor 2075mW - 71.4mW por °C acima de 25°C Temperatura máxima 150°C 211 http://www.kemper.com.br L293D 212 http://www.kemper.com.br L293D Pinos 1,2EN e 3,4EN - Habilita a saída do motor 0 - Desliga o motor 1 - permite ligar o motor Pinos 1A, 2A, 3A e 4A Entradas digitais para ligar/desligar o motor ( Vcc1 ) Pinos 1Y, 2Y, 3Y e 4Y Saídas para o motor ( Vcc2 ) 213 http://www.kemper.com.br L293D •Ligue o grupo 1Y, 2Y e o grupo 3Y, 4Y aos terminais dos motores A e B respectivamente; •Ligue 1,2EN e 3,4EN a Vcc1 ou a dois pinos digitais do Arduino; 214 http://www.kemper.com.br L293D •Veja na próxima tabela o funcionamento do motor: 215 http://www.kemper.com.br L293D 1A 2A 1,2EN Motor A 3A 4A 3,4EN Motor B 0 0 1 Parado 0 0 1 Parado 0 1 1 Frente 0 1 1 Frente 1 0 1 Ré 1 0 1 Ré 1 1 1 Parado 1 1 1 Parado 0 0 0 Parado 0 0 0 Parado 0 1 0 Parado 0 1 0 Parado 1 0 0 Parado 1 0 0 Parado 1 1 0 Parado 1 1 0 Parado 216 http://www.kemper.com.br L293D •Exemplo de cálculo para dissipação de calor no integrado com Vcc2 igual a 6V e dois motores consumindo 500mA cada um: 217 http://www.kemper.com.br •O fabricante afirma que VHO é igual a Vcc2 - 1,4V, ou seja, por driver usado no motor, será subtraído 1,4V de Vcc2, ou: 6V - ( 1,4 * 2 ) = 3,2V entregue ao motor. L293D 218 http://www.kemper.com.br L293D •VHO é uma queda de tensão característica das junções PN de todo semicondutor e não pode ser evitada; 219 http://www.kemper.com.br L293D •No nosso caro, isto quer dizer que para Vcc2 igual a 6V, o motor irá receber 3,2V, pois, são dois drivers por motor; 220 http://www.kemper.com.br L293D •Aplicando-se a lei de potência temos: •P = U * I •P = 2,8V * ( 500mA * 2 motores ) •P = 2,8W dissipados no circuito integrado. 221 http://www.kemper.com.br L293D •Perceba que 2,8W é a potência total para um sinal de 100% do tempo em estado alto, porém, se o duty cycle for de 50% a potência dissipada no circuito integrado cai para a metade. 222 http://www.kemper.com.br L293D • Sempre ligue um capacitor de 100nF entre os dois terminais do motor; •Motor induz corrente no sentido oposto da alimentação e isto pode queimar o circuito, por isto, coloque diodos de proteção; 223 http://www.kemper.com.br L293D •O integrado L293 tem duas versões, a sem ‘D’ não contêm os diodos de proteção, a versão com ‘D’ contêm os diodos. 224 http://www.kemper.com.br Sevo de Aeromodelo 225 http://www.kemper.com.br Sevo de Aeromodelo •Servo de aeromodelo é um pequeno motor comum controlado por um potenciômetro ligado a um circuito digital com redução de velocidade para dar força; 226 http://www.kemper.com.br Sevo de Aeromodelo 227 http://www.kemper.com.br •Eles geralmente não são feitos para girar 360°, sendo o ângulo máximo determinado pelo modelo; Sevo de Aeromodelo 228 http://www.kemper.com.br •As suas principais características são a força e a precisão no ângulo do eixo central, permanecendo no ângulo correto enquanto houver sinal de controle e alimentação; Sevo de Aeromodelo 229 http://www.kemper.com.br • Eles costumam ter três pinos, sendo dois de alimentação e um de controle; • A alimentação geralmente fica entre 5V e 6V; • O pulso de controle tem que ter 5V, mesmo se Vcc do motor for maior. Sevo de Aeromodelo 230 http://www.kemper.com.br •O controle do ângulo é feito pela duração do pulso de controle, onde um pulso de 1.5mS de duração faz o motor centralizar o eixo; Sevo de Aeromodelo 231 http://www.kemper.com.br Sevo de Aeromodelo 232 http://www.kemper.com.br •O servo não tem um circuito de controle inteligente, por isto, tome cuidado para que o conjunto mecânico possa atingir o ângulo determinado, ou, ele ficará forçando toda a mecânica até conseguir. Sevo de Aeromodelo 233 http://www.kemper.com.br • Quando um servo é impedido de atingir o ângulo determinado, ele pode quebrar o conjunto mecânico; • Ele pode se comportar como um curto-circuito e pode queimar a eletrônica interna do próprio servo. Sevo de Aeromodelo 234 http://www.kemper.com.br •O Arduino só consegue controlar servo pelos pinos digitais 9 e 10 da placa; Sevo de Aeromodelo 235 http://www.kemper.com.br Exemplo 236 http://www.kemper.com.br Exemplo • #include <Servo.h> • Servo nome_servo; • void setup () • { • // Liga o pulso de controle do servo • nome_servo.attach( 9 ); • } • ( continua ) 237 http://www.kemper.com.br Exemplo • ( continuação ) • void loop () • { • nome_servo.write( 90 ); • delay ( 2000 ); • nome_servo.write( 80 ); • delay ( 2000 ); • nome_servo.write( 70 ); • //Desliga o pulso de controle do servo • nome_servo.detach (); • } 238 http://www.kemper.com.br •#include <Servo.h> •Servo.h chama uma classe padrão do compilador e deve ficar nas primeiras linhas do código. Sevo de Aeromodelo 239 http://www.kemper.com.br •Servo nome_servo; •É a chamada do construtor da classe e deve ficar fora das funções setup () e loop (); •nome_servo é o rótulo pelo qual a classe será chamada. Sevo de Aeromodelo 240 http://www.kemper.com.br • nome_servo.attach( 9|10, min, max ); • Ativa o pulso de controle do servo; • Recebe os pinos 9 ou 10; •min - é o tempo em µS mínimo da parte alta pulso de controle; •max - é o tempo em µS máximo da parte alta do pulso de controle; Sevo de Aeromodelo 241 http://www.kemper.com.br •nome_servo.write( ângulo ); •Determina o ângulo para o qual o eixo do servo deve girar; Sevo de Aeromodelo 242 http://www.kemper.com.br •nome_servo.writeMicroseconds( µS ); •Passa o tempo da parte alta do pulso de controle, onde, 1.5mS representa o ângulo de 90°; Sevo de Aeromodelo 243 http://www.kemper.com.br •nome_servo.detach(); •Desliga o pulso de controle do servo; Sevo de Aeromodelo 244 http://www.kemper.com.br Obrigado! Caso você tenha alguma dúvida, não deixe de entrar em contato pelo site http://www.kemper.com.br ou pelo e-mail Helmut.kemper@gmail.com 245
Compartilhar