hola amigos tengo de tarea mover un motor paso a paso con un potenciometro y lo tengo que hacer sin librerias.
en el programa el potenciometro siempre empieza en 0.
con el uso de la funcion map() simulo que mi motor paso a paso tiene que dar 20 pasos para dar una vuelta de 360 grados.
vean que simulo las bobinas de un motor paso a paso con 4 leds que tienen de nombre led1, led2, led3, led4. esto es solo una simulacion, cuando termine el programa comprare el motor paso a paso y ahi en ves de leds seran las bobinas del motor.
volviendo al tema segun mi programa para dar un paso adelante osea en sentido de las manecillas del reloj se hace el primer bucle for que enciende led1, led2, led3, led4. para dar un paso hacia atras osea en sentido contrario de las manecillas del reloj se hace el bucle for que enciende led4,led3,led2,led1.
todo trabaja perfectamente hasta aqui, tengo un contador que le llamo “n” el cual actua como una retroalimentacion de donde se encuentra el pot.
ejemplo:
teniendo en cuenta que 20 pasos es 360 grados, muevo el pot a la mitad (10), osea 180 grados, y empieza el programa a mover el paso a paso hacia adelante, en sentido horario, led1, led2, led3, led4, hasta que mi contador “n” vea que lo hizo 10 veces y parara, de igual manera si estando en 180 grados lo muevo a cero, este se movera 10 pasos para atras, led4, led3, led2, led1 hasta que el contador “n” llegue a 0 de nuevo.
Bien hasta aqui trabaja perfecto pero tengo un detalle que necesito.
ejemplo:
teniendo en cuenta que 20 pasos es 360 grados, muevo el pot a la mitad (10), osea 180 grados, y empieza el programa a mover el paso a paso hacia adelante, en sentido horario, led1, led2, led3, led4, cuando mi contador “n” lleve 7 pasos, yo muevo el pot a 3 osea 54 grados y quiero que este pare el contador en 7 inmediatamente y empieze el ciclo hacia atras led4, led3, led2, led1 hasta que mi contador “n” vea sepa que este en 3 y parara.
hasta el momento lo que me hace el programa es que primero tiene que llegar hasta el valor del pot que le dimos al principio y ya que mi contador “n” llega a ese valor ya ejecuta el siguiente. lo quiero en tiempo real.
espero me entiendan muchas gracias.
/*
En este proyecto leemos el valor de un potenciometro
y con este valor damos velocidad a un motor paso a paso
*/
// Declaramos las constantes que vamos a usar
const int pinSensor1 = 0; // pin del sensor analogico, con un potenciometro
// Declaramos las variables que vamos a usar
int velocidad1 = 0; //variable para guardar valor del potenciometro
int velocidad2 = 0;// variable para guardar el valor
int velocidad3 = 0;
int valorPotenciometro1 = 0;
int led1 = 2;
int led2 = 4;
int led3 = 7;
int led4 = 8;
int led5 = 12;
int led6 = 13;
int led7 = 11;
float n = 0; //variable para guardar el valor de "n" siendo n un contador
void setup() {
pinMode(pinSensor1, INPUT); // Incializa el pin del pot como entrada
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
pinMode(led7, OUTPUT);
}
void loop(){
valorPotenciometro1 = analogRead(pinSensor1); // Lee el valor del sensor
velocidad1 = map(valorPotenciometro1, 0, 1023, 0, 20);// Transforma este valor en el valor que usaremos con funcion map
velocidad2= map(velocidad1, 0 ,100,100,0);//futuros valores
velocidad3= map(velocidad1, 140 ,255,0,255);//futuros valores
if ((velocidad1)<20)// una vuelta completa del pot es igual a 20 segun el mapeo aqui solo mide que sea verdad
{
if ((velocidad1)>n)// comprueba que el valor del pot sea mayor a "n" nuestro contador
{
if (velocidad1>0) // comprueba que giremos primero el pot para empezar secuencia
{
for (int i=0;n<velocidad1;i++) //empezara secuencia de bucle cuando giremos el pot
{
digitalWrite(led1, HIGH);
delay(100);
digitalWrite(led1, LOW);
delay(100);
digitalWrite(led2, HIGH);
delay(100);
digitalWrite(led2, LOW);
delay(100);
digitalWrite(led3, HIGH);
delay(100);
digitalWrite(led3, LOW);
delay(100);
digitalWrite(led4, HIGH);
delay(100);
digitalWrite(led4, LOW);
delay(100);
digitalWrite(led5, HIGH);
n=n+1; // aqui iremos sumando nuestro contador para llegar a ser igual a velocidad1
}
}
}
}
if ((velocidad1)<n) // aqui mide que cuando velocidad1 sea mayor a nuestro contador ejecute
{
for (int j=0;n>velocidad1;j++) // empezara la secuencia de bucle cuando velocidad 1 sea menor a n
{
digitalWrite(led4, HIGH);
delay(100);
digitalWrite(led4, LOW);
delay(100);
digitalWrite(led3, HIGH);
delay(100);
digitalWrite(led3, LOW);
delay(100);
digitalWrite(led2, HIGH);
delay(100);
digitalWrite(led2, LOW);
delay(100);
digitalWrite(led1, HIGH);
delay(100);
digitalWrite(led1, LOW);
delay(100);
digitalWrite(led6, HIGH);
n=n-1; // disminuira nuestro contador
}
}
TheUnnamedCircuit.ino (4.04 KB)