Buenas, estoy hace algunas semanas armando un plotter xy con dos motores 28byj-48 se me recomendó no trabajar con librerias para tener mayor precisión y de paso aprender más, pero se me está complicando bastante. Hasta ahora llegue a dos versiones muy basicas, una en la cual con un button acciono paso por paso los motores y otra en la que acciono los motores con un ciclo for y los detengo con un delay cuando llegan a la cantidad de pasos que yo deseo.
Actualmente tengo 2 objetivos que no puedo resolver:
1- Indicarle a mis motores independientemente cuantos pasos hacer y frenarse, sin uso delay ni millis.
2- Se que para sacar la distancia media tengo que usar el teorema de pitágoras, pero todavía no me figuro del todo como aplicar esa ecuación dentro del sketch.
Cualquier dato, tutorial o post me es de ayuda, muchas gracias!!
Pd: adjunto el sketch que uso para con el boton, el resto de mis versiones oscilan con esta.
// constants won't change. They're used here to set pin numbers:
const int buttonPin = 2; // the number of the pushbutton pin
// variables will change:
int buttonState = 0; // variable for reading the pushbutton status
boolean flag = true;
const int motorPinb1 = A0; // 28BYJ48 In1
const int motorPinb2 = A1; // 28BYJ48 In2
const int motorPinb3 = A2; // 28BYJ48 In3
const int motorPinb4 = A3; // 28BYJ48 In4
const int motorPin1 = 8; // 28BYJ48 In1
const int motorPin2 = 9; // 28BYJ48 In2
const int motorPin3 = 10; // 28BYJ48 In3
const int motorPin4 = 11; // 28BYJ48 In4
unsigned long previousMillis = 0;
unsigned long previousMicros = 0;
const long interval = 60;
//definicion variables
int motorSpeed = 1200; //variable para fijar la velocidad
int stepCounter = 0; // contador para los pasos
int stepsPerRev = 4076; // pasos para una vuelta completa
//tablas con la secuencia de encendido (descomentar la que necesiteis)
//secuencia 1-fase
//const int numSteps = 4;
//const int stepsLookup[4] = { B1000, B0100, B0010, B0001 };
//secuencia 2-fases
//const int numSteps = 4;
//const int stepsLookup[4] = { B1100, B0110, B0011, B1001 };
//secuencia media fase
const int numSteps = 8;
const int stepsLookup[8] = { B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001 };
//------------------
void setup()
{
pinMode(buttonPin, INPUT);
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
pinMode(motorPinb1, OUTPUT);
pinMode(motorPinb2, OUTPUT);
pinMode(motorPinb3, OUTPUT);
pinMode(motorPinb4, OUTPUT);
}
void loop()
{
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
if (buttonState == HIGH) {
if(flag) {
clockwise();
flag = false;
// delayMicroseconds(motorSpeed);
}
delay (10);
} else {
flag = true;
}
// for (int i = 0; i < stepsPerRev * 2; i++)
// {
// clockwise();
// delayMicroseconds(motorSpeed);
// }
// for (int i = 0; i < stepsPerRev * 2; i++)
// {
// anticlockwise();
// delayMicroseconds(motorSpeed);
// }
// delay(1000);
}
void clockwise()
{
stepCounter ++;
if (stepCounter >= numSteps) stepCounter = 0;
setOutput(stepCounter);
}
//
//void anticlockwise()
//{
// stepCounter--;
// if (stepCounter < 0) stepCounter = numSteps - 1;
// setOutput(stepCounter);
//}
//
void setOutput(int step)
{
digitalWrite(motorPin1, bitRead(stepsLookup[step], 0));
digitalWrite(motorPin2, bitRead(stepsLookup[step], 1));
digitalWrite(motorPin3, bitRead(stepsLookup[step], 2));
digitalWrite(motorPin4, bitRead(stepsLookup[step], 3));
digitalWrite(motorPinb1, bitRead(stepsLookup[step], 0));
digitalWrite(motorPinb2, bitRead(stepsLookup[step], 1));
digitalWrite(motorPinb3, bitRead(stepsLookup[step], 2));
digitalWrite(motorPinb4, bitRead(stepsLookup[step], 3));
}