Saltar la navegación

Enciende un motor stepper por proximidad y lo mantiene en marcha durante un giro incluso marchando

Enciende un motor stepper por proximidad y lo mantiene en marcha durante un giro incluso marchando

//Funciona cuando detecta algo a  15 cm, el motor hace un recorrido determinado, en este ejemplo una vuelta, aunque nos alejemos.

//se ha definido una función para detectar la distancia.

//una función por giro(se puede variar el numero de giros con la variable giros, admite decimales) en función de dos valores  clockwise y anticlockwise

//el sensorda algun error de lectura a cero,por ello se ha eliminado esta opción por codigo añadiendo if cm>0, de esta manera funciona perfectamente

//conexiones ultrasonido

int trigPin = 12; // trigger

int echoPin = 11; //echo

// variables ultrasonido

long duration, cm; //variables donde almacenar datos para calcular distancia

//conexiones motor

int IN1_motor=2; //28BYJ48 In1

int IN2_motor=3; //28BYJ48 In2

int IN3_motor=4; //28BYJ48 In3

int IN4_motor=5; //28BYJ48 In4

//variables motor

int motorSpeed = 8000; //variable para fijar la velocidad, A MAYOR VALOR GIRO MÁS LENTO

int stepCounter = 0; // contador para los pasos

int stepsPerRev = 4076; // pasos para una vuelta completa

float giros=0.2;

//secuencia media fase, el motor 28BYJ48 funciona correctament amb aquests valors

const int numSteps = 8;

const int stepsLookup[8] = { B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001 };

void setup() {

Serial.begin (9600); //Serial Port begin

pinMode(trigPin, OUTPUT); //Define inputs and outputs

pinMode(echoPin, INPUT);

pinMode(IN1_motor, OUTPUT);

pinMode(IN2_motor, OUTPUT);

pinMode(IN3_motor, OUTPUT);

pinMode(IN4_motor, OUTPUT);

}

void loop() {

leer_distancia();

if (cm < 15 && cm >0 ){ //algunos sensores a veces dan alguna lectura "0" de esta manera los salta

hacer_un_giro();

}

else{

}

}

void clockwise() //función giro horario

{

stepCounter++;

if (stepCounter >= numSteps) stepCounter = 0;

setOutput(stepCounter);

};

void anticlockwise() //función giro antihorario

{

stepCounter--;

if (stepCounter < 0) stepCounter = numSteps - 1;

setOutput(stepCounter);

}

void setOutput(int step) //función que envia órdenes al motor

{

digitalWrite(IN1_motor, bitRead(stepsLookup[step], 0));

digitalWrite(IN2_motor, bitRead(stepsLookup[step], 1));

digitalWrite(IN3_motor, bitRead(stepsLookup[step], 2));

digitalWrite(IN4_motor, bitRead(stepsLookup[step], 3));

};

//función hacer un giro

void hacer_un_giro(){ //cambiando la variable giros en el apartado variables motor se puede cambiar la amplitud del giro

for (int i = 0; i < stepsPerRev*giros ; i++)

{

clockwise();

delayMicroseconds(motorSpeed); //

}

//se podría activar que diera una vuelta en un sentido y otra al revés desbloqueando el siguiente for

/*for (int i = 0; i < stepsPerRev*giros ; i++)

{

anticlockwise();

delayMicroseconds(motorSpeed);

}*/

delay(10);

}

void leer_distancia(){

// The sensor is triggered by a HIGH pulse of 10 or more microseconds.

// Give a short LOW pulse beforehand to ensure a clean HIGH pulse:

digitalWrite(trigPin, LOW);

delayMicroseconds(10);

digitalWrite(trigPin, HIGH);

digitalWrite(trigPin, LOW);

// Read the signal from the sensor: a HIGH pulse whose

// duration is the time (in microseconds) from the sending

// of the ping to the reception of its echo off of an object.

pinMode(echoPin, INPUT);

duration = pulseIn(echoPin, HIGH);

// Convert the time into a distance

cm = (duration/2) / 29.1; // Divide by 29.1 or multiply by 0.0343

Serial.print(cm);// valor en cm

Serial.print("cm");

Serial.println();

delay(100);

}