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.
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();
}
}
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.
- 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();
}
}
Comentários
Postar um comentário