quinta-feira, 23 de maio de 2013

Driver de Motor: L298 + Arduino (Parte 3 - Final)

Não adianta em nada fazer um hardware, passar horas a fio roteando cada trilha do circuito para não ter com que usar. Os microcontroladores trouxeram para o mundo uma flexibilidade enorme para o projeto de hardware... então mãos na massa

Especificações

O firmware deverá ser capaz de fazer o controle total do hardware:
- acionar as respectivas saídas: direção, acionamento e velocidade
- ler as entradas de controle (Rsensing)

Não colocarei portabilidade no rol de requisitos. É para Arduino, pronto e acabou. Se quiser portar para PIC, 8051 ou outra plataforma... é um outro projeto.

Para facilitar o instanciamento, já que o compilador core do Arduino suporta suporta, é uma classe (isso mesmo C++!!!) chamado L298Driver. Junto dele vai um exemplo do sketch para ser feito no Arduino.

Implementação

Para reduzir a complexidade desse post, o código fonte está disponível no site do Google Code, sob o projeto l298-arduino-driver: https://code.google.com/p/l298-arduino-driver

Instalação e Teste

É necessário que se tenha o Arduino. Procure identificar onde o Arduino está instalado. Vamos chamar esse diretório de ; dentro dele existem diversos diretórios. O importante é o libraries.

Baixe o projeto do GoogleCode, https://code.google.com/p/l298-arduino-driver/source/browse/ o arquivo L298Driver.zip

""Unzipe"" o arquivo para dentro da pasta libraries dentro do diretório de instalação do Arduino IDE , como na figura abaixo: 


Uma vez feito. Abra o Arduino IDE (ele irá reconfigurar os diretórios para reconhecer a nova biblioteca).

Antes de codificar, indique para utilizar a biblioteca: Menu>Sketch>Import Library>L298Driver, a IDE irá adicionar o cabeçalho #include .. veja abaixo

E por fim um programa funcional!


É compilar, gravar no Arduino, empilhar o Shield e se divertir!

Até breve!

quarta-feira, 22 de maio de 2013

Driver de Motor: L298 + Arduino (Parte 2)


Continuação do artigo anterior (parte 1)
Esta é a parte do artigo que explicará as funcionalidades e modo de operação do nosso driver. O artigo anterior, lidados com as bases do hardware. Na 3a e última parte, descreveremos a biblioteca para Arduino.

Funcionamento

O funcionamento é extremamente simples. Aplicando as tensões nas entradas de controle conforme o diagrama abaixo, temos a ativação, ou não, da saída.

Entrada
Saída
A(C)
EN1(2)
B(D)
OUT
X
0
X
0
0
1
0
0
0
1
1
RUN +
1
1
0
RUN -
1
1
1
0

X - não importa o valor da entrada.
0, 1: sinal low (0V) e high (Vcc) respectivamente
RUN: saída ativada (+ em uma polaridade, - com polaridade invertida)

No diagrama abaixo, temos um exemplo de conexão com a utilização do Arduino. A conexão SENS1,SENS2 é opcional.



A alimentação do motor não deverá ultrapassar 46V. Nem o consumo total dos motores, excederem 2A cada um – Não há fusível de proteção.
Quando a alimentação do motor estiver ativada, o LED7 ficará aceso. Os demais LEDs estão ligados às linhas de sinal do L298.

PWM

Até o presente momento não se falou em controle de velocidade. Do jeito que está, o motor irá girar na sua velocidade nominal, proporcional à corrente que passa, claro! E se quisermos dotar os motores de um controle de velocidade? Como não temos potenciômetros para controlar corrente, então lançamos mão do PWM.

O PWM significa Pulse Width Modulation, ou modulação por largura de pulso. Quando se trabalha com PWM, o leitor tem que ter em mente o conceito de ciclo de trabalho (duty cycle). Um sinal de PWM tem freqüência fixa, e valores de amplitudes bem definidos – 0 ou 1 (0 ou VCC, como quiser) – mudando somente quanto tempo no ciclo o sinal vai estar em 0 ou 1. Isto é, eu altero somente a largura do pulso... Veja  no diagrama abaixo 5 sinais  de mesma freqüência, porém com largura de pulso diferentes.



Na prática, dado as características elétricas da carga mediante um sinal variável, a largura de pulso irá influenciar dramaticamente no comportamento do dispositivo:
  1.   A tensão efetiva (eficaz ou RMS) será proporcional à largura do pulso. Apesar da corrente agora, ser também pulsada, esse conceito não se aplica. Se o motor consome 2A, ele receberá os 2A, só que por um período de tempo determinado pelo PWM. Isso faz com que se tenha melhor controle de consumo e por sua vez a potência consumida J
  2. Sinais PWM costumam gerar harmônicos: Prepare-se para instabilidades com ruídos e ajustes nos capacitores que vão aos motores L
  3. O corte abrupto (1 --> 0) nos sinais PWM faz com que as cargas indutivas criem correntes parasitas (fly back). Os diodos de proteção irão trabalhar mais intensamente! Fica de olho, costumam esquentar!!! K  

Plugue os pinos EN1 e EN2 nas portas do Arduino que suportem PWM. Quando ativar o pino, em vez de usar a função digitalWrite, use analogWrite passando o numero do pino e o valor de PWM desejado (0 a 255, para 0 e 100% respectivamente)
No diagrama de conexão acima, os pinos EN estão ligados aos pinos 6 e 9 que são PWM! :) 


Current Sensing

Por fim, e não menos importante, current sensing, isto é os pinos SENS1 e SENS2. É dele que virá o controle de feedback do driver.

Se estiver utilizando o current sensing propriamente, isto é com o resistor de 0.5Ohm/1W. Teremos ali a leitura de tensão proporcional à corrente que passa por cada canal do L298. Conforme especificado, se essa tensão ultrapassar 1V, teremos uma corrente circulante > 2A, o que pode queimar o integrado...

Os pinos SENS1 e SENS2 deverão ser ligados a um conversor AD, o arduino possui esses pinos (A0..A5). Para ler, utilize analogRead(). Faça as conversões necessárias. O AD do arduino tem resolução de 10bits... com fundo de escala de 5V... então fazendo os cálculos, qualquer leitura acima de 204 (~=1V) já podemos tomar algumas ações como, diminuir o ciclo de PWM; ou desabilitar o canal respectivo momentaneamente; ou parar tudo para proteger o L298.

No diagrama acima, eles estão ligados aos pinos A0 e A1 respectivamente.

--//--

No proximo e último artigo, trataremos da biblioteca de controle para o Arduino.

terça-feira, 21 de maio de 2013

Driver de Motor: L298 + Arduino (Parte 1)


Vamos fazer o Arduino andar? É comum o Arduino ser utilizado em projetos de robótica, ora lendo sensores e dando um feedback e/ou movimentando algum chassis com motores.

Fazer estas coisas não é um mistério, mas em muitos casos conseguir no mercado nacional aquele shield que faça essa interface é uma aventura e muitas vezes o preço não é convidativo.

O driver aqui descrito é baseado num manjadíssimo circuito integrado dedicado para motores o L298; Vários fabricantes produzem esse integrado, mas é mais comum vê-lo sob a sigla da ST (SGS-Thompson). Esse integrado é conhecido como "Ponte H" - H-Bridge - Dual. Isto é, ele tem 2 bridges, o que pode fazê-lo controlar 2 motores com um componente só! O que é muito bom!

Quer saber um pouco mais sobre pontes-H? Visite o artigo neste blog: http://mmc-zaap.blogspot.com/2013/05/ponte-h.html

O L298

O L298 implementa a ponte-H conforme o diagrama abaixo:

Não se assuste com as portas AND fazendo o driver dos transistores. A função dele é criar a lógica necessária de forma que NUNCA coloque os transistores de saída em curto e fazer a interface entre o setor de baixa tensão e alta tensão.  Já que o L298 trabalha com 2 alimentações.

São 2 canais(A, B); Eis a Pinagem e função:
Pino
Função
Descrição
IN1
E
Entrada de comando canal A
IN2
E
Entrada de comando Canal A
OUT1
S
Saída de carga canal A
OUT2
S
Saída de carga canal A
EN1
E
Habilita canal A
SENS1
S
Saída para o sensor de corrente do canal A(R)
IN3
E
Entrada de comando canal B
IN4
E
Entrada de comando Canal B
OUT3
S
Saída de carga canal B
OUT4
S
Saída de carga canal B
EN2
E
Habilita canal B
SENS2
S
Saída para o sensor de corrente do canal B(R)
VS
PWR
Alimentação do conjunto de potencia dos canais
VCC/+Vss
PWR
Alimentação da lógica
GND
PWR
Ground

Não vou entrar nos detalhes das características elétricas, mas resumirei o que for importante para a implementação desse projeto:
- Alimentação da lógica: 4,5V a 7V.
- Alimentação do conjunto de poténcia: 7 a 46V - com limitação de corrente circulante de até 2A por canal!!! (não se iluda com os 4A que diz no datasheet, isso é corrente TOTAL=A+B)
- Frequencia de comutação máxima aplicada nos pinos IN e EN : 40Khz (caso use alguma entrada com PWM)

O Sensor de corrente nada mais é que um resistor cuja derivação serve para monitorar a tensão gerada. Um microcontrolador ou algum outro circuito dedicado tem que ler essa saída e fazer o corte do fornecimento de tensão para a carga de forma que o circuito se mantenha estável e dentro dos parâmetros de funcionamento.

O datasheet não é claro, mas há o entendimento que deverá ser um resistor cuja finalidade é gerar uma tensão proporcional à corrente circulante em cada um dos canais. O corte será feito se a corrente atingir 2A.

Segundo o datasheet, a tensão gerada em SENS1, SENS2 não deverá exceder 2V. Se fixarmos em 1V, teremos que para 2A, a resistencia deverá ser de 0.5Ohm. Portanto um Resistor de 0.5Ohmx1W tá de bom tamanho. Pede-se que seja um resistor puro, não de fio. Pois num processo de comutação, esses resistores (de fio) podem dar problemas devido indutância intrínseca do componente. 


O circuito

Com base no datasheet do L298, o circuito final é bastante simples:

Para auxiliar a depuração e funcionamento do motor, foi colocado uma bateria de LED's na parte de controle do circuito, justamente para visualizar o sinal de cada estágio.

Os diodos D1 a D8 são diodos para proteção. Se o circuito não for crítico, pode usar o 1N4007. Mas recomendo algum tipo de diodo schottky para potência: 1N5819, UF4007 por exemplo. Não utilize o circuito sem os diodos de proteção. D9 é só uma proteção adicional contra inversão de polaridade.

C1,C2 são capacitores de desacoplamento de fonte. Valores não críticos: 10uF para o Eletrolítico, 100nF para o despolarizado (Cerâmica ou poliéster - tanto faz). C3,C4 são de poliéster - 10nF ou 47nF. para desacoplamento/ruído do motor.

Especial atenção para RS1 e RS2. Estes resistores deverão ser de 0.5Ohm/1Watt. De preferência que não seja de fio! Caso o driver trabalhe com motores de pequena potência (desses de brinquedos) O resistor pode ser substituído por um jumper. Os demais resistores (R1 a R6) 1k2; R9 é calculado em função da tensão de alimentação 4k7 tá de bom tamanho)

O conector J1 é do tipo KK. Ele não é conectado diretamente a algum pino do Arduino por uma questão de projeto. No futuro pretendo liberar mais outros 2 artigos, usando um controlador dedicado para este driver de potência: Usando o SN74HC14 ou SN74HC00 (ou qualquer porta inversora) e outro dedicado ao seu controlador original, o L297. Esses 2 últimos projetos, sim, conectados diretamente à porta do Arduino. X1,X2,X3 são conectores tipo MTA de 0.156” (distância entre pinos) com trava.

Realização

Abaixo temos o layout do circuito impresso. Em breve disponibilizarei o projeto na em um repositório público e o leitor poderá baixar e reproduzir a placa.


Veja como ficou...


Veja o vídeo do carro robótico em funcionamento, logo abaixo:



É isso aí! Até a próxima!

segunda-feira, 20 de maio de 2013

Ponte H

Por estes dias recebi um daqueles projetinhos de colégio... mais para ajudar que fazer. Mas acabei fazendo.Para não deixar a prática ficar sem a teoria. Resolvi descrever um pouco de um artifício usado em circuitos de potência. As configurações de pontes H são as mais diversas.  Mas o conceito se aplica a todos.

Uma ponte H, nada mais é um circuito eletrônico que permite comutar a tensão na carga. Isto é, com base em uma lógica de comando, a corrente pode fluir num sentido, ora em outro. Em outras palavras: inversão de polaridade. ;)
No esquema abaixo, temos o circuito típico de uma ponte H. Como eu disse, existem várias formas de projetar uma. Usei o modelo NPN/PNP pois é mais fácil de entender o que acontece, e se o usuário quiser implementar, é mais seguro. Veja o esquema abaixo:

O funcionamento é simples. Basta aplicar alguma tensão nos pontos indicados (reverse/forward inputs). Para facilitar o entendimento, seja "0" a ligação ao terra (ou negativo) e "1" ao positivo.

Pelo visto os fluxos que importam e surtem efeitos são os "0"-"1" e "1"-"0" . Nos demais nem flui corrente... então não há ativação do motor.

Esse é o princípio do funcionamento da Ponte H. Na verdade esse circuito é bastante útil quando precisa de alguma forma tirar vantagem da inversão da polarização. Motores DC é um caso muito comum.

Veja que os transistores em muitos casos conduzem direto sem resistência limitadora nos seus coletores ou emissores, somente a resistência da carga é que vai limitar alguma coisa... por isso fique antenado, transistorzinho barato-chinfrim de sinal ou baixa corrente aqui não tem vez! Se usar, vai queimar!


Diodos de Proteção

Entre coletores e emissores de cada transistor, devemos ter um diodo de proteção para o caso de comutarmos cargas indutivas. Motivo? Óbvio... Pela lei de Lenz, Lorenz e... blá blá blá, uma carga indutiva quando tem o seu fornecimento de corrente cessado, o campo magnético criado e circundante é capaz de gerar uma tensão em oposição... blá,blá,blá!

Os diodos de proteção são para isso, caso o motor gere uma tensão em resposta ao corte de energia ou troca de polarização, o diodo irá drenar essa carga nociva ao terra (ou ao potencial de alimentação, se for o caso). Os diodos NÃO deverão ser 1N4148, BAT54 ou qualquer outro de sinal ou baixa corrente. PODE usar o 1N4007, mas o melhor mesmo é usar um do tipo schottky 1N5819 ou UF4007 - fast recovery diodes.

Abaixo o exemplo de uso desses diodos:

Circuito

Com base no circuito acima, implementei um pequeno shield para Arduino. Veja o layoute abaixo. Quem tiver interesse nesse circuito, entre em contato. Quando eu tiver um repositório on-line atualizarei o este post.

No shield temos os principais pontos: J1, J2 e J3. J1 é a conexão com o motor. J2 é a entrada de alimentação - CUIDADO! Este porto NÃO TEM proteção. Se inverter a polaridade da alimentação aqui, os diodos de proteção irão queimar! J3 é o ponto de conexão de controle, onde o Arduino irá comandar o funcionamento do circuito.

O valor dos resistores não tem mistério: coloca 1K para todo mundo!

ATENÇÂO: Não convém usar VIN e +5V do arduino para alimentar este circuito. Utilize uma fonte em separado.
Vista dos componentes
Lado da Solda

É isso aí! Guarde este artigo. Em breve irei voltar a esse mesmo assunto numa outra abordagem!