Página 1 de 3

Proyecto "Ermita" (Arduino)

Publicado: Dom Jul 14, 2019 7:13 pm
por Alfred
No sé si estos foros estan abiertos a proyectos Arduino, pero por si acaso ahí va:

He empezado a desarrollar mi primer proyecto serio para Arduino.

Se trata de controlar los efectos de una ermita.

Lo que quiero hacer es lo siguiente:

Cuando se apriete un botón se inicie un ciclo de unos 40 segundos,
1. Se enciende el led que indica que el ciclo está activo (lluz rojo del botón)
2. Se enciende la luz interior de la Ermita
3. Se pone en funcionamiento la campana y suena el sonido de la campana
4. Se enciende el led/vela de la capilla
5. Se acaba el movimiento y el sonido de la campana
6. Se apaga la luz del interior de la Ermita
7. Se apaga el led/vela de la capilla, se apaga el led indicador y se enciende el led que indica que el ciclo puede empezar de nuevo (luz verde del botón)

El esquema de conexiones es el siguiente:
Ermita_esquema.png
(El integrado SCP 1000 corresponde al lector de terjetas Micro SD.)

Re: Proyecto "Ermita" (Arduino)

Publicado: Dom Jul 14, 2019 7:14 pm
por Alfred
Y el esquech "provisional" es el siguiente:

#include <Servo.h> // inclou la llibreria Servo
#include <SPI.h> // inclou la llibreria SPI
#include <SD.h> // Inclou la llibreiria SD
#include <TMRpcm.h> // inclou la biblioteca tmrpcm de gestió de fitxers .wav

// objectes
File campana;
TMRpcm tmrpcm;
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;
// Definició altaveu
const int pinaltaveu = 9;
// pin conexió lector SD
const int pinsd = 10;

int pos = 90; // posicio inicial del servo

void setup() {
myservo.attach(pinservo); // vincula el servo al pin digital 6
tmrpcm.speakerPin = pinaltaveu; // Vincula l'altaveu al pin 9
tmrpcm.setVolume(4); // gestió del volum de 0 a 7
tmrpcm.quality(1); // qualitat de l'audio 0 o 1
// Initialisation de la carte SD
SD.begin(pinsd);
pinMode(pinpulsador , INPUT);
}


void loop() {

value = digitalRead(pinpulsador); //lectura digital del pin

if (value == HIGH){
digitalWrite ( pinledverd , LOW ) // apaga el led verd indicador de stand by
digitalWrite ( pinledvermell , HIGH ) // encen el led vermell indicant que está en funcionament
digitalWrite ( pinledblanc , HIGH ) // encen el llum de l'Ermita
delay (2000)
tmrpcm.play("campana.wav"); // sona la campana

}

// inicia el moviment de la campana
//varia la posicio de 90 a 180
for (pos = 90; pos <= 180; pos += 1)
{
myservo.write(pos);
delay(20);
}

//varia la posicion de 180 a 0
for (pos = 180; pos >= 0; pos -= 1)
{
myservo.write(pos);
}
//varia la posicion de 0 a 180
for (pos = 0; pos >= 180; pos -= 1)
{
myservo.write(pos);
}
//varia la posicion de 180 a 90
for (pos = 180; pos >= 90; pos -= 1)
{
myservo.write(pos);
}
}

{

digitalWrite ( pinledespelma , HIHG ) // encen l'espelma
delay (5000)
digitalWrite ( pinledblanc , LOW ) // apaga el llum de l'Ermita
digitalWrite ( pinledvermell , LOW ) // apaga el led de funcionament
digitalWrite ( pinverd , HIGH ) // encen el led verd de stand by
digitalWrite ( pinledespelma , LOW ) // apaga l'espelma

}

l'Alfred

Entrades: 17
Membre des de: 26 set. 2014, 13:42

Re: Proyecto "Ermita" (Arduino)

Publicado: Dom Jul 14, 2019 7:15 pm
por Alfred
No hace falta que espero opiniones, correcciones, valoraciones, ayudas.....

Re: Proyecto "Ermita" (Arduino)

Publicado: Dom Jul 14, 2019 9:11 pm
por fmco
hola,

Vigila que cada { tenga su } según la indentación.

En el IDE colocando el cursor junto a } te indica cual es su {

En loop() tienes mal colocados los { }

Cada orden en C acaba con ; excepto los for/if/else que van con sus {}

A las variables les tienes que definir el tipo que son:
int value;


yo lo simplificaría y pondría rutinas fuera del loop() pero cada maestrillo tiene su librillo...


void loop() {
value = digitalRead(pinpulsador); //lectura digital del pin
if (value==HIGH) {
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 ( pinverd , HIGH ) // encen el led verd de stand by
}
}

void EjecutaErmita () {
2. Se enciende la luz interior de la Ermita
3. Se pone en funcionamiento la campana y suena el sonido de la campana
4. Se enciende el led/vela de la capilla
5. Se acaba el movimiento y el sonido de la campana
6. Se apaga la luz del interior de la Ermita
7. Se apaga el led/vela de la capilla,
}


Luego esta el tema de si las librerías son compatibles, la de sonido con la de servos, etc... pero eso ya es mas difícil de ver.

saludos,

Paco

Re: Proyecto "Ermita" (Arduino)

Publicado: Dom Jul 14, 2019 9:57 pm
por Alfred
La parte del sonido la he sacado de aquí:

https://www.locoduino.org/spip.php?article55

Re: Proyecto "Ermita" (Arduino)

Publicado: Dom Jul 14, 2019 11:14 pm
por xaviermbcn
Alfred,

Has pensado en utilizar un lenguaje de bloques en vez de bajar a C. Tipo el que enseñó Jofre en Scòpic?

Salut,

Re: Proyecto "Ermita" (Arduino)

Publicado: Lun Jul 15, 2019 9:07 am
por Alfred
No me acuerdo. La verdad es que el curso fué un pelín breve y no llegué a asimilar muy bién lo de los bloques. Durillo que es uno!!!!!

Re: Proyecto "Ermita" (Arduino)

Publicado: Lun Jul 15, 2019 11:39 am
por DabidGuty
No puedo ayudar.
Pero tengo curiosidad, jajaja ¿El servo es para mover la campana? :D
Saludos

Re: Proyecto "Ermita" (Arduino)

Publicado: Lun Jul 15, 2019 1:39 pm
por Alfred
DabidGuty escribió: Lun Jul 15, 2019 11:39 am No puedo ayudar.
Pero tengo curiosidad, jajaja ¿El servo es para mover la campana? :D
Saludos
Bai!!!

Re: Proyecto "Ermita" (Arduino)

Publicado: Lun Jul 15, 2019 8:51 pm
por Alfred
Primera corección:

#include <Servo.h> // inclou la llibreria Servo
#include <SPI.h> // inclou la llibreria SPI
#include <SD.h> // Inclou la llibreiria SD
#include <TMRpcm.h> // inclou la biblioteca tmrpcm de gestió de fitxers .wav

// objectes
File campana;
TMRpcm tmrpcm;
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;
// Definició altaveu
const int pinaltaveu = 9;
// pin conexió lector SD
const int pinsd = 10;

int pos = 90; // posicio inicial del servo

void setup() {
myservo.attach(pinservo); // vincula el servo al pin digital 6
tmrpcm.speakerPin = pinaltaveu; // Vincula l'altaveu al pin 9
tmrpcm.setVolume(4); // gestió del volum de 0 a 7
tmrpcm.quality(1); // qualitat de l'audio 0 o 1
// Initialisation de la carte SD
SD.begin(pinsd);
pinMode(pinpulsador , INPUT);
}


void loop() {

value = digitalRead(pinpulsador); //lectura digital del pin

if (value == HIGH){
digitalWrite ( pinledverd , LOW ); // apaga el led verd indicador de stand by
digitalWrite ( pinledvermell , HIGH ); // encen el led vermell indicant que está en funcionament
ExecutaErmita();
}
else {
digitalWrite ( pinledvermell , LOW ); // apaga el led de funcionament
digitalWrite ( pinverd , HIGH ); // encen el led verd de stand by
}
}

void ExecutaErmita (){
digitalWrite ( pinledblanc , HIGH ); // encen el llum de l'Ermita
delay (2000);
tmrpcm.play("campana.wav"); // sona la campana
}
// inicia el moviment de la campana
//varia la posicio de 90 a 180
for (pos = 90; pos <= 180; pos += 1)
{
myservo.write(pos);
delay(20);
}

//varia la posicion de 180 a 0
for (pos = 180; pos >= 0; pos -= 1)
{
myservo.write(pos);
}
//varia la posicion de 0 a 180
for (pos = 0; pos >= 180; pos -= 1)
{
myservo.write(pos);
}
//varia la posicion de 180 a 90
for (pos = 180; pos >= 90; pos -= 1)
{
myservo.write(pos);
}
{

digitalWrite ( pinledespelma , HIHG ); // encen l'espelma
delay (5000)
digitalWrite ( pinledblanc , LOW ); // apaga el llum de l'Ermita
digitalWrite ( pinledespelma , LOW ); // apaga l'espelma

}

Re: Proyecto "Ermita" (Arduino)

Publicado: Lun Jul 15, 2019 9:10 pm
por fmco
hola,

he estado jugando con la librería TMRpcm, como suponía es incompatible con la de servos. Ambos hacen uso del Timer1 con lo que el servo no va.

Por suerte, ya lo han previsto y se puede hacer que use el Timer2 con algunas limitaciones, para ello se ha de modificar el archivo pcmConfig.h como en la imagen (el archivo esta en Mis Documentos/Arduino/libraries/TMRpcm). Activar el uso del Timer2 y usar un buffer de 128 bytes.

El altavoz cambia de la salida 9 a la 3, no hay problema ya que no la usabas.

El volumen con un altavoz normal de 8 ohm 0.5W es bastante bajo, además entre 5 y 7 distorsiona por lo que quizás necesites un amplificador, he probado con un transistor como en algún esquema que he visto por la web pero no da mucho volumen más, ya probarás.

Sin que sirva de precedente, he acabado haciendo el código según tus especificaciones. Bueno, he cambiado el pulsador para que arranque al ponerlo a masa, que a mi me gusta más.

Quizás estaría bien abrir un hilo de nociones básicas para programar en C del Arduino o entender los listados.

saludos,

Paco

Re: Proyecto "Ermita" (Arduino)

Publicado: Mar Jul 16, 2019 8:53 am
por Alfred
fmco escribió: Lun Jul 15, 2019 9:10 pm hola,


Quizás estaría bien abrir un hilo de nociones básicas para programar en C del Arduino o entender los listados.

saludos,

Paco
Si, estaria bién.

Y muchas gracias.

Re: Proyecto "Ermita" (Arduino)

Publicado: Dom Jul 21, 2019 3:37 pm
por fmco
hola,

un pequeño tutorial sobre el lenguaje Arduino:

viewtopic.php?f=28&t=4263

saludos,

Paco

Re: Proyecto "Ermita" (Arduino)

Publicado: Lun Jul 22, 2019 9:03 pm
por Alfred
Moltes gràcies!!!

Re: Proyecto "Ermita" (Arduino)

Publicado: Sab Jul 03, 2021 7:45 pm
por Alfred
Poco a poco!