eje x y, posicionar en origen cuando arrancamos ON

:smiling_imp:

Hola Compis.

Tengo el siguiente code que os muestro abajo, en el cual es un brazo xy y según el codigo ascill que el envío por puerto serie se posiciona en alguna de las coordenadas que le tengo marcado al principio.

Pues bien, todo funciona correctamente, lo único que pretendo es cuando arranco arduino que interprete en funcion de los swish si estan en 0 o 1023 que vaya a inicio y si ya esta que no haga nada, para que siempre arraque desde un origen.

El caso es que en el Void setup(); le doi las siguientes ordenes;

if (finalcarrera_Valuex == 0 ) { // en estas lineas es donde pretendo que los dos ejes se posicionen en 0
digitalWrite(enable_x, LOW );
digitalWrite(dirx, HIGH);
stepper_x.step( 4000 ); }

else { digitalWrite(enable_x, HIGH );
digitalWrite(dirx, LOW);
stepper_x.step( 0 ); }

if (finalcarrera_Valuey == 0 ) { // en estas lineas es donde pretendo que los dos ejes se posicionen en 0
digitalWrite(enable_y, LOW);
digitalWrite(diry, HIGH);
stepper_y.step( 4000 ); }

else { digitalWrite(enable_y, HIGH);
digitalWrite(diry, LOW);
stepper_y.step( 0 ); }

para que vaya a origen, pero cuando llega el eje x como el y a origen y activan los swish no para ninguno de los motores hasta que ejecuta los 4000 pasos, es decir no interrumpe esos pasos, si no que los ejecuta hasta que los ternima, a pesar de decirle en el void look(); los siguiente comandos para que se inhabilite a traves de enable y así pare, pero no sucede tal cosa.

Se os cocurre que puedo hacer ya he probado varios comandos y no consigo nada.

TAn solo quiero posicionar el brazo xy en origen, que es cuando quedan activados los swichs.

void loop()
{

finalcarrera_Valuex = analogRead(finalcarrerax); // aqui le digo que estado tiene sensorValueX del final de carrera x
finalcarrera_Valuey = analogRead(finalcarreray); // aqui le digo que estado tiene sensorValueX del final de carrera y

if (finalcarrera_Valuex == 0 ) { // con enable_x en HIGH desabilito modulo pololu y asi no consumen
digitalWrite(enable_x, LOW ); }

else { digitalWrite(enable_x, HIGH ); }

if (finalcarrera_Valuey == 0 ) {
digitalWrite(enable_y, LOW ); }

else { digitalWrite(enable_y, HIGH ); }

if (Serial.available() > 0 ) {
incomingByte = Serial.read();

digitalWrite(enable_y, LOW );
digitalWrite(enable_x, LOW ); }

else { digitalWrite(enable_y, HIGH );
digitalWrite(enable_x, HIGH ); }

#include <Stepper.h>

#define STEPS 200 //Ponemos el número de pasos que necesita para dar una vuelta. 200 en nuestro caso

Stepper stepper_x(STEPS, 7,10); //pines para control de motor x
Stepper stepper_y(STEPS, 6,11); // pines para control de motor y
int incomingByte;
int finalcarrerax = A0; // aqui he convertido interruptor digital en analogico para aprovechar los pocos pines digitales que me quedan
int finalcarreray = A1;
int finalcarrera_Valuex = 0; // aqui almaceno estado de A0
int finalcarrera_Valuey = 0;
int dirx = 12;
int diry = 13;
int enable_x = 9;
int enable_y = 8;

int ax = (finalcarrera_Valuex >= 1023 ); // En la primera posicin en vez de poner 0, le decimos que sea el final de carrera cuando este en 0 y
// as se autoajustara continuamente cuando ase por el final de carrera.
int bx = 1000; // aqui son los pasos que ordenare que se posicione mi motor cuando demos la orden ax
int cx = 2000;
int dx = 3000;
int ex = 3500;

int ay = (finalcarrera_Valuey >= 1023 );
int by = 1000;
int cy = 2000;
int dy = 3000;
int ey = 4000;

int posicion_x = 0; ///¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ AQUI ES DONDE ME GUSTARIA ALMACENAR LA POSICION ACTUAL ???
int posicion_y = 0;

int destino_x = 0; /// AQUI ES DONDE ME GUSTARIA GUARDAR LA POSICION UTIMA DEL MOTOR DONDE ESTUBO SITUADO
int destino_y = 0;

int sentidogiro_x = 0;
int sentidogiro_y = 0;

void setup()
{
Serial.begin(9600);
stepper_x.setSpeed(300); // REVOLUCIONES DEL MOTOR
stepper_y.setSpeed(300);

pinMode(dirx, OUTPUT);
pinMode(diry, OUTPUT);
pinMode(enable_x, OUTPUT);
pinMode(enable_y, OUTPUT);

finalcarrera_Valuex = analogRead(finalcarrerax); // aqui le digo que estado tiene sensorValueX del final de carrera x
finalcarrera_Valuey = analogRead(finalcarreray);

if (finalcarrera_Valuex == 0 ) { // en estas lineas es donde pretendo que los dos ejes se posicionen en 0
digitalWrite(enable_x, LOW );
digitalWrite(dirx, HIGH);
stepper_x.step( 4000 ); }

else { digitalWrite(enable_x, HIGH );
digitalWrite(dirx, LOW);
stepper_x.step( 0 ); }

if (finalcarrera_Valuey == 0 ) { // en estas lineas es donde pretendo que los dos ejes se posicionen en 0
digitalWrite(enable_y, LOW);
digitalWrite(diry, HIGH);
stepper_y.step( 4000 ); }

else { digitalWrite(enable_y, HIGH);
digitalWrite(diry, LOW);
stepper_y.step( 0 ); }

}

void loop()
{

finalcarrera_Valuex = analogRead(finalcarrerax); // aqui le digo que estado tiene sensorValueX del final de carrera x
finalcarrera_Valuey = analogRead(finalcarreray); // aqui le digo que estado tiene sensorValueX del final de carrera y

if (finalcarrera_Valuex == 0 ) { // con enable_x en HIGH desabilito modulo pololu y asi no consumen
digitalWrite(enable_x, LOW ); }

else { digitalWrite(enable_x, HIGH ); }

if (finalcarrera_Valuey == 0 ) {
digitalWrite(enable_y, LOW ); }

else { digitalWrite(enable_y, HIGH ); }

if (Serial.available() > 0 ) {
incomingByte = Serial.read();

digitalWrite(enable_y, LOW );
digitalWrite(enable_x, LOW ); }

else { digitalWrite(enable_y, HIGH );
digitalWrite(enable_x, HIGH ); }

if (incomingByte == ‘A’) {
destino_x = ax;
destino_y = ay;
sentidogiro_x = destino_x - posicion_x ;
sentidogiro_y = destino_y - posicion_y ;
if (sentidogiro_x <= 0) {
digitalWrite(dirx, HIGH); }
else { digitalWrite(dirx, LOW); }

if (sentidogiro_y <= 0) {
digitalWrite(diry, HIGH); }
else { digitalWrite(diry, LOW); }
stepper_x.step( sentidogiro_x );
stepper_y.step( sentidogiro_y );

}

if (incomingByte == ‘B’) {
destino_x = bx;
destino_y = by;
sentidogiro_x = destino_x - posicion_x ;
sentidogiro_y = destino_y - posicion_y ;
if (sentidogiro_x <= 0) {
digitalWrite(dirx, HIGH); }
else { digitalWrite(dirx, LOW); }

if (sentidogiro_y <= 0) {
digitalWrite(diry, HIGH); }
else { digitalWrite(diry, LOW); }
stepper_x.step( sentidogiro_x );
stepper_y.step( sentidogiro_y );

}
if (incomingByte == ‘C’) {
destino_x = cx;
destino_y = cy;
sentidogiro_x = destino_x - posicion_x ;
sentidogiro_y = destino_y - posicion_y ;
if (sentidogiro_x <= 0) {
digitalWrite(dirx, HIGH); }
else { digitalWrite(dirx, LOW); }

if (sentidogiro_y <= 0) {
digitalWrite(diry, HIGH); }
else { digitalWrite(diry, LOW); }
stepper_x.step( sentidogiro_x );
stepper_y.step( sentidogiro_y );

}
if (incomingByte == ‘D’) {
destino_x = dx;
destino_y = dy;
sentidogiro_x = destino_x - posicion_x ;
sentidogiro_y = destino_y - posicion_y ;
if (sentidogiro_x <= 0) {
digitalWrite(dirx, HIGH); }
else { digitalWrite(dirx, LOW); }

if (sentidogiro_y <= 0) {
digitalWrite(diry, HIGH); }
else { digitalWrite(diry, LOW); }
stepper_x.step( sentidogiro_x );
stepper_y.step( sentidogiro_y );

}

posicion_x = destino_x;
posicion_y = destino_y;

}

Para comenzar te pediré que en adelante uses los tags para insertar códigos. Asi como lo posteas es ilegible.

Lee las normas del foro también. El tag para códigos es el Nro 19 de este editor.

if (finalcarrera_Valuex == 0 ) {    // en estas lineas es donde pretendo que los dos ejes se posicionen en 0
   digitalWrite(enable_x, LOW );
       digitalWrite(dirx, HIGH);
       stepper_x.step( 4000 );   }

else { digitalWrite(enable_x, HIGH );
       digitalWrite(dirx, LOW);
       stepper_x.step( 0 );   
}

Analicemos solo finalcarrera_Valuex

Entinedo que uses A0 como digital, pero porque no lo defines como tal en setup y por el contrario lo lees como analógico. Para mi no tiene sentido como lo estas haciendo. Debe ser asi: en el setup()

pinMode(A0, INPUT);

y luego

finalcarrera_Valuex = digitalRead(A0);