¡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!
Sistema de iluminación con Arduino??
Sistema de iluminación con Arduino??
Hola,
tengo pensado hacer un pequeño proyecto y quizá alguien haya hecho algo parecido o tenga experiencia al respecto.
Se trataría de hacer un sistema de iluminación para la maqueta controlado por un Arduino y con unas tiras de Led RGB poder ir modificando las luces, y hacer una variación como en los Intellilight de Uhlenbrock.
Alguna sugerencia u orientación?
Saludos
tengo pensado hacer un pequeño proyecto y quizá alguien haya hecho algo parecido o tenga experiencia al respecto.
Se trataría de hacer un sistema de iluminación para la maqueta controlado por un Arduino y con unas tiras de Led RGB poder ir modificando las luces, y hacer una variación como en los Intellilight de Uhlenbrock.
Alguna sugerencia u orientación?
Saludos
Buenas,
he hecho las primeras pruebas de iluminación con una tira de leds conectada a los pines analógicos del arduino. He hecho diversas variaciones con los colores rgb.
Podéis verlo aquí:
he hecho las primeras pruebas de iluminación con una tira de leds conectada a los pines analógicos del arduino. He hecho diversas variaciones con los colores rgb.
Podéis verlo aquí:
Código: Seleccionar todo
// color swirl! connect an RGB LED to the PWM pins as indicated
// in the #defines
// public domain, enjoy!
#define REDPIN 5
#define GREENPIN 6
#define BLUEPIN 3
#define FADESPEED 5 // make this higher to slow down
void setup() {
pinMode(REDPIN, OUTPUT);
pinMode(GREENPIN, OUTPUT);
pinMode(BLUEPIN, OUTPUT);
}
void loop() {
int r, g, b;
// fade from blue to violet
for (r = 0; r < 256; r++) {
analogWrite(REDPIN, r);
delay(FADESPEED);
}
// fade from violet to red
for (b = 255; b > 0; b--) {
analogWrite(BLUEPIN, b);
delay(FADESPEED);
}
// fade from red to yellow
for (g = 0; g < 256; g++) {
analogWrite(GREENPIN, g);
delay(FADESPEED);
}
// fade from yellow to green
for (r = 255; r > 0; r--) {
analogWrite(REDPIN, r);
delay(FADESPEED);
}
// fade from green to teal
for (b = 0; b < 256; b++) {
analogWrite(BLUEPIN, b);
delay(FADESPEED);
}
// fade from teal to blue
for (g = 255; g > 0; g--) {
analogWrite(GREENPIN, g);
delay(FADESPEED);
}
}Vale. Y si ya lo has hecho, qué tipo de ayuda necesitas ?.
Hombre....Por decirte algo, te diría que podías hacer un Flash con las luces.
digitalwrite (pinsalida, high);
delay (valortiempo);
for (a = 0: a < 256; a++)
[
]
digitalwrite (pinsalida, low);
delay (valortiempo);
return;
Tendrás que ajusta los valores, evidentemente.
Si necesitas algo más......
Hombre....Por decirte algo, te diría que podías hacer un Flash con las luces.
digitalwrite (pinsalida, high);
delay (valortiempo);
for (a = 0: a < 256; a++)
[
]
digitalwrite (pinsalida, low);
delay (valortiempo);
return;
Tendrás que ajusta los valores, evidentemente.
Si necesitas algo más......
Hola furdex gracias por tu aportación.
La verdad es que soy bastante inexperto y es la primera vez que me enfrento con arduino. El código lo he cogido de un tutorial y he intentado adaptarlo, así que si tú tienes conocimientos y quieres compartirlos, pues excelente.
La idea es ir variando la iluminación de las tiras o algo así, semejante al Intellilight de Uhlenbrock, creo que es. Lo conoces??
Saludos
La verdad es que soy bastante inexperto y es la primera vez que me enfrento con arduino. El código lo he cogido de un tutorial y he intentado adaptarlo, así que si tú tienes conocimientos y quieres compartirlos, pues excelente.
La idea es ir variando la iluminación de las tiras o algo así, semejante al Intellilight de Uhlenbrock, creo que es. Lo conoces??
Saludos
Jola Javier.
Lamento decirte que desconozco totalmente la Intellilight de la que hablas.
En cuanto a programación......Si te puedo contar un poquito. He pasado por COBOL, CLIPPER, C, PASCAL, FORTRAN, BASIC y ENSAMBLADOR. Quizás me olvide de alguno.
Arduino, el compilador que lleva habla en C con el ATMEGA.
No soy experto en Arduino, pero tengo un amigo que SI lo tiene.
Si tienes algún problema o pregunta, ya sabes........
Saludos.
Lamento decirte que desconozco totalmente la Intellilight de la que hablas.
En cuanto a programación......Si te puedo contar un poquito. He pasado por COBOL, CLIPPER, C, PASCAL, FORTRAN, BASIC y ENSAMBLADOR. Quizás me olvide de alguno.
Arduino, el compilador que lleva habla en C con el ATMEGA.
No soy experto en Arduino, pero tengo un amigo que SI lo tiene.
Si tienes algún problema o pregunta, ya sabes........
Saludos.
Hola,
el Intellilight es esto:
En principio querría hacer variaciones de los tonos blancos e ir variando hacia tonos ámbar o azulados.
Algo así como ir simulando los ciclos del día.
No me planteo el tema del sonido, aunque creo que las posibilidades del Arduino son enormes y no creo que fuese demasiado complicado implementarles.
Te agradecería mucho que me orientases con el código para hacer ese tipo de ciclos que te comentaba.
Yo de programación ná de ná, así que cualquier ayuda es bienvenida.
el Intellilight es esto:
En principio querría hacer variaciones de los tonos blancos e ir variando hacia tonos ámbar o azulados.
Algo así como ir simulando los ciclos del día.
No me planteo el tema del sonido, aunque creo que las posibilidades del Arduino son enormes y no creo que fuese demasiado complicado implementarles.
Te agradecería mucho que me orientases con el código para hacer ese tipo de ciclos que te comentaba.
Yo de programación ná de ná, así que cualquier ayuda es bienvenida.
Bien. Por lo que me ha parecido entender, la IntelliLight, no sólo realiza efector ópticos, sino que además, imita mediante sonido algunas inclemencias de la madre naturaleza.
En cuanto a lo que respecta al sonido, el arduino está compuesto (creo recordar) por dos entradas analógicas (supongo que de 8 bits cada una). Esto significa que tienes 256 posibilidades de sacar un valor por dichas entradas/salidas. Estos valores van de 0 a 255 (ambos inclusiva).
Si montas un altavoz que se conecte a estas entradas/salidas analógicas, puedes formar sonidos sacando valores entre 0 y 255 y jugando don el tiempo en el retardo (delay () o bucles vacios (for [])). Las instrucción a emplear sería la que has utilizado en tu programa anterior, es decir, ANALOGWRITE (pin,valor);
Según tu código anterior, me parece entender que las luces que usas, están conectadas a los pines 5, 6 y 3 para los colores RED (ROJO), GREEN (VERDE) y BLUE (AZUL).
La combinación en la tonalidad de cada uno, te darán como resultado el color final.
Visto el código, parece que se saca un valor entre 0 y 255 por las entradas/salidas 5, 6 y 3 respectivamente para la tonalidad Rojo, Verde y Azul.
Sacando el valor 255 por el pin (puerto) 5 (ANALOGWRITE(5,255)) y por el 6 un valor de 0 (ANALOGWRITE (6,0)), así como por el 3 (ANALOGWRITE (3,0), obtendrás un ROJO intenso.
Si por el contrario, sacas el valor 255 por el Green (pin o puerto 6) y sacas un 0 (anulas) los 5 y 3, entonces la intensidad la obtendrás en el Vende.
De esta manera, tendrás que jugar a sacar distintos valores combinados en los tres puertos analógicos, para obtener una gama de colores entre el blanco (todo encendido (255,255, 255)) y el negro (todo apagado (0, 0, 0)). Pasando por el azul claro, amarillo, naranja, violeta, etc.
El programa sería algo así (ten en cuenta que lo hago de cabeza. Ahora mismo me falta todo el hardware para probarlo):
Main ()
Int bucle1;
Int bucle;2
Int bucle3;
#define tiempo_en_milisegundos 1000 // Equivale a 1 segundo
#define REDPIN 5
#define GREENPIN 6
#define BLUEPIN 3
void setup()
{
pinMode (REDPIN, OUTPUT); // Declaras el pin 5 como salida
pinMode (GREENPIN, OUTPUT); // Declaras el pin 6 también de salida
pinMode (BLUEPIN, OUTPUT); // Declaras el pin 3 de salida
for (bucle1 = 0; bucle1 < 256; bucle1 ++)
{
for (bucle2 = 0; bucle2 < 256; bucle2 ++)
[
for (bucle3 = 0; bucle3 < 256; bucle3 ++)
[
analogWrite (REDPIN, bucle1);
analogWrite (REDPIN, bucle2);
analogWrite (REDPIN, bucle3);
]
delay (tiempo_en_milisegundos);
}
]
Return ();
// Falta el cierre del procedimiento. No recuerdo si “]”, va después de return (); o antes. Te lo dirá el compilador al generar el código Hexadecimal para traspasarlo al arduino.
Ya me contarás.
Saludos.
En cuanto a lo que respecta al sonido, el arduino está compuesto (creo recordar) por dos entradas analógicas (supongo que de 8 bits cada una). Esto significa que tienes 256 posibilidades de sacar un valor por dichas entradas/salidas. Estos valores van de 0 a 255 (ambos inclusiva).
Si montas un altavoz que se conecte a estas entradas/salidas analógicas, puedes formar sonidos sacando valores entre 0 y 255 y jugando don el tiempo en el retardo (delay () o bucles vacios (for [])). Las instrucción a emplear sería la que has utilizado en tu programa anterior, es decir, ANALOGWRITE (pin,valor);
Según tu código anterior, me parece entender que las luces que usas, están conectadas a los pines 5, 6 y 3 para los colores RED (ROJO), GREEN (VERDE) y BLUE (AZUL).
La combinación en la tonalidad de cada uno, te darán como resultado el color final.
Visto el código, parece que se saca un valor entre 0 y 255 por las entradas/salidas 5, 6 y 3 respectivamente para la tonalidad Rojo, Verde y Azul.
Sacando el valor 255 por el pin (puerto) 5 (ANALOGWRITE(5,255)) y por el 6 un valor de 0 (ANALOGWRITE (6,0)), así como por el 3 (ANALOGWRITE (3,0), obtendrás un ROJO intenso.
Si por el contrario, sacas el valor 255 por el Green (pin o puerto 6) y sacas un 0 (anulas) los 5 y 3, entonces la intensidad la obtendrás en el Vende.
De esta manera, tendrás que jugar a sacar distintos valores combinados en los tres puertos analógicos, para obtener una gama de colores entre el blanco (todo encendido (255,255, 255)) y el negro (todo apagado (0, 0, 0)). Pasando por el azul claro, amarillo, naranja, violeta, etc.
El programa sería algo así (ten en cuenta que lo hago de cabeza. Ahora mismo me falta todo el hardware para probarlo):
Main ()
Int bucle1;
Int bucle;2
Int bucle3;
#define tiempo_en_milisegundos 1000 // Equivale a 1 segundo
#define REDPIN 5
#define GREENPIN 6
#define BLUEPIN 3
void setup()
{
pinMode (REDPIN, OUTPUT); // Declaras el pin 5 como salida
pinMode (GREENPIN, OUTPUT); // Declaras el pin 6 también de salida
pinMode (BLUEPIN, OUTPUT); // Declaras el pin 3 de salida
for (bucle1 = 0; bucle1 < 256; bucle1 ++)
{
for (bucle2 = 0; bucle2 < 256; bucle2 ++)
[
for (bucle3 = 0; bucle3 < 256; bucle3 ++)
[
analogWrite (REDPIN, bucle1);
analogWrite (REDPIN, bucle2);
analogWrite (REDPIN, bucle3);
]
delay (tiempo_en_milisegundos);
}
]
Return ();
// Falta el cierre del procedimiento. No recuerdo si “]”, va después de return (); o antes. Te lo dirá el compilador al generar el código Hexadecimal para traspasarlo al arduino.
Ya me contarás.
Saludos.
P.D. Se me olvidaba.......
Se trata de tres bucles anidados de 256 iteraciones cada uno. Como cada vuelta, tiene un retardo de 1 segundo, el programa te tardará 256 x 256 x 256 segundos en terminar. Perro eso SI. En cada vuelta deberías ver (si todo vunciona como preveo) un color o tonalidad diferente.
Saludos.
Se trata de tres bucles anidados de 256 iteraciones cada uno. Como cada vuelta, tiene un retardo de 1 segundo, el programa te tardará 256 x 256 x 256 segundos en terminar. Perro eso SI. En cada vuelta deberías ver (si todo vunciona como preveo) un color o tonalidad diferente.
Saludos.
Hola Javier.
He estado mirando el manual del Arduino.
Este manual propone el hardware siguiente.
Esta croquis simula la tecla de un ordenador. Cuando tú pulsas el switch, entonces el Arguino pasa a seguir con el procedimiento.
El programa para leer ese pulsador sería:
void setup ()
[
]
Y para que vuelva a empezar,
void loop ()
[
]
Esa es la estructura esencial, principal y fundamental para realizar cualquier programa en C para el Arduino.
Como te decía, la lectura (y espera) de la pulsación del switch sería:
void setup ()
[
pinmode (3, input);
]
serial.begin (9600);
digitalread (3);
while (digitalread (3) == HIGH)
[
if (digitalread (3) == LOW)
[
serial.print ("Has pulsado el interruptor);
]
else
[
serial.print ("Pulsa el interruptor");
]
]
]
Y para que vuelva a empezar,
void loop ()
[
]
Bueno, a grandes rasgos, éste sería uno de los programas que con ayuda de hardware externo (un simple pulsador y una simple resistencias), podrías empezar a probar.
Leyendo el manual, me doy cuenta de que si tienes conectado un display (pantalla lcd) al Arduino, éste está comunicado con el micro ATMEGA (Arduino), a través del puerto SERIE. Por lo que deberás inicializarlo con la instrucción:
serial.begin (9600);
En fín, ya me contarás.
Saludos.
He estado mirando el manual del Arduino.
Este manual propone el hardware siguiente.
Esta croquis simula la tecla de un ordenador. Cuando tú pulsas el switch, entonces el Arguino pasa a seguir con el procedimiento.
El programa para leer ese pulsador sería:
void setup ()
[
]
Y para que vuelva a empezar,
void loop ()
[
]
Esa es la estructura esencial, principal y fundamental para realizar cualquier programa en C para el Arduino.
Como te decía, la lectura (y espera) de la pulsación del switch sería:
void setup ()
[
pinmode (3, input);
]
serial.begin (9600);
digitalread (3);
while (digitalread (3) == HIGH)
[
if (digitalread (3) == LOW)
[
serial.print ("Has pulsado el interruptor);
]
else
[
serial.print ("Pulsa el interruptor");
]
]
]
Y para que vuelva a empezar,
void loop ()
[
]
Bueno, a grandes rasgos, éste sería uno de los programas que con ayuda de hardware externo (un simple pulsador y una simple resistencias), podrías empezar a probar.
Leyendo el manual, me doy cuenta de que si tienes conectado un display (pantalla lcd) al Arduino, éste está comunicado con el micro ATMEGA (Arduino), a través del puerto SERIE. Por lo que deberás inicializarlo con la instrucción:
serial.begin (9600);
En fín, ya me contarás.
Saludos.
Gracias por todo,
estoy probando el código y me da algunos errores.
Te corto y pego:
sketch_jun04b:2: error: expected constructor, destructor, or type conversion before 'Int'
sketch_jun04b:3: error: 'Int' does not name a type
sketch_jun04b:3: error: expected unqualified-id before numeric constant
sketch_jun04b.cpp: In function 'void setup()':
sketch_jun04b:17: error: 'bucle1' was not declared in this scope
sketch_jun04b:19: error: 'bucle2' was not declared in this scope
sketch_jun04b:20: error: expected primary-expression before '[' token
sketch_jun04b:21: error: expected primary-expression before 'for'
sketch_jun04b:21: error: expected `]' before 'for'
sketch_jun04b:21: error: expected `;' before 'for'
sketch_jun04b:21: error: 'bucle3' was not declared in this scope
sketch_jun04b:21: error: expected `;' before ')' token
sketch_jun04b:26: error: expected primary-expression before ']' token
sketch_jun04b:26: error: expected `;' before ']' token
sketch_jun04b:32: error: expected primary-expression before ']' token
sketch_jun04b:32: error: expected `;' before ']' token
sketch_jun04b:34: error: expected `}' at end of input
El código que he metido es el que me has dado:
estoy probando el código y me da algunos errores.
Te corto y pego:
sketch_jun04b:2: error: expected constructor, destructor, or type conversion before 'Int'
sketch_jun04b:3: error: 'Int' does not name a type
sketch_jun04b:3: error: expected unqualified-id before numeric constant
sketch_jun04b.cpp: In function 'void setup()':
sketch_jun04b:17: error: 'bucle1' was not declared in this scope
sketch_jun04b:19: error: 'bucle2' was not declared in this scope
sketch_jun04b:20: error: expected primary-expression before '[' token
sketch_jun04b:21: error: expected primary-expression before 'for'
sketch_jun04b:21: error: expected `]' before 'for'
sketch_jun04b:21: error: expected `;' before 'for'
sketch_jun04b:21: error: 'bucle3' was not declared in this scope
sketch_jun04b:21: error: expected `;' before ')' token
sketch_jun04b:26: error: expected primary-expression before ']' token
sketch_jun04b:26: error: expected `;' before ']' token
sketch_jun04b:32: error: expected primary-expression before ']' token
sketch_jun04b:32: error: expected `;' before ']' token
sketch_jun04b:34: error: expected `}' at end of input
El código que he metido es el que me has dado:
Código: Seleccionar todo
Main ()
Int bucle1;
Int bucle;2
Int bucle3;
#define tiempo_en_milisegundos 1000 // Equivale a 1 segundo
#define REDPIN 5
#define GREENPIN 6
#define BLUEPIN 3
void setup()
{
pinMode (REDPIN, OUTPUT); // Declaras el pin 5 como salida
pinMode (GREENPIN, OUTPUT); // Declaras el pin 6 también de salida
pinMode (BLUEPIN, OUTPUT); // Declaras el pin 3 de salida
for (bucle1 = 0; bucle1 < 256; bucle1 ++)
{
for (bucle2 = 0; bucle2 < 256; bucle2 ++)
[
for (bucle3 = 0; bucle3 < 256; bucle3 ++)
[
analogWrite (REDPIN, bucle1);
analogWrite (REDPIN, bucle2);
analogWrite (REDPIN, bucle3);
]
delay (tiempo_en_milisegundos);
}
]
Return ();
Bien espero ayudar para que te compile decentemente tienes que hacer que cada sentencia o instruccion este escrita correctamente osea tiene que tener la sintaxis correcta sino es como si hablaras en indio osea mi ser gran jefe indio asi que vamos a coregir algunos errores de sintaxis :
Sentencia for :
una sentencia for en c seria de la forma :
for (i=0;i=10;i++) { <Codigo que se ejecuta en el for >}
asi tendremos que para tu codigo seria algo asi :
Main ()
Int bucle1;
Int bucle;2
Int bucle3;
#define tiempo_en_milisegundos 1000 // Equivale a 1 segundo
#define REDPIN 5
#define GREENPIN 6
#define BLUEPIN 3
void setup()
{
pinMode (REDPIN, OUTPUT); // Declaras el pin 5 como salida
pinMode (GREENPIN, OUTPUT); // Declaras el pin 6 también de salida
pinMode (BLUEPIN, OUTPUT); // Declaras el pin 3 de salida
for (bucle1 = 0; bucle1 < 256; bucle1 ++)
{
for (bucle2 = 0; bucle2 < 256; bucle2 ++)
{
for (bucle3 = 0; bucle3 < 256; bucle3 ++)
{
analogWrite (REDPIN, bucle1);
analogWrite (REDPIN, bucle2);
analogWrite (REDPIN, bucle3);
}
}
delay (tiempo_en_milisegundos);
}
Return ();
}
y hay que ir refinando un poco mas pues hay otros errores de estructura que hay que corregir es lo que puedo hacer en 30 segundos
Sentencia for :
una sentencia for en c seria de la forma :
for (i=0;i=10;i++) { <Codigo que se ejecuta en el for >}
asi tendremos que para tu codigo seria algo asi :
Main ()
Int bucle1;
Int bucle;2
Int bucle3;
#define tiempo_en_milisegundos 1000 // Equivale a 1 segundo
#define REDPIN 5
#define GREENPIN 6
#define BLUEPIN 3
void setup()
{
pinMode (REDPIN, OUTPUT); // Declaras el pin 5 como salida
pinMode (GREENPIN, OUTPUT); // Declaras el pin 6 también de salida
pinMode (BLUEPIN, OUTPUT); // Declaras el pin 3 de salida
for (bucle1 = 0; bucle1 < 256; bucle1 ++)
{
for (bucle2 = 0; bucle2 < 256; bucle2 ++)
{
for (bucle3 = 0; bucle3 < 256; bucle3 ++)
{
analogWrite (REDPIN, bucle1);
analogWrite (REDPIN, bucle2);
analogWrite (REDPIN, bucle3);
}
}
delay (tiempo_en_milisegundos);
}
Return ();
}
y hay que ir refinando un poco mas pues hay otros errores de estructura que hay que corregir es lo que puedo hacer en 30 segundos
- Josep Callarisa
- Forero
- Mensajes: 2253
- Registrado: Dom Ene 22, 2006 8:30 pm
- 20
- Ubicación: Gavà - Barcelona
He conseguido subsanar los errores de compilación con este código
Fijo que se me ha olvidado cerrar alguna función o algo, mañana probaré a ver.
Hasta luego y gracias
Código: Seleccionar todo
int bucle1;
int bucle2;
int bucle3;
#define tiempo_en_milisegundos 1000 // Equivale a 1 segundo
#define REDPIN 5
#define GREENPIN 6
#define BLUEPIN 3
void setup()
{
pinMode (REDPIN, OUTPUT); // pin 5 como salida
pinMode (GREENPIN, OUTPUT); // pin 6 de salida
pinMode (BLUEPIN, OUTPUT); // pin 3 de salida
}
void loop()
{
for (bucle1 = 0; bucle1 < 256; bucle1 ++)
{
for (bucle2 = 0; bucle2 < 256; bucle2 ++)
{
for (bucle3 = 0; bucle3 < 256; bucle3 ++)
{
analogWrite (REDPIN, bucle1);
analogWrite (REDPIN, bucle2);
analogWrite (REDPIN, bucle3);
}
}
}
delay (15000);
}
Hasta luego y gracias
Hola Javier.
Empieza por cambiar el nombre del primer procedimiento. Es decir, en vez de poner "main ()", pon "void setup ()".
Y contunua por cambiar "[" y "]", por "{" y "}". Ojo que NO es el mismo carácter. El carácter "[" es el código ASCII 91 mientras que el carácter "]" es el 93. Los caracteres "{" y "}" son respectivamente, los códigos ASCII 123 y 125. Si has copiado y pegado mi código, lo entiendo porque el error ha sido mío.
Saludos.
Empieza por cambiar el nombre del primer procedimiento. Es decir, en vez de poner "main ()", pon "void setup ()".
Y contunua por cambiar "[" y "]", por "{" y "}". Ojo que NO es el mismo carácter. El carácter "[" es el código ASCII 91 mientras que el carácter "]" es el 93. Los caracteres "{" y "}" son respectivamente, los códigos ASCII 123 y 125. Si has copiado y pegado mi código, lo entiendo porque el error ha sido mío.
Saludos.
-
- Menú CTMS Y MAS
-
- Contacto