Hola muchas gracias por permitirme estar en el foro.
Me gustaría compartir con ustedes el proyecto en el que estoy trabajando y una duda que surgió con el código de Arduino.
Tratare de ser muy breve en la descripción de mi duda.
Estoy construyendo un telescopio el cual será movido por medio de una montura motorizada con 2 motores Nema 23.
Aclaro que mis conocimientos en Arduino son básicos y después de muchas horas leyendo y buscando en la web me encontré con el código de Andrea Lombardo el cual se ajusta a las necesidades de mi proyecto.
https://paypal.me/AndreaLombardo84
https://www.lombardoandrea.com
realice algunas modificaciones con el fin de poder adaptar una pantalla LCD 2004 y poder escribir en ella un mensaje constante en las 3 primeras filas y la dirección de movimiento en la 4 fila.
El problema surge cuando al mover el joystick GIRO A LA DERECHA, GIRO A LA IZQUIERDA, SUBIENDO, BAJANDO, se sobre escriben unas con otras. Ya intente con lcd.clear(); el cual hace que el mensaje se desvanezca rápido y al poner un delay(); este afecta la velocidad de los motores.
Dejo el código modificado, agradezco sus sugerencias.
Muchas gracias por su ayuda y un abrazo gigante.
Me gustaría compartir con ustedes el proyecto en el que estoy trabajando y una duda que surgió con el código de Arduino.
Tratare de ser muy breve en la descripción de mi duda.
Estoy construyendo un telescopio el cual será movido por medio de una montura motorizada con 2 motores Nema 23.
Aclaro que mis conocimientos en Arduino son básicos y después de muchas horas leyendo y buscando en la web me encontré con el código de Andrea Lombardo el cual se ajusta a las necesidades de mi proyecto.
https://paypal.me/AndreaLombardo84
https://www.lombardoandrea.com
realice algunas modificaciones con el fin de poder adaptar una pantalla LCD 2004 y poder escribir en ella un mensaje constante en las 3 primeras filas y la dirección de movimiento en la 4 fila.
El problema surge cuando al mover el joystick GIRO A LA DERECHA, GIRO A LA IZQUIERDA, SUBIENDO, BAJANDO, se sobre escriben unas con otras. Ya intente con lcd.clear(); el cual hace que el mensaje se desvanezca rápido y al poner un delay(); este afecta la velocidad de los motores.
Dejo el código modificado, agradezco sus sugerencias.
Código:
//Control de dos motores paso a paso con Arduino, Joystick y LCD
//GX IZQUIERDA DERECHA- GY ARRIBA Y ABAJO
//Inclusión de bibliotecas
#include <AccelStepper.h>
#include <Bounce2.h>
#include <Wire.h> // libreria de comunicacion por I2C
#include <LCD.h> // libreria para funciones de LCD
#include <LiquidCrystal_I2C.h> // libreria para LCD por I2C
LiquidCrystal_I2C lcd(0x27,20,4); // DIR, E, RW, RS, D4, D5, D6, D7
//Definicion de la constante del pin de Arduino
const int ledEnable = 13; //el led a bordo nos mostrará el estado de activación de los motores
const int pinSwEnable = 7; //el botón presente en el módulo del joystick que habilita o deshabilita el control
const int pinEnable = 8; //los pines que controlan el estado ENABLE de los controladores A4988 están conectados en serie por esta razón solo se necesita un pin para administrar ambos
unsigned long debounceDelay = 10; //milisegundos para el botón debonuce
const int jX = A0; //pin analógico que lee los valores de las X
const int stepX = 3; //pin digital que envía señales STEP al controlador X
const int dirX = 4; //pin digital que envía la señal de DIRECCIÓN al controlador X
long speedX, valX, mapX; //Variables de gestión del movimiento del motor X
const int jY = A1; //pin analógico que lee los valores de la Y
const int stepY = 5; //pin digital que envía las señales STEP al controlador Y
const int dirY = 6; //pin digital que envía la señal de DIRECCIÓN al controlador Y
long speedY, valY, mapY; //Variables de gestión del movimiento del motor Y
//variables utilizadas por la biblioteca AccelStepper
const int maxSpeed = 1000; //de acuerdo con la documentación de la biblioteca, este valor se puede configurar hasta 4000 para un Arduino UNO
const int minSpeed = 0; //velocidad mínima del motor
const float accelerazione = 50.0; //número de pasos por segundo en aceleración
const int treshold = 30; //la lectura de los potenciómetros nunca es 100% confiable, este valor ayuda a determinar el punto a considerar como "Stay still" en los movimientos
long tresholdUp, tresholdDown; //variables de servicio para realizar la tarea descrita anteriormente
boolean abilitato, muoviX, muoviY, enable; //variables de gestión de movimiento
Bounce btnEnable = Bounce(); //crea una instancia de un botón de la biblioteca Bounce
//instancia los motores
AccelStepper motoreX(AccelStepper::DRIVER, stepX, dirX);
AccelStepper motoreY(AccelStepper::DRIVER, stepY, dirY);
void setup() {
//inicializar valores
speedX = speedY = 0;
enable = false;
//definición de los modos pin
pinMode(ledEnable, OUTPUT);
pinMode(pinEnable, OUTPUT);
pinMode(pinSwEnable, INPUT_PULLUP); //la entrada del interruptor debe establecerse como INPUT_PULLUP
digitalWrite(ledEnable, enable);
digitalWrite(pinEnable, !enable); //Los controladores A4988 deshabilitan los comandos al motor si reciben una señal ALTA en el pin ENABLE por esta razón el valor es opuesto al del LED
//configurar el botón del joystick usando la biblioteca Bounce
btnEnable.attach(pinSwEnable);
btnEnable.interval(debounceDelay);
//calcula el rango de valores dentro del cual considerar la posición del joystick como "Quédate quieto"
tresholdDown = (maxSpeed / 2) - treshold;
tresholdUp = (maxSpeed / 2) + treshold;
//configurar los parámetros del motor
motoreX.setMaxSpeed(maxSpeed);
motoreX.setSpeed(minSpeed);
motoreX.setAcceleration(accelerazione);
motoreY.setMaxSpeed(maxSpeed);
motoreY.setSpeed(minSpeed);
motoreY.setAcceleration(accelerazione);
//Inicializar la pantalla LCD
// Imprimir mensaje en LCD
lcd.backlight();
lcd.init();
lcd.setCursor(2,0);
lcd.print("TELESCOPIO 2021");
lcd.setCursor(0,1);
lcd.print("Modulo de Direccion");
lcd.setCursor(0,2);
lcd.print("Arduino Funcionando");
}
void loop()
{
//realizar la función de control y lectura del botón que determina el estado de habilitación
checkEnable();
digitalWrite(ledEnable, enable); //muestra el estado de habilitación a través del led en el pin 13
digitalWrite(pinEnable, !enable); //establecer el valor opuesto en los pines ENABLE de los controladores
//realizar lectura analógica de los valores provenientes de los potenciómetros del joystick
valX = analogRead(jX);
valY = analogRead(jY);
//mapea los valores leídos en función de la velocidad mínima y máxima
mapX = map(valX, 0, 1023, minSpeed, maxSpeed);
mapY = map(valY, 0, 1023, minSpeed, maxSpeed);
//realizar la función de control del motor
pilotaMotori(mapX, mapY);
}
void pilotaMotori(long mapX, long mapY) {
if (mapX <= tresholdDown) {
//x vuelve
speedX = -map(mapX, tresholdDown, minSpeed, minSpeed, maxSpeed);
muoviX = true;
lcd.setCursor(1,3);
lcd.print("GIRO A LA DERECHA");
} else if (mapX >= tresholdUp) {
//x continúa
speedX = map(mapX, maxSpeed, tresholdUp, maxSpeed, minSpeed);
muoviX = true;
lcd.setCursor(1,3);
lcd.print("GIRO A LA IZQUIERDA");
} else {
//x se queda quieto
speedX = 0;
muoviX = false;
}
if (mapY <= tresholdDown) {
//y va giù
speedY = -map(mapY, tresholdDown, minSpeed, minSpeed, maxSpeed);
muoviY = true;
lcd.setCursor(5,3);
lcd.print("SUBIENDO");
} else if (mapY >= tresholdUp) {
//y va su
speedY = map(mapY, maxSpeed, tresholdUp, maxSpeed, minSpeed);
muoviY = true;
lcd.setCursor(5,3);
lcd.print("BAJANDO");
} else {
//y sta fermo
speedY = 0;
muoviY = false;
}
if (muoviX) {
motoreX.setSpeed(speedX);
motoreX.run();
} else {
motoreX.stop();
}
if (muoviY) {
motoreY.setSpeed(speedY);
motoreY.run();
} else {
motoreY.stop();
}
}
void checkEnable() {
btnEnable.update();
if (btnEnable.fell()) {
enable = !enable;
}
}
Muchas gracias por su ayuda y un abrazo gigante.