Postagem em destaque

Controle PID de Potência em Corrente Alternada - Arduino e TRIAC - Parte I

Este post é o primeiro de uma série de seis que escrevi tratando de controle de potência e PID (controle proporcional, integral e derivativo...

quarta-feira, 13 de fevereiro de 2013

Robô cartesiano com Arduino

Dia desses fiz um post sobre um TCC em que estou dando suporte que é uma Máquina de Aplicação de Cola. É um projeto muito interessante pela complexidade (vocês podem ler sobre ele no post acima) e também pelo fato de os alunos serem muito bons na parte de mecânica. O equipamento que eles construíram, todo em alumínio e aço, ficou ajustadíssimo. Os motores que eles escolheram são parrudos, adequados ao trabalho da máquina. Compraram também um ótimo driver, adequado para motores de passo  desses maiores, o SMC-U-PRO. Esse produto é da HobbyCNC, que é uma empresa interessante para hobbistas de mecatrônica.

No nosso primeiro encontro dei a eles um curso de Arduino bem voltado pelo ao projeto, um hands-on bem legal.

Depois, pegamos algum hardware para "desvendar". Essa prá mim é a parte divertida do troço: pegar um hardware já existente, que os caras já trouxeram, e conectá-lo com as demais partes do projeto, de maneira a funcionar harmoniosamente para atender aos objetivos do projeto. No primeiro dia destrinchamos o leitor de código de barras, ligamos um dos motores num dos drivers (eles trouxeram dois drivers completamente diferentes, e um deles não consegui funcionar) e tentamos, sem sucesso, usando um relé usado, acionar as válvulas pneumáticas.

Ficou como "para casa" prá eles:

- Comprar outro driver de motor
- Comprar relés adequados
- Providenciar os cabeamentos adequados para interconectar tudo.
- Comprar um display LCD para termos um  feedback da CNC melhor que um bip.
- Comprar um Arduino Mega.

Aqui vai uma dica: se vc for fazer um TCC baseado em Arduino, compre o Mega. Não tenho nada contra o Uno ou Leonardo (quer dizer, contra o Leonardo tenho sim: as diferenças de pinagem I2C). Eu mesmo não tenho um Mega e já fiz miséria sem ele, inclusive ligar 81 portas digitais multiplexadas. Acontece que isso complica um bocado o código, e normalmente os alunos não são "fluentes" em C o suficiente para ligar com coisas como multiplexação.

Ou seja: usar o Mega pode simplificar o seu projeto na parte de software, que é o que "pega". E hoje ele nem tá tão mais caro assim que os outros irmãos menores.

Ontem foi a nossa segunda reunião de projeto. Os caras trouxeram o "para casa" prontinho, então resolvemos atacar várias frentes simultaneamente: uma turma foi cuidar dos relés, outra de preparar e ligar o LCD, um outro ligou os motores. Eu e o Euclides fomos estudar o acionamento dos motores.

Lembrando do projeto: é uma mesa que tem que deslocar uma peça no eixos X e Y ao mesmo tempo, de maneira a poder traçar linhas na superfície da peça. Um aplicador fixo então irá aplicar cola na superfície.


Acima, a ferramenta com os motores acoplados. Vcs podem ver uma das peças posicionadas. A meta é que a plataforma se movimente para percorrer toda a borda da peça, ainda arredondando as quinas ("concordando", no dizer de meus antigos mestres). Para isso será preciso acionar os dois motores simultaneamente.

Abaixo, o driver com as conexões ao Arduino.


 O driver é realmente muito bem feito, bem flexível. Controla motores com até 4A por fase, permite Chopper, quer dizer, o gerenciamento da corrente via PWM. Com isso a gente consegue:

- Uso de Altas velocidades (até 2000 RPM, segundo o fabricante, o que é "paca", em se tratando de motores de passo)
- Controle de aceleração/desaceleração.
- Tem sistema de detecção de inatividade, ou seja, quando o motor fica inativo por 1 a 2 segundos, ele reduz a corrente para o motor, o que diminui o aquecimento e o consumo, claro.

Como temos de acionar dois motores simultaneamente, usamos a biblioteca AccelStepper. Ela é melhor que a Stepper que vem no Arduino, agregando diversas funcionalidades, inclusive a possibilidade de acionar mais de um motor de passo por vez.

Abaixo, vídeo de um teste de acionamento dos motores dos eixos. E mais abaixo, o código fonte desse acionamento.




#include <AccelStepper.h>

// Define os motores.
// AccelStepper::DRIVER - seta o tipo de controladora, no caso um driver, SMC-U-PRO
AccelStepper stepperX(AccelStepper::DRIVER,6,7);
AccelStepper stepperY(AccelStepper::DRIVER,9,10);

void setup()
{
  // habilita os pinos de enable dos motores
  stepperX.setEnablePin(8);
  stepperY.setEnablePin(11);
  // seta a a velocidade máxima dos motores
  stepperX.setMaxSpeed(2000);
  stepperY.setMaxSpeed(2000);
}

void loop()
{  
  // prepara os motores para girar em uma direção...
  // "manda" girar o motor -2000 steps. O valor legativo significa giro no sentido contrário
  // aos ponteiros do relógio.
  // Obs: o comando não gira o motor, só diz que é para girar. O giro efetivo é no loop abaixo
  stepperX.moveTo(-2000);
  // seta a velocidade de giro em passos/s.
  stepperX.setSpeed(1000);
  stepperY.moveTo(-2000);
  stepperY.setSpeed(1000);

  // esse é o loop que move os motores até a posição 2000. Observe que a rotina não
  // fica bloqueada no stepperX.runSpeed, ou seja, ele dá um passo e sai.
  //Aí vc pode fazer outras coisas, como por exemplo acionar o giro de outros motores,
  // como eu fiz.
  // Mas o que quer que vc coloque dentro do while tem que ser rápido, porque
  // senão vai atrasar o giro dos motores. Você pode colocar, por exemplo, um botão de
  // parada imediata, a ser testado dentro do loop, ou um sensor de fim de curso.
  while ((stepperX.currentPosition() != -2000) && (stepperY.currentPosition() != -2000))
  {
    stepperX.runSpeed();
    stepperY.runSpeed();
  }
  // o código abaixo é análogo, só que gira na direção contrária, agora.
  stepperX.moveTo(2000);
  stepperX.setSpeed(1000);
  stepperY.moveTo(2000);
  stepperY.setSpeed(1000);
  // move os motores até a posição -2000
  while ((stepperX.currentPosition() != 2000) && (stepperY.currentPosition() != 2000))
  {
    stepperX.runSpeed();
    stepperY.runSpeed();
  }
}