#include <Stepper.h> // Inclui a biblioteca Stepper para controlar motores de passo
#include <Servo.h> // Inclui a biblioteca Servo para controlar servomotores
Servo myservo; // Cria um objeto Servo
int pos = 0; // Define a posição inicial do servo
const int NUM_MOTORS = 3; // Define o número de motores que serão controlados
const int X_PIN[NUM_MOTORS] = {A0, A1, A2}; // Define os pinos de entrada analógica dos joysticks que controlam cada motor
const int STEP_PIN[NUM_MOTORS] = {10, 5, A4}; // Define os pinos de passo de cada motor
const int DIR_PIN[NUM_MOTORS] = {9, 4, A5}; // Define os pinos de direção de cada motor
const int STEPS_PER_REVOLUTION[NUM_MOTORS] = {400, 400, 400}; // Define o número de passos por revolução de cada motor
int sensorVal[NUM_MOTORS], motorSpeed[NUM_MOTORS]; // Cria variáveis para armazenar o valor lido do joystick e a velocidade do motor
int currentStep[NUM_MOTORS] = {0, 0, 0}; // Adiciona variáveis para rastrear a posição atual de cada motor
// Cria um objeto Stepper para cada motor
Stepper myStepper[NUM_MOTORS] = {
Stepper(STEPS_PER_REVOLUTION[0], STEP_PIN[0], DIR_PIN[0]),
Stepper(STEPS_PER_REVOLUTION[1], STEP_PIN[1], DIR_PIN[1]),
Stepper(STEPS_PER_REVOLUTION[2], STEP_PIN[2], DIR_PIN[2])
};
void setup() {
myservo.attach(6); // Anexa o servo no pino 6
myservo.write(0); // Define a posição inicial do servo para 0
pinMode(3, INPUT_PULLUP); // Define o pino 3 como entrada com pull-up
Serial.begin(115200); // Inicia a comunicação serial a 115200 bps
randomSeed(analogRead(0)); // Inicializa o gerador de números aleatórios
// Move os motores para posições aleatórias iniciais
for (int i = 0; i < NUM_MOTORS; i++) {
int randomPosition = random(-3600, 3600); // Gera uma posição aleatória para cada motor
myStepper[i].setSpeed(60); // Define a velocidade do motor
myStepper[i].step(randomPosition); // Move o motor para a posição aleatória
currentStep[i] = randomPosition; // Atualiza a posição atual do motor
}
delay(1000); // Atraso antes de retornar à posição zero
// Retorna os motores para a posição zero
for (int i = 0; i < NUM_MOTORS; i++) {
myStepper[i].setSpeed(60); // Define a velocidade do motor
myStepper[i].step(-currentStep[i]); // Move o motor para a posição zero
currentStep[i] = 0; // Atualiza a posição atual do motor
}
}
void loop() {
// Loop para cada motor
for (int i = 0; i < NUM_MOTORS; i++) {
sensorVal[i] = analogRead(X_PIN[i]); // Lê o valor do joystick correspondente ao motor
// Verifica se o motor está dentro dos limites antes de girar
if(sensorVal[i] < 470 && currentStep[i] > -3600) {
motorSpeed[i] = map(sensorVal[i], 0, 470, 60, 0); // Mapeia o valor lido do joystick para a velocidade do motor
myStepper[i].setSpeed(motorSpeed[i]); // Define a velocidade do motor
myStepper[i].step(1); // Faz o motor dar um passo
currentStep[i]--; // Atualiza a posição atual do motor
}
// Se o valor lido for maior que 550, o motor gira na direção oposta
else if(sensorVal[i] > 550 && currentStep[i] < 3600) {
motorSpeed[i] = map(sensorVal[i], 550, 1023, 0, 60); // Mapeia o valor lido do joystick para a velocidade do motor
myStepper[i].setSpeed(motorSpeed[i]); // Define a velocidade do motor
myStepper[i].step(-1); // Faz o motor dar um passo na direção oposta
currentStep[i]++; // Atualiza a posição atual do motor
}
// Se o valor lido estiver entre 470 e 550, o motor não gira
else {
motorSpeed[i] = 0; // Define a velocidade do motor como zero
}
}
int button = !digitalRead(3); // Lê o estado do botão
if (button == 1 ){ // Se o botão for pressionado
if (pos == 0) { // Se a posição atual for 0
pos = 180; // Muda a posição para 180
} else { // Se a posição atual for diferente de 0
pos = 0; // Muda a posição para 0
}
myservo.write(pos); // Move o servo para a nova posição
delay(1000); // Adicione um atraso de 1 segundo
}
}