Os Primeiros Passos Introduzindo o Controle de Motores

224 views

Olá caro leitor, como vai? Nesse segundo artigo sobre a ROMEO V2.2 iremos prosseguir com o algo mais mão na massa. Para quem ainda não sabe sobre o que iremos escrever aqui, sugiro dar uma passadinha no primeiro artigo da série, onde falamos um pouco sobre esse controlador de motores com cérebro de arduino, você pode ver esse artigo clicando aqui. Não é segredo para quem já conhece a ROMEO é o fato dela aliar simplicidade com capacidade, com algumas poucas linhas de código diretamente da IDE Arduino poderemos controlar até dois motores de até 2 Amperes! Vamos recobrar um pouco sobre o hardware para controle de motores.

ROMEO V2.2, Voltando ao Hardware

Do texto anterior, para saber como controlar motores com a ROMEO V2.2 precisamos revisitar o hardware que acompanha a placa. Primeiro falemos novamente do seu cérebro, um ATMEGA32u4, dentre todos os periféricos poderosos desse microcontrolador da família AVR, o gerador de modulação por largura de pulso ( conhecido de forma simples por PWM) for estrategicamente mapeado para que possa ser usado com as conhecidas chamadas AnalogWrite() da corelibs Wiring o que resulta em pouco mais de duas linhas de código para acionar o hardware de controle de motores, não entraremos agora em detalhes de como o PWM funciona e porque ele é o escolhido para uso, por ora vamos usar essa informação e observar o circuito para controle de motor ilustrado novamente abaixo:

 

Circuito 1 - Romeo V2.2
Figura 1 – Circuito Romeo v2.2

 

O circuito de acionamento de motores tem como principal componente o L298P uma ponte H dupla responsável por receber os sinais de controle do MCU, e gerar os sinais de potência a partir da fonte de alimentação, na sua operação mais básica o par INPUT1/2 e INPUT3/4 formam basicamente a direção para qual se deseja o giro sendo que de acordo com nível lógico presente nos INPUTS ou o motor gira no sentido horário ou anti-horário. Os sinais ENA e ENB, na configuração padrão de ligação, como o próprio nome sugere, é responsável por habilitar o motor, ou seja ele literalmente aciona o motor na velocidade máxima. Assim sendo, se sua aplicação precisa do motor ligado ou desligado e em máxima velocidade basta escolher a direção e enviar o nível lógico correspondente a INPUT1/2 ou 3/4 (Lembre-se que cada par de sinais, corresponde a 1 motor) e enviar nível lógico 1 para ENA/ENB, novamente cada sinal ENABLE corresponde a cada motor. Porém aplicações que envolvem o uso de conceitos de robótica em um entendimento geral, exige que seja possível controlar a rotação do motor, seja para controlar a velocidade de movimente do conjunto, ou localização através do controle de posição, para isso precisamos modificar o sinal de controle ENA/ENB para que seu comportamento seja o de quantificar a quantidade de energia disponível para o motor, resultando em maior ou menor giro.

 

E por Falar em Controle, Vamos Revisar o Tal do PWM

PWM, vem do inglês como sendo “Pulse Width Modulation”, ou em tradução literal, modulação por largura de pulso, basicamente esse tipo de modulação consiste na geração de um sinal com uma componente alternada (somada a uma componente contínua) cujo sua frequência e amplitude são constantes, variando-se o período dentro de cada ciclo que esse sinal permanece em máxima amplitude e, no restante do período, o sinal vá para o valor mínimo de amplitude, na prática isso se traduz em um sinal quadrado onde a porção positiva do sinal varia dentro de cada período, vejamos uma figurinha que ilustra bem o aspecto desse tipo de sinal:

 

Circuito 2 - Romeo V2.2
Figura 2 – Circuito Romeo V2.2

 

A figura acima é bem autoexplicativa, observe, caro leitor, que o período do sinal mostrado é constante, apesar de não parecer o ciclo sempre recomeça a cada 2 milissegundos,  mas observem que quando o Duty Cycle, conhecido por ciclo ativo, principal variável do PWM, muda o aspecto do sinal, mantendo ele em máxima amplitude proporcionalmente pelo valor de ciclo ativo desejado, ou seja no exemplo acima, se o usuário selecionar um ciclo ativo de 75%, o sinal vai ficar em  máxima amplitude em 75% do período. Mas agora o leitor deve estar se perguntando: “Felipe. muito legal isso, mas o que o PWM tem a ver com motores, ROMEO V2.2, e com o analogWrite()?”. A resposta é tudo, primeiro o PWM funciona de forma simplificada como um conversor digital para analógico de 1 bit (D/A), de forma que a tensão média presente na saída (ou carga) vai ser aproximadamente o valor do ciclo ativo, multiplicado pelo máximo valor de amplitude do PWM atual, ou seja, voltando a ROMEO V2.2, se a ponte H for alimentada com 12V,  significa que a tensão presente no motor poderá ser variada entre 0 e 12V! Bastando apenas usar o analogWrite() nos sinais ENA e ENB!

 

O PWM, como trabalha com apenas dois estados de operação, ou seja ponte H acionada ou não em uma frequência relativamente alta, teoricamente não existe dissipação de potência nos componentes, na prática, devido as imperfeições internas dos semicondutores isso não ocorre, mas a dissipação de potência é mínima, fazendo com que dissipadores menores possam ser usados e reduzindo o aquecimento do conjunto de potência para controle do motor. Alie isso ao fato de que microcontroladores de 8 a 32bits possuem pelo menos 1 timer dedicado para geração de PWM, na ROMEO V2.2 existem pelo menos 4, sendo 2 para controle da ponte H, creio que sejam motivos mais que justificáveis para adotar esse tipo de estratégia de controle. Mas lembre-se da dica, a frequência do PWM não pode ser muito baixa, a ponto do sistema controlado conseguir responder a ela. Como explicado anteriormente o PWM possui uma componente alternada que precisa ser eliminada para obtenção da tensão contínua e variável, em alguns casos usam – se filtros passa baixa para isso, porém em caso de motores, o próprio enrolamento e a sua resistência interna já formam internamente um filtro passa baixas, para isso basta que o período do PWM seja muito menor que a constante de tempo do conjunto do enrolamento, podendo ser obtido dividindo sua indutância, pela resistência do enrolamento, para fins práticos, frequências acima de 800Hz já são indicadas pra uso.

 

Preparando a ROMEO V2.2 Para Controlar os Motores

A ROMEO V2.2 possui alguns passos que devem ser cumpridos para anexar os dois motores a ela, por ser uma placa que controla cargas de considerável potência em relação aos demais componentes, a primeira coisa que o usuário deve possuir é uma fonte com capacidade suficiente para alimentar a placa com os dois motores a plena potência (Com carga nos eixos e máxima tensão de saída) em minha bancada possuo uma fonte ajustável de 0 – 30V com capacidade de corrente de 5A, sendo mais que suficiente para essa aplicação, uma fonte de 12V por 5A é o que considero de requisito mínimo para controle de motores, a tensão máxima de entrada segundo o próprio manual da ROMEO é de 23v, portanto, atenção na hora de selecionar a tensão. Vamos olhar abaixo o wiring típico para conexão de dois motores na ROMEO V2.2:

 

Wiring - Romeo V2.2
Figura 3 – Wiring – Romeo V2.2

 

A Conexão não é das mais problemáticas para os motores, a placa já possui todas as proteções, incluindo os diodos de flywheel para proteger as saídas da ponte H de eventos conhecidos por  força contra-eletromotriz, que ocorre sempre que qualquer um dos motores sejam comutados (por exemplo quando os sinal do PWM finaliza o período de ciclo ativo e vai a zero), adicionalmente, durante do desenvolvimento da aplicação, o usuário deve conectar a porta USB da ROMEO V2.2 no computador ou notebook onde encontra-se aberta uma instancia do Arduino pronta para programar.

 E falando em Programar, Vamos Para o Software!

Bom, até esse ponto do artigo já conhecemos sobre o hardware da ROMEO V2.2, o tipo de controle que vamos usar, o PWM, o porque vamos usar, e como preparar a placa e as conexões relevantes. Está na hora de colocarmos um pouco de software no ATMEGA32u4 e começar a experimentar os controles com essa placa. Primeiramente, vamos configurar a Arduino IDE para que consigamos fazer o download dos nossos aplicativos para a placa, para isso, com a placa conectada, abra uma instância do Arduino IDE, escolha a porta serial na qual a placa está conectada, se estiver no windows, clique no ícone iniciar com o botão direito, e em seguida em gerenciador de dispositivos, vá na aba das portas COM e LPT, você deve encontrar algo assim se sua placa estiver corretamente conectada:

 

Device Manager
Figura 4 – Device Manager

 

Guarde o número da porta COM, ela será usada para fazer o download do seu firmware, e usar ferramentas como o serial monitor. Nos sistemas operacionais MAC ou Linux, encontrar a porta de comunicação não é tão intuitivo, para isso abra em ambos um terminal, desconecte a placa e plugue-a novamente, em seguida no terminal entre com o comando:

 

Você deve obter na tela a ultima porta de comunicação instalada, ou seja a da placa que você acabou de plugar:

Circuito 4

 

No caso do Linux a porta que você deve guardar o nome, vai ser ttyACM<número>. De um modo geral a IDE do Arduino já acerta a porta de conexão desde que você use a placa correta, como a ROMEO V2.2 baseia-se na Arduino Leonardo, você deve utilizar essa placa no Arduino IDE, ao configurar para essa placa, você deve ter algo com o seguinte aspecto:

 

Com essa etapa terminada, agora sim estamos prontos para começar a testar as capacidades dessa placa. E vamos começar como? Utilizando a principal característica da placa, para isso vamos enviar alguns sinais de PWM para a ponte H através da porta serial. No caso da nossa placa os canais D5 e D6, são sinais capazes de emitir PWM respectivamente conectados em ENA/ENB, D4 e D7 basicamente indicam a direção do motor sendo mapeados respectivamente para INPUT1/2 e INPUT3/4, vejam o simples sketch abaixo:

 

O sketch acima não tem nenhum segredo, a maior parte do processamento se dá em receber a string da serial e converter o valor reportado dela para binário. Em poucas palavras a ROMEO V2.2 vai ficar procurando bytes que chegam pela UART-USB, até que receba a tecla enter, quando isso ocorrer a string enviada será convertida para binário, e o valor carregado em ambos os PWM de ambos os motores, o usuário pode modificar o código acima para que os dados recebidos pela Serial também comandem o sentido de rotação de cada motor!

 

Esse primeiro sketch cumpre o que promete, controlar a tensão média enviada ao motor, de acordo com o valor carregado ao PWM, mas dissemos antes que a frequência do PWM enviado não pode ser muito baixa correto? Se em um primeiro momento utilizar o analogWrite() atende o objetivo, para projetos reais ele pode não ser a melhor escolha, isso se dá pelo fato do PWM que aparece no motor possui 1KHz de frequência central, caindo em uma frequência audível, dado a potência envolvida, prepare-se para escutar um belo zumbido durante a operação, em especial em ciclo ativos de pequenos valores (entre 10 e 25%). Além disso observem a figura abaixo:

 

 

Acima temos duas formas de onda, a primeira representa um motor sendo controlado em modo contínuo, ou seja com uma frequência de PWM elevada aponto da corrente no enrolamento do motor nunca chegar a zero mesmo com no estado em que o PWM encontra-se em desligado dentro do ciclo, abaixo temos uma forma de onda de corrente muito similar ao que vai acontecer no motor da nossa ROMEO usando o PWM provido pelo analogWrite(), nesse caso podemos dizer que o motor está operando em modo descontínuo, ou seja durante o estado em que o PWM está desligado no ciclo, a corrente do motor vai a zero, definitivamente não há qualquer conversão de energia nesse estado e a inércia da velocidade atual tem que ser suficiente para manter o motor girando até o próximo ciclo de PWM, onde a corrente volta a subir. Ok, mas qual o problema disso? Basicamente você vai precisa de mais ciclo ativo para fazer o motor manter certo torque, além disso o stress nas armaduras do motor tendem a ser maiores uma vez que a variação de corrente (o pico entre o estado desligado e a completa subida da corrente na armadura do motor) é muito maior, o que vai se traduzir em uma vida útil menor.

 

Mas então o que fazer? O analogWrite() é a única maneira de colocar um PWM na placa sem ter que considerar o uso de técnicas de software, o leitor mais iniciante deve estar se perguntando. Na verdade é que usando o Wiring não é atualmente possível, mas o Arduino não impede que usuários mais avançados (e curiosos) consigam configurar os periféricos do MCU de uma forma mais adequada a sua aplicação, extraindo o máximo de desempenho dele, partindo dessa premissa, podemos modificar o código abaixo chegando em:

 

 

Percebam que essencialmente o código mudou pouquíssima coisa, o que adicionamos a primeira instancia é a inclusão de avr/io.h , basicamente esse arquivo header, permite que o usuário acesse diretamente os periféricos do MCU do ROMEO V2.2 através dos seus registradores, podendo configurar da forma que bem entender, se por um lado a função setupUserPWM() parece mais complicada de entender, por outro lado da ao usuário poder de escolha para resolver um problema como bem entender! Essa função acessa os registradores dos timers 3 e 4 do ATMEGA32u4 e os configura para o modo PWM usando o hardware de captura e comparação OCR3 e OCR4. Agora o leitor me pergunta, por que? Para responder essa pergunta voltemos no esquemático, mais precisamente no MCU, observem esse pedaço abaixo em destaque:

 

Lembram quando mencionamos aqui nesse artigo que o PWM enviado a ponte H da ROMEO V2.2 aparece nos canais D5 e D6, observem que onde os pinos estão marcados, aparecem respectivamente OC3A e OC4D, basicamente essas siglas denotam que o pino D5 pode fornecer PWM vindo Timer 3, pelo canal A, e o D6 pelo Timer 4 pelo canal D, D5 também pode usar Timer 4, mas porque separá-los? A resposta é simples, separando-os em diferentes timers, cada motor poderá operar com uma frequência de PWM diferente, adequado ao seu conjunto de armadura.  A função de inicialização também deixa com que o usuário escolha a frequência de operação (OBS: Há um limite pra escolha dessa frequência, ou seja, quanto maior ela for, menor será a resolução, ou quantidade de bits que o PWM poderá receber), o valor de 38KHz utilizado na aplicação está fora da banda audível sendo um bom compromisso entre operação em modo contínuo e resolução do controle de energia fornecida, o valor de recarga do timer é calculado dividindo o clock da CPU, por essa frequência. A função updateUserPWM() basicamente substitui a analogWrite() , onde o usuário escolhe o canal e passa um valor de até 16bits contendo o ciclo ativo necessário, esse valor é passado imediatamente ao PWM, não existindo qualquer latência perceptível pelo usuário. Fica a minha sugestão de utilizar o analogRead() e implementar um controle manual direto do ROMEO V2.2.

 

Conclusão

A ROMEO V2.2, agora mostrou na placa o porque de ser uma placa de controle de motores de respeito, ela permite que usuários iniciantes e mais avançados possam desenvolver aplicações atendendo cada um os seus objetivos, oferecendo um bring-up fácil de realizar, afinal são poucas conexões necessárias para colocar a placa em funcionamento, e um fluxo de desenvolvimento flexível, permitindo que o usuário inicie com as core-libs do Arduino ou parta para a configuração direto direta dos registradores, sem usar o Wiring. Espero que os códigos aqui demonstrado sejam apenas o ponto de partida para projetos mais complexos, nos próximos posts vamos explorar um pouco sobre controle de motores em malha fechada sim, sim vamos falar de PI, e PID e como implementar um negócio desse sem entrar mais do que o necessário na matemática, então é isso, até a próxima!

Referências:

[1] – ATMEGA32u4 – http://www.atmel.com/Images/Atmel-7766-8-bit-AVR-ATmega16U4-32U4_Datasheet.pdf

[2] – Brushed motor control basics: http://ww1.microchip.com/downloads/en/appnotes/00905a.pdf

[3] – RASHID, Power Electronics, 4th Edition – https://www.amazon.com/Power-Electronics-Circuits-Devices-Applications/dp/0133125904

 

 

(Visited 152 times, 1 visits today)