Proyecto final Objeto Educativo con Arduino
Título | Proyecto final Objeto Educativo con Arduino |
---|---|
Tipo de Proyecto | Proyecto de Curso |
Palabras Clave | objetoeducativo |
Período | 2022-2022 |
Asignatura | Interacción y Performatividad |
Del Curso | Interacción y Performatividad 2022 |
Carreras | Diseño |
Alumno(s) | Javiera Ruiz, Maite Aranda, Luciana Jorquera |
Profesor | Renzo Varela |
Fundamento del proyecto
Este proyecto se origina desde la intención de enseñar a otras personas cómo utilizar Arduino como una herramienta que permita realizar proyectos utilizando dispositivos y componentes electrónicos.
Se utilizo un motor Nema que gira en 2 direcciones diferentes cada una con un pulsador, y un motor stepper 28byj-48 que se mueve en una sola dirección al ser activado con un pulsador.
Se utilizaron 3 inputs (pulsadores) y hay 2 outputs (2 motores)
Diseño del objeto
Registro Fotográfico de la maqueta
Video
Componentes del circuito
- Arduino UNO R3
- Fuente de poder con capacidad de transformar la corriente alterna (220V) a corriente continua (12V)
- Driver BL-TB6560-V2.0, funcionan como unión entre el arduino y el motor.
- Protoboard
- Motor stepper NEMA 23
- Motor stepper 28byj-48
- 3 pulsadores
- Resistencias, cableado
- Software Arduino, programación en lenguaje C++
Circuito
Código
#include <Stepper.h> // incluye libreria stepper float radio=3.5; // medida del radio del eje del motor en milimetros float distancia=100; // distancia de recorrido de la cuerda en milimetros float duracion=5; // tiempo del recorrido en segundos, 10 para enrollar y 10 para desenrollar //botones const int boton1 = 3; //definir valor del pin del boton1 const int boton2 = 4; //definir valor del pin del boton2 const int boton3 = 5; //definir valor del pin del boton3 int stateButton = 0; //definir estado del boton 1 int stateButton2 = 0; //definir estado del boton 2 int stateButton3 = 0; //definir estado del boton 3 Stepper motor1(2048, 8, 9, 10, 11); // pasos completos motor 1 const int stepPin = 6; // pin de conexion al arduino motor 2 const int dirPin = 12; // p in de conexion al arduino motor 2 const int enPin = 13; // pin de conexion al arduino motor 2 float unidadtiempo=(0.0455/radio); // constante dividida por el radio del eje del motor float total=(duracion/(0.0455/radio)); // tiempo dividido por unidadtiempo float perimetro=(2*PI*radio); // perimetro del espesor del eje del motor float calculo1=(distancia/perimetro); // calculo para saber cuantas vueltas debe dar el motor en una distancia determinada float calculo2=(calculo1*1600); // calculo 1 por 1600 (correspondiente a una vuelta del motor) void setup() { motor1.setSpeed(3); // valores de 1, 2 o 3 para el motor 28byj-48 pinMode(boton1, INPUT); pinMode(boton2, INPUT); pinMode(boton3, INPUT); pinMode(stepPin,OUTPUT); pinMode(dirPin,OUTPUT); pinMode(enPin,OUTPUT); digitalWrite(enPin,LOW); Serial.begin(9600); } void loop() { stateButton = digitalRead(boton1); stateButton2 = digitalRead(boton2); stateButton3 = digitalRead(boton3); //motor 28byj-48 if (stateButton == HIGH){ Serial.print("a"); motor1.step(2048); // cantidad de pasos delay(100); } //motor NEMA 23 //giro del motor al presionar el boton 1 if (stateButton2 == HIGH) { digitalWrite(dirPin,HIGH); // sentido de giro del motor a la derecha for(int x = 0; x < calculo2; x++) { // ciclo for para mantener la duracion del ciclo digitalWrite(stepPin,HIGH); delayMicroseconds(total); digitalWrite(stepPin,LOW); delayMicroseconds(total); } delay(10); // un segundo de retraso } //giro del motor al presionar el boton 2 if (stateButton3 == HIGH){ digitalWrite(dirPin,LOW); // sentido de giro del motor a la izquierda for(int x = 0; x < calculo2; x++) { digitalWrite(stepPin,HIGH); delayMicroseconds(total); digitalWrite(stepPin,LOW); delayMicroseconds(total); } delay(10); // un segundo de retraso } else{ digitalWrite(dirPin,LOW); digitalWrite(stepPin,LOW); } }
Código intervenido con explicaciones (en cursiva)
Los comentarios del código, relacionados a la misma línea de texto en la que se escriben, se indican con “//”
En esta sección del código, se definen variables y se declaran los pin en los que sé conectarán los cables que dirigen tanto a los botones, como a los motores
recuerda que si vas a utilizar variables diferentes a números enteros, debes iniciarlas con float
#include <Stepper.h> // incluye libreria stepper float radio=3.5; // medida del radio del eje del motor en milímetros float distancia=100; // distancia de recorrido de la cuerda en milímetros float duracion=5; // tiempo del recorrido en segundos, 5 para enrollar y 5 para desenrollar //botones const int boton1 = 3; //definir valor del pin del boton1 const int boton2 = 4; //definir valor del pin del boton2 const int boton3 = 5; //definir valor del pin del boton3 int stateButton = 0; //definir estado del boton 1 int stateButton2 = 0; //definir estado del boton 2 int stateButton3 = 0; //definir estado del boton 3 Stepper motor1(2048, 8, 9, 10, 11); // pasos completos motor 1 const int stepPin = 6; // pin de conexion al arduino motor 2 const int dirPin = 12; // pin de conexion al arduino motor 2 const int enPin = 13; // pin de conexion al arduino motor 2 float unidadtiempo=(0.0455/radio); //constante dividida por el radio del eje del motor float total=(duracion/(0.0455/radio)); //tiempo dividido por unidad tiempo float perimetro=(2*PI*radio); //perimetro del espesor del eje del motor float calculo1=(distancia/perimetro); // calculo para saber cuantas vueltas debe dar el motor en una distancia determinada float calculo2=(calculo1*1600); // calculo 1 por 1600 (correspondiente a una vuelta del motor) Las instrucciones escritas dentro de la sección “void setup()” se ejecutan una única vez, al iniciar el arduino.
En esta sección del código, se establecen las configuraciones de la placa, es decir, se definen los pines de entrada (input) o salida (output).También se configuran parámetros como velocidad o frecuencias. En este caso, se establece que los botones 1, 2 y 3 son input, y los motores son output. También se establece la velocidad con la que gira el motor 28byj-48
void setup() { motor1.setSpeed(3); // velocidad, valores de 1, 2 o 3 para el motor 28byj-48 pinMode(boton1, INPUT); pinMode(boton2, INPUT); pinMode(boton3, INPUT); pinMode(stepPin,OUTPUT); pinMode(dirPin,OUTPUT); pinMode(enPin,OUTPUT); digitalWrite(enPin,LOW); Serial.begin(9600); }
El código escrito dentro de la sección “void loop()” se ejecuta inmediatamente después de las sección “void setup()” de manera infinita, hasta que se interrumpe la alimentación del arduino. Esto significa, que el código se ejecuta completo desde la primera línea de código hasta la última, y una vez alcanzada esta, empieza nuevamente desde la primera línea de código, y así en un bucle.
void loop() { stateButton = digitalRead(boton1); //relación entre el estado del botón y el estado de presión del botón stateButton2 = digitalRead(boton2); stateButton3 = digitalRead(boton3); //programación motor 28byj-48 con librería stepper if (stateButton == HIGH){ //Si el boton1 esta presionado, se ejecutan las siguientes lineas de codigo Serial.print("a"); motor1.step(2048); // cantidad de pasos delay(100); }
Los condicionales if/else, son una estructura de control, que nos permite tomar ciertas decisiones en el desarrollo del código, es decir, nos permiten determinar qué acciones se ejecutan al existir o no cierta condición. Se comienza escribiendo el condicional if, luego entre paréntesis la condición, se abren las llaves, se escribe el código a ejecutar si la condición establecida anteriormente es verdadera y finalmente se cierran los paréntesis de llave. Else funciona de la misma manera, solo que se refiere a lo que ocurrirá si la condición definida por if es falsa.
La señal step (stepPin) produce un impulso corto que indica que el motor debe hacer un paso con una longitud y una dirección predefinidas. La señal direction (dirPin) determina la dirección del movimiento (por ejemplo, HIGH hacia adelante, LOW hacia atrás)
//programación del motor NEMA 23 //giro del motor al presionar el botón 1 if (stateButton2 == HIGH) { //Si el boton2 esta presionado, se ejecutan las siguientes lineas de codigo digitalWrite(dirPin,HIGH); // sentido de giro del motor a la derecha for(int x = 0; x < calculo2; x++) { // ciclo for para mantener la duracion del ciclo digitalWrite(stepPin,HIGH); delayMicroseconds(total); digitalWrite(stepPin,LOW); delayMicroseconds(total); } delay(10); // un segundo de retraso } //giro del motor al presionar el botón 2 if (stateButton3 == HIGH){ //Si el boton3 esta presionado, se ejecutan las siguientes lineas de codigo digitalWrite(dirPin,LOW); // sentido de giro del motor a la izquierda for(int x = 0; x < calculo2; x++) { // ciclo for para mantener la duracion del ciclo digitalWrite(stepPin,HIGH); delayMicroseconds(total); digitalWrite(stepPin,LOW); delayMicroseconds(total); } delay(10); // un segundo de retraso } else{ digitalWrite(dirPin,LOW); digitalWrite(stepPin,LOW); } }