/*
"author": "Vinícius Andrade", RA: 22333
"author": "João Felipe Coromberk", RA: 23319
*/
#ifndef StepperMotor_h
#define StepperMotor_h
// Define os pinos do motor de passo
const int STEP_PIN = 2; // Pino para o sinal de passo do motor
const int STEP_DIR_PIN = 3; // Pino para controlar a direção do motor
const int ENABLE_PIN = 4; // Pino para ativar ou desativar o motor
const int MS1_PIN = 5; // Pino para controle de microstepping (modo 1)
const int MS2_PIN = 6; // Pino para controle de microstepping (modo 2)
const int MS3_PIN = 7; // Pino para controle de microstepping (modo 3)
// Define os pinos dos botões
const int BTN_CHANGE_DIRECTION = 8; // Pino do botão que muda a direção do motor
const int BTN_ON_OFF = 9; // Pino do botão liga/desliga do motor
const int BTN_CHANGE_MSTEP = 10; // Pino do botão que altera o microstepping
// Classe StepperMotor que encapsula o controle do motor de passo
class StepperMotor {
public:
// Construtor da classe, inicializa os pinos do motor
StepperMotor(int stepPin, int dirPin, int enablePin, int ms1Pin, int ms2Pin, int ms3Pin);
// Inicializa os pinos como saídas e configura os valores iniciais
void initialize();
// Alterna a direção do motor entre horário e anti-horário
void toggleDirection();
// Liga ou desliga o motor
void togglePower();
// Altera o modo de microstepping do motor
void changeMicrosteppingMode();
// Executa um passo do motor se estiver ligado
void step();
private:
// Atributos que armazenam os pinos e estados do motor
int _stepPin;
int _dirPin;
int _enablePin;
int _ms1Pin;
int _ms2Pin;
int _ms3Pin;
bool _direction; // Direção atual do motor
bool _enabled; // Estado de ligado/desligado do motor
int _microsteppingMode; // Modo atual de microstepping
// Configura o modo de microstepping do motor
void setMicrosteppingMode(int mode);
};
// Construtor que inicializa os pinos e os estados do motor
StepperMotor::StepperMotor(int stepPin, int dirPin, int enablePin, int ms1Pin, int ms2Pin, int ms3Pin) :
_stepPin(stepPin), _dirPin(dirPin), _enablePin(enablePin), _ms1Pin(ms1Pin), _ms2Pin(ms2Pin), _ms3Pin(ms3Pin) {
_direction = true; // Define a direção inicial como horário
_enabled = true; // Define o motor como ligado inicialmente
_microsteppingMode = 0; // Define o modo inicial de microstepping como 0
}
// Função que inicializa os pinos do motor
void StepperMotor::initialize() {
pinMode(_stepPin, OUTPUT); // Define o pino de passo como saída
pinMode(_dirPin, OUTPUT); // Define o pino de direção como saída
pinMode(_enablePin, OUTPUT); // Define o pino de habilitação como saída
pinMode(_ms1Pin, OUTPUT); // Define o pino MS1 como saída
pinMode(_ms2Pin, OUTPUT); // Define o pino MS2 como saída
pinMode(_ms3Pin, OUTPUT); // Define o pino MS3 como saída
// Configura os pinos do motor com seus valores iniciais
digitalWrite(_stepPin, LOW); // Desativa o sinal de passo
digitalWrite(_enablePin, LOW); // Liga o motor (ativo em LOW)
setMicrosteppingMode(_microsteppingMode); // Configura o modo de microstepping
digitalWrite(_dirPin, _direction); // Configura a direção inicial do motor
}
// Função que alterna a direção do motor
void StepperMotor::toggleDirection() {
_direction = !_direction; // Inverte a direção atual
Serial.println(_direction ? "Horario" : "Antihorario"); // Imprime a nova direção
digitalWrite(_dirPin, _direction); // Atualiza o pino de direção
delay(200); // Atraso para evitar rebotes
}
// Função que liga ou desliga o motor
void StepperMotor::togglePower() {
_enabled = !_enabled; // Inverte o estado de ligado/desligado
Serial.println(_enabled ? "Ligado" : "Desligado"); // Imprime o estado atual
digitalWrite(_enablePin, _enabled ? LOW : HIGH); // Atualiza o pino de habilitação
delay(200); // Atraso para evitar rebotes
}
// Função que muda o modo de microstepping
void StepperMotor::changeMicrosteppingMode() {
_microsteppingMode = (_microsteppingMode + 1) % 5; // Avança para o próximo modo
setMicrosteppingMode(_microsteppingMode); // Aplica o novo modo de microstepping
delay(200); // Atraso para evitar mudanças rápidas
}
// Função que executa um passo do motor, se estiver habilitado
void StepperMotor::step() {
if (_enabled) { // Verifica se o motor está ligado
digitalWrite(_stepPin, HIGH); // Envia o pulso para o pino de passo
delay(20); // Atraso para garantir o movimento
digitalWrite(_stepPin, LOW); // Finaliza o pulso
delay(20); // Atraso entre os pulsos
}
}
// Função que configura o modo de microstepping
void StepperMotor::setMicrosteppingMode(int mode) {
// Configura os pinos MS1, MS2 e MS3 conforme o modo selecionado
switch (mode) {
case 0:
Serial.println("Modo 1"); // Imprime o modo atual
digitalWrite(_ms1Pin, LOW); // Define MS1 para LOW
digitalWrite(_ms2Pin, LOW); // Define MS2 para LOW
digitalWrite(_ms3Pin, LOW); // Define MS3 para LOW
break;
case 1:
Serial.println("Modo 2");
digitalWrite(_ms1Pin, HIGH); // Define MS1 para HIGH
digitalWrite(_ms2Pin, LOW); // Define MS2 para LOW
digitalWrite(_ms3Pin, LOW); // Define MS3 para LOW
break;
case 2:
Serial.println("Modo 3");
digitalWrite(_ms1Pin, LOW);
digitalWrite(_ms2Pin, HIGH); // Define MS2 para HIGH
digitalWrite(_ms3Pin, LOW);
break;
case 3:
Serial.println("Modo 4");
digitalWrite(_ms1Pin, HIGH);
digitalWrite(_ms2Pin, HIGH); // Define MS2 para HIGH
digitalWrite(_ms3Pin, LOW);
break;
case 4:
Serial.println("Modo 5");
digitalWrite(_ms1Pin, HIGH);
digitalWrite(_ms2Pin, HIGH);
digitalWrite(_ms3Pin, HIGH); // Define MS3 para HIGH
break;
}
}
#endif // StepperMotor_h
#ifndef ButtonHandler_h
#define ButtonHandler_h
// Classe ButtonHandler para gerenciar os botões do sistema
class ButtonHandler {
public:
// Construtor que inicializa o pino do botão
ButtonHandler(int buttonPin);
// Verifica se o botão foi pressionado
bool isPressed();
private:
int _buttonPin; // Armazena o pino do botão
bool _lastButtonState; // Armazena o último estado do botão para detectar mudanças
};
// Construtor que inicializa o botão e configura o pino como entrada pull-up
ButtonHandler::ButtonHandler(int buttonPin) :
_buttonPin(buttonPin) {
_lastButtonState = HIGH; // Estado inicial é HIGH, porque o pull-up interno é ativado
pinMode(_buttonPin, INPUT_PULLUP); // Configura o pino como entrada com resistor de pull-up
}
// Função que verifica se o botão foi pressionado
bool ButtonHandler::isPressed() {
bool buttonState = digitalRead(_buttonPin); // Lê o estado atual do botão
// Se o estado mudou de HIGH para LOW, o botão foi pressionado
if (buttonState == LOW && _lastButtonState == HIGH) {
_lastButtonState = LOW; // Atualiza o estado para LOW
return true; // Retorna que o botão foi pressionado
} else if (buttonState == HIGH) { // Se o estado é HIGH, o botão não está sendo pressionado
_lastButtonState = HIGH; // Atualiza o estado para HIGH
}
return false; // Retorna falso se o botão não foi pressionado
}
#endif // ButtonHandler_h
// Instancia os objetos
StepperMotor motor(STEP_PIN, STEP_DIR_PIN, ENABLE_PIN, MS1_PIN, MS2_PIN, MS3_PIN); // Objeto do motor de passo
ButtonHandler btnDirection(BTN_CHANGE_DIRECTION); // Botão para mudar a direção do motor
ButtonHandler btnOnOff(BTN_ON_OFF); // Botão para ligar/desligar o motor
ButtonHandler btnMicrostep(BTN_CHANGE_MSTEP); // Botão para alterar o microstepping
// Função de configuração inicial
void setup() {
Serial.begin(9600); // Inicializa a comunicação serial para debug
motor.initialize(); // Inicializa o motor de passo
}
// Função principal que executa continuamente
void loop() {
// Verifica se o botão de direção foi pressionado
if (btnDirection.isPressed()) {
motor.toggleDirection(); // Alterna a direção do motor
}
// Verifica se o botão liga/desliga foi pressionado
if (btnOnOff.isPressed()) {
motor.togglePower(); // Liga ou desliga o motor
}
// Verifica se o botão de mudança de microstep foi pressionado
if (btnMicrostep.isPressed()) {
motor.changeMicrosteppingMode(); // Altera o modo de microstepping do motor
}
// Se o motor estiver ligado, executa um passo
motor.step(); // Executa um passo do motor
}