Go Down

Topic: Campanas para mi Iglesia. (Read 10453 times) previous topic - next topic

francisco2v

Dec 08, 2014, 06:56 pm Last Edit: Dec 16, 2014, 08:38 am by francisco2v
Siempre que recurro a Uds. recibo gran ayuda desinteresada y esta vez de nuevo necesito de los que más saben que me ayuden.
Tengo dos campanas que quiero tocar de forma automatizada con unos mazos con electroimanes.
Necesito ayuda (GRAN AYUDA)en software para arduino nano si es posible.
Dos salidas con rele ( para las dos campanas) y 10 o 15 programas que se puedan memorizar y llamar según necesidad. Visualizado con un display de 2x16.
Como se puede enfocar y si ....alguna persona del foro me da la solución... se lo agradezco muchísimo.
Que quede constancia que no es para mi...es para mi pequeña y modesta comunidad. ( Con lo poco que se pueda siempre me gusta ayudar.).


carmeloco

Lo primero que debes plantearte, son las secuencias a cumplir, o sea, toques de cada campana y tiempo de pausa entre cada uno de ellos, para cada uno de los 10 o 15 "programas". No me sirven 10 o 15. Hay que tener claro desde un principio el número total de secuencias, y cómo deben ser.

Lo segundo, es cómo tienes pensado decirle al arduino, que ejecute cada una de esas secuencias. Entiendo que si es para una iglesia, debe de ser algo sencillo de usar. A mi se me ocurre crear un panel con tantos botones como secuencias haya. El arduino nano, no tiene tantas entradas, pero le podríamos dar el número, con combinaciones en binario. Usando 4 pines, puedes conseguir decirle 15 secuencias distintas.

Piensa en todo esto y nos comentas.

curro92

Hola,
ahí van algunas ideas ideas que se me ocurren poniéndome en el caso de que lo tuviera que hacerlo yo (no es el caso, porque en el pueblo hay una señora que las toca de maravilla jeje)

- Pienso que los electromazos serán de un consumo considerable (tal vez próximo a los 10A), hará falta relés que aguanten bien eso, y tendrás que pensar cómo controlar esos relés (transitsor, tiristor). Además, mira las características de esos martillos eléctricos, si necesitan continua o alterna. Y el tiempo de accionamiento del martillo, que creo que tendrá que ser muy breve. Supongo que todo eso lo tienes más o menos controlado.

- para elaborar los distintos programas, yo haría lo siguiente: conectaría a arduino un pequeño buzzer o altavoz, y con la librería tone
http://arduino.cc/en/reference/tone


definiría dos notas (que más o menos se correspondan  con las campanas) e iría completando las melodías con las dos notas, tin-ton tin-ton, ya sabes, si son las fiestas tin-ton-ton, tin-ton-ton y si es para difunto tiiinnnn-taaannnn-tiiinnnn-taaannnn...

- para el control, puede valer lo que te ha sugerido carmeloco, un panel con tantos botones como programas. Otra solución más sofisticada sería usar un LCD 1602 con botonera, como este

en ebay los tienes por menos de 5 euros. Con esos botones puedes ir recorriendo una lista que aparece en la LCD y seleccionar una opción (hay librerías para eso).

- lo más sencillo teniendo la LCD 1602: utilizar solo dos botones, uno para que se presenten sucesivamente los nombres de los programas, el otro para seleccionar el que está en la pantalla.







francisco2v

Creo que serian como secuencial alto/bajo para cada una de las dos campanas y estas secuencias estar en la memoria.
Como leer una secuencia de la memoria y que salga para la campana 1 y/o la campana 2.
Como poner las secuencias en la memoria para llamarlas después.
Gracias...estoy perdidito......

carmeloco

Las secuencias, hay muchas formas de almacenarlas, desde guardarlas en un array, hasta hace una sub-rutina por cada secuencia.

francisco2v

Gracias...pero...necesito mas ayuda...tengo un nivel muy bajo
Salu2

curro92


Hola,
Para empezar podrías conectar dos led a los pines de campana, y practicar.
la forma más sencilla sería utilizar digitalWrite() para dar un impulso al relé que controla el martillo, tendrías que ajustar la duración, yo he puesto una décima de segundo (100 milisegundos), y la duración intervalo entre campanas (he puesto 1 segundo)

Code: [Select]

int campana1Pin = 2;         
int campana2Pin = 3;               

void setup()
{
   pinMode(campana1Pin, OUTPUT);      // pin digital como salida
   pinMode(campana2Pin, OUTPUT);      // pin digital como salida

}


// tocar dos campanas sucesivamente  n numero de veces
toque_de_campanas_numero1(int n)
{
    int c;
    for(c=0; c< n;c++)
    {
       digitalWrite(campana1Pin , HIGH); 
       delay(100);   
       digitalWrite(campana1Pin , LOW);
       delay(1000);   

       digitalWrite(campana2Pin , HIGH); 
       delay(100);   
       digitalWrite(campana2Pin , LOW);
       delay(1000); 
   }
}

void loop()
{

   if(boton1) 
      toque_de_campanas_numero1(33)   //ejecutar el toque con 33 campanadas
}



francisco2v

#7
Dec 09, 2014, 04:33 pm Last Edit: Dec 09, 2014, 04:49 pm by francisco2v
Muchas gracias.....ya me voy "aclarado" .....un poco......bueno voy a probar. Si ves como profundizar algo más te lo agradecería.
No tengo nada claro de como hacer....:
Al pulsar boton1 que suene una secuencia
Al pulsar boton2 que suene otra secuencia
.....etc.
Con 10 ó 15 serían sufucientes.
Salu2
(Ya se que pido mucho......pero bueno.....me es necesario.)

francisco2v

Hola de nuevo al compilar me dan estos errores:

sketch_dec09a:13: error: ISO C++ forbids declaration of 'toque_de_campanas_numero1' with no type
sketch_dec09a.cpp: In function 'void loop()':
sketch_dec09a:33: error: 'boton1' was not declared in this scope
sketch_dec09a:34: error: expected `;' at end of input
sketch_dec09a:34: error: expected `}' at end of input

Gracias por su ayuda

surbyte

Quote
const byte campana1Pin = 2;         
const byte campana2Pin = 3;               
const byte boton1Pin     = 4;

void setup() {
   pinMode(campana1Pin, OUTPUT);      // pin digital como salida
   pinMode(campana2Pin, OUTPUT);      // pin digital como salida
   pinMode(boton1Pin, INPUT);             // pin digital como entrada

// demas botones

}

void loop(){

   int boton1 = digitalRead(boton1Pin);
   if(boton1 == HIGH) 
      toque_de_campanas_numero1(33)   //ejecutar el toque con 33 campanadas
}

// tocar dos campanas sucesivamente  n numero de veces
void toque_de_campanas_numero1(int n)
{
    int c;
    for(c=0; c< n;c++)    {
       digitalWrite(campana1Pin , HIGH); 
       delay(100);   
       digitalWrite(campana1Pin , LOW);
       delay(1000);   

       digitalWrite(campana2Pin , HIGH); 
       delay(100);   
       digitalWrite(campana2Pin , LOW);
       delay(1000); 
   }
}


francisco2v

Sois unos GENIOS……
No llevo sombrero pero si lo llevase .....me lo quitaría ante Ustedes.
Bueno ahora hacer  pruebas ....es lo que toca…..les comentaré mis pequeños avances y Grades tropiezos.
Pregunta:
Cuantos pulsadores puedo poner SURBYTE...?

Salu2

francisco2v

SURBITE al compilar me da este error..:

sketch_dec09a.ino: In function 'void loop()':
sketch_dec09a:19: error: expected `;' before '}' token

Gracias de nuevo.

surbyte


francisco2v

Según entiendo primero toca la campana1 y despues la campana2.....:

 int c;
    for(c=0; c< n;c++)    {
       digitalWrite(campana1Pin , HIGH); 
       delay(100);   
       digitalWrite(campana1Pin , LOW);
       delay(1000);   

       digitalWrite(campana2Pin , HIGH); 
       delay(100);   
       digitalWrite(campana2Pin , LOW);
       delay(1000); 

Que debo hacer para que toquen las dos a la vez.
No puedo simular por los errores que me da al compilar.

Gracias.

carmeloco

Ahí va mi sugerencia:

Code: [Select]

int seq = 0; //Variable para pulsadores
//Secuencias. Primero el numero de campara, 1 ó 2
//luego la pausa en milisegundos
int s01 [] = {1, 1000, 2, 1000, 1, 1000, 2, 1000};
int s02 [] = {2, 1000, 1, 1000, 2, 1000, 1, 1000};
int s03 [] = {2, 1, 1, 1000, 2, 1, 1, 1000};
int s04 [] = {1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50};
int s05 [] = {2, 50, 2, 50, 2, 50, 2, 50, 2, 50, 2, 50, 2, 50, 2, 50};
void setup() {
  pinMode (2, OUTPUT);//pin campana 1
  pinMode (3, OUTPUT);//Pin Campana 2
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  pinMode (4, INPUT_PULLUP);//Pulsador secuencia 1
  pinMode (5, INPUT_PULLUP);//Pulsador secuencia 2
  pinMode (6, INPUT_PULLUP);//Pulsador secuencia 3
  pinMode (7, INPUT_PULLUP);//Pulsador secuencia 4
  pinMode (8, INPUT_PULLUP);//Pulsador secuencia 5
}

void loop() {
  //Pulsaciones
  if (digitalRead (4) == LOW) {
    seq = 1;
  }
  if (digitalRead (5) == LOW) {
    seq = 2;
  }
  if (digitalRead (6) == LOW) {
    seq = 3;
  }
  if (digitalRead (7) == LOW) {
    seq = 4;
  }
  if (digitalRead (8) == LOW) {
    seq = 5;
  }

  //Ejecución de secuencia según la pulsación
  //En cada bucle for, el parametro de "test" tiene que ser equivalente
  //a la longitud del array de la secuencia
  switch (seq) {
    case 1:
      for (int x = 0; x < 8; x = x + 2) {
        digitalWrite (s01[x] + 1 , LOW);//Rele UP
        delay (50);
        digitalWrite (s01[x] + 1 , HIGH);//Rele DOWN
        delay (s01[x + 1]);
      }
      seq = 0;
      break;
    case 2:
      for (int x = 0; x < 8; x = x + 2) {
        digitalWrite (s02[x] + 1 , LOW);
        delay (50);
        digitalWrite (s02[x] + 1 , HIGH);
        delay (s02[x + 1]);
      }
      seq = 0;
      break;
    case 3:
      for (int x = 0; x < 8; x = x + 2) {
        digitalWrite (s03[x] + 1 , LOW);
        delay (50);
        digitalWrite (s03[x] + 1 , HIGH);
        delay (s03[x + 1]);
      }
      seq = 0;
      break;
    case 4:
      for (int x = 0; x < 16; x = x + 2) {
        digitalWrite (s04[x] + 1 , LOW);
        delay (50);
        digitalWrite (s04[x] + 1 , HIGH);
        delay (s04[x + 1]);
      }
      seq = 0;
      break;
    case 5:
      for (int x = 0; x < 16; x = x + 2) {
        digitalWrite (s05[x] + 1 , LOW);
        delay (50);
        digitalWrite (s05[x] + 1 , HIGH);
        delay (s05[x + 1]);
      }
      seq = 0;
      break;
  }
}


Go Up