¡Bienvenido visitante ! ¡Apúntate al foro ! ¡Es gratuito !
Aquí encontrarás respuesta a muchas de tus preguntas sobre modelismo ferroviario.
¡Puedes preguntar a tus anchas y aportar tus conocimientos!

Proyecto "Ermita" (Arduino)

Un sitio específico para que cada cual hable de sus proyectos. Así no queda difuminado según el tema por los talleres.
Avatar de Usuario
fmco
Forero
Mensajes: 945
Registrado: Vie Ene 20, 2006 4:09 pm
20
Ubicación: Reus
Contactar:

Re: Proyecto "Ermita" (Arduino)

Mensaje por fmco »

Queremos video! Queremos video! :mrgreen:
Avatar de Usuario
Alfred
Forero
Mensajes: 897
Registrado: Jue Abr 24, 2008 9:41 pm
18
Ubicación: Sant Martí de Provençals

Re: Proyecto "Ermita" (Arduino)

Mensaje por Alfred »

:lol:
l'Alfred
Avatar de Usuario
Alfred
Forero
Mensajes: 897
Registrado: Jue Abr 24, 2008 9:41 pm
18
Ubicación: Sant Martí de Provençals

Re: Proyecto "Ermita" (Arduino)

Mensaje por Alfred »

l'Alfred
Avatar de Usuario
Alfred
Forero
Mensajes: 897
Registrado: Jue Abr 24, 2008 9:41 pm
18
Ubicación: Sant Martí de Provençals

Re: Proyecto "Ermita" (Arduino)

Mensaje por Alfred »

Estoy recuperando este proyecto y he echo algunas modificaciones.

Para empezar he encontrado una terjeta de sonido de la casa Uhlenbrock que se activa por medio de un pulsador o alimetando un opto. Harés esta segunda opción.
IMG_20230622_184912.jpg
IMG_20230622_184912.jpg (3.3 MiB) Visto 187 veces
Esto me permite simplificar un poco el programa del arduino que controla todo, ya que al no depender el sonido directamente del Arduino, me permite usar el Timer normal. Lo que he hecho es anular todo lo referente a la tageta SD y Altavoz del programa y he añadido una salida PINOPTO.

Os adjunto la variante del programa con la esperanza que la miréis y que me encontrárais los herrores que seguramente he cometido.
Ermita 4.pdf
(39.37 KiB) Descargado 4 veces
(nota: no se como inserir un texto como un "cuadro de texto")
l'Alfred
Avatar de Usuario
fmco
Forero
Mensajes: 945
Registrado: Vie Ene 20, 2006 4:09 pm
20
Ubicación: Reus
Contactar:

Re: Proyecto "Ermita" (Arduino)

Mensaje por fmco »

hola,

he copiado tu programa y me da errores de compilación. Un par de sugerencias:
  • En el Arduino IDE pulsa el botón derecho del ratón y clica en 'Autoformato'. Esto te formatea el texto y puedes ver el programa con el sangrado (indentación) adecuado para detectar errores de falta de llaves {.
  • Clica en una llave { o } y te mostrará su pareja, así verás si te falta alguna.

Yo he detectado un par de erroes debido a { mal colocadas, la última del programa que no tiene pareja, esta de más, y otra en la función EjecutaErmita() en que has comentado el while() pero no su llave final.

En cuanto al programa:
  • Los pines de entrada y salida deben definirse en el setup() con pinMode() o luego no funcionarán. El del servo no hace falta ya que lo hace la librería.

    Te faltan todos los pines de salida:

    Código: Seleccionar todo

    void setup() {
      pinMode(pinpulsador, INPUT_PULLUP);
      pinMode(pinledverd, OUTPUT);
      pinMode(pinledvermell, OUTPUT);
      pinMode(pinledblanc, OUTPUT);
      pinMode(pinledespelma, OUTPUT);
      pinMode(pinopto, OUTPUT);
      myservo.attach(pinservo); // vincula el servo al pin digital 6
      myservo.write(posMin);
    }
    Para 'inserir' :wink: un texto pincha el botón con <>=_<> que te pondrá un par de etiquetas code en el mensaje y en medio introduce el texto.
  • El loop() se ejecuta indefinidamente, cuando acaba vuelve a empezar. Ahora mismo lo único que hace es leer el pulsador y en función de si esta pulsado o no cambiar los LED rojo y verde. El resto de funciones no se ejecutan ya que no las llamas en ningún momento. Te has pasado comentando líneas :lol: Descomenta la llamada a EjecutaErmita()

    Código: Seleccionar todo

    void loop() {
      value = digitalRead(pinpulsador); //lectura digital del pin
      if (value == LOW) {
        digitalWrite ( pinledverd , LOW ); // apaga el led verd indicador de stand     by
        digitalWrite ( pinledvermell , HIGH ); // encen el led vermell indicant que está     en funcionament
        EjecutaErmita();
      }
      else {
        digitalWrite ( pinledvermell , LOW ); // apaga el led de funcionament
        digitalWrite ( pinledverd , HIGH ); // encen el led verd de stand by
      }
    }
  • Esta es más difícil de ver y te darás cuenta cuando ejecutes el programa. Hemos pulsado el botón, los LED rojo y verde cambian y vamos a ejecutar la función EjecutaErmita(). Ahora mismo la tienes así:

    Código: Seleccionar todo

    void EjecutaErmita() {
      digitalWrite ( pinledblanc, HIGH ); // encen el llum de l'Ermita
      delay (2000);
      MouCampana(); // Comença a moure campana
    
      digitalWrite ( pinopto, HIGH );
    
      digitalWrite ( pinledespelma , HIGH ); // encen l'espelma
      delay (5000);
      digitalWrite ( pinledblanc , LOW ); // apaga el llum de l'Ermita
      digitalWrite ( pinledespelma , LOW ); // apaga l'espelma
    }
    Se enciende el LED blanco cuando llega el campanero, se espera dos segundos y se hace un único movimiento de campana con MouCampana() en que el badajo todavía no llega a golpear la campana. Luego activas el opto y comienza a sonar la campana en el módulo Uhlembrock.
    Se enciende la vela y tras 5 segundos se marcha el campanero apagando la luz blanca y la vela.
    Una vez finalizada la función se vuelve al loop() para comprobar de nuevo el pulsador.

    ¿Qué falta?
    ► Mostrar Spoiler

Ánimo!!! Que no es difícil y es muy entretenido.

saludos,

Paco
Avatar de Usuario
Alfred
Forero
Mensajes: 897
Registrado: Jue Abr 24, 2008 9:41 pm
18
Ubicación: Sant Martí de Provençals

Re: Proyecto "Ermita" (Arduino)

Mensaje por Alfred »

Muchas gracias.

Lo únco que había hecho era modificar el archivo "ErmitaTimer2.zip" que me pasate hace 4 años.

Al encontrar el módulo de sonido de Uhlembrock he deshechado la targeta SD y altavoz. El módulo Uhlembrock se activa con un pulso, ya sea de tensión entre 5 y 12 v en la entrada Opto, que es la que usaré, o cerrando el circuito por medio de un pulsador.
El módulo de sonido reproduce un sondo waw cada vez que se pulsa. Puedes ser en bucle o una sola vez. Por lo que el archivo de sonido durará x tiempo y se parará.
Ahora tendré que hacer coincidir el tiempo del sonido con el tiempo de movimiento de la campana!!!!

De momento he hecho las siguienntes modificaciones:

Código: Seleccionar todo

#include <Servo.h>  // inclou la llibreria Servo

Servo myservo;

// Definició dels leds
const int pinledverd = 8;
const int pinledvermell = 7;
const int pinledblanc = 5;
const int pinledespelma = 4;
// Definició del pulsador
const int pinpulsador = 2;
// Definició servo
const int pinservo = 6;
const int posMax = 140;  // posicio maxima
const int posMin = 20;   // posicio minima
// Definició Opto targeta so
const int pinopto = 9;

int value;

void setup() {
  pinMode(pinpulsador, INPUT_PULLUP);
  pinMode(pinledverd, OUTPUT);
  pinMode(pinledvermell, OUTPUT);
  pinMode(pinledblanc, OUTPUT);
  pinMode(pinledespelma, OUTPUT);
  pinMode(pinopto, OUTPUT);
  myservo.attach(pinservo);  // vincula el servo al pin digital 6
  myservo.write(posMin);
}

void loop() {
  value = digitalRead(pinpulsador);  //lectura digital del pin
  if (value == LOW) {
    digitalWrite(pinledverd, LOW);      // apaga el led verd indicador de stand by
    digitalWrite(pinledvermell, HIGH);  // encen el led vermell indicant que está en funcionament
    // EjecutaErmita();
  } else {
    digitalWrite(pinledvermell, LOW);  // apaga el led de funcionament
    digitalWrite(pinledverd, HIGH);    // encen el led verd de stand by
  }
}

void EjecutaErmita() {
  digitalWrite(pinledblanc, HIGH);  // encen el llum de l'Ermita
  delay(2000);
  MouCampana();  // Comença a moure campana
  digitalWrite(pinopto, HIGH);
  delay(50)
  digitalwrite(pinopto, LOW)
  digitalWrite(pinledespelma, HIGH);  // encen l'espelma
  delay(5000);
  digitalWrite(pinledblanc, LOW);    // apaga el llum de l'Ermita
  digitalWrite(pinledespelma, LOW);  // apaga l'espelma
}

void MouCampana() {
  int pos;
  //varia la posicio minima a maxima
  for (pos = posMin; pos <= posMax; pos++) {
    myservo.write(pos);
    delay(20);
  }

  //varia la posicion de maxima a minima
  for (pos = posMax; pos >= posMin; pos--) {
    myservo.write(pos);
    delay(20);
  }
}
l'Alfred
Avatar de Usuario
Alfred
Forero
Mensajes: 897
Registrado: Jue Abr 24, 2008 9:41 pm
18
Ubicación: Sant Martí de Provençals

Re: Proyecto "Ermita" (Arduino)

Mensaje por Alfred »

Antes se me olvidó poner el nuevo esquema!!!!
Adjuntos
Ermita_esquema 2.png
Ermita_esquema 2.png (65.94 KiB) Visto 153 veces
l'Alfred
Avatar de Usuario
Alfred
Forero
Mensajes: 897
Registrado: Jue Abr 24, 2008 9:41 pm
18
Ubicación: Sant Martí de Provençals

Re: Proyecto "Ermita" (Arduino)

Mensaje por Alfred »

Antes se me olvidó poner el nuevo esquema!!!!

Ermita_esquema 2.png
Ermita_esquema 2.png (65.94 KiB) Visto 153 veces
l'Alfred
Avatar de Usuario
fmco
Forero
Mensajes: 945
Registrado: Vie Ene 20, 2006 4:09 pm
20
Ubicación: Reus
Contactar:

Re: Proyecto "Ermita" (Arduino)

Mensaje por fmco »

hola,
Antes se me olvidó poner el nuevo esquema!!!!

Antes de seguir, unos conceptos para asentar conocimientos:
  • ya estarás familiarizado con la conexión de un LED, el ánodo (pin de la parte redonda del encapsulado y pin tocando el triangulo en su dibujo de su esquema) para que se encienda se conecta siempre a positivo. Por otro lado el cátodo (pin de la parte plana del encapsulado y el pin tocando a la raya en el dibujo de su esquema) se conecta a negativo o masa.

    Imagen
  • Siempre hay que colocarle una resistencia, su valor depende de la tensión con que lo alimentes (Vs), la tensión del LED (VLED) que depende de su color (aproximadamente entre 1,6V para rojo y 3,4V para blanco) y la intensidad que pase por él (ILED), entre 2mA para los de alto brillo y 20mA para los normales, cuanta más intensidad, más luz dará.

    Imagen
  • Si lo queremos controlar con el Arduino, tal como has escrito en el programa (se enciende con HIGH y se apaga con LOW) se tiene que conectar así:

    Imagen
Resumiendo, en el esquema tienes dibujados todos los LED al revés :oops:


En cuanto a los pulsadores, se pueden conectar de dos maneras:

Imagen
  • Con resistencia de pull-down: Mientras no se pulsa el pulsador en la entrada tienes un valor LOW debido a la conexión de la resistencia, cuando lo pulsas tendrás un valor HIGH. Para saber cuando se pulsa debes mirar cuando la entrada es HIGH.

    Código: Seleccionar todo

    const int pinpulsador = 2;
    
    void setup() {
      pinMode(pinpulsador, INPUT);
    }
    
    void loop() {
      if (digitalRead(pinpulsador)== HIGH) {
        // Se ha pulsado, realizamos alguna accion
      }
    }
    
  • Con resistencia de pull-up: En este caso mientras no se pulsa el pulsador en la entrada tienes un valor HIGH, cuando lo pulsas tendrás un valor LOW. Ahora lo que hay que comprobar es que la entrada este a LOW para saber que se ha pulsado

    Código: Seleccionar todo

    const int pinpulsador = 2;
    
    void setup() {
      pinMode(pinpulsador, INPUT);
    }
    
    void loop() {
      if (digitalRead(pinpulsador)== LOW) {
        // Se ha pulsado, realizamos alguna accion
      }
    }
    
    En este ultimo caso si los cables hasta el pulsador son muy cortos, te puedes ahorrar la resistencia de pull-up activando la interna del Arduino usando INPUT_PULLUP cuando defines el modo del pin:

    Código: Seleccionar todo

    const int pinpulsador = 2;
    
    void setup() {
      pinMode(pinpulsador, INPUT_PULLUP);
    }
    
    void loop() {
      if (digitalRead(pinpulsador)== LOW) {
        // Se ha pulsado, realizamos alguna accion
      }
    }
    
Re-resumiendo, tal como tienes escrito el programa, el esquema correcto es este:
Adjuntos
esquema.png
esquema.png (49.41 KiB) Visto 136 veces
Avatar de Usuario
fmco
Forero
Mensajes: 945
Registrado: Vie Ene 20, 2006 4:09 pm
20
Ubicación: Reus
Contactar:

Re: Proyecto "Ermita" (Arduino)

Mensaje por fmco »

hola,
De momento he hecho las siguienntes modificaciones:
He detectado un par de errores:
  • Las instrucciones tienen que acabar en ; en un par de sitios te falta
  • En el loop() no has descomentado la llamada a EjecutaErmita() por lo que no se ejecuta la función
Para que vayas practicando y viendo los errores te he preparado tu proyecto en el simulador Wokwi.

No necesitas estar dado de alta, lo que tienes que hacer es ir a esta pagina:

https://wokwi.com/projects/new/arduino-nano

Luego del .zip que te adjunto abres con el Wordpad el archivo sketch.ino lo seleccionas todo y haces copiar, luego en la pestaña sketch.ino del simulador lo pegas

Después haces lo mismo con el archivo diagram.json y lo pegas en la pestaña diagram.json del simulador con lo que tendrás el circuito dibujado.

Ya puedes darle al 'Play' y probar el programa, puedes detenerlo y hacerle cambios y ver el resultado.

saludos,

Paco
Adjuntos
wokwi.png
wokwi.png (128.08 KiB) Visto 120 veces
project.zip
Proyecto Ermita para Wokwi
(5.54 KiB) Descargado 3 veces
Avatar de Usuario
Alfred
Forero
Mensajes: 897
Registrado: Jue Abr 24, 2008 9:41 pm
18
Ubicación: Sant Martí de Provençals

Re: Proyecto "Ermita" (Arduino)

Mensaje por Alfred »

Muchas gracias!!!!!!

Esto es lo que andaba buscando un simulador para ir practicando!!!!
l'Alfred
Avatar de Usuario
Alfred
Forero
Mensajes: 897
Registrado: Jue Abr 24, 2008 9:41 pm
18
Ubicación: Sant Martí de Provençals

Re: Proyecto "Ermita" (Arduino)

Mensaje por Alfred »

Ya funciona como quiero excepto un pequeño detalle!!!!!

La campana debería de moverse unas 6 u 8 veces por lo que no sé como añadirlo aquí:

Código: Seleccionar todo

void MouCampana() {
  int pos;
  //varia la posicio minima a maxima
  for (pos = posMin; pos <= posMax; pos++) {
    myservo.write(pos);
    delay(20);
  }

  //varia la posicion de maxima a minima
  for (pos = posMax; pos >= posMin; pos--) {
    myservo.write(pos);
    delay(20);
  }
l'Alfred
Avatar de Usuario
xaviermbcn
Forero
Mensajes: 3175
Registrado: Mié Ene 18, 2006 7:54 am
20
Ubicación: Barcelona

Re: Proyecto "Ermita" (Arduino)

Mensaje por xaviermbcn »

Pon un for que abarque estos 2.
Con una variable de 1 a 6
Xavier

Maqueta 0 operativa, en construcción.
Maqueta H0 operativa, en construcción.

TC3.3, 5.0, 5.5, 5.8, 7.0, 8.0G2, 9.0C2 Gold, TP 5.5 a 9.0, TA, +Street.
Electronica: Central Lenz 3.6 + LI LAN + LH100 + PacoMouse !!
Retro: LDT RS8, RS16, PpP, LR100, CTMS
Accesorios: LDT 1-DEC, S-DEC, SA-DEC, LS100, LS150, CTMS
Otros: Rramp, LDT KSM.
Avatar de Usuario
xaviermbcn
Forero
Mensajes: 3175
Registrado: Mié Ene 18, 2006 7:54 am
20
Ubicación: Barcelona

Re: Proyecto "Ermita" (Arduino)

Mensaje por xaviermbcn »

Y si es una subrutina, hazlo mas chapucero. Llama la función seis veces seguidas. Hasta puedes añadir un delay entre cada llamada....
Xavier

Maqueta 0 operativa, en construcción.
Maqueta H0 operativa, en construcción.

TC3.3, 5.0, 5.5, 5.8, 7.0, 8.0G2, 9.0C2 Gold, TP 5.5 a 9.0, TA, +Street.
Electronica: Central Lenz 3.6 + LI LAN + LH100 + PacoMouse !!
Retro: LDT RS8, RS16, PpP, LR100, CTMS
Accesorios: LDT 1-DEC, S-DEC, SA-DEC, LS100, LS150, CTMS
Otros: Rramp, LDT KSM.
Avatar de Usuario
fmco
Forero
Mensajes: 945
Registrado: Vie Ene 20, 2006 4:09 pm
20
Ubicación: Reus
Contactar:

Re: Proyecto "Ermita" (Arduino)

Mensaje por fmco »

hola,
Y si es una subrutina, hazlo mas chapucero. Llama la función seis veces seguidas.

no me seáis chapuzas tened un poco de estilo escribiendo el programa que para eso tenéis un curso muy chulo aquí mismo:

http://ctms1.com/forum/viewtopic.php?t=4263


¿No me digas que prefieres esto?:

Código: Seleccionar todo

...
  MouCampana();  // Comença a moure campana - Comienza a mover campana
  digitalWrite(pinopto, HIGH);  // Engega el so - Arranca el sonido
  delay(50);
  digitalWrite(pinopto, LOW);
  MouCampana();  // Ding-dong
  MouCampana();  // Ding-dong
  MouCampana();  // Ding-dong
  MouCampana();  // Ding-dong
  MouCampana();  // Ding-dong
  MouCampana();  // Ding-dong
...
¿a esto?:

Código: Seleccionar todo

#define NUM_DING_DONGS 6


...
  MouCampana();  // Comença a moure campana - Comienza a mover campana
  digitalWrite(pinopto, HIGH);  // Engega el so - Arranca el sonido
  delay(50);
  digitalWrite(pinopto, LOW);
  for (int DingDong = 0; DingDong < NUM_DING_DONGS; DingDong++)
    MouCampana();  // Ding-dong
...
¿y si son 15 ding-dongs lo que le dura el sonido?


Hasta puedes añadir un delay entre cada llamada....
No acabo de ver esto, quieres que se pare el el aire la campana?

saludos,

Paco
Responder
 
  • Contacto
  • Nombre de Usuario:
    Email:
    Asunto:
    Mensaje: