Chat

Welcome to Flux

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

Explain project
Write a project description
Find schematic issues
Create a test plan

Ready.


conectalo aqui

pero quiero que mi motor inicialice pardo
1y
@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} };
void setup(){ 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);
}
void loop() { 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){ mostrarNumero(pisoDeseado -1); moverAElevador(); pisoActual= pisoDeseado; Serial.println("Llegada al piso"); Serial.println(pisoActual); detenerMotor(); }
void moverAElevador(){ if(pisoDeseado > pisoActual){ moverArriba(); }else if (pisoDeseado < pisoActual){ moverAbajo(); } } void moverArriba(){ digitalWrite(motorPin1, HIGH); digitalWrite(motorPin2, LOW); Serial.println ("moviendo el elevador hacia arriba"); }
void moverAbajo(){ digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, HIGH); Serial.println ("moviendo el elevador hacia aBAJO"); } void detenerMotor(){ digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); Serial.println ("mOTOR DETENIDO"); } void mostrarNumero(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][7]);
digitalWrite(segDP, LOW);
} } tu me diste ese codigo por que no compila
1y
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:
  1. 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.
  2. 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 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}
};

void setup(){
  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);
}

void mostrarNumero(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);   
}

void moverArriba(){
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  Serial.println("moviendo el elevador hacia arriba");
}

void moverAbajo(){
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  Serial.println("moviendo el elevador hacia abajo");
}

void detenerMotor(){
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  Serial.println("Motor detenido");
}

void moverAElevador(){
  if(pisoDeseado > pisoActual){
    moverArriba();
  }else if (pisoDeseado < pisoActual){
    moverAbajo();
  }
}

void loop() {
  // 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.
1y
cuales serian la condiciones de control ponlas por favor
1y
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


void loop() {
  // Leer los estados de los botones para determinar el piso deseado
  if(!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 consecuencia
  if(pisoDeseado != pisoActual){
    mostrarNumero(pisoDeseado - 1); // Mostrar el número del piso deseado en el display
    moverAElevador(); // 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ón
  delay(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.
1y
//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} };
void setup(){ 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);
} void mostrarNumero(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][7]);
digitalWrite(segDP, LOW);
} void moverArriba(){ digitalWrite(motorPin1, HIGH); digitalWrite(motorPin2, LOW); Serial.println ("moviendo el elevador hacia arriba"); } void moverAbajo(){ digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, HIGH); Serial.println ("moviendo el elevador hacia aBAJO"); } void detenerMotor(){ digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); Serial.println ("mOTOR DETENIDO"); } void moverAElevador(){ if(pisoDeseado > pisoActual){ moverArriba(); }else if (pisoDeseado < pisoActual){ moverAbajo(); } }
void loop() { 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){ mostrarNumero(pisoDeseado -1); moverAElevador(); pisoActual= pisoDeseado; Serial.println("Llegada al piso"); Serial.println(pisoActual); detenerMotor(); }
delay(50);
}
1y
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


void mostrarNumero(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.
1y
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
1y
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.
1y
// 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 setup() { 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);
}
void mostrarNumero(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);
}
void moverMotor(bool direccion) { if (direccion) { digitalWrite(motorPin1, HIGH); digitalWrite(motorPin2, LOW); Serial.println("Moviendo el elevador hacia arriba"); } else { digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, HIGH); Serial.println("Moviendo el elevador hacia abajo"); } }
void detenerMotor() { digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); Serial.println("Motor detenido"); }
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;
} ayudame a conectar los componentes
1y
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.
1y
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} };
void setup(){ 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);
}
void loop() { 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){ mostrarNumero(pisoDeseado -1); moverAElevador(); pisoActual= pisoDeseado; Serial.println("Llegada al piso"); Serial.println(pisoActual); detenerMotor(); }
void moverAElevador(){ if(pisoDeseado > pisoActual){ moverArriba(); }else if (pisoDeseado < pisoActual){ moverAbajo(); } } void moverArriba(){ digitalWrite(motorPin1, HIGH); digitalWrite(motorPin2, LOW); Serial.println ("moviendo el elevador hacia arriba"); }
void moverAbajo(){ digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, HIGH); Serial.println ("moviendo el elevador hacia aBAJO"); } void detenerMotor(){ digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); Serial.println ("mOTOR DETENIDO"); } void mostrarNumero(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][7]);
digitalWrite(segDP, LOW);
} }
1y
@copilot conectalo aqui
1y
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.
1y
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;
void setup() { pinMode(motorPin1, OUTPUT); pinMode(motorPin2, OUTPUT); pinMode(PULS1, INPUT); pinMode(PULS2, INPUT); pinMode(PULS3, INPUT); pinMode(a, OUTPUT); pinMode(b, OUTPUT); pinMode(c, OUTPUT); pinMode(d, OUTPUT); pinMode(e, OUTPUT); pinMode(f, OUTPUT); pinMode(g, OUTPUT); apagadisp(); grados = 0; }
void loop() { ESTADO1 = digitalRead(PULS1); ESTADO2 = digitalRead(PULS2); ESTADO3 = digitalRead(PULS3);
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;
            cuenta = cuenta - 1;
            if (cuenta == 0) {
                muestra2();
            }
        }
        grados = (grados / 1.4222222222);
        muestra1();
        apagado();
    }
}

if (ESTADO2 == HIGH) {
    if (grados == 0) {
        grados = 750;
    } else if (grados == 1465) {
        grados = grados - 720;
    } else {
        grados = 750;
        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;
        }
        grados = (grados / 1.4222222222);
        muestra2();
        apagado();
    }
}

if (ESTADO3 == HIGH) {
    if (grados == 0) {
        grados = 1465;
        cuenta = 1040;
    } else if (grados == 750) {
        grados = grados + 715;
    } else {
        grados = 1465;
        grados = (grados * 1.4222222222);
        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 }
void apagarMotor() { digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); }
void paso_der() { digitalWrite(11, LOW); digitalWrite(10, LOW); digitalWrite(9, HIGH); digitalWrite(8, HIGH); delay(retardo); digitalWrite(11, LOW); digitalWrite(10, HIGH); digitalWrite(9, HIGH); digitalWrite(8, LOW); delay(retardo); digitalWrite(11, HIGH); digitalWrite(10, HIGH); digitalWrite(9, LOW); digitalWrite(8, LOW); delay(retardo); digitalWrite(11, HIGH); digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(8, HIGH); delay(retardo); }
void paso_izq() { digitalWrite(11, HIGH); digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(8, HIGH); delay(retardo); digitalWrite(11, HIGH); digitalWrite(10, HIGH); digitalWrite(9, LOW); digitalWrite(8, LOW); delay(retardo); digitalWrite(11, LOW); digitalWrite(10, HIGH); digitalWrite(9, HIGH); digitalWrite(8, LOW); delay(retardo); digitalWrite(11, LOW); digitalWrite(10, LOW); digitalWrite(9, HIGH); digitalWrite(8, HIGH); delay(retardo); }
void apagado() { digitalWrite(11, LOW); digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(8, LOW); }
void muestra1() { digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); }
void muestra2() { digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, HIGH); }
void muestra3() { digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, HIGH); }
void apagadisp() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); } conecta los componentes acorde a este codigo
1y
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:
  1. Conexiones para el Motor:
    • Conecta U1:2 (1A) a Arduino Uno R3 PINOUT:11.
    • Conecta U1:7 (2A) a Arduino Uno R3 PINOUT:10.
  2. 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).
  3. 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.
1y
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:
  1. 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.
  2. 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.
  3. 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?
1y
podrias ayudarme cambiando el motor de ahi por un motoreductor de dos cables haz los ajustes necesrios y el codigo por favor
1y
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:
  1. 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.
  2. 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


void moverAdelante() {
  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
}

void moverAtras() {
  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
}

void pararMotor() {
  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.
1y
tengo 3 botones de 4 patas para controlar la subida de 3 pisos y la respectiva bajada
1y
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 piso
const int PULS2 = 13; // Botón para segundo piso
const int PULS3 = 3;  // Botón para tercer piso

void setup() {
  // Configura los pines del botón como entrada con resistencias pull-up
  pinMode(PULS1, INPUT_PULLUP); 
  pinMode(PULS2, INPUT_PULLUP);
  pinMode(PULS3, INPUT_PULLUP);
  
  // Configura los pines del motor
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  // ...resto del setup...
}

void loop() {
  // Lee el estado de los botones
  bool estado1 = !digitalRead(PULS1); // Invierte el estado debido a pull-up
  bool estado2 = !digitalRead(PULS2);
  bool estado3 = !digitalRead(PULS3);

  // Determina la acción en base al estado del botón
  if (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.
1y
podrias completar absolutamente todo el codigo
1y
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 motor
const int motorPin2 = 10; // Segundo pin de control del motor
const int buttonPin1 = 12; // Botón para el primer piso
const int buttonPin2 = 13; // Botón para el segundo piso
const int buttonPin3 = 3;  // Botón para el tercer piso

// Estado deseado del elevador
int pisoDeseado = 0; // 0 = planta baja, 1 = primer piso, 2 = segundo piso, 3 = tercer piso
int pisoActual = 0;

void setup() {
  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");
}

void loop() {
  // Leer los estados de los botones y actualizar el piso deseado
  if (!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ón
  Serial.print("Llegó al piso: ");
  Serial.println(pisoActual);
  detenerMotor();
}

void moverAElevador() {
  // Añadir aquí lógica adicional si los pisos son a diferentes alturas
  if (pisoDeseado > pisoActual) {
    moverArriba();
  } else {
    moverAbajo();
  }
}

void moverArriba() {
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  Serial.println("Moviendo el elevador hacia arriba");
}

void moverAbajo() {
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  Serial.println("Moviendo el elevador hacia abajo");
}

void detenerMotor() {
  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.
1y
hay una paarte en el codigo anterior que imprime el piso en el que esta en una pantalla de 7 segmentos 10 pines
1y
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 segmentos
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; // 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 pantalla
const 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-3
int 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
};

void setup() {
  // ... resto del setup ...
  
  // Configura los pines de los segmentos como salida
  pinMode(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ígitos
  digitalWrite(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ún
  digitalWrite(commonPin2, HIGH); // Modificar si la pantalla es de ánodo común
}

void loop() {
  // ... resto del loop ...

  // Llamada a la función de mostrar número en la pantalla de 7 segmentos
  mostrarNumEnDisplay(pisoActual);
  
  // ... resto del loop ...
}

void mostrarNumEnDisplay(int numero) {
  // Asume que la entrada es válida (0 a 3)
  
  // Apaga todos los segmentos
  digitalWrite(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 comunes
  digitalWrite(commonPin1, HIGH); // Modificar si la pantalla es de ánodo común
  digitalWrite(commonPin2, HIGH); // Modificar si la pantalla es de ánodo común

  // Ahora muestra el número seleccionando los segmentos adecuados
  digitalWrite(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ún
  digitalWrite(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.
1y
ponla en el que acabas de hacer
1y
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 segmentos
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; // Este es opcional si no necesitas el punto decimal.

// Mapa de segmentos para los números 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
};

void setup() {
  // ...código previo...

  // Configura los pines de la pantalla de 7 segmentos como salida
  pinMode(segA, OUTPUT);
  pinMode(segB, OUTPUT);
  pinMode(segC, OUTPUT);
  pinMode(segD, OUTPUT);
  pinMode(segE, OUTPUT);
  pinMode(segF, OUTPUT);
  pinMode(segG, OUTPUT);
  pinMode(segDP, OUTPUT);  // Opcional
}

void loop() {
  // ...código previo para leer los botones...
  
  // Si el piso deseado es diferente al actual, mueve el elevador y actualiza la pantalla
  if (pisoDeseado != pisoActual) {
    mostrarNumero(pisoDeseado); // Actualiza la pantalla de 7 segmentos con el piso deseado
    moverAElevador();
    pisoActual = pisoDeseado; // Actualiza piso actual tras la simulación
  }
  
  // ...código previo...
}

void mostrarNumero(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.
1y
junta todo el codigo
1y
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 motor
const int motorPin1 = 11; // Pin de control del motor A
const int motorPin2 = 10; // Pin de control del motor B

// Pines para los botones
const int buttonPin1 = 12; // Botón para el primer piso
const int buttonPin2 = 13; // Botón para el segundo piso
const int buttonPin3 = 3;  // Botón para el tercer piso

// Pines de los segmentos de la pantalla de 7 segmentos
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; // Punto decimal opcional
// Estados actuales y deseados del elevador
int pisoDeseado = 0; 
int pisoActual = 0;

// Matriz de los segmentos para representar los números 0-3 en la pantalla de 7 segmentos
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
};

void setup() {
  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 opcional

  Serial.begin(9600);
  Serial.println("Sistema de elevador inicializado");
}

void loop() {
  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 segmentos
    moverAElevador();
    pisoActual = pisoDeseado; // Simula la llegada al piso deseado
    Serial.print("Llegada al piso: ");
    Serial.println(pisoActual);
    detenerMotor();
  }
}

void moverAElevador() {
  if (pisoDeseado > pisoActual) {
    moverArriba();
  } else if (pisoDeseado < pisoActual) {
    moverAbajo();
  }
}

void moverArriba() {
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  Serial.println("Moviendo el elevador hacia arriba");
}

void moverAbajo() {
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  Serial.println("Moviendo el elevador hacia abajo");
}

void detenerMotor() {
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  Serial.println("Motor detenido");
}

void mostrarNumero(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ínea
  digitalWrite(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.
1y
SI MIS BOTONES TIENEN SU RESISTENCIA NO CAMBIA NADA EN EL CODIGO '
1y
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


void setup() {
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  
  // Configura los pines de los botones como entrada
  pinMode(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.
1y
en la pantalla unicamente quiero que se muestren el numero de piso en el que esta y al que avanza
1y
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


void mostrarNumero(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ínea
  digitalWrite(segDP, LOW);
}

void loop() {
  // ...código previo para leer los botones...
  
  // Si el piso deseado es diferente al actual, mueve el elevador y actualiza la pantalla
  if (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 piso
    delay(2000);  // Simula el tiempo de movimiento entre pisos
    pisoActual = pisoDeseado; // El elevador ha llegado al nuevo piso
    Serial.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.
1y
en este codigo se debe tener en cuenta que la funcion del elevador la realizara el control del motor con giro , si esta ?
1y
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


void moverArriba() {
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  Serial.println("Moviendo el elevador hacia arriba");
}

void moverAbajo() {
  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


void loop() {
  // Lectura de botones y actualización de pisoDeseado...
  
  if (pisoDeseado != pisoActual) {
    moverAElevador();
    mostrarNumero(pisoDeseado - 1);  // Actualiza la pantalla de 7 segmentos
    delay(2000); // Simula el tiempo de movimiento entre pisos
    pisoActual = pisoDeseado; // El elevador ha llegado al nuevo piso
    Serial.print("Llegada al piso: ");
    Serial.println(pisoActual);
    detenerMotor();
  }

  // ...resto del loop...
}

void moverAElevador() {
  if (pisoDeseado > pisoActual) {
    moverArriba();
  } else if (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.
1y
si la distancia entre pisos es de 8.3 cm cuaanto debe girar el motor para que cada boton cumpla su funcion
1y
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=Distancia a moverPaso del husillo\text{Revoluciones necesarias} = \frac{\text{Distancia a mover}}{\text{Paso del husillo}}
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×Pasos por revolucioˊnPaso del husillo\text{Pasos necesarios} = \text{Distancia a mover} \times \frac{\text{Pasos por revolución}}{\text{Paso del husillo}}
Por lo tanto:
Pasos necesarios=83mm×200pasos/rev1mm/rev=16600pasos\text{Pasos necesarios} = 83 mm \times \frac{200 pasos/rev}{1 mm/rev} = 16600 pasos
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.
1y
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} };
void setup(){ 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);
}
void loop() { 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){ mostrarNumero(pisoDeseado -1); moverAElevador(); pisoActual= pisoDeseado; Serial.println("Llegada al piso"); Serial.println(pisoActual); detenerMotor(); }
void moverAElevador(){ if(pisoDeseado > pisoActual){ moverArriba(); }else if (pisoDeseado < pisoActual){ moverAbajo(); } } void moverArriba(){ digitalWrite(motorPin1, HIGH); digitalWrite(motorPin2, LOW); Serial.println ("moviendo el elevador hacia arriba"); }
void moverAbajo(){ digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, HIGH); Serial.println ("moviendo el elevador hacia aBAJO"); } void detenerMotor(){ digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); Serial.println ("mOTOR DETENIDO"); } void mostrarNumero(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][7]);
digitalWrite(segDP, LOW);
} }
1y
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:
  1. 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().
  2. 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 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},  // 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
};

void setup() {
  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);
}

void loop() {
  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();
  }
}

void moverAElevador() {
  if (pisoDeseado > pisoActual) {
    moverArriba();
  } else if (pisoDeseado < pisoActual) {
    moverAbajo();
  }
}

void moverArriba() {
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  Serial.println("Moviendo el elevador hacia arriba");
}

void moverAbajo() {
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  Serial.println("Moviendo el elevador hacia abajo");
}

void detenerMotor() {
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  Serial.println("Motor detenido");
}

void mostrarNumero(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.
1y


  • Ground
    A common return path for electric current. Commonly known as ground.
  • Net Portal
    Wirelessly connects nets on schematic. Used to organize schematics and separate functional blocks. To wirelessly connect net portals, give them same designator. #portal
  • Power Net Portal
    Wirelessly connects power nets on schematic. Identical to the net portal, but with a power symbol. Used to organize schematics and separate functional blocks. To wirelessly connect power net portals, give them the same designator. #portal #power
  • Generic Resistor
    A generic fixed resistor for rapid developing circuit topology. Save precious design time by seamlessly add more information to this part (value, footprint, etc.) as it becomes available. Standard resistor values: 1.0Ω 10Ω 100Ω 1.0kΩ 10kΩ 100kΩ 1.0MΩ 1.1Ω 11Ω 110Ω 1.1kΩ 11kΩ 110kΩ 1.1MΩ 1.2Ω 12Ω 120Ω 1.2kΩ 12kΩ 120kΩ 1.2MΩ 1.3Ω 13Ω 130Ω 1.3kΩ 13kΩ 130kΩ 1.3MΩ 1.5Ω 15Ω 150Ω 1.5kΩ 15kΩ 150kΩ 1.5MΩ 1.6Ω 16Ω 160Ω 1.6kΩ 16kΩ 160kΩ 1.6MΩ 1.8Ω 18Ω 180Ω 1.8KΩ 18kΩ 180kΩ 1.8MΩ 2.0Ω 20Ω 200Ω 2.0kΩ 20kΩ 200kΩ 2.0MΩ 2.2Ω 22Ω 220Ω 2.2kΩ 22kΩ 220kΩ 2.2MΩ 2.4Ω 24Ω 240Ω 2.4kΩ 24kΩ 240kΩ 2.4MΩ 2.7Ω 27Ω 270Ω 2.7kΩ 27kΩ 270kΩ 2.7MΩ 3.0Ω 30Ω 300Ω 3.0KΩ 30KΩ 300KΩ 3.0MΩ 3.3Ω 33Ω 330Ω 3.3kΩ 33kΩ 330kΩ 3.3MΩ 3.6Ω 36Ω 360Ω 3.6kΩ 36kΩ 360kΩ 3.6MΩ 3.9Ω 39Ω 390Ω 3.9kΩ 39kΩ 390kΩ 3.9MΩ 4.3Ω 43Ω 430Ω 4.3kΩ 43KΩ 430KΩ 4.3MΩ 4.7Ω 47Ω 470Ω 4.7kΩ 47kΩ 470kΩ 4.7MΩ 5.1Ω 51Ω 510Ω 5.1kΩ 51kΩ 510kΩ 5.1MΩ 5.6Ω 56Ω 560Ω 5.6kΩ 56kΩ 560kΩ 5.6MΩ 6.2Ω 62Ω 620Ω 6.2kΩ 62KΩ 620KΩ 6.2MΩ 6.8Ω 68Ω 680Ω 6.8kΩ 68kΩ 680kΩ 6.8MΩ 7.5Ω 75Ω 750Ω 7.5kΩ 75kΩ 750kΩ 7.5MΩ 8.2Ω 82Ω 820Ω 8.2kΩ 82kΩ 820kΩ 8.2MΩ 9.1Ω 91Ω 910Ω 9.1kΩ 91kΩ 910kΩ 9.1MΩ #generics #CommonPartsLibrary
  • Generic Capacitor
    A generic fixed capacitor ideal for rapid circuit topology development. You can choose between polarized and non-polarized types, its symbol and the footprint will automatically adapt based on your selection. Supported options include standard SMD sizes for ceramic capacitors (e.g., 0402, 0603, 0805), SMD sizes for aluminum electrolytic capacitors, and through-hole footprints for polarized capacitors. Save precious design time by seamlessly add more information to this part (value, footprint, etc.) as it becomes available. Standard capacitor values: 1.0pF 10pF 100pF 1000pF 0.01uF 0.1uF 1.0uF 10uF 100uF 1000uF 10,000uF 1.1pF 11pF 110pF 1100pF 1.2pF 12pF 120pF 1200pF 1.3pF 13pF 130pF 1300pF 1.5pF 15pF 150pF 1500pF 0.015uF 0.15uF 1.5uF 15uF 150uF 1500uF 1.6pF 16pF 160pF 1600pF 1.8pF 18pF 180pF 1800pF 2.0pF 20pF 200pF 2000pF 2.2pF 22pF 20pF 2200pF 0.022uF 0.22uF 2.2uF 22uF 220uF 2200uF 2.4pF 24pF 240pF 2400pF 2.7pF 27pF 270pF 2700pF 3.0pF 30pF 300pF 3000pF 3.3pF 33pF 330pF 3300pF 0.033uF 0.33uF 3.3uF 33uF 330uF 3300uF 3.6pF 36pF 360pF 3600pF 3.9pF 39pF 390pF 3900pF 4.3pF 43pF 430pF 4300pF 4.7pF 47pF 470pF 4700pF 0.047uF 0.47uF 4.7uF 47uF 470uF 4700uF 5.1pF 51pF 510pF 5100pF 5.6pF 56pF 560pF 5600pF 6.2pF 62pF 620pF 6200pF 6.8pF 68pF 680pF 6800pF 0.068uF 0.68uF 6.8uF 68uF 680uF 6800uF 7.5pF 75pF 750pF 7500pF 8.2pF 82pF 820pF 8200pF 9.1pF 91pF 910pF 9100pF #generics #CommonPartsLibrary
  • Generic Inductor
    A generic fixed inductor for rapid developing circuit topology. *You can now change the footprint and 3D model at the top level anytime you want. This is the power of #generics
  • Terminal
    Terminal
    An electrical connector acting as reusable interface to a conductor and creating a point where external circuits can be connected.
  • RMCF0805JT47K0
    47 kOhms ±5% 0.125W, 1/8W Chip Resistor 0805 (2012 Metric) Automotive AEC-Q200 Thick Film #forLedBlink
  • 875105359001
    10uF Capacitor Aluminum Polymer 20% 16V SMD 5x5.3mm #forLedBlink #commonpartslibrary #capacitor #aluminumpolymer #radialcan
  • CTL1206FYW1T
    Yellow 595nm LED Indication - Discrete 1.7V 1206 (3216 Metric) #forLedBlink

Inspect

Arduino Uno R3 Shield Template

Arduino Uno R3 Shield Template
Description

Created
Last updated by osco
1 Contributor(s)
osco

Controls

Properties

Availability & Pricing

DistributorQty 1
Digi-Key$8.56–$8.71
LCSC$0.36–$4.33
Mouser$8.31

Assets