Hola,
Soy novato y aunque, hasta ahora, no había tenido problemas programando, me esta siendo imposible controlar un motor por pasos desde el monitor serial. Algo que pensaba que era sencillo como las cosas que habia hecho hasta ahora.
Llevo una semana leyendo y viendo videos de comunicación con Arduino pero no consigo mejorar lo que hice con el primer código que programé y que no hace lo que yo busco hacer.
Lo que pretendo hacer es: definir varias posiciones (en este caso son 3) y que el motor por pasos vaya a la posición que le mando y vuelva al punto de inicio, esto controlado a través del serial y luego que espere a que le mande la siguiente orden, algo que pensaba era fácil de hacer pero no lo está siendo.
Con este código, que es el que más se ha acercado a lo que quiero hacer, el motor por pasos va a lo que sería la posición 1 vuelve a la 0, va a la 2 vuelve a la 0, luego la 3 vuelve a la 0 y así continuamente, nunca deja de hacerlo.
Ya he probado 8 códigos diferentes y todos funcionan peor que el primero, que al menos pasa por las 4 posiciones, predefinidas.
Aquí os dejo el primer código que hice y que mas se acerca a lo que buscaba, aunque esta lejos de serlo.
#include <Stepper.h>
//Definimos un objeto stepper
Stepper motor1(2048,8,10,9,11); //Pasos completos (pasos para 1 giro completo, y luego los pines)
void setup()
{
//Le asignamos una funcion de velocidad al objeto
//Requiere un tiempo minimo entre paso y paso de 10ms. por eso hay que calcular las rpm maximas. 1rpm = 1rev/60s. 60s/2048=0,02929s*1000=29,3ms>10ms. OK. 2rpm = 1rev/30s. 30s/2048=0,01464s*1000=14,6ms>10ms. OK .3rpm = 1rev/20s. 20s/2048=0,00976s*1000=9,8ms<10ms. MUY JUSTO PARA OK.
motor1.setSpeed(2); //Definir valocidad en RPM (valores enteros de 1, 2 o 3 para 28BYJ_48)
Serial.begin(9600);
}
void loop()
{
if(Serial.available()) //Para saber si existe informacion disponible ne el monitor serie. Si no lo hay no hace nada, ya que no hay mas codigo, si lo hay entra al if.
{
int Posicion = Serial.parseInt(); //Lee el byte entrante
Serial.println(Posicion); //Es innecesaria. Solo para ver el valor que hemos escrito, para confirmar.
if(Posicion = 1)
{
Serial.println("512");
motor1.step(512); //A la funcion step (pasos que queremos que de el motor) le asignamos el valor de la variable pasos (la cual tiene el valor de lo que metamos al monitor serial)
delay(1000);
motor1.step(-512); //Le hago volver al inicio
Serial.end();
}
if(Posicion = 2)
{
Serial.println("1024");
motor1.step(1024); //A la funcion step (pasos que queremos que de el motor) le asignamos el valor de la variable pasos (la cual tiene el valor de lo que metamos al monitor serial)
delay(1000);
motor1.step(-1024); //Le hago volver al inicio
Serial.end();
}
if(Posicion = 3);
{
Serial.println("1536");
motor1.step(1536); //A la funcion step (pasos que queremos que de el motor) le asignamos el valor de la variable pasos (la cual tiene el valor de lo que metamos al monitor serial)
delay(1000);
motor1.step(-1536); //Le hago volver al inicio
Serial.end();
}
}
}
Otro código que se acerca a lo que busco, es un poco distinto ay que aqui controlo yo la ida y la vuelta, o esa era la idea. En este caso el problema es que siempre avanza lo mismo y en el mismo sentido. El código es el siguiente:
#include <Stepper.h>
//Definimos un objeto stepper
Stepper motor1(2048,8,10,9,11); //Pasos completos (pasos para 1 giro completo, y luego los pines)
int posicion;
void setup(){
//Le asignamos una funcion de velocidad al objeto
//Requiere un tiempo minimo entre paso y paso de 10ms. por eso hay que calcular las rpm maximas. 1rpm = 1rev/60s. 60s/2048=0,02929s*1000=29,3ms>10ms. OK. 2rpm = 1rev/30s. 30s/2048=0,01464s*1000=14,6ms>10ms. OK .3rpm = 1rev/20s. 20s/2048=0,00976s*1000=9,8ms<10ms.
motor1.setSpeed(2); //Definir valocidad en RPM (valores enteros de 1, 2 o 3 para 28BYJ_48)
Serial.begin(9600);
}
void loop(){
//si existe datos disponibles los leemos
if (Serial.available()>0){
//leemos la opcion enviada
posicion=Serial.read();
////////////////////////////////////////////
if(posicion=='1')
{
Serial.println("90");
motor1.step("512");
delay (1000);
}
if(posicion=='2')
{
Serial.println("-90");
motor1.step("-512");
delay (1000);
}
////////////////////////////////////////////
if(posicion=='3')
{
Serial.println("180");
motor1.step("1024");
delay (1000);
}
if(posicion=='4')
{
Serial.println("-180");
motor1.step("-1024");
delay (1000);
}
////////////////////////////////////////////
if(posicion=='5')
{
Serial.println("270");
motor1.step("1536");
delay (1000);
}
if(posicion=='6')
{
Serial.println("-270");
motor1.step("-1536");
delay (1000);
}
}
}
Los demas no los pongo porque o no hacen nada o hacen cosas raras.
Tengo un arduino UNO, el motor por pasos es un 28BYJ-48 y en controlador es un ULN2003.
Gracias de antemano.