This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
CONSULTA Saludos - Problema con código
#1
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.

[Imagen: Screenshot-20210325-220529-com-huawei-hi...erseas.jpg]

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.
  Responder
#2
Publica el código como dicen las normas del foro, en el espacio habilitado para los códigos, y sin emoticonos, que lo único que hacen es estorbar. 

Edita la publicación y corrígela si quieres que alguien te haga caso.

Ya da bastante trabajo averiguar los fallos de un código, como para encima estar quitando emoticonos.

Y pon el enlace al la pagina del proyecto en concreto, no voy a perder el tiempo en leerme las 18 paginas que no me interesan, ni mucho menos a pagar por ayudarte.
  Responder
#3
Buenas noches.

Ahora que ya tenemos un código limpio, te puedo decir que:

Con el IDE Arduino 1.8.13
Lo único que falla es tu línea 7, si la comentas se le quitan todos los problemas a tu código, prueba eso y luego me dices si tienes algún error mas.

Otra cosa es que el programa haga lo que tu quieres, pero compilar, compila, que es lo importante.

Como se te amontonan los mensajes que envía Arduino al LCD, prueba a poner esta línea después de cada bloque de impresión

Código:
lcd.clear(); // Una bonita pantalla limpia sin restos de mensajes anteriores.

En tus líneas

88
122
131
148
157

Verás como mejora todo el proyecto.

Un saludo.
  Responder


Posibles temas similares…
Tema Autor Respuestas Vistas Último mensaje
  CONSULTA ¿como uno dos codigos en un solo codigo? laurangcard 1 633 18-11-2020, 10:03 PM
Último mensaje: asesorplaza1
  CONSULTA problemas en codigo kuro 1 659 13-10-2020, 11:06 PM
Último mensaje: asesorplaza1
  error al compilar el código homer32 4 1,765 23-09-2019, 01:29 PM
Último mensaje: homer32
  CONSULTA Codigo pluviometro balancin Dieseldj1 0 822 01-09-2019, 10:43 PM
Último mensaje: Dieseldj1
  conversión código arduino ethernet 5100 a wemos d1 mini nbaglietto 0 1,241 24-11-2017, 02:05 AM
Último mensaje: nbaglietto