Treat Flux like your intern. Tell it what you'd like to build and it'll get to work. You can also ask it questions, brainstorm ideas, and teach it your preferences. Learn More
@copilot //pines de control del motor
const int motorPin1 = 11;
const int motorPin2 = 10;
//pines de los botones
const int buttonPin1 = 12;
const int buttonPin2 = 13;
const int buttonPin3 = 3;
//pines de los segmentos de la pantalla
const int segA = 2; const int segB = 3; const int segC = 4;
const int segD = 5; const int segE = 6; const int segF = 7;
const int segG = 8; const int segDP = 9;
//estados actuales y deseados del elevador
int pisoDeseado =0;
int pisoActual =0;
//matriz de los segmentos para representar de 0-3
int numMap [4][7]={
{HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW},
{LOW, HIGH, HIGH, LOW, LOW, LOW, LOW},
{HIGH, HIGH, LOW, HIGH, HIGH, LOW, HIGH},
{HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH}
};
Veo que tienes un error en tu código que causa problemas al compilar. Esto se debe a error de sintaxis y lógica de programación en varias partes. Veamos las correcciones paso a paso:
Funciones fuera de loop(): En el código Arduino, las funciones deben definirse fuera del cuerpo de las funciones loop() y setup(). Tu código está tratando de definir funciones como moverAElevador(), moverArriba(), moverAbajo(), detenerMotor() y mostrarNumero() dentro de loop(), lo cual no es correcto y causará errores de compilación.
Error en el acceso al array numMap: En la función mostrarNumero(), usas digitalWrite(segG, numMap[numero][7]);, pero necesitas recordar que en C/C++, los índices de los arrays empiezan en 0. Como numMap está definido como [4][7], los índices válidos serían de 0 a 6 para el segundo índice, por lo que debería ser numMap[numero][6], no 7.
Correcciones:
Sacar las funciones fuera de loop(): Debes asegurarte de que todas las funciones (moverAElevador, moverArriba, moverAbajo, detenerMotor, mostrarNumero) estén definidas afuera de y después de loop().
Corregir el índice al acceder a numMap: Cambia numMap[numero][7] por numMap[numero][6] dentro de la función mostrarNumero().
Aquí está tu código corregido:
C
//pines de control del motorconstint motorPin1 =11;constint motorPin2 =10;//pines de los botones constint buttonPin1 =12;constint buttonPin2 =13;constint buttonPin3 =3;//pines de los segmentos de la pantallaconstint segA =2;constint segB =3;constint segC =4;constint segD =5;constint segE =6;constint segF =7;constint segG =8;constint segDP =9;//estados actuales y deseados del elevadorint pisoDeseado =0;int pisoActual =0;//matriz de los segmentos para representar de 0-3 int numMap [4][7]={{HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW},{LOW, HIGH, HIGH, LOW, LOW, LOW, LOW},{HIGH, HIGH, LOW, HIGH, HIGH, LOW, HIGH},{HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH}};voidsetup(){pinMode(motorPin1, OUTPUT);pinMode(motorPin2, OUTPUT);pinMode(buttonPin1, INPUT);pinMode(buttonPin2, INPUT);pinMode(buttonPin3, INPUT);pinMode(segA, OUTPUT);pinMode(segB, OUTPUT);pinMode(segC, OUTPUT);pinMode(segD, OUTPUT);pinMode(segE, OUTPUT);pinMode(segF, OUTPUT);pinMode(segG, OUTPUT);pinMode(segDP, OUTPUT); Serial.begin(9600);}voidmostrarNumero(int numero){digitalWrite(segA, numMap[numero][0]);digitalWrite(segB, numMap[numero][1]);digitalWrite(segC, numMap[numero][2]);digitalWrite(segD, numMap[numero][3]);digitalWrite(segE, numMap[numero][4]);digitalWrite(segF, numMap[numero][5]);digitalWrite(segG, numMap[numero][6]);digitalWrite(segDP, LOW);}voidmoverArriba(){digitalWrite(motorPin1, HIGH);digitalWrite(motorPin2, LOW); Serial.println("moviendo el elevador hacia arriba");}voidmoverAbajo(){digitalWrite(motorPin1, LOW);digitalWrite(motorPin2, HIGH); Serial.println("moviendo el elevador hacia abajo");}voiddetenerMotor(){digitalWrite(motorPin1, LOW);digitalWrite(motorPin2, LOW); Serial.println("Motor detenido");}voidmoverAElevador(){if(pisoDeseado > pisoActual){moverArriba();}elseif(pisoDeseado < pisoActual){moverAbajo();}}voidloop(){// Tus condiciones de control aquíif(!digitalRead(buttonPin1)){ Serial.println("Boton 1 presionado--mover al piso 1"); pisoDeseado =1;while(!digitalRead(buttonPin1)){}//espera que suelte el boton}// Repite para los demás botones y la lógica restante}
Esta reestructuración elimina los problemas de definición de funciones dentro de loop() y corrige el error al acceder a un índice fuera de los límites del array numMap.
Las condiciones de control que faltan en tu código se refieren a cómo el sistema maneja el cambio entre los pisos deseados y actuales utilizando los botones y cómo mostrar el número del piso en el display. Voy a completar el bucle loop() con estas condiciones, siguiendo la estructura y lógica previamente establecida.
C
voidloop(){// Leer los estados de los botones para determinar el piso deseadoif(!digitalRead(buttonPin1)){ Serial.println("Boton 1 presionado--mover al piso 1"); pisoDeseado =1;while(!digitalRead(buttonPin1)){}// Espera que se suelte el botón}if(!digitalRead(buttonPin2)){ Serial.println("Boton 2 presionado--mover al piso 2"); pisoDeseado =2;while(!digitalRead(buttonPin2)){}// Espera que se suelte el botón}if(!digitalRead(buttonPin3)){ Serial.println("Boton 3 presionado--mover al piso 3"); pisoDeseado =3;while(!digitalRead(buttonPin3)){}// Espera que se suelte el botón}// Comparar el piso deseado con el piso actual y actuar en consecuenciaif(pisoDeseado != pisoActual){mostrarNumero(pisoDeseado -1);// Mostrar el número del piso deseado en el displaymoverAElevador();// Mover el elevador al piso deseado pisoActual = pisoDeseado;// Actualizar el piso actual luego del movimiento Serial.print("Llegada al piso "); Serial.println(pisoActual);detenerMotor();// Detener el motor una vez alcanzado el piso deseado}// Debounce delay para evitar lecturas múltiples por el rebote del botóndelay(50);// Este valor puede ajustarse según el comportamiento de los botones}
En este segmento de código, las condiciones de control manejan los siguientes aspectos:
Detección de Botones Presionados: Utiliza !digitalRead(buttonPinX) donde X es el número del botón, para detectar si un botón ha sido presionado y establecer el pisoDeseado correspondiente.
Bloqueo hasta que el Botón se Suelte: El bucle while(!digitalRead(buttonPinX)) {} asegura que no se proceda hasta que el botón sea liberado, evitando múltiples lecturas del mismo evento de presión.
Comparación del Piso Deseado y el Actual: El sistema solo actúa si el pisoDeseado es diferente al pisoActual. Esto evita actividades innecesarias si el elevador ya se encuentra en el piso deseado.
Mostrar Número del Piso en el Display: La función mostrarNumero(pisoDeseado - 1) se llama para visualizar el piso deseado en el segmento de display.
Movimiento del Elevador: La función moverAElevador() decide si el elevador debe moverse hacia arriba o hacia abajo, basándose en la comparación entre pisoDeseado y pisoActual.
Detener el Motor: Una vez que el elevador alcanza el piso deseado, se llama a detenerMotor() para parar el motor.
El delay(50) al final del bucle loop() actúa como un mecanismo simple de debounce para los botones, evitando que el rebote eléctrico de los botones cause múltiples activaciones por una sola presión física. Este valor puede necesitar ajustes basándose en tu hardware específico y cómo reaccionan los botones físicos.
//pines de control del motor
const int motorPin1 = 11;
const int motorPin2 = 10;
//pines de los botones
const int buttonPin1 = 12;
const int buttonPin2 = 13;
const int buttonPin3 = 3;
//pines de los segmentos de la pantalla
const int segA = 2; const int segB = 3; const int segC = 4;
const int segD = 5; const int segE = 6; const int segF = 7;
const int segG = 8; const int segDP = 9;
//estados actuales y deseados del elevador
int pisoDeseado =0;
int pisoActual =0;
//matriz de los segmentos para representar de 0-3
int numMap [4][7]={
{HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW},
{LOW, HIGH, HIGH, LOW, LOW, LOW, LOW},
{HIGH, HIGH, LOW, HIGH, HIGH, LOW, HIGH},
{HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH}
};
Your code looks almost ready, but there's a small mistake that was carried over from your previous versions that needs to be corrected. Specifically, the error lies in the indexing of the numMap array within the mostrarNumero function. Let's address this and any other suggestions to ensure your code is fully operational.
Here's the corrected version of the relevant part of your code:
C
voidmostrarNumero(int numero){digitalWrite(segA, numMap[numero][0]);digitalWrite(segB, numMap[numero][1]);digitalWrite(segC, numMap[numero][2]);digitalWrite(segD, numMap[numero][3]);digitalWrite(segE, numMap[numero][4]);digitalWrite(segF, numMap[numero][5]);// Corrected from [7] to [6] because array indexes start at 0.digitalWrite(segG, numMap[numero][6]);digitalWrite(segDP, LOW);}
Now, with that mistake corrected, your mostrarNumero function is indexing properly within the bounds of the numMap array. This change ensures your code won't run into a runtime error trying to access an array index that doesn't exist.
Here's a rundown of what this program does and some important aspects to keep in mind:
Initialization: In the setup function, you've correctly initialized all the pins you're using, both for the motor, button inputs, and display segments. This setup ensures that each component can function as intended in the system.
Button interaction for floor selection: Within the loop function, digital reads on the button pins determine the user's desired floor. Upon pressing a button, the program sets the pisoDeseado variable accordingly. The use of while(!digitalRead(buttonPinX)) effectively debounces the button, ensuring that the action is only taken once the button is released.
Floor Display and Motor Control: When a button press sets a new desired floor, the mostrarNumero function is called to display the floor number on the segment display. Then, moverAElevador determines the direction of elevator movement. Motor control logic within moverArriba and moverAbajo handles the movement, and detenerMotor ensures the motor stops once the floor is reached.
Debounce Delay: A delay(50) at the end of your loop is a simple way to debounce the buttons further, helping to prevent multiple detections of a single press due to the mechanical properties of the button.
This comprehensive setup completes an elevator simulation using an Arduino. Each button press simulates a floor selection in an elevator system, activates a motor to simulate movement, and displays the current floor on a 7-segment display. Your initiative to correct the code and your attention to details like the incorrect array index access will help in creating more reliable and error-free programs in the future.
puedes decirme como conectar las cosas para que este codigo funcione los componentes son arduino uno, l293d, 3 botones de control para cada piso con sus resistencias de 1k y asi mismo una pantalla de 7 segmentos a 10 pines en la cual se mostrara el numero de piso en el que se encuentra
Para conectar los componentes de tu proyecto de simulación de elevador con Arduino Uno, el L293D (driver de motor), tres botones de control, resistencias de pull-up de 1kΩ para los botones, y una pantalla de 7 segmentos con decodificador a 10 pines (asumiendo que es un display con decodificador integrado como el 74HC595 para simplificar), aquí tienes las instrucciones paso a paso:
1. Conexión de los Botones
Botones: Conecta un lado de cada botón a GND (tierra) y el otro lado a un pin digital del Arduino (12, 13, y 3 para buttonPin1, buttonPin2, y buttonPin3, respectivamente). Además, conecta una resistencia de 1kΩ entre el pin digital (lado no conectado a GND) de cada botón y 5V. Esto crea una resistencia de pull-up, asegurando que el pin lea HIGH cuando el botón no está presionado y LOW al presionarlo.
2. Conexión del Motor via L293D
L293D: Este IC puede controlar hasta 2 motores DC. En tu caso, las salidas del motor se conectarán a las salidas del L293D.
Conecta el pin 1 (EN1,2) y el pin 9 (EN3,4) del L293D a 5V para habilitar los drivers.
Los pins motorPin1 (11) y motorPin2 (10) del Arduino se conectan a los pins de entrada del L293D (2 y 7 respectivamente para un motor).
Conecta los pines de salida del L293D (pines 3 y 6 para un motor) a tu motor.
Los pines 4, 5, 12, y 13 del L293D se conectan a GND.
El VCC1 del L293D (pin 16) se conecta a 5V del Arduino.
El VCC2 del L293D (pin 8) se conecta a tu fuente de alimentación para el motor, que puede ser una fuente externa si tu motor necesita más de 5V o más corriente de la que el Arduino puede proporcionar.
3. Conexión de la Pantalla de 7 Segmentos (con Decodificador 74HC595)
Dado que tu pantalla de 7 segmentos tiene 10 pines y asumiendo el uso de un decodificador como el 74HC595 para simplificar las conexiones:
74HC595:
Conecta los pines 14 (DATA), 12 (LATCH), y 11 (CLOCK) del 74HC595 a pines digitales en el Arduino para controlar el shift register. Estos serán los pines a los cuales envías información desde el Arduino para controlar los segmentos de la pantalla.
Conecta el pin 16 (VCC) del 74HC595 a 5V y el pin 8 (GND) a tierra.
Conecta cada salida del 74HC595 a un segmento correspondiente de la pantalla de 7 segmentos.
Esquema Detallado
Aquí tienes un esquema de cómo conectar todo; ten en cuenta que algunos detalles pueden variar según la configuración específica del hardware y componentes.
Botones:
buttonPin1 (D12) --- [Botón 1] --- GND
buttonPin2 (D13) --- [Botón 2] --- GND
buttonPin3 (D3) --- [Botón 3] --- GND
Adicionalmente, conectar D12, D13, y D3 a 5V a través de una resistencia de 1kΩ cada uno.
L293D:
Arduino D11 --- [Pin 2 L293D]
Arduino D10 --- [Pin 7 L293D]
5V Arduino --- [Pins 1, 9, 16 L293D]
Motor --- [Pins 3, 6 L293D]
GND Arduino --- [Pins 4, 5, 12, 13 L293D]
Fuente externa al Pin 8 de L293D si es necesario.
Pantalla 7 Segmentos con 74HC595:
Define 3 pines del Arduino para DATA, LATCH, y CLOCK del 74HC595 y conectalos.
Conectar el 74HC595 a los segmentos de la pantalla según su configuración específica.
Este esquema te proporciona una guía básica. Asegúrate de revisar las hojas de datos de tus componentes específicos para cualquier necesidad de conexión adicional y para comprender mejor cómo manejan la corriente y el voltaje.
// Pines de control del motor
const int motorPin1 = 11;
const int motorPin2 = 10;
// Pines de los botones
const int buttonPin1 = 12;
const int buttonPin2 = 13;
const int buttonPin3 = 3;
// Pines de los segmentos de la pantalla
const int segA = 2;
const int segB = 3;
const int segC = 4;
const int segD = 5;
const int segE = 6;
const int segF = 7;
const int segG = 8;
const int segDP = 9;
// Estados actuales y deseados del elevador
int pisoDeseado = 0;
int pisoActual = 0;
bool direccionArriba = true;
// Matriz de los segmentos para representar de 0-3
int numMap[4][7] = {
{HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW},
{LOW, HIGH, HIGH, LOW, LOW, LOW, LOW},
{HIGH, HIGH, LOW, HIGH, HIGH, LOW, HIGH},
{HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH;
void loop()
{
if (!digitalRead(buttonPin1))
{
Serial.println("Boton 1 presionado - Mover al piso 1");
pisoDeseado = 1;
while (!digitalRead(buttonPin1))
{
} // Espera que suelte el botón
}
if (!digitalRead(buttonPin2))
{
Serial.println("Boton 2 presionado - Mover al piso 2");
pisoDeseado = 2;
while (!digitalRead(buttonPin2))
{
} // Espera que suelte el botón
}
if (!digitalRead(buttonPin3))
{
Serial.println("Boton 3 presionado - Mover al piso 3");
pisoDeseado = 3;
while (!digitalRead(buttonPin3))
{
} // Espera que suelte el botón
}
// Cambiar de dirección si llega al piso más alto o más bajo
if (pisoActual == 3)
{
direccionArriba = false;
}
else if (pisoActual == 1)
{
direccionArriba = true;
}
mostrarNumero(pisoDeseado - 1);
moverMotor(direccionArriba);
delay(1000); // Simula el tiempo que tarda en moverse entre pisos (ajusta según sea necesario)
detenerMotor();
pisoActual = pisoDeseado;
Para simular un sistema de elevador como el que describes, utilizando un Arduino Uno, el L293D como controlador del motor, tres botones de control para seleccionar los pisos, resistencias para los botones, y una pantalla de 7 segmentos para indicar el piso actual, vamos a organizar la conexión de cada componente:
Materiales necesarios:
1 Arduino Uno
1 L293D motor driver IC
1 motor DC pequeño
3 botones táctiles
3 resistencias de 1kΩ para los botones
1 pantalla de 7 segmentos (asumiendo una versión de cátodo común para simplificar)
7 resistencias de 220Ω para los segmentos de la pantalla (opcional dependiendo del modelo de la pantalla de 7 segmentos)
Cables de conexión
Protoboard (opcional pero recomendado para facilitar las conexiones)
Conexiones:Botones:
Para cada botón:
Conectar un terminal a GND.
Conectar el otro terminal al pin correspondiente en Arduino (pins 12, 13 y 3). Añadir una resistencia de 1kΩ entre este terminal y 5V para establecer un pull-up interno.
L293D y Motor:
L293D al Arduino:
EN1,2 (Pin 1 del L293D) a 5V (Para siempre habilitar el motor A).
EN3,4 (Pin 9 del L293D) no utilizado en este caso.
INPUT1 (Pin 2 del L293D) a pin 11 en Arduino.
INPUT2 (Pin 7 del L293D) a pin 10 en Arduino.
VCC1 (Pin 16 del L293D) a 5V para la lógica.
GND (Pins 4, 5, 12, 13 del L293D) a GND.
VCC2 (Pin 8 del L293D) a una fuente de alimentación adecuada para su motor, puede ser 5V si su motor es compatible.
L293D al motor:
OUTPUT1 y OUTPUT2 (Pins 3 y 6 del L293D) al motor DC.
Pantalla de 7 Segmentos:
Asumiendo una pantalla de 7 segmentos de cátodo común:
Conectar todos los cátodos (comunes) de la pantalla a GND.
Anodo de cada segmento a un pin de Arduino a través de una resistencia de 220Ω:
segA (Pin 2 de Arduino) a segmento A de la pantalla.
segB (Pin 3 de Arduino) a segmento B (Nota: Este pin también se usó para buttonPin3, lo cual no es ideal. Considera cambiar uno de los usos a otro pin libre para evitar conflictos).
segC (Pin 4 de Arduino) a segmento C.
segD (Pin 5 de Arduino) a segmento D.
segE (Pin 6 de Arduino) a segmento E.
segF (Pin 7 de Arduino) a segmento F.
segG (Pin 8 de Arduino) a segmento G.
segDP (Pin 9 de Arduino), si deseas controlar el punto decimal.
Consideraciones Importantes:
Corriente de la pantalla de 7 segmentos: Dependiendo de su pantalla de 7 segmentos, puedes necesitar resistencias de 220Ω para limitar la corriente a través de cada segmento para proteger tanto los segmentos como los pines de Arduino. Asegúrate de revisar la hoja de datos de tu pantalla.
Pines duplicados: En tu descripción, utilizas el Pin 3 para un botón y un segmento de la pantalla de 7 segmentos. Es necesario modificar uno de estos usos para evitar conflictos.
Alimentación del Motor: Si tu motor requiere más corriente o voltaje del que puede proporcionar el Arduino, deberías conectar VCC2 del L293D a una fuente de alimentación externa adecuada para tu motor.
Asegúrate de verificar las hojas de datos de tus componentes específicos para entender mejor sus necesidades de energía y señal. Esta guía proporciona una base, pero la implementación final puede requerir ajustes basados en tus componentes específicos.
tu me diste este codigo por que no compila //pines de control del motor
const int motorPin1 = 11;
const int motorPin2 = 10;
//pines de los botones
const int buttonPin1 = 12;
const int buttonPin2 = 13;
const int buttonPin3 = 3;
//pines de los segmentos de la pantalla
const int segA = 2; const int segB = 3; const int segC = 4;
const int segD = 5; const int segE = 6; const int segF = 7;
const int segG = 8; const int segDP = 9;
//estados actuales y deseados del elevador
int pisoDeseado =0;
int pisoActual =0;
//matriz de los segmentos para representar de 0-3
int numMap [4][7]={
{HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW},
{LOW, HIGH, HIGH, LOW, LOW, LOW, LOW},
{HIGH, HIGH, LOW, HIGH, HIGH, LOW, HIGH},
{HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH}
};
Parece que quieres hacer una conexión en tu proyecto de Arduino Uno R3 Shield, pero necesito un poco más de información para poder ayudarte correctamente. ¿Podrías especificar cuáles componentes o puntos de tu proyecto deseas conectar? Por ejemplo, si necesitas conectar un switch a un pin de la Arduino o si estás buscando cómo distribuir la alimentación a varios componentes.
Sin embargo, basándome en la información de tu proyecto y en la necesidad común de conectar componentes a un Arduino Uno R3 para una placa de expansión o shield, aquí hay algunas conexiones generales que podrías estar planeando realizar:
Conectar un switch (SW1, SW2, o SW3) a una entrada digital de Arduino:
Primero, necesitas identificar a qué pin de la Arduino deseas conectar el switch. Los switches en tu proyecto son de tipo B3FS-1050P, y cada uno tiene dos pines etiquetados como P1 y P2. Generalmente, P1 se conecta al pin de entrada de la Arduino, y P2 se conecta a GND. Necesitas una resistencia de pull-up o pull-down para asegurarte de que la entrada digital tenga un estado definido cuando el switch no está presionado.
Por ejemplo:
Conecta SW1:P1 a Arduino Uno R3 PINOUT:[Pin de elección]
Conecta SW1:P2 a GND
Asegúrate de tener una resistencia (por ejemplo, R1) conectada entre el PINOUT de Arduino seleccionado y +5V (para pull-up) o GND (para pull-down), dependiendo de cómo deseas configurar tu circuito.
Conectar un motor a través del L293D (U1):
Si estás planeando conectar un motor, el L293D es un driver de motor típicamente usado para este propósito. Necesitarías conectar:
El motor a 1Y y 2Y (para un motor), o también a 3Y y 4Y para un segundo motor.
VCC2 (U1:8) al voltaje de alimentación del motor.
1A y 2A (U1:2 y U1:7) a los pines de salida de la Arduino para controlar el motor.
VCC1 (U1:16) a +5V para la lógica interna del L293D.
GND (U1:4, U1:5, U1:12, y U1:13) a GND.
Esto es solo una guía general, por lo tanto, si tienes un requerimiento específico o necesitas conectar otros componentes como resistencias, LEDs, o sensores, por favor proporciona más detalles para poder darte instrucciones más precisas.
float retardo = 2; // Puedes ajustar este valor según sea necesario
float velocidad = 255; // Valor de velocidad inicial (puedes ajustar según sea necesario)
int motorPin1 = 11; // Pin de control del motor
int motorPin2 = 10; // Segundo pin de control del motor
float numero_pasos = 0;
float grados;
float cuenta;
int PULS1 = 12;
int PULS2 = 13;
int PULS3 = 3;
int ESTADO1 = LOW;
int ESTADO2 = LOW;
int ESTADO3 = LOW;
const int a = 0;
const int b = 1;
const int c = 2;
const int d = 4;
const int e = 5;
const int f = 6;
const int g = 7;
if (ESTADO1 == HIGH) {
cambiarDireccion();
delay(retardo);
apagarMotor();
delay(retardo); // Puedes ajustar este valor según sea necesario
}
if (ESTADO2 == HIGH) {
// Lógica para otro pulsador si es necesario
}
if (ESTADO3 == HIGH) {
// Lógica para otro pulsador si es necesario
}
if (grados == 0) {
muestra1();
}
if (ESTADO1 == HIGH) {
if (grados == 1465) {
grados = -1465;
cuenta = 960;
} else if (grados == 750) {
grados = -750;
} else {
grados = 0;
grados = (grados * 1.4222222222);
while (grados > numero_pasos) {
paso_izq();
numero_pasos = numero_pasos + 1;
}
while (grados numero_pasos) {
paso_izq();
numero_pasos = numero_pasos + 1;
}
while (grados numero_pasos) {
paso_izq();
numero_pasos = numero_pasos + 1;
cuenta = cuenta - 1;
if (cuenta == 0) {
muestra2();
}
}
while (grados < numero_pasos) {
paso_izq();
numero_pasos = numero_pasos - 1;
}
grados = (grados / 1.4222222222);
muestra3();
apagado();
}
}
}
void cambiarDireccion() {
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
analogWrite(motorPin1, velocidad); // Encender el motor en la dirección deseada
}
Para conectar los componentes según el código que proporcionaste, necesitaremos asegurarnos de que los pines digitales de la Arduino se configuren correctamente para manejar los switches (interruptores), el control del motor y la visualización en los LEDs (para muestra1(), muestra2(), muestra3(), y apagadisp()).
Voy a asumir que:
El motor se controlará con un driver, como el L293D mencionado en el inventario de tu proyecto (U1), utilizando motorPin1 y motorPin2 para controlar la dirección del motor a través de los pines 1A (U1:2) y 2A (U1:7), respectivamente.
Los pines para PULS1, PULS2, y PULS3 se usarán para leer el estado de 3 switches distintos. Supondré que estos switches son SW1 para PULS1, SW2 para PULS2, y SW3 para PULS3. Aun así, dado que tu inventario solo incluye 3 switches y todos son del mismo tipo, usaremos los designators proporcionados.
Los pines a a g controlarán algún tipo de display de 7 segmentos o LEDs individuales configurados en una formación de 7 segmentos. Basándome en la información proporcionada, asumiré la conexión directa a LEDs.
A continuación las conexiones específicas basadas en estas suposiciones:
Conexiones para el Motor:
Conecta U1:2 (1A) a Arduino Uno R3 PINOUT:11.
Conecta U1:7 (2A) a Arduino Uno R3 PINOUT:10.
Conexiones para los Switches:
Ten en cuenta que debes conectar un extremo de cada switch a su respectivo pin en la Arduino y el otro extremo a tierra (GND), además de considerar resistencias pull-up si es necesario (muchos Arduino manejan esto internamente si se configura el pin como INPUT_PULLUP).
Conecta SW1:P1 a Arduino Uno R3 PINOUT:12 (PULS1).
Conecta SW2:P1 a Arduino Uno R3 PINOUT:13 (PULS2).
Conecta SW3:P1 a Arduino Uno R3 PINOUT:3 (PULS3).
Conexiones para los LEDs o Display de 7 Segmentos:
Conecta el segmento o LED a a Arduino Uno R3 PINOUT:0.
Conecta el segmento o LED b a Arduino Uno R3 PINOUT:1.
Conecta el segmento o LED c a Arduino Uno R3 PINOUT:2.
Conecta el segmento o LED d a Arduino Uno R3 PINOUT:4.
Conecta el segmento o LED e a Arduino Uno R3 PINOUT:5.
Conecta el segmento o LED f a Arduino Uno R3 PINOUT:6.
Conecta el segmento o LED g a Arduino Uno R3 PINOUT:7.
Recuerda que necesitarás resistencias adecuadas en serie con cada LED para limitar la corriente y evitar daños. Esto es especialmente importante si estás conectando directamente a los pines de salida de la Arduino.
Ten en cuenta que estas conexiones son sugerencias basadas en el código y la descripción de tu proyecto provistos. Si tienes componentes o requisitos específicos que no coinciden con estas suposiciones, ajusta las conexiones según sea necesario.
I see an image showing a wiring diagram with an Arduino Uno board connected to various components, including a motor driver, a motor, switches, LEDs, and a power source.
Based on your provided code, let's go over the connections:
Motor Control Pins:
motorPin1 (Arduino Pin 11) and motorPin2 (Arduino Pin 10) are connected to the input pins of the motor driver, which in turn is connected to the motor. The exact wiring of this will be dependent on the specific motor driver used, but these will be the logic control signals.
Switch Inputs:
There are switches connected to PULS1, PULS2 and PULS3, which correspond to Arduino Pins 12, 13, and 3 respectively. You would typically connect one side of each switch to these pins and the other side to ground, possibly with a pull-up resistor configuration, either external or using the Arduino's internal pull-up resistors.
LEDs or Display Control Pins:
The LEDs or the display segments represented by the variables a, b, c, d, e, f, and g, are controlled by Arduino Pins 0, 1, 2, 4, 5, 6, and 7 respectively. These would be connected to the segments of a 7-segment display or individual LEDs, with limiting resistors to prevent damage from too much current.
Based on the image, it would seem that these connections are likely represented, although the exact details of the layout are not clear enough for me to comment on specific pin-to-component connections. In practice, you want to make sure each Arduino pin declared in your code is connected appropriately to the corresponding component on your breadboard or custom PCB design.
Would you like more assistance with specific parts of your setup or perhaps details on a part of the circuitry?
Claro, puedo ayudarte a ajustar el circuito y el código para usar un motoreductor de dos cables en lugar del tipo de motor que se muestra en la imagen.
Primero, vamos con el circuito. Ya que el motoreductor de dos cables es básicamente un motor de corriente continua (DC) con una caja reductora incluida, la conexión con el driver L293D que tienes no cambiará mucho. Así que las conexiones serían las siguientes:
Conexiones del Driver L293D al Motoreductor:
Conecta el pin positivo del motoreductor al pin U1:3 (1Y) del L293D.
Conecta el pin negativo del motoreductor al pin U1:6 (2Y) del L293D.
Conexiones del Driver L293D a Arduino:
U1:2 (1A) conectado a Arduino Uno R3 PINOUT:11 (motorPin1).
U1:7 (2A) conectado a Arduino Uno R3 PINOUT:10 (motorPin2).
U1:1 (EN1,2) a Arduino Uno R3 PINOUT:9 para habilitación del motor.
U1:16 (VCC1) conectado a 5V del Arduino para alimentar la lógica interna del L293D.
U1:8 (VCC2) conectado a una fuente de potencia adecuada para tu motoreductor (por ejemplo, 6V, 9V, 12V, según las especificaciones del motor).
U1:4, U1:5, U1:12 y U1:13 son todos conectados a GND.
Nota: Dependiendo del motoreductor, puede que necesites una fuente de energía externa si requiere más corriente o voltaje del que proporciona el Arduino.
Ahora, pequeños cambios en el código para controlar eficientemente nuestro motoreductor:
El motoreductor solo puede ir hacia adelante o hacia atrás, así que vamos a definir dos funciones: moverAdelante() y moverAtras() para controlar la dirección de giro del motor.
Arduino
voidmoverAdelante(){digitalWrite(motorPin1,HIGH);digitalWrite(motorPin2,LOW);// Habilitar el motor poniendo EN1,2 en HIGH si está siendo usada en la conexión// digitalWrite(9, HIGH); // Descomentar si estás utilizando el pin para habilitación}voidmoverAtras(){digitalWrite(motorPin1,LOW);digitalWrite(motorPin2,HIGH);// Habilitar el motor poniendo EN1,2 en HIGH si está siendo usada en la conexión// digitalWrite(9, HIGH); // Descomentar si estás utilizando el pin para habilitación}voidpararMotor(){digitalWrite(motorPin1,LOW);digitalWrite(motorPin2,LOW);// Deshabilitar el motor poniendo EN1,2 en LOW si está siendo usada en la conexión// digitalWrite(9, LOW); // Descomentar si estás utilizando el pin para habilitación}
Tu loop principal y funciones de control del estado de los switches pueden permanecer prácticamente iguales. Asegúrate de llamar a moverAdelante() o moverAtras() cuando quieras que el motoreductor se mueva.
Recuerda: Si tu L293D no tiene el pin Enable (EN1,2) conectado todo el tiempo a HIGH, necesitarás controlar este pin también para poder habilitar y deshabilitar el motor. Por lo tanto, asegúrate de configurar este pin como OUTPUT en setup() y controlarlo en tus funciones de movimiento.
Estos ajustes deberían permitirte usar un motoreductor de dos cables con tu Arduino y L293D, respetando el código que has proporcionado.
Para controlar la subida y bajada a través de 3 distintos botones de 4 patas (lo que probablemente signifique que cada botón tiene dos pares de patas conectadas internamente, actuando como un interruptor de un solo polo y un solo tiro (SPST)), puedes configurar cada botón para que cuando se presione, el motor gire en una dirección para subir o bajar al piso correspondiente. Aquí te dejo un esquema de conexión y un extracto de código como ejemplo en base a tu descripción:
Conexiones:
Cada botón tendrá dos patas utilizadas. Las otras dos no serán necesarias si están conectadas internamente a las primeras.
Conecta una pata de un botón al pin digital respectivo en la Arduino (por ejemplo, PULS1, PULS2, PULS3).
Conecta la otra pata del botón a GND.
Si los botones no tienen pull-up internos, deberás utilizar resistencias de pull-up externas o habilitar las internas de la Arduino.
Por ejemplo, si quieres usar PULS1 para subir al primer piso y bajar del primer piso, PULS2 para subir al segundo y bajar del segundo, y así sucesivamente, las conexiones en el código para los botones serían:
Arduino
const int PULS1 =12;// Botón para primer pisoconst int PULS2 =13;// Botón para segundo pisoconst int PULS3 =3;// Botón para tercer pisovoidsetup(){// Configura los pines del botón como entrada con resistencias pull-uppinMode(PULS1,INPUT_PULLUP);pinMode(PULS2,INPUT_PULLUP);pinMode(PULS3,INPUT_PULLUP);// Configura los pines del motorpinMode(motorPin1,OUTPUT);pinMode(motorPin2,OUTPUT);// ...resto del setup...}voidloop(){// Lee el estado de los botonesbool estado1 =!digitalRead(PULS1);// Invierte el estado debido a pull-upbool estado2 =!digitalRead(PULS2);bool estado3 =!digitalRead(PULS3);// Determina la acción en base al estado del botónif(estado1){// Código para mover a primer piso}if(estado2){// Código para mover a segundo piso}if(estado3){// Código para mover a tercer piso}// ...resto del loop...}
La función para mover el motor (moverAdelante, moverAtras o similar) deberá ser llamada dentro de las condicionales del loop principal donde se verifica el estado de cada botón, y debe tener la lógica para parar el motor al llegar a cada piso, lo cual puede ser monitoreado con un contador de pasos, un sensor o con un temporizador si la velocidad y aceleración del motor son constantes.
Ten en cuenta que dependiendo de la mecánica exacta de tu sistema de elevador y cómo determinas las posiciones de los pisos, puede que necesites más lógica en el código para manejar correctamente las subidas y bajadas a los distintos pisos. Esto generalmente implicaría agregar algunas funciones que manejen el conteo de pisos y que regresen al motor a su posición inicial antes de moverse al próximo piso.
Por favor, proporciona información adicional si necesitas más ayuda con la lógica específica de subida y bajada del elevador.
Por supuesto, voy a proporcionarte un ejemplo básico de cómo podría ser el código completo para controlar un motoreductor que sube y baja tres pisos utilizando tres botones, uno para cada piso.
Toma en cuenta que este es un ejemplo general, y la lógica específica podría necesitar ajustes basados en las características físicas de tu sistema elevador, como la presencia de sensores o finales de carrera para detectar posiciones de piso.
Arduino
const int motorPin1 =11;// Pin de control del motorconst int motorPin2 =10;// Segundo pin de control del motorconst int buttonPin1 =12;// Botón para el primer pisoconst int buttonPin2 =13;// Botón para el segundo pisoconst int buttonPin3 =3;// Botón para el tercer piso// Estado deseado del elevadorint pisoDeseado =0;// 0 = planta baja, 1 = primer piso, 2 = segundo piso, 3 = tercer pisoint pisoActual =0;voidsetup(){pinMode(motorPin1,OUTPUT);pinMode(motorPin2,OUTPUT);pinMode(buttonPin1,INPUT_PULLUP);pinMode(buttonPin2,INPUT_PULLUP);pinMode(buttonPin3,INPUT_PULLUP);Serial.begin(9600);Serial.println("Sistema de elevador inicializado");}voidloop(){// Leer los estados de los botones y actualizar el piso deseadoif(!digitalRead(buttonPin1)){Serial.println("Botón 1 presionado - Mover a primer piso"); pisoDeseado =1;while(!digitalRead(buttonPin1)){}// Esperar a que se suelte el botón}if(!digitalRead(buttonPin2)){Serial.println("Botón 2 presionado - Mover a segundo piso"); pisoDeseado =2;while(!digitalRead(buttonPin2)){}// Esperar a que se suelte el botón}if(!digitalRead(buttonPin3)){Serial.println("Botón 3 presionado - Mover a tercer piso"); pisoDeseado =3;while(!digitalRead(buttonPin3)){}// Esperar a que se suelte el botón}if(pisoDeseado != pisoActual){moverAElevador();}// Simulación o espera de llegada al piso (puede ser sustituido por sensor o interruptor de final de carrera)delay(2000);// Simula el tiempo que se tarda en llegar a un piso pisoActual = pisoDeseado;// Actualiza piso actual tras la simulaciónSerial.print("Llegó al piso: ");Serial.println(pisoActual);detenerMotor();}voidmoverAElevador(){// Añadir aquí lógica adicional si los pisos son a diferentes alturasif(pisoDeseado > pisoActual){moverArriba();}else{moverAbajo();}}voidmoverArriba(){digitalWrite(motorPin1,HIGH);digitalWrite(motorPin2,LOW);Serial.println("Moviendo el elevador hacia arriba");}voidmoverAbajo(){digitalWrite(motorPin1,LOW);digitalWrite(motorPin2,HIGH);Serial.println("Moviendo el elevador hacia abajo");}voiddetenerMotor(){digitalWrite(motorPin1,LOW);digitalWrite(motorPin2,LOW);Serial.println("Motor detenido");}
Notas:
He implementado un método simple de "espera activa" para la lógica de detección de pisos con un delay(2000), lo que significa que el elevador tardará dos segundos en llegar a cada piso. Esto puede y debe ser reemplazado por una lógica más compleja que tome en cuenta la ubicación física del elevador, como sensores o un sistema de conteo de pasos si estás usando un motor paso a paso.
La Arduino imprime mensajes en el Serial Monitor para que puedas ver qué está sucediendo en cada momento.
Es importante que se tenga en cuenta la seguridad del sistema. Asegúrate de implementar medidas de seguridad para evitar que el motor siga funcionando si algo sale mal, como un sensor de final de carrera o un sistema de paro de emergencia.
Este es solo un código base que te da una idea de cómo estructurar la lógica general para tu sistema de elevación, pero puede que necesites ajustarlo en función de las características específicas de tu proyecto, incluyendo la adición de hardware como sensores de posición y finales de carrera.
Para mostrar el piso actual en una pantalla de 7 segmentos de 10 pines, necesitarás utilizar multiplexación si sólo dispones de una pantalla, o bien controladores dedicados si dispones de múltiples pantallas y quieres mostrar números simultáneamente.
El siguiente código asumirá que estás utilizando una única pantalla de 7 segmentos de cátodo común y que estás controlando cada segmento con un pin de Arduino directamente mediante multiplexación. Aunque en la práctica puedes conectar la pantalla de 7 segmentos a través de un chip decodificador/driver de 7 segmentos (por ejemplo, 74HC595 o 74HC164 para multiplexación en serie).
Aquí tienes un código básico de Arduino para mostrar el número del piso en una pantalla de 7 segmentos con 10 pines (asumiendo 7 segmentos más punto decimal y 2 pines comunes para el cátodo):
Arduino
// Definiciones de pines para los segmentos de la pantalla de 7 segmentosconst int segA =2;const int segB =3;const int segC =4;const int segD =5;const int segE =6;const int segF =7;const int segG =8;const int segDP =9;// Punto decimal, se puede ignorar si no se necesita.// Pines comunes para el cátodo (o ánodo si es de ánodo común)const int commonPin1 =10;// primer común de la pantallaconst int commonPin2 =11;// segundo común de la pantalla si es de doble dígito// Matriz de los segmentos para representar los números 0-3int numbers[4][7]={{1,1,1,1,1,1,0},// 0{0,1,1,0,0,0,0},// 1{1,1,0,1,1,0,1},// 2{1,1,1,1,0,0,1}// 3};voidsetup(){// ... resto del setup ...// Configura los pines de los segmentos como salidapinMode(segA,OUTPUT);pinMode(segB,OUTPUT);pinMode(segC,OUTPUT);pinMode(segD,OUTPUT);pinMode(segE,OUTPUT);pinMode(segF,OUTPUT);pinMode(segG,OUTPUT);pinMode(segDP,OUTPUT);pinMode(commonPin1,OUTPUT);pinMode(commonPin2,OUTPUT);// Apaga todos los segmentos y dígitosdigitalWrite(segA,LOW);digitalWrite(segB,LOW);digitalWrite(segC,LOW);digitalWrite(segD,LOW);digitalWrite(segE,LOW);digitalWrite(segF,LOW);digitalWrite(segG,LOW);digitalWrite(segDP,LOW);digitalWrite(commonPin1,HIGH);// Modificar si la pantalla es de ánodo comúndigitalWrite(commonPin2,HIGH);// Modificar si la pantalla es de ánodo común}voidloop(){// ... resto del loop ...// Llamada a la función de mostrar número en la pantalla de 7 segmentosmostrarNumEnDisplay(pisoActual);// ... resto del loop ...}voidmostrarNumEnDisplay(int numero){// Asume que la entrada es válida (0 a 3)// Apaga todos los segmentosdigitalWrite(segA,LOW);digitalWrite(segB,LOW);digitalWrite(segC,LOW);digitalWrite(segD,LOW);digitalWrite(segE,LOW);digitalWrite(segF,LOW);digitalWrite(segG,LOW);digitalWrite(segDP,LOW);// Si no se utiliza, se puede comentar// Apaga los dígitos comunesdigitalWrite(commonPin1,HIGH);// Modificar si la pantalla es de ánodo comúndigitalWrite(commonPin2,HIGH);// Modificar si la pantalla es de ánodo común// Ahora muestra el número seleccionando los segmentos adecuadosdigitalWrite(segA, numbers[numero][0]);digitalWrite(segB, numbers[numero][1]);digitalWrite(segC, numbers[numero][2]);digitalWrite(segD, numbers[numero][3]);digitalWrite(segE, numbers[numero][4]);digitalWrite(segF, numbers[numero][5]);digitalWrite(segG, numbers[numero][6]);// Elige cuál dígito común iluminar// Si el número es menor que 10, sólo necesitas un dígito comúndigitalWrite(commonPin1,LOW);// Modificar si la pantalla es de ánodo común}
Este es un ejemplo simplificado. En la implementación real, probablemente necesitarías considerar la posibilidad de multiplexar los segmentos si usas una pantalla de más de un dígito, lo que podría significar alternar rápidamente entre dígitos y segmentos para mostrar correctamente los números.
Además, si estás utilizando un módulo de pantalla de 7 segmentos con un chip controlador, tendrías que usar las funciones de la biblioteca apropiada para este chip, en vez de controlar directamente los pines de los segmentos como en el ejemplo anterior.
Para mostrar el piso actual en una pantalla de 7 segmentos de 10 pines, vamos a necesitar saber si la pantalla tiene ánodo común o cátodo común y cómo están asignados los pines a los segmentos para poder hacer la conexión y control por código correctos. Asumiré que la pantalla de 7 segmentos es de ánodo común y que los segmentos están ordenados como 'a' hasta 'g' más un punto decimal 'dp'.
Aquí tienes un ejemplo de cómo conectar y actualizar la pantalla de 7 segmentos en el código. Substituiré la lógica de delay por una lógica en la que se deberá presionar un botón para que el elevador suba o baje al siguiente piso.
Primero, definamos las conexiones de la pantalla de 7 segmentos a pines de Arduino y agreguemos la lógica para mostrar el número en la pantalla:
Arduino
// Definir los pines de Arduino para los segmentos de la pantalla de 7 segmentosconst int segA =2;const int segB =3;const int segC =4;const int segD =5;const int segE =6;const int segF =7;const int segG =8;const int segDP =9;// Este es opcional si no necesitas el punto decimal.// Mapa de segmentos para los números 0-3int numMap[4][7]={{HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,LOW},// 0{LOW,HIGH,HIGH,LOW,LOW,LOW,LOW},// 1{HIGH,HIGH,LOW,HIGH,HIGH,LOW,HIGH},// 2{HIGH,HIGH,HIGH,HIGH,LOW,LOW,HIGH}// 3};voidsetup(){// ...código previo...// Configura los pines de la pantalla de 7 segmentos como salidapinMode(segA,OUTPUT);pinMode(segB,OUTPUT);pinMode(segC,OUTPUT);pinMode(segD,OUTPUT);pinMode(segE,OUTPUT);pinMode(segF,OUTPUT);pinMode(segG,OUTPUT);pinMode(segDP,OUTPUT);// Opcional}voidloop(){// ...código previo para leer los botones...// Si el piso deseado es diferente al actual, mueve el elevador y actualiza la pantallaif(pisoDeseado != pisoActual){mostrarNumero(pisoDeseado);// Actualiza la pantalla de 7 segmentos con el piso deseadomoverAElevador(); pisoActual = pisoDeseado;// Actualiza piso actual tras la simulación}// ...código previo...}voidmostrarNumero(int num){digitalWrite(segA, numMap[num][0]);digitalWrite(segB, numMap[num][1]);digitalWrite(segC, numMap[num][2]);digitalWrite(segD, numMap[num][3]);digitalWrite(segE, numMap[num][4]);digitalWrite(segF, numMap[num][5]);digitalWrite(segG, numMap[num][6]);// Para el punto decimal, si no es necesario siempre mantenerlo apagado//digitalWrite(segDP, LOW);}// ...resto del código con las funciones moverArriba, moverAbajo, detenerMotor, etc...
Aquí se está asumiendo que cada piso se muestra con los números 0-3 en la pantalla de 7 segmentos. La función mostrarNumero() se llama con un número del 0 al 3 para mostrar el piso deseado. Dentro de esta función, se configuran los pines de cada segmento a HIGH o LOW según las necesidades para formar cada número posible en la pantalla de 7 segmentos, usando un arreglo numMap que define el mapa de segmentos para los números del 0 al 3.
Ten en cuenta que necesitas modificar los valores en numMap si tu pantalla de 7 segmentos está cableada de forma diferente o si tienes una pantalla de cátodo común. Además, si tu pantalla de 7 segmentos tiene más de un dígito, necesitarás implementar multiplexación o utilizar un controlador de pantalla de 7 segmentos.
Claro, aquí está todo el código combinado, que incluye la lógica de control del motor del elevador mediante botones y el despliegue del número del piso actual en una pantalla de 7 segmentos de ánodo común:
Arduino
// Pines de control del motorconst int motorPin1 =11;// Pin de control del motor Aconst int motorPin2 =10;// Pin de control del motor B// Pines para los botonesconst int buttonPin1 =12;// Botón para el primer pisoconst int buttonPin2 =13;// Botón para el segundo pisoconst int buttonPin3 =3;// Botón para el tercer piso// Pines de los segmentos de la pantalla de 7 segmentosconst int segA =2; const int segB =3; const int segC =4;const int segD =5; const int segE =6; const int segF =7;const int segG =8; const int segDP =9;// Punto decimal opcional// Estados actuales y deseados del elevadorint pisoDeseado =0;int pisoActual =0;// Matriz de los segmentos para representar los números 0-3 en la pantalla de 7 segmentosint numMap[4][7]={{HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,LOW},// 0{LOW,HIGH,HIGH,LOW,LOW,LOW,LOW},// 1{HIGH,HIGH,LOW,HIGH,HIGH,LOW,HIGH},// 2{HIGH,HIGH,HIGH,HIGH,LOW,LOW,HIGH}// 3};voidsetup(){pinMode(motorPin1,OUTPUT);pinMode(motorPin2,OUTPUT);pinMode(buttonPin1,INPUT_PULLUP);pinMode(buttonPin2,INPUT_PULLUP);pinMode(buttonPin3,INPUT_PULLUP);pinMode(segA,OUTPUT);pinMode(segB,OUTPUT);pinMode(segC,OUTPUT);pinMode(segD,OUTPUT);pinMode(segE,OUTPUT);pinMode(segF,OUTPUT);pinMode(segG,OUTPUT);pinMode(segDP,OUTPUT);// Punto decimal opcionalSerial.begin(9600);Serial.println("Sistema de elevador inicializado");}voidloop(){if(!digitalRead(buttonPin1)){Serial.println("Botón 1 presionado - Mover al primer piso"); pisoDeseado =1;while(!digitalRead(buttonPin1)){}// Esperar a que se suelte el botón}if(!digitalRead(buttonPin2)){Serial.println("Botón 2 presionado - Mover al segundo piso"); pisoDeseado =2;while(!digitalRead(buttonPin2)){}// Esperar a que se suelte el botón}if(!digitalRead(buttonPin3)){Serial.println("Botón 3 presionado - Mover al tercer piso"); pisoDeseado =3;while(!digitalRead(buttonPin3)){}// Esperar a que se suelte el botón}if(pisoDeseado != pisoActual){mostrarNumero(pisoDeseado -1);// Actualiza la pantalla de 7 segmentosmoverAElevador(); pisoActual = pisoDeseado;// Simula la llegada al piso deseadoSerial.print("Llegada al piso: ");Serial.println(pisoActual);detenerMotor();}}voidmoverAElevador(){if(pisoDeseado > pisoActual){moverArriba();}elseif(pisoDeseado < pisoActual){moverAbajo();}}voidmoverArriba(){digitalWrite(motorPin1,HIGH);digitalWrite(motorPin2,LOW);Serial.println("Moviendo el elevador hacia arriba");}voidmoverAbajo(){digitalWrite(motorPin1,LOW);digitalWrite(motorPin2,HIGH);Serial.println("Moviendo el elevador hacia abajo");}voiddetenerMotor(){digitalWrite(motorPin1,LOW);digitalWrite(motorPin2,LOW);Serial.println("Motor detenido");}voidmostrarNumero(int numero){digitalWrite(segA, numMap[numero][0]);digitalWrite(segB, numMap[numero][1]);digitalWrite(segC, numMap[numero][2]);digitalWrite(segD, numMap[numero][3]);digitalWrite(segE, numMap[numero][4]);digitalWrite(segF, numMap[numero][5]);digitalWrite(segG, numMap[numero][6]);// Si no usas el punto decimal, puedes comentar la siguiente líneadigitalWrite(segDP,LOW);}
Recuerda que si no utilizas el punto decimal, puedes quitar la línea que involucra segDP o dejarla en modo LOW. Este código asume que la pantalla de 7 segmentos tiene ánodos comunes y los dígitos que se van a mostrar son del 0 al 3 (para pisos del 1 al 3). Además, este código asume que cuando se presiona un botón, el piso deseado cambia de inmediato. En una aplicación real, podrías querer implementar un debounce para los botones o esperar que se libere el botón antes de mover el elevador. También es importante tener en cuenta la seguridad y asegurarse de que se incluyan sensores y limitaciones de hardware para evitar cualquier accidente.
Si tus botones ya incluyen resistencias de pull-up o pull-down externas, entonces no necesitas habilitar las resistencias internas de pull-up en los pines digitales de la Arduino. En otras palabras, podrías cambiar las líneas del setup() donde configuramos los pines de los botones de INPUT_PULLUP a INPUT, ya que no hará falta la resistencia interna.
Aquí está la sección del setup() ajustada para botones con resistencias externas incluidas:
Arduino
voidsetup(){pinMode(motorPin1,OUTPUT);pinMode(motorPin2,OUTPUT);// Configura los pines de los botones como entradapinMode(buttonPin1,INPUT);pinMode(buttonPin2,INPUT);pinMode(buttonPin3,INPUT);// ...resto del setup...}
Todo lo demás en el código permanecerá igual. Las lógicas para la detección de pulsaciones de botones, control del motor y pantalla de 7 segmentos no requieren ajustes porque dependen de los estados HIGH o LOW de los pines de entrada, que serán correctos siempre y cuando las resistencias estén bien dimensionadas y colocadas.
Es importante añadir que el uso de resistencias externas es una práctica común para asegurar que el pin lea correctamente los estados lógicos, especialmente en entornos donde exista mucho ruido eléctrico.
El código que te proporcioné anteriormente ya está configurado para mostrar el número del piso en el que está y al que se avanza usando la pantalla de 7 segmentos. Cada vez que se presiona un botón para seleccionar un piso, el número correspondiente se mostrará en la pantalla.
Aquí está el fragmento específico del código que maneja la visualización de los números de piso en la pantalla de 7 segmentos:
Arduino
voidmostrarNumero(int numero){digitalWrite(segA, numMap[numero][0]);digitalWrite(segB, numMap[numero][1]);digitalWrite(segC, numMap[numero][2]);digitalWrite(segD, numMap[numero][3]);digitalWrite(segE, numMap[numero][4]);digitalWrite(segF, numMap[numero][5]);digitalWrite(segG, numMap[numero][6]);// Si no usas el punto decimal, puedes comentar la siguiente líneadigitalWrite(segDP,LOW);}voidloop(){// ...código previo para leer los botones...// Si el piso deseado es diferente al actual, mueve el elevador y actualiza la pantallaif(pisoDeseado != pisoActual){moverAElevador();mostrarNumero(pisoDeseado -1);// Actualiza la pantalla de 7 segmentos// Se simula un proceso que indicaría que se ha llegado al nuevo pisodelay(2000);// Simula el tiempo de movimiento entre pisos pisoActual = pisoDeseado;// El elevador ha llegado al nuevo pisoSerial.print("Llegada al piso: ");Serial.println(pisoActual);detenerMotor();}// ...resto del loop...}
Recuerda que el delay utilizado dentro del loop principal es solo para simular el movimiento del elevador, se supone que en un sistema real utilizarías algún método de detección más preciso (como sensores o un sistema de conteo si estás utilizando un motor paso a paso) para determinar cuando el elevador haya llegado al piso deseado.
El método mostrarNumero() utiliza una matriz llamada numMap que traduce el número del piso en las salidas HIGH y LOW necesarias para activar los segmentos correspondientes en la pantalla de 7 segmentos. Debes asegurarte de que la matriz numMap coincida con la configuración de tu pantalla de 7 segmentos (la configuración del código asume una pantalla de ánodo común). Además, el código considera el primer piso como 1, por lo cual resta 1 al valor a mostrar para indexar correctamente la matriz numMap que empieza en 0. Asegúrate de que el rango de pisos en el código coincida con el sistema real de numeración de pisos de tu proyecto.
Sí, en el código que hemos discutido, la función del elevador (subir o bajar) se lograría mediante el control de la dirección de giro del motor. Esto se gestiona a través de las funciones moverArriba() y moverAbajo() que activan los pines del motor para controlar la dirección del giro:
Arduino
voidmoverArriba(){digitalWrite(motorPin1,HIGH);digitalWrite(motorPin2,LOW);Serial.println("Moviendo el elevador hacia arriba");}voidmoverAbajo(){digitalWrite(motorPin1,LOW);digitalWrite(motorPin2,HIGH);Serial.println("Moviendo el elevador hacia abajo");}
En la función loop(), cuando un botón es presionado, la variable pisoDeseado se actualiza y se compara con pisoActual. Sí hay una diferencia entre el piso actual y el piso deseado, entonces se llama a moverAElevador() que a su vez determinará la dirección de movimiento llamando a moverArriba() o moverAbajo() basado en si el piso deseado es mayor o menor que el piso actual, respectivamente:
Arduino
voidloop(){// Lectura de botones y actualización de pisoDeseado...if(pisoDeseado != pisoActual){moverAElevador();mostrarNumero(pisoDeseado -1);// Actualiza la pantalla de 7 segmentosdelay(2000);// Simula el tiempo de movimiento entre pisos pisoActual = pisoDeseado;// El elevador ha llegado al nuevo pisoSerial.print("Llegada al piso: ");Serial.println(pisoActual);detenerMotor();}// ...resto del loop...}voidmoverAElevador(){if(pisoDeseado > pisoActual){moverArriba();}elseif(pisoDeseado < pisoActual){moverAbajo();}}
Recuerda que en un escenario real, tendrías que implementar una lógica de control más sofisticada para determinar cuánto tiempo o cuántos pasos debe moverse el motor para llegar a cada piso. Esto podría involucrar temporizadores más precisos, sensores de posición, encoders o interruptores de límite para detectar con precisión la posición del elevador. Además, deberías tener métodos para iniciar y detener el motor de manera segura, así como manejar casos de emergencia o situaciones anormales.
Por último, asegúrate de que la potencia y especificaciones del motor y del controlador del motor (por ejemplo, un L293D) sean adecuadas para la carga y las demandas del elevador.
Para determinar cuánto debe girar el motor para mover el elevador entre pisos que están separados por una distancia de 8.3 cm, necesitas conocer el mecanismo de transmisión entre el motor y el elevador, así como las especificaciones del motor y la relación de reducción si hay engranajes involucrados.
Por ejemplo, si estás utilizando un motor con una caja reductora (también conocido como motorreductor) y el mecanismo de transmisión es un husillo o tornillo de plomo que convierte el giro del motor en movimiento lineal, entonces la cantidad de giros necesarios dependerá del paso del husillo. El paso es la distancia que se mueve el elevador con una revolución completa del husillo.
Aquí hay una forma de calcular la cantidad de revoluciones necesarias para una distancia dada:
Revoluciones necesarias=Paso del husilloDistancia a mover
Si el paso del husillo es precisamente igual a la distancia entre pisos, entonces necesitarías una revolución para mover el elevador de un piso al siguiente. Si el paso es más pequeño, necesitarías más giros.
Sin embargo, a menudo los motores paso a paso se utilizan para este tipo de aplicaciones debido a su precisión. Si estás utilizando un motor paso a paso, necesitarás saber cuántos pasos por revolución tiene el motor y la relación de reducción si el motor está conectado a engranajes. Por ejemplo, un motor típico puede tener 200 pasos por revolución. Si estás usando directamente este motor, y necesitas moverte 8.3 cm por piso y el paso del tornillo de plomo es de 1 mm, entonces la cantidad de pasos necesarios sería:
Pasos necesarios=Distancia a mover×Paso del husilloPasos por revolucioˊn
Este es solo un ejemplo. Debes reemplazar los números según las especificaciones exactas de tu motor y husillo.
Una vez que sepas la cantidad de pasos o revoluciones necesarias para mover el elevador la distancia deseada, puedes programar la Arduino para girar el motor esa cantidad de pasos cuando se presione cada botón. Esto podría hacerse utilizando un contador de pasos en el software, un temporizador si la velocidad es constante, o sensores de hardware que detecten la posición del elevador.
tu me diste este codigo por que no compila //pines de control del motor
const int motorPin1 = 11;
const int motorPin2 = 10;
//pines de los botones
const int buttonPin1 = 12;
const int buttonPin2 = 13;
const int buttonPin3 = 3;
//pines de los segmentos de la pantalla
const int segA = 2; const int segB = 3; const int segC = 4;
const int segD = 5; const int segE = 6; const int segF = 7;
const int segG = 8; const int segDP = 9;
//estados actuales y deseados del elevador
int pisoDeseado =0;
int pisoActual =0;
//matriz de los segmentos para representar de 0-3
int numMap [4][7]={
{HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW},
{LOW, HIGH, HIGH, LOW, LOW, LOW, LOW},
{HIGH, HIGH, LOW, HIGH, HIGH, LOW, HIGH},
{HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH}
};
El código que proporcionaste tiene un par de errores que evitarían que se compile correctamente en el IDE de Arduino. Aquí se enumeran los problemas y las correcciones:
Las funciones moverAElevador, moverArriba, moverAbajo, detenerMotor y mostrarNumero están definidas dentro de la función loop(), lo cual es incorrecto. Estas funciones deben estar definidas fuera del cuerpo de la función loop().
En la función mostrarNumero, el índice para segG al acceder a numMap está equivocado. Debería ser [numero][6] en lugar de [numero][7] para acceder al segmento G.
Corrigiendo esos errores, el código debería verse así:
Arduino
// Pines de control del motorconst int motorPin1 =11;const int motorPin2 =10;// Pines de los botones const int buttonPin1 =12;const int buttonPin2 =13;const int buttonPin3 =3;// Pines de los segmentos de la pantallaconst int segA =2; const int segB =3; const int segC =4;const int segD =5; const int segE =6; const int segF =7;const int segG =8; const int segDP =9;// Estados actuales y deseados del elevadorint pisoDeseado =0;int pisoActual =0;// Matriz de los segmentos para representar de 0-3 int numMap[4][7]={{HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,LOW},// 0{LOW,HIGH,HIGH,LOW,LOW,LOW,LOW},// 1{HIGH,HIGH,LOW,HIGH,HIGH,LOW,HIGH},// 2{HIGH,HIGH,HIGH,HIGH,LOW,LOW,HIGH}// 3};voidsetup(){pinMode(motorPin1,OUTPUT);pinMode(motorPin2,OUTPUT);pinMode(buttonPin1,INPUT);pinMode(buttonPin2,INPUT);pinMode(buttonPin3,INPUT);pinMode(segA,OUTPUT);pinMode(segB,OUTPUT);pinMode(segC,OUTPUT);pinMode(segD,OUTPUT);pinMode(segE,OUTPUT);pinMode(segF,OUTPUT);pinMode(segG,OUTPUT);pinMode(segDP,OUTPUT);Serial.begin(9600);}voidloop(){if(!digitalRead(buttonPin1)){Serial.println("Boton 1 presionado--mover al piso 1"); pisoDeseado =1;while(!digitalRead(buttonPin1)){}// Espera que suelte el boton}if(!digitalRead(buttonPin2)){Serial.println("Boton 2 presionado--mover al piso 2"); pisoDeseado =2;while(!digitalRead(buttonPin2)){}// Espera que suelte el boton}if(!digitalRead(buttonPin3)){Serial.println("Boton 3 presionado--mover al piso 3"); pisoDeseado =3;while(!digitalRead(buttonPin3)){}// Espera que suelte el boton}if(pisoDeseado != pisoActual){moverAElevador();mostrarNumero(pisoDeseado -1); pisoActual = pisoDeseado;Serial.println("Llegada al piso");Serial.println(pisoActual);detenerMotor();}}voidmoverAElevador(){if(pisoDeseado > pisoActual){moverArriba();}elseif(pisoDeseado < pisoActual){moverAbajo();}}voidmoverArriba(){digitalWrite(motorPin1,HIGH);digitalWrite(motorPin2,LOW);Serial.println("Moviendo el elevador hacia arriba");}voidmoverAbajo(){digitalWrite(motorPin1,LOW);digitalWrite(motorPin2,HIGH);Serial.println("Moviendo el elevador hacia abajo");}voiddetenerMotor(){digitalWrite(motorPin1,LOW);digitalWrite(motorPin2,LOW);Serial.println("Motor detenido");}voidmostrarNumero(int numero){digitalWrite(segA, numMap[numero][0]);digitalWrite(segB, numMap[numero][1]);digitalWrite(segC, numMap[numero][2]);digitalWrite(segD, numMap[numero][3]);digitalWrite(segE, numMap[numero][4]);digitalWrite(segF, numMap[numero][5]);digitalWrite(segG, numMap[numero][6]);digitalWrite(segDP,LOW);// Opcional, para el punto decimal}
Con estas correcciones, el código debería compilar sin problemas en el entorno de desarrollo de Arduino. Si encuentras otros errores de compilación, verifica que todos los paréntesis y llaves estén correctamente emparejados y que todas las variables estén definidas correctamente. Si estás utilizando un IDE distinto al de Arduino, asegúrate de que esté configurado para compilar sketches de Arduino y que tengas los drivers correctos instalados para tu placa.
2y
2
No files yet
Reviews
Documents
Documents are markdown text files which describe project goals, capture details, or even simulation outputs.
Assets
Arduino UNO.STEP
Arduino UNO 3D3D Model
dxf
Arduino UNO R3 shield - Shape.dxf
Arduino UNO R3 shield - Shape
Arduino Uno R3 Shield Template-removebg-preview.png
Arduino Uno R3 Shield Template-removebg-previewThumbnail
Arduino Uno R3 Shield Template
Template for Arduino Uno R3 Shield. Include an official pinout so you will always know Arduino names, the alternative roles of pins, which one is SDA, or SCL, etc. On PCB you can find the 3D model of the Arduino Uno R3 itself along with the board outline on the silkscreen.
#Arduino#Uno#Shield#Template#project-template #project
Properties
Properties describe core aspects of the project.
Pricing & Availability
Distributor
Qty 1
Digi-Key
$8.56–$8.71
LCSC
$0.36–$4.33
Mouser
$8.31
Controls
Welcome 👋
Flux helps you build PCBs faster with an AI teammate!
Create your account to collaborate, stay updated, fork your own version, and get instant answers from our AI agent.
osco
osco
copilot
loop()ysetup(). Tu código está tratando de definir funciones comomoverAElevador(),moverArriba(),moverAbajo(),detenerMotor()ymostrarNumero()dentro deloop(), lo cual no es correcto y causará errores de compilación.mostrarNumero(), usasdigitalWrite(segG, numMap[numero][7]);, pero necesitas recordar que en C/C++, los índices de los arrays empiezan en 0. ComonumMapestá definido como[4][7], los índices válidos serían de0a6para el segundo índice, por lo que debería sernumMap[numero][6], no7.loop(): Debes asegurarte de que todas las funciones (moverAElevador,moverArriba,moverAbajo,detenerMotor,mostrarNumero) estén definidas afuera de y después deloop().numMap: CambianumMap[numero][7]pornumMap[numero][6]dentro de la funciónmostrarNumero().loop()y corrige el error al acceder a un índice fuera de los límites del arraynumMap.osco
copilot
loop()con estas condiciones, siguiendo la estructura y lógica previamente establecida.!digitalRead(buttonPinX)dondeXes el número del botón, para detectar si un botón ha sido presionado y establecer elpisoDeseadocorrespondiente.while(!digitalRead(buttonPinX)) {}asegura que no se proceda hasta que el botón sea liberado, evitando múltiples lecturas del mismo evento de presión.pisoDeseadoes diferente alpisoActual. Esto evita actividades innecesarias si el elevador ya se encuentra en el piso deseado.mostrarNumero(pisoDeseado - 1)se llama para visualizar el piso deseado en el segmento de display.moverAElevador()decide si el elevador debe moverse hacia arriba o hacia abajo, basándose en la comparación entrepisoDeseadoypisoActual.detenerMotor()para parar el motor.delay(50)al final del bucleloop()actúa como un mecanismo simple de debounce para los botones, evitando que el rebote eléctrico de los botones cause múltiples activaciones por una sola presión física. Este valor puede necesitar ajustes basándose en tu hardware específico y cómo reaccionan los botones físicos.osco
copilot
numMaparray within themostrarNumerofunction. Let's address this and any other suggestions to ensure your code is fully operational.mostrarNumerofunction is indexing properly within the bounds of thenumMaparray. This change ensures your code won't run into a runtime error trying to access an array index that doesn't exist.setupfunction, you've correctly initialized all the pins you're using, both for the motor, button inputs, and display segments. This setup ensures that each component can function as intended in the system.loopfunction, digital reads on the button pins determine the user's desired floor. Upon pressing a button, the program sets thepisoDeseadovariable accordingly. The use ofwhile(!digitalRead(buttonPinX))effectively debounces the button, ensuring that the action is only taken once the button is released.mostrarNumerofunction is called to display the floor number on the segment display. Then,moverAElevadordetermines the direction of elevator movement. Motor control logic withinmoverArribaandmoverAbajohandles the movement, anddetenerMotorensures the motor stops once the floor is reached.delay(50)at the end of your loop is a simple way to debounce the buttons further, helping to prevent multiple detections of a single press due to the mechanical properties of the button.osco
copilot
- Botones: Conecta un lado de cada botón a GND (tierra) y el otro lado a un pin digital del Arduino (12, 13, y 3 para
2. Conexión del Motor via L293DbuttonPin1,buttonPin2, ybuttonPin3, respectivamente). Además, conecta una resistencia de 1kΩ entre el pin digital (lado no conectado a GND) de cada botón y 5V. Esto crea una resistencia de pull-up, asegurando que el pin lea HIGH cuando el botón no está presionado y LOW al presionarlo.- L293D: Este IC puede controlar hasta 2 motores DC. En tu caso, las salidas del motor se conectarán a las salidas del L293D.
- Conecta el pin 1 (EN1,2) y el pin 9 (EN3,4) del L293D a 5V para habilitar los drivers.
- Los pins
- Conecta los pines de salida del L293D (pines 3 y 6 para un motor) a tu motor.
- Los pines 4, 5, 12, y 13 del L293D se conectan a GND.
- El VCC1 del L293D (pin 16) se conecta a 5V del Arduino.
- El VCC2 del L293D (pin 8) se conecta a tu fuente de alimentación para el motor, que puede ser una fuente externa si tu motor necesita más de 5V o más corriente de la que el Arduino puede proporcionar.
3. Conexión de la Pantalla de 7 Segmentos (con Decodificador 74HC595)motorPin1(11) ymotorPin2(10) del Arduino se conectan a los pins de entrada del L293D (2 y 7 respectivamente para un motor).- 74HC595:
- Conecta los pines 14 (DATA), 12 (LATCH), y 11 (CLOCK) del 74HC595 a pines digitales en el Arduino para controlar el shift register. Estos serán los pines a los cuales envías información desde el Arduino para controlar los segmentos de la pantalla.
- Conecta el pin 16 (VCC) del 74HC595 a 5V y el pin 8 (GND) a tierra.
- Conecta cada salida del 74HC595 a un segmento correspondiente de la pantalla de 7 segmentos.
Esquema DetalladobuttonPin1(D12) --- [Botón 1] --- GNDbuttonPin2(D13) --- [Botón 2] --- GNDbuttonPin3(D3) --- [Botón 3] --- GNDosco
copilot
- 1 Arduino Uno
- 1 L293D motor driver IC
- 1 motor DC pequeño
- 3 botones táctiles
- 3 resistencias de 1kΩ para los botones
- 1 pantalla de 7 segmentos (asumiendo una versión de cátodo común para simplificar)
- 7 resistencias de 220Ω para los segmentos de la pantalla (opcional dependiendo del modelo de la pantalla de 7 segmentos)
- Cables de conexión
- Protoboard (opcional pero recomendado para facilitar las conexiones)
Conexiones: Botones:- Conectar un terminal a GND.
- Conectar el otro terminal al pin correspondiente en Arduino (pins 12, 13 y 3). Añadir una resistencia de 1kΩ entre este terminal y 5V para establecer un pull-up interno.
L293D y Motor:- L293D al Arduino:
- EN1,2 (Pin 1 del L293D) a 5V (Para siempre habilitar el motor A).
- EN3,4 (Pin 9 del L293D) no utilizado en este caso.
- INPUT1 (Pin 2 del L293D) a pin 11 en Arduino.
- INPUT2 (Pin 7 del L293D) a pin 10 en Arduino.
- VCC1 (Pin 16 del L293D) a 5V para la lógica.
- GND (Pins 4, 5, 12, 13 del L293D) a GND.
- VCC2 (Pin 8 del L293D) a una fuente de alimentación adecuada para su motor, puede ser 5V si su motor es compatible.
- L293D al motor:
- OUTPUT1 y OUTPUT2 (Pins 3 y 6 del L293D) al motor DC.
Pantalla de 7 Segmentos:- Conectar todos los cátodos (comunes) de la pantalla a GND.
- Anodo de cada segmento a un pin de Arduino a través de una resistencia de 220Ω:
Consideraciones Importantes:segA(Pin 2 de Arduino) a segmento A de la pantalla.segB(Pin 3 de Arduino) a segmento B (Nota: Este pin también se usó parabuttonPin3, lo cual no es ideal. Considera cambiar uno de los usos a otro pin libre para evitar conflictos).segC(Pin 4 de Arduino) a segmento C.segD(Pin 5 de Arduino) a segmento D.segE(Pin 6 de Arduino) a segmento E.segF(Pin 7 de Arduino) a segmento F.segG(Pin 8 de Arduino) a segmento G.segDP(Pin 9 de Arduino), si deseas controlar el punto decimal.osco
osco
copilot
osco
copilot
muestra1(),muestra2(),muestra3(), yapagadisp()).U1), utilizandomotorPin1ymotorPin2para controlar la dirección del motor a través de los pines 1A (U1:2) y 2A (U1:7), respectivamente.PULS1,PULS2, yPULS3se usarán para leer el estado de 3 switches distintos. Supondré que estos switches sonSW1paraPULS1,SW2paraPULS2, ySW3paraPULS3. Aun así, dado que tu inventario solo incluye 3 switches y todos son del mismo tipo, usaremos los designators proporcionados.aagcontrolarán algún tipo de display de 7 segmentos o LEDs individuales configurados en una formación de 7 segmentos. Basándome en la información proporcionada, asumiré la conexión directa a LEDs.U1:2(1A) aArduino Uno R3 PINOUT:11.U1:7(2A) aArduino Uno R3 PINOUT:10.INPUT_PULLUP).SW1:P1aArduino Uno R3 PINOUT:12(PULS1).SW2:P1aArduino Uno R3 PINOUT:13(PULS2).SW3:P1aArduino Uno R3 PINOUT:3(PULS3).aaArduino Uno R3 PINOUT:0.baArduino Uno R3 PINOUT:1.caArduino Uno R3 PINOUT:2.daArduino Uno R3 PINOUT:4.eaArduino Uno R3 PINOUT:5.faArduino Uno R3 PINOUT:6.gaArduino Uno R3 PINOUT:7.osco
Image
copilot
motorPin1(Arduino Pin 11) andmotorPin2(Arduino Pin 10) are connected to the input pins of the motor driver, which in turn is connected to the motor. The exact wiring of this will be dependent on the specific motor driver used, but these will be the logic control signals.PULS1,PULS2andPULS3, which correspond to Arduino Pins 12, 13, and 3 respectively. You would typically connect one side of each switch to these pins and the other side to ground, possibly with a pull-up resistor configuration, either external or using the Arduino's internal pull-up resistors.a,b,c,d,e,f, andg, are controlled by Arduino Pins 0, 1, 2, 4, 5, 6, and 7 respectively. These would be connected to the segments of a 7-segment display or individual LEDs, with limiting resistors to prevent damage from too much current.osco
copilot
U1:3(1Y) del L293D.U1:6(2Y) del L293D.U1:2(1A) conectado aArduino Uno R3 PINOUT:11(motorPin1).U1:7(2A) conectado aArduino Uno R3 PINOUT:10(motorPin2).U1:1(EN1,2) aArduino Uno R3 PINOUT:9para habilitación del motor.U1:16(VCC1) conectado a 5V del Arduino para alimentar la lógica interna del L293D.U1:8(VCC2) conectado a una fuente de potencia adecuada para tu motoreductor (por ejemplo, 6V, 9V, 12V, según las especificaciones del motor).U1:4,U1:5,U1:12yU1:13son todos conectados a GND.moverAdelante()ymoverAtras()para controlar la dirección de giro del motor.moverAdelante()omoverAtras()cuando quieras que el motoreductor se mueva.setup()y controlarlo en tus funciones de movimiento.osco
copilot
PULS1para subir al primer piso y bajar del primer piso,PULS2para subir al segundo y bajar del segundo, y así sucesivamente, las conexiones en el código para los botones serían:moverAdelante,moverAtraso similar) deberá ser llamada dentro de las condicionales del loop principal donde se verifica el estado de cada botón, y debe tener la lógica para parar el motor al llegar a cada piso, lo cual puede ser monitoreado con un contador de pasos, un sensor o con un temporizador si la velocidad y aceleración del motor son constantes.osco
copilot
delay(2000), lo que significa que el elevador tardará dos segundos en llegar a cada piso. Esto puede y debe ser reemplazado por una lógica más compleja que tome en cuenta la ubicación física del elevador, como sensores o un sistema de conteo de pasos si estás usando un motor paso a paso.osco
copilot
osco
copilot
mostrarNumero()se llama con un número del 0 al 3 para mostrar el piso deseado. Dentro de esta función, se configuran los pines de cada segmento aHIGHoLOWsegún las necesidades para formar cada número posible en la pantalla de 7 segmentos, usando un arreglonumMapque define el mapa de segmentos para los números del 0 al 3.numMapsi tu pantalla de 7 segmentos está cableada de forma diferente o si tienes una pantalla de cátodo común. Además, si tu pantalla de 7 segmentos tiene más de un dígito, necesitarás implementar multiplexación o utilizar un controlador de pantalla de 7 segmentos.osco
copilot
segDPo dejarla en modoLOW. Este código asume que la pantalla de 7 segmentos tiene ánodos comunes y los dígitos que se van a mostrar son del 0 al 3 (para pisos del 1 al 3). Además, este código asume que cuando se presiona un botón, el piso deseado cambia de inmediato. En una aplicación real, podrías querer implementar un debounce para los botones o esperar que se libere el botón antes de mover el elevador. También es importante tener en cuenta la seguridad y asegurarse de que se incluyan sensores y limitaciones de hardware para evitar cualquier accidente.osco
copilot
setup()donde configuramos los pines de los botones deINPUT_PULLUPaINPUT, ya que no hará falta la resistencia interna.setup()ajustada para botones con resistencias externas incluidas:osco
copilot
mostrarNumero()utiliza una matriz llamadanumMapque traduce el número del piso en las salidas HIGH y LOW necesarias para activar los segmentos correspondientes en la pantalla de 7 segmentos. Debes asegurarte de que la matriznumMapcoincida con la configuración de tu pantalla de 7 segmentos (la configuración del código asume una pantalla de ánodo común). Además, el código considera el primer piso como1, por lo cual resta1al valor a mostrar para indexar correctamente la matriznumMapque empieza en0. Asegúrate de que el rango de pisos en el código coincida con el sistema real de numeración de pisos de tu proyecto.osco
copilot
moverArriba()ymoverAbajo()que activan los pines del motor para controlar la dirección del giro:loop(), cuando un botón es presionado, la variablepisoDeseadose actualiza y se compara conpisoActual. Sí hay una diferencia entre el piso actual y el piso deseado, entonces se llama amoverAElevador()que a su vez determinará la dirección de movimiento llamando amoverArriba()omoverAbajo()basado en si el piso deseado es mayor o menor que el piso actual, respectivamente:osco
copilot
osco
copilot
moverAElevador,moverArriba,moverAbajo,detenerMotorymostrarNumeroestán definidas dentro de la funciónloop(), lo cual es incorrecto. Estas funciones deben estar definidas fuera del cuerpo de la funciónloop().mostrarNumero, el índice parasegGal acceder anumMapestá equivocado. Debería ser[numero][6]en lugar de[numero][7]para acceder al segmento G.