Ola a todos, sou novo aqui, preciso imensamente da ajudas de voces para concluir este codigo trate de um aparelho que estou tentado concluir

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());
}

Como obter o melhor desse Fórum

Ola sr, @zenmga .
Vi que voce fechou o seu tópico como concluído.

Me desculpe se eu estiver enganado.
Mas senti que voce se incomodou com a resposta do Sr. @J-M-L .

O que ele escreveu é uma recomendação para que leia um texto de "protocolos" ao usar o forum, para que tenhamos um bom nível de relacionamento e comunicação.

Veja por exemplo no seu caso:
Voce postou um codigo de tamanho até grande para fins de visualização, mas não seguiu a orientação para coloca-lo entre as tags, permitindo assim que possamos ou navegar no seu tópico ou no seu código de forma independente.

Não postou nenhum diagrama (ou fiação) do seu projeto.
Isto ajuda muito a entender seu projeto e muitas vezes até elucidar o problema.

Não existe uma descrição de como deveria funcionar o seu projeto e como ele está comportando.

Não informou qual micro controlador está usando;

Pela sua descrição entendi que este projeto tem a finalidade de ajudar a reabilitação do seu pai .

Acho isto de uma importância sem medidas e gostaria muito de ajuda-lo.

Mas por favor ajude-nos a ajuda-lo.

Faça as recomendações que postei mas antes de tudo leia o tópico que o J-M-L

PS:
Não estou encontrando na WEB uma das bibliotecas que voce usou.
"AnalogJoystick.h"
Pode informar o link de onde voce baixou?

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.