segue o esboco que consegui com leituras e ajuda do IGPT, mas nao passo daqui, aparece no lcd , mas nao navega . nao funiona o joystick preciso disso para fazer funionar um aparelho que ira ajudar na reabilitacao do meu Pai , acamado , alguem poderia me ajudar concluir :.por favor .... obrigado
#include <U8glib.h>
#include <AccelStepper.h>
#include <Encoder.h>
#include <AnalogJoystick.h>
// Definições dos pinos para o motor X
#define X_PUL_PIN 2
#define X_DIR_PIN 3
#define X_ENA_PIN 4
#define X_ENCODER_PIN_A 5
#define X_ENCODER_PIN_B 6
#define ALARME_PIN_X 13
#define HOME_SWITCH_X 22
// Definições dos pinos para o motor Y
#define Y_PUL_PIN 7
#define Y_DIR_PIN 8
#define Y_ENA_PIN 9
#define Y_ENCODER_PIN_A 10
#define Y_ENCODER_PIN_B 11
#define ALARME_PIN_Y 14
#define HOME_SWITCH_Y 23
// Definições dos pinos para o Joystick
#define JOYSTICK_X_PIN A0
#define JOYSTICK_Y_PIN A1
#define JOYSTICK_SW_PIN 12
// Constantes para velocidade e tempo máximos
#define MAX_SPEED 550
#define MAX_TIME 1800
// Inicialização dos motores
AccelStepper motorX(AccelStepper::DRIVER, X_PUL_PIN, X_DIR_PIN);
AccelStepper motorY(AccelStepper::DRIVER, Y_PUL_PIN, Y_DIR_PIN);
// Inicialização dos encoders
Encoder encoderX(X_ENCODER_PIN_A, X_ENCODER_PIN_B);
Encoder encoderY(Y_ENCODER_PIN_A, Y_ENCODER_PIN_B);
// Inicialização do Joystick
AnalogJoystick joystick(JOYSTICK_X_PIN, JOYSTICK_Y_PIN, JOYSTICK_SW_PIN);
// Variáveis para controle de tempo e velocidade alvo
unsigned long previousTime = 0;
unsigned long interval = 100; // Intervalo de atualização em milissegundos
int targetSpeedX = 0; // Velocidade alvo para o motor X
int targetSpeedY = 0; // Velocidade alvo para o motor Y
unsigned long targetTime = 0; // Tempo alvo para o movimento automático
// Variável para o modo de operação
bool manualMode = false;
// Variáveis para controle de posição dos motores
int maxPositionX = 1000; // Posição máxima do motor X
int minPositionX = 0; // Posição mínima do motor X
int maxPositionY = 1000; // Posição máxima do motor Y
int minPositionY = 0; // Posição mínima do motor Y
// Inicialização do display
U8GLIB_ST7920_128X64_1X u8g(23, 17, 16, 41);
void setup() {
// Configurações iniciais dos motores
motorX.setMaxSpeed(MAX_SPEED);
motorY.setMaxSpeed(MAX_SPEED);
motorX.setAcceleration(MAX_SPEED * 2);
motorY.setAcceleration(MAX_SPEED * 2);
// Configurações dos pinos
pinMode(ALARME_PIN_X, INPUT);
pinMode(ALARME_PIN_Y, INPUT);
pinMode(HOME_SWITCH_X, INPUT_PULLUP);
pinMode(HOME_SWITCH_Y, INPUT_PULLUP);
// Verifica a posição inicial e desliga os drivers
if (digitalRead(HOME_SWITCH_X) == LOW) {
moveMotorToHome(&motorX, X_ENA_PIN);
}
if (digitalRead(HOME_SWITCH_Y) == LOW) {
moveMotorToHome(&motorY, Y_ENA_PIN);
}
}
void loop() {
unsigned long currentTime = millis();
// Verifica alarmes e reinicia drivers se possível
checkAndRestartDriver(ALARME_PIN_X, X_ENA_PIN);
checkAndRestartDriver(ALARME_PIN_Y, Y_ENA_PIN);
// Alternar entre o modo manual e automático
toggleManualMode();
// Executa a lógica de movimento dependendo do modo selecionado
executeMovementLogic();
// Exibe informações no LCD
displayInfoOnLCD();
// Aguarda o tempo restante do intervalo
while (millis() - previousTime < interval) {
// Aguarda
}
previousTime = millis();
}
// Função para desenhar o gráfico de posição dos motores
void drawGraph() {
int posX = map(encoderX.read(), 0, 1000, 0, u8g.getWidth());
int posY = map(encoderY.read(), 0, 1000, 0, u8g.getHeight());
u8g.drawPixel(posX, posY);
}
// Função para exibir o status do alarme no display
void displayAlarmStatus(String status) {
u8g.setFont(u8g_font_6x10);
u8g.drawStr(10, 50, status.c_str());
}
// Função para reiniciar o driver (desligar e ligar)
void restartDriver(int pin) {
digitalWrite(pin, HIGH);
delay(1000); // Tempo para desligar
digitalWrite(pin, LOW);
}
// Função para verificar alarme e reiniciar driver se possível
void checkAndRestartDriver(int alarmPin, int driverEnablePin) {
if (digitalRead(alarmPin) == HIGH) {
restartDriver(driverEnablePin);
delay(1000); // Tempo para reiniciar o driver
}
}
// Função para movimentar o motor até a posição inicial (home)
void moveMotorToHome(AccelStepper* motor, int enablePin) {
digitalWrite(enablePin, LOW);
motor->moveTo(0); // Posição inicial
while (motor->run()) {
// Aguarda movimento até a posição inicial
}
digitalWrite(enablePin, HIGH);
}
// Função para alternar entre o modo manual e automático
void toggleManualMode() {
int joystickState = joystick.getButtonState();
if (joystickState == JoystickButtonState::PRESSED) {
manualMode = !manualMode; // Alternar entre modo manual e automático
delay(500); // Debounce
}
}
// Função para executar lógica de movimento dependendo do modo selecionado
void executeMovementLogic() {
if (manualMode) {
// Lógica de movimento manual aqui
int joyX = joystick.getX();
int joyY = joystick.getY();
// Implementar lógica de movimento manual com o joystick
} else {
// Lógica de movimento automático aqui
if (millis() < targetTime) {
// Executa o movimento automático com base no tempo alvo
motorX.setSpeed(targetSpeedX);
motorY.setSpeed(targetSpeedY);
motorX.runSpeed();
motorY.runSpeed();
}
}
}
// Função para exibir informações no display LCD
void displayInfoOnLCD() {
u8g.firstPage();
do {
// Lógica para exibir informações no LCD
if (manualMode) {
// Exibir informações no modo manual
u8g.setFont(u8g_font_6x10);
u8g.drawStr(10, 10, "Manual Mode");
u8g.drawStr(10, 20, "Speed X: " + String(targetSpeedX));
u8g.drawStr(10, 30, "Speed Y: " + String(targetSpeedY));
u8g.drawStr(10, 40, "Encoder X: " + String(encoderX.read()));
u8g.drawStr(10, 50, "Encoder Y: " + String(encoderY.read()));
} else {
// Exibir informações no modo automático
u8g.setFont(u8g_font_6x10);
u8g.drawStr(10, 10, "Auto Mode");
u8g.drawStr(10, 20, "Speed X: " + String(targetSpeedX));
u8g.drawStr(10, 30, "Speed Y: " + String(targetSpeedY));
u8g.drawStr(10, 40, "Time Left: " + String((targetTime - millis()) / 1000) + "s");
}
} while (u8g.nextPage());
}