¡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)
- Alfred
- Forero
- Mensajes: 897
- Registrado: Jue Abr 24, 2008 9:41 pm
- 18
- Ubicación: Sant Martí de Provençals
Proyecto "Ermita" (Arduino)
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:
(El integrado SCP 1000 corresponde al lector de terjetas Micro SD.)
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:
(El integrado SCP 1000 corresponde al lector de terjetas Micro SD.)
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)
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
#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
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)
No hace falta que espero opiniones, correcciones, valoraciones, ayudas.....
l'Alfred
Re: Proyecto "Ermita" (Arduino)
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
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
- 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
- xaviermbcn
- Forero
- Mensajes: 3175
- Registrado: Mié Ene 18, 2006 7:54 am
- 20
- Ubicación: Barcelona
Re: Proyecto "Ermita" (Arduino)
Alfred,
Has pensado en utilizar un lenguaje de bloques en vez de bajar a C. Tipo el que enseñó Jofre en Scòpic?
Salut,
Has pensado en utilizar un lenguaje de bloques en vez de bajar a C. Tipo el que enseñó Jofre en Scòpic?
Salut,
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.
- Alfred
- Forero
- Mensajes: 897
- Registrado: Jue Abr 24, 2008 9:41 pm
- 18
- Ubicación: Sant Martí de Provençals
Re: Proyecto "Ermita" (Arduino)
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!!!!!
l'Alfred
Re: Proyecto "Ermita" (Arduino)
No puedo ayudar.
Pero tengo curiosidad, jajaja ¿El servo es para mover la campana?
Saludos
Pero tengo curiosidad, jajaja ¿El servo es para mover la campana?
Saludos
Multimaus + GenLiRS + RS8DC + ServoPoint + RR&Co TC Gold 8.0 B4
- Alfred
- Forero
- Mensajes: 897
- Registrado: Jue Abr 24, 2008 9:41 pm
- 18
- Ubicación: Sant Martí de Provençals
Re: Proyecto "Ermita" (Arduino)
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
}
#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
}
l'Alfred
Re: Proyecto "Ermita" (Arduino)
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
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
- Adjuntos
-
- ErmitaTimer2.zip
- (344.52 KiB) Descargado 11 veces
- Alfred
- Forero
- Mensajes: 897
- Registrado: Jue Abr 24, 2008 9:41 pm
- 18
- Ubicación: Sant Martí de Provençals
- Alfred
- Forero
- Mensajes: 897
- Registrado: Jue Abr 24, 2008 9:41 pm
- 18
- Ubicación: Sant Martí de Provençals
Re: Proyecto "Ermita" (Arduino)
Poco a poco!
- Adjuntos
-
- 209209304_10226076991421037_1151726208183978601_n.jpg (60.78 KiB) Visto 105 veces
l'Alfred
-
- Menú CTMS Y MAS
-
- Contacto