¡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!

Sistema de iluminación con Arduino??

Electrónica aplicada al modelismo, gama CTMS, investigación y desarrollo.
Responder
Javier
Forero
Mensajes: 89
Registrado: Vie Jul 16, 2010 5:19 pm
15

Sistema de iluminación con Arduino??

Mensaje por Javier »

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
Javier
Forero
Mensajes: 89
Registrado: Vie Jul 16, 2010 5:19 pm
15

Mensaje por Javier »

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

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 &#40;r = 0; r < 256; r++&#41; &#123; 
    analogWrite&#40;REDPIN, r&#41;;
    delay&#40;FADESPEED&#41;;
  &#125; 
  // fade from violet to red
  for &#40;b = 255; b > 0; b--&#41; &#123; 
    analogWrite&#40;BLUEPIN, b&#41;;
    delay&#40;FADESPEED&#41;;
  &#125; 
  // fade from red to yellow
  for &#40;g = 0; g < 256; g++&#41; &#123; 
    analogWrite&#40;GREENPIN, g&#41;;
    delay&#40;FADESPEED&#41;;
  &#125; 
  // fade from yellow to green
  for &#40;r = 255; r > 0; r--&#41; &#123; 
    analogWrite&#40;REDPIN, r&#41;;
    delay&#40;FADESPEED&#41;;
  &#125; 
  // fade from green to teal
  for &#40;b = 0; b < 256; b++&#41; &#123; 
    analogWrite&#40;BLUEPIN, b&#41;;
    delay&#40;FADESPEED&#41;;
  &#125; 
  // fade from teal to blue
  for &#40;g = 255; g > 0; g--&#41; &#123; 
    analogWrite&#40;GREENPIN, g&#41;;
    delay&#40;FADESPEED&#41;;
  &#125; 
&#125;
furdex
Forero
Mensajes: 26
Registrado: Mar Feb 22, 2011 12:50 pm
15

Mensaje por furdex »

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......
Javier
Forero
Mensajes: 89
Registrado: Vie Jul 16, 2010 5:19 pm
15

Mensaje por Javier »

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
furdex
Forero
Mensajes: 26
Registrado: Mar Feb 22, 2011 12:50 pm
15

Mensaje por furdex »

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.
Javier
Forero
Mensajes: 89
Registrado: Vie Jul 16, 2010 5:19 pm
15

Mensaje por Javier »

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.
furdex
Forero
Mensajes: 26
Registrado: Mar Feb 22, 2011 12:50 pm
15

Mensaje por furdex »

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.
furdex
Forero
Mensajes: 26
Registrado: Mar Feb 22, 2011 12:50 pm
15

Mensaje por furdex »

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.
furdex
Forero
Mensajes: 26
Registrado: Mar Feb 22, 2011 12:50 pm
15

Mensaje por furdex »

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.
Adjuntos
Arduino_tecla.JPG
Javier
Forero
Mensajes: 89
Registrado: Vie Jul 16, 2010 5:19 pm
15

Mensaje por Javier »

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:

Código: Seleccionar todo

Main &#40;&#41;

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&#40;&#41;
&#123;
pinMode &#40;REDPIN, OUTPUT&#41;; // Declaras el pin 5 como salida
pinMode &#40;GREENPIN, OUTPUT&#41;; // Declaras el pin 6 también de salida
pinMode &#40;BLUEPIN, OUTPUT&#41;; // Declaras el pin 3 de salida

for &#40;bucle1 = 0; bucle1 < 256; bucle1 ++&#41;
&#123;
for &#40;bucle2 = 0; bucle2 < 256; bucle2 ++&#41;
&#91;
for &#40;bucle3 = 0; bucle3 < 256; bucle3 ++&#41;
&#91;
analogWrite &#40;REDPIN, bucle1&#41;;
analogWrite &#40;REDPIN, bucle2&#41;;
analogWrite &#40;REDPIN, bucle3&#41;;
&#93;

delay &#40;tiempo_en_milisegundos&#41;;

&#125;

&#93;

Return &#40;&#41;;
jjgvela
Forero
Mensajes: 106
Registrado: Sab Ago 08, 2009 1:53 pm
16
Ubicación: Malaga

Mensaje por jjgvela »

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
Avatar de Usuario
Josep Callarisa
Forero
Mensajes: 2253
Registrado: Dom Ene 22, 2006 8:30 pm
20
Ubicación: Gavà - Barcelona

Mensaje por Josep Callarisa »

jjgvela escribió: Int bucle;2

:shock:
Jos€p o Chiusep o "p"
Uso Lenzeria y PpP, talla HO con 2C, TC 10A1 de momento.
Javier
Forero
Mensajes: 89
Registrado: Vie Jul 16, 2010 5:19 pm
15

Mensaje por Javier »

He conseguido subsanar los errores de compilación con este código

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&#40;&#41;  
&#123;  
pinMode &#40;REDPIN, OUTPUT&#41;; // pin 5 como salida  
pinMode &#40;GREENPIN, OUTPUT&#41;; // pin 6 de salida  
pinMode &#40;BLUEPIN, OUTPUT&#41;; //  pin 3 de salida  
  &#125;
void loop&#40;&#41; 
&#123;
for &#40;bucle1 = 0; bucle1 < 256; bucle1 ++&#41;  
&#123;  
    for &#40;bucle2 = 0; bucle2 < 256; bucle2 ++&#41;  
     &#123;  
       for &#40;bucle3 = 0; bucle3 < 256; bucle3 ++&#41;  
         &#123; 
          analogWrite &#40;REDPIN, bucle1&#41;;  
          analogWrite &#40;REDPIN, bucle2&#41;;  
          analogWrite &#40;REDPIN, bucle3&#41;;  
         &#125; 
     &#125; 
 
   &#125;
delay &#40;15000&#41;;  
 
&#125;  

Fijo que se me ha olvidado cerrar alguna función o algo, mañana probaré a ver.

Hasta luego y gracias
furdex
Forero
Mensajes: 26
Registrado: Mar Feb 22, 2011 12:50 pm
15

Mensaje por furdex »

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.
jjgvela
Forero
Mensajes: 106
Registrado: Sab Ago 08, 2009 1:53 pm
16
Ubicación: Malaga

Mensaje por jjgvela »

Josep que quieres era mas sangrante lo de los [] que el nombre de la variable pero tienes razon .

Josep Callarisa escribió:
jjgvela escribió: Int bucle;2

:shock:
Responder
 
  • Contacto
  • Nombre de Usuario:
    Email:
    Asunto:
    Mensaje: