¡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!
Aquí encontrarás respuesta a muchas de tus preguntas sobre modelismo ferroviario.
¡Puedes preguntar a tus anchas y aportar tus conocimientos!
Proyecto "Ermita" (Arduino)
Re: Proyecto "Ermita" (Arduino)
Queremos video! Queremos video! 
- Alfred
- Forero
- Mensajes: 897
- Registrado: Jue Abr 24, 2008 9:41 pm
- 18
- Ubicación: Sant Martí de Provençals
Re: Proyecto "Ermita" (Arduino)
l'Alfred
- Alfred
- Forero
- Mensajes: 897
- Registrado: Jue Abr 24, 2008 9:41 pm
- 18
- Ubicación: Sant Martí de Provençals
Re: Proyecto "Ermita" (Arduino)
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.
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.
(nota: no se como inserir un texto como un "cuadro de texto")
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.
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.
(nota: no se como inserir un texto como un "cuadro de texto")
l'Alfred
Re: Proyecto "Ermita" (Arduino)
hola,
he copiado tu programa y me da errores de compilación. Un par de sugerencias:
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:
Ánimo!!! Que no es difícil y es muy entretenido.
saludos,
Paco
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:
Para 'inserir'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); }
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
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í:
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.
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 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
- Alfred
- Forero
- Mensajes: 897
- Registrado: Jue Abr 24, 2008 9:41 pm
- 18
- Ubicación: Sant Martí de Provençals
Re: Proyecto "Ermita" (Arduino)
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:
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
- Alfred
- Forero
- Mensajes: 897
- Registrado: Jue Abr 24, 2008 9:41 pm
- 18
- Ubicación: Sant Martí de Provençals
Re: Proyecto "Ermita" (Arduino)
Antes se me olvidó poner el nuevo esquema!!!!
- Adjuntos
-
- Ermita_esquema 2.png (65.94 KiB) Visto 153 veces
l'Alfred
Re: Proyecto "Ermita" (Arduino)
hola,
Antes de seguir, unos conceptos para asentar conocimientos:
En cuanto a los pulsadores, se pueden conectar de dos maneras:

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.

-
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á.

-
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í:

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

-
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
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); } void loop() { if (digitalRead(pinpulsador)== LOW) { // Se ha pulsado, realizamos alguna accion } }
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 } }
- Adjuntos
-
- esquema.png (49.41 KiB) Visto 136 veces
Re: Proyecto "Ermita" (Arduino)
hola,
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
He detectado un par de errores:De momento he hecho las siguienntes modificaciones:
- 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
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 (128.08 KiB) Visto 120 veces
-
- project.zip
- Proyecto Ermita para Wokwi
- (5.54 KiB) Descargado 3 veces
- Alfred
- Forero
- Mensajes: 897
- Registrado: Jue Abr 24, 2008 9:41 pm
- 18
- Ubicación: Sant Martí de Provençals
Re: Proyecto "Ermita" (Arduino)
Muchas gracias!!!!!!
Esto es lo que andaba buscando un simulador para ir practicando!!!!
Esto es lo que andaba buscando un simulador para ir practicando!!!!
l'Alfred
- Alfred
- Forero
- Mensajes: 897
- Registrado: Jue Abr 24, 2008 9:41 pm
- 18
- Ubicación: Sant Martí de Provençals
Re: Proyecto "Ermita" (Arduino)
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í:
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
- xaviermbcn
- Forero
- Mensajes: 3175
- Registrado: Mié Ene 18, 2006 7:54 am
- 20
- Ubicación: Barcelona
Re: Proyecto "Ermita" (Arduino)
Pon un for que abarque estos 2.
Con una variable de 1 a 6
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.
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.
- xaviermbcn
- Forero
- Mensajes: 3175
- Registrado: Mié Ene 18, 2006 7:54 am
- 20
- Ubicación: Barcelona
Re: Proyecto "Ermita" (Arduino)
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.
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.
Re: Proyecto "Ermita" (Arduino)
hola,
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?:
¿a esto?:
¿y si son 15 ding-dongs lo que le dura el sonido?
saludos,
Paco
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
...
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
...
No acabo de ver esto, quieres que se pare el el aire la campana?Hasta puedes añadir un delay entre cada llamada....
saludos,
Paco
-
- Menú CTMS Y MAS
-
- Contacto