StepperTrio

Home > Robótica > Bibliotecas **Recursos** > RunTimer > Timer2 > CircularBuffer > SerialLog > ActionPlan **Dispositivos** > Ultrassom > Array de sensores > NRF24L01 > Wireless log > RF24Control **Movimento** > StepperMotor > StepperMotorTm > **StepperRobot Inicialização** > StepperRobot Operação > StepperRobot Recursos

Introdução
Esta classe é parte de um projeto para produzir uma impressora 3D. É feita para controlar uma placa Keyes-CNC (foto abaixo). Esta placa tem soquetes para um arduino Nano, três placas A4988 e pode controlar 3 motores de passo bipolares. Existem várias vantagens no uso deste tipo de controle para motores de passo, por exemplo, a economia de pinos no microcontrolador, os motores podem ser controlados com apenas 2 pinos cada um. Veja o tópico abaixo.



Placa A4988
Esta pequena plaquinha nos dá acesso ao chip **//Allegro’s A4988 DMOS Microstepping// //Driver//** fabricado pela Allegro. Este chip proporciona um controle muito mais avançado dos motores de passo. Em primeiro lugar, a lógica do controle é diferente, em vez de mandar os pulsos em sequência para cada bobina do motor, podemos apenas informar a direção em um pino e fornecer os pulsos em outro. Isso permite que cada motor seja controlado apenas com 2 pinos em vez de usar 4 pinos como nos drivers baseados no chips ULN2803/2003 ou em dupla ponte H. Em uma impressora que usa três motores de passo, isso significa uma economia de seis pinos no microcontrolador. A placa também fornece várias opções de micro-passos, permitindo maior precisão no movimento.


 * [[image:A4988-1.jpg width="185" height="181"]] || [[image:a4988-2.jpg width="169" height="169"]] || [[image:a4988-3.jpg width="214" height="211"]] ||

Pinos utilizados

code format="java5"
 * 1) define XDIR_PIN  2
 * 2) define YDIR_PIN  3
 * 3) define ZDIR_PIN  4


 * 1) define XSTP_PIN  5
 * 2) define YSTP_PIN  6
 * 3) define ZSTP_PIN  7


 * 1) define ENABLE_PIN 8


 * 1) define XINPUT_PIN 9
 * 2) define YINPUT_PIN 10
 * 3) define YINPUT_PIN 11

code

Definição pública da classe code format="java5" class StepperTrio { public: StepperTrio; void moveSteps(int stepsX, int stepsY, int stepsZ); void moveTo(int posX, int posY, int posZ); void setPos(int posX, int posY, int posZ); int getPosX; int getPosY; int getPosZ; void run; boolean isMoving; }; code

um não temos acesso direto às bobinas do mcom foco 4988 da Alegro foi criada originalmente pela Polulu, mas tem sido replicada por muitos outros fabricantes devido ao sucesso que fez. Cada placa é capaz de controlar um motor de passo com consumo de até dois amperes usando dissipador de calor, ou de até um amper sem dissipador. Isso permite o uso de motores bem avantajados. Atualmente, a grande maioria das impressoras 3D usa essas plaquinhas para controlar os motores de passo.

**turnSteps** O feliz usuário da biblioteca não precisa se preocupar com pulsos e passos ao comandar os movimentos do robô, a biblioteca é capaz de calcular os passos necessários para mover o robô tantos centímetros ou girar tantos graus e providenciar os pulsos correspondentes. Mas para que essa mágica aconteça é preciso informar a medida entre as rodas (em centímetros) e a quantidade de passos que o robô precisa para dar uma volta completa de 360 graus usando um dos movimentos do tipo **//turn//** nos dois últimos parâmetros de **//init//**. No movimento //turn//, uma das rodas fica parada enquanto a outra se move, descrevendo um círculo em torno da primeira. Essa informação deve ser descoberta experimentalmente. Até pode ser calculada a partir do diâmetro das rodas, mas a experiência mostrou que robôs caseiros medidos com recursos caseiros raramente conseguem medidas exatas. Para descobrir a quantidade passos, use o método **//moveSteps//**. Abaixo um exemplo de programa que poderia ser usado para a calibração:

code format="javascript"
 * 1) include 

// motor esquerdo // // motor direito // // Aceleração // Movimento
 * 1) define lfMotorPin1 3
 * 2) define lfMotorPin2 2
 * 3) define lfMotorPin3 5
 * 4) define lfMotorPin4 4
 * 1) define rgMotorPin1 9
 * 2) define rgMotorPin2 8
 * 3) define rgMotorPin3 10
 * 4) define rgMotorPin4 11
 * 1) define startSpeed   130
 * 2) define cruizingSpeed 300
 * 1) define wheelsDist   18.3

class Robot: public StepperRobot{ public: Robot:StepperRobot{}

void init{ init(startSpeed, cruizingSpeed, wheelsDist, 500); // <- valor a ser descoberto, não é usado por moveSteps initLeftMotor (lfMotorPin1, lfMotorPin2, lfMotorPin3, lfMotorPin4); // pinos para o motor esquerdo initRightMotor(rgMotorPin1, rgMotorPin2, rgMotorPin3, rgMotorPin4); // pinos para o motor direito turboOff; halfStepOn; } };

Robot rob;

void setup{ rob.init; }

boolean odd= true;

void loop{ rob.run;
 * 1) ifndef _USE_TIMER2_
 * 1) endif

if(!rob.isMoving){ if(odd) rob.moveSteps(mvTurnL, 468); else rob.moveSteps(mvBrake, 300); // dá uma parada pra permitir a verificação

odd= !odd; } }

code

Talvez essa seja a informação mais simples de encontrar mas mesmo assim existem algumas armadilhas.In
 * Distância entre as rodas **