Plataforma de electrónica abierta para la creación de prototipos basada en software y hardware flexibles y fáciles de usar.
Rodrigo Zarza @Zarza Offline #1
Primera Idea

Hoy casi me han entrado ganas de hacer mi propio blog para ir contando mis lentos progresos en Arduino. Por lo pronto voy a contar cómo hice mi primer programa "propio", es decir, que no lo saqué de los ejemplos que vienen. Bien cierto es, que la base es de un ejemplo y sólo lo copie 2 veces, pero dejadme con mi ilusión :foreveralone:

Se trata de un programa que alterna el encendido, a modo de sirena, unos leds Verdes y otros Rojos con sólo utilizar cables y los propios leds. Voy a intentar explicar lo más claro posible el proceso de construcción del Hardware y la creación del programa por separado.

En primer lugar hay que hacer el circuito. Lo más sencillo es que veáis este vídeo que hice.
Para que fuese fácil de reconocer los cables, he puesto la parte del circuito de los leds rojos con los cables +ROJO y -NEGRO, y el circuito para los leds verdes con cables +AMARILLO y -AZUL.
La idea es muy sencilla, el cable rojo en el pin 13 envía energía a la zona de leds rojos, y el pin 12 con el cable amarillo envía energía a la zona de leds verdes. Eso sí, ambas zonas comparten el cable negativo NEGRO para volver a la placa y cerrar el circuito en el pin GND.
Luego véis unos cables que parece que sobran, pero como la breadboard (la tabla de conexiones), divide las filas de 5 en 5 conectores, si queremos poner más leds, necesitamos más conectores, así que puenteamos 5 y 5 conectores. (Puede parecer una tontería, pero yo que no había visto esto en mi vida, no sabía bien cómo interactuaban entre si las filas y columnas de la breadboard, y como esto debería ser un tutorial para tontos, pues al detalle lo dejo). Como nota, decir que los laterales, los de +POSITIVO Y -NEGATIVO, tienen toda la columna interconectada, no van de 5 en 5 como parece.



Bueno, con esto deberíais tener bien conectado todo. Vamos a la parte de Software.
Abrid el IDE del Arduino y copiad este código:

Código: Seleccionar todo
  1.  
  2. int Led1 = 13;       // Pin de la placa arduino donde se conecta el led1.
  3. int Led2 = 12;       // Pin de la placa arduino donde se conecta el led2.
  4.  
  5. void setup()                    // Funcion para inicializar los pines de la placa
  6. {
  7.   pinMode(Led1, OUTPUT);       // Asignamos la variable Led1 ,que corresponde al pin 13,como salida  
  8.   pinMode(Led2, OUTPUT);      // Asignamos la variable Led2 ,que corresponde al pin 12,como salida  
  9. }
  10.  
  11. void loop()                     //Iniciamos lo que es propiamente el programa
  12. {
  13.   digitalWrite(Led1, HIGH);         // Ponemos a 1 el pin 13 para encender el led
  14.   delay(500);                     // esperamos medio segundo
  15.   digitalWrite(Led1, LOW);        // Ponemos a 0 el pin 13 para apagar el led
  16.   delay(1);                   // esperamos medio segundo
  17.  
  18.   digitalWrite(Led2, HIGH);         // Ponemos a 1 el pin 12 para encender el led
  19.   delay(500);                     // esperamos medio segundo
  20.   digitalWrite(Led2, LOW);        // Ponemos a 0 el pin 12 para apagar el led
  21.   delay(1);                   // esperamos medio segundo
  22. }
  23.  


El programa debería sernos conocido a estas alturas, todos hemos visto algo de C ya. Simplemente asignamos una variable con el valor del pin del Arduino. Luego le decimos que esos pines son de salida y empezamos con el programa en sí. Con las notas que he puesto en el código veremos para que vale cada línea. Simplemente aclarar que en este caso, HIGH=1 y LOW=0.

Y listo, ya tenéis vuestras luces para ese coche de policía que os habéis cargado de pequeños y que tanto llorasteis porque no os querían comprar uno nuevo. Es vuestra hora de repararlo.

---------------------------

Segunda Idea

Utilizar la pantalla LCD para indicar qué led está encendido en cada momento:
Es tarde y no tengo ganas de ponerme con el tutorial, pero... ahí va el vídeo de Barrio Sésamo. Espero que al terminar hayáis aprendido estos dos colores.



----------------------------

Tercera Idea

Leds moviendose al estilo "Coche Fantástico". Esta idea es completamente copiada de Arduino, tanto el circuito como código.
Esta es la primera vez que uso las resistencias, y por tanto la primera vez que aprendo a leer el código de colores jaja. La verdad es que es bastante sencillo con la pegatina que incluye el Arduino. La primera banda indica un número, la segundo otro, y la tercera el multiplicador. Es decir, si tenemos NARANJA=3 NARANJA=3 MARRÓN=10, tendremos 33 * 10 = 330 ohms.

Para este proyecto lo ideal son resistencias de 220ohm pero yo no tenía y puse las de 330 que vienen con el Arduino de serie, las del ejemplo que puse antes.



Vamos al lío.
El circuito:

Imagen

Y el código:
Código: Seleccionar todo
  1.  
  2. int timer = 100;           // The higher the number, the slower the timing.
  3.  
  4. void setup() {
  5.   // use a for loop to initialize each pin as an output:
  6.   for (int thisPin = 2; thisPin < 8; thisPin++)  {
  7.     pinMode(thisPin, OUTPUT);      
  8.   }
  9. }
  10.  
  11. void loop() {
  12.   // loop from the lowest pin to the highest:
  13.   for (int thisPin = 2; thisPin < 8; thisPin++) {
  14.     // turn the pin on:
  15.     digitalWrite(thisPin, HIGH);  
  16.     delay(timer);                  
  17.     // turn the pin off:
  18.     digitalWrite(thisPin, LOW);    
  19.   }
  20.  
  21.   // loop from the highest pin to the lowest:
  22.   for (int thisPin = 7; thisPin >= 2; thisPin--) {
  23.     // turn the pin on:
  24.     digitalWrite(thisPin, HIGH);
  25.     delay(timer);
  26.     // turn the pin off:
  27.     digitalWrite(thisPin, LOW);
  28.   }
  29. }
  30.  


--------------------

Cuarta Idea

Esta es una variación de mi cosecha del ejemplo anterior. Se trata de las mismas luces del coche fantástico pero dinámicas, es decir, podemos variar la velocidad con el potenciómetro.
Una vez tengáis montado el ejemplo 3, montamos al lado el potenciómetro con este esquema:

Imagen

Muy sencillito como podéis ver. Lo interesante viene ahora, el código.
He de ser sincero, he tardado un buen rato en conseguir que funcione como debe ser. Al principio las luces eran estáticas, ni siquiera cambiaba la iluminación, el potenciómetro no reaccionaba. Pero tras un par de retoques, conseguí que cogiese el valor del potenciómetro de una manera mucho más sencilla de la que vi por los tutoriales.
A ver si con las explicaciones que vienen en el código os apañáis bien:

Código: Seleccionar todo
  1.  
  2.  
  3. int sensorPin = 0;    // selecciona el pin de entrada para el potenciómetro
  4.  
  5. int sensorValue = 0;  // variable para almacenar el valor que ofrece el sensor
  6.  
  7.  
  8. void setup() {
  9.  
  10.  
  11.     for (int thisPin = 2; thisPin < 8; thisPin++)  {  //iniciamos todos los pines como salida
  12.     pinMode(thisPin, OUTPUT);  //no se muy bien por que, pero sin esta linea los leds brillan poco
  13. }
  14. }
  15. void loop() {
  16.   // lee el valor del sensor:
  17.   sensorValue = analogRead(sensorPin);    //leemos el valor del potenciómetro
  18. sensorValue = sensorValue / 5; //Dividimos el valor del sensor para que sea menos sensible al girar el potenciómetro
  19.  
  20.  
  21.  
  22.   for (int thisPin = 2; thisPin < 8; thisPin++) {  // barrido desde el led menor al mayor:
  23.     digitalWrite(thisPin, HIGH);     // encendemos el led:
  24.     delay(sensorValue);   //el tiempo de espera entre cada led lo sacamos del valor que da el potenciómetro        
  25.     digitalWrite(thisPin, LOW);     // apagamos el led:
  26.   }
  27.  
  28.  
  29.   for (int thisPin = 7; thisPin >= 2; thisPin--) {  // barrido desde el led mayor al menor:
  30.     digitalWrite(thisPin, HIGH);  // encendemos el led:
  31.     delay(sensorValue);  //el tiempo de espera entre cada led lo sacamos del valor que da el potenciómetro
  32.     digitalWrite(thisPin, LOW);   // apagamos el led:
  33.   }
  34.  
  35. }
  36.  




------------------------

Quinta Idea

Aquí va el proyecto del que posiblemente esté más orgulloso, ya que es el primero que hago por mi cuenta. Obviamente anteriormente leí varios tutoriales para conocer cómo funcionaba la fotoresistencia, pero la idea de indicar por leds la cantidad de luz que le entra y la programación corre de mi cuenta.
En definitiva se trata de un indicador de luminosidad. Dependiendo de la luz que le entre a la fotoresistencia, se encenderán una cantidad de leds u otros. No deja de hacer el mismo efecto que un potenciómetro pero sin tocar! jaja
Aprovecho la lista de reproducción motivadora de GTV en Spotify como música para el vídeo:



Para montar la parte de circuito de la fotoresistencia, me ayudo de esta imagen oficial de Arduino:

Imagen

A parte de eso, debemos conectar todos los leds, similar al ejemplo 3 de más arriba. El polo positivo a las salidas digitales de la 10 a la 13, cada led por separado, y los polos negativos a GND. En el vídeo se puede ver bastante bien.

Vamos a por el código. Lo he explicado con comentarios:

Código: Seleccionar todo
  1.  
  2.  
  3. const int sensorMin = 0;      // constante minima de la fotoresistencia
  4. const int sensorMax = 600;    // constante maxima de la fotoresistencia
  5.  
  6. int Led1 = 10;                     // Pin de la placa arduino donde se conecta el led.
  7. int Led2 = 11;                    
  8. int Led3 = 12;                    
  9. int Led4 = 13;                    
  10.  
  11. void setup() {
  12.  
  13.   Serial.begin(9600);  // inicia el circuito de la fotoresistencia
  14.  
  15.   pinMode(Led1, OUTPUT);      //inicia cada salida digital para los leds
  16.   pinMode(Led2, OUTPUT);      
  17.   pinMode(Led3, OUTPUT);      
  18.   pinMode(Led4, OUTPUT);      
  19. }
  20.  
  21. void loop() {
  22.  
  23.   int sensorReading = analogRead(A0); //leemos el valor que da la fotoresistencia que llega a la entrada analogica A0
  24.  
  25.   int range = map(sensorReading, sensorMin, sensorMax, 0, 4);  //con esto podemos asignar el rango de valores. en este caso usamos 5 casos, del 0 al 4.
  26.  
  27.  
  28.   switch (range) {    //primera vez que uso Switch, pero es mas util que if. dependiendo del valor que nos llegue por A0, se van a encender más o menos leds.
  29.  
  30.   case 0:  
  31.     Serial.println("oscuro");
  32.      digitalWrite(Led1, 1);        
  33.     digitalWrite(Led2, 1);        
  34.     digitalWrite(Led3, 1);        
  35.     digitalWrite(Led4, 1);
  36.     break;
  37.    
  38.   case 1:    
  39.     Serial.println("sombra");
  40.      digitalWrite(Led1, 0);        
  41.     digitalWrite(Led2, 1);        
  42.     digitalWrite(Led3, 1);        
  43.     digitalWrite(Led4, 1);
  44.     break;
  45.    
  46.   case 2:  
  47.     Serial.println("intermedio");
  48.      digitalWrite(Led1, 0);        
  49.     digitalWrite(Led2, 0);        
  50.     digitalWrite(Led3, 1);        
  51.     digitalWrite(Led4, 1);
  52.     break;
  53.    
  54.   case 3:    
  55.     Serial.println("claro");
  56.     digitalWrite(Led1, 0);        
  57.     digitalWrite(Led2, 0);        
  58.     digitalWrite(Led3, 0);        
  59.     digitalWrite(Led4, 1);  
  60.     break;
  61.    
  62.      case 4:    
  63.     Serial.println("luz");
  64.     digitalWrite(Led1, 0);        
  65.     digitalWrite(Led2, 0);        
  66.     digitalWrite(Led3, 0);        
  67.     digitalWrite(Led4, 0);  
  68.     break;
  69.    
  70.            
  71.    
  72.   }
  73.  
  74. }
  75.  
Última edición por Zarza el 26 Feb 2012, 21:43, editado 5 veces en total
Simracer para: 7thRacing
Linkin' Unit
Avatar de Usuario
Veterano
Arduino
May 2011 | 982 Mens.
Los siguientes usuarios han agradecido a Zarza este post
Alex (24 Feb 2012, 18:38), Gerardo (24 Feb 2012, 19:13), Andrés (27 Feb 2012, 00:45), Jaime (27 Feb 2012, 01:49)


Rodrigo Zarza @Zarza Offline #2
Añadida una segunda idea para jugar con los Leds. Esta vez haciendo uso de un LCD. Mañana tutorial.
Simracer para: 7thRacing
Linkin' Unit
Avatar de Usuario
Veterano
Arduino
May 2011 | 982 Mens.

Rodrigo Zarza @Zarza Offline #3
Tercera idea añadida.
Simracer para: 7thRacing
Linkin' Unit
Avatar de Usuario
Veterano
Arduino
May 2011 | 982 Mens.

Rodrigo Zarza @Zarza Offline #4
Cuarta idea añadida.
Esta vez cogiendo ideas de otros tutoriales, pero convinándolos por mi cuenta.
Pero me asalta una duda en esta linea:
pinMode(thisPin, OUTPUT);

La única diferencia que encuentro es que si lo pongo brillan los leds y si no, brillan muy muy poco pero se encienden.
Simracer para: 7thRacing
Linkin' Unit
Avatar de Usuario
Veterano
Arduino
May 2011 | 982 Mens.

Gerardo Balboa @Gerardo Offline #5
Grandes aportes! :)
Imagen
Avatar de Usuario
Administrador
Legendario
Nov 2010 | 2509 Mens.
Los siguientes usuarios han agradecido a Gerardo este post
Zarza (26 Feb 2012, 00:45)


David Martínez @DavidMC Offline #6
Zarza escribió:
Cuarta idea añadida.
Esta vez cogiendo ideas de otros tutoriales, pero convinándolos por mi cuenta.
Pero me asalta una duda en esta linea:
pinMode(thisPin, OUTPUT);

La única diferencia que encuentro es que si lo pongo brillan los leds y si no, brillan muy muy poco pero se encienden.

En principio, la instrucción pinMode(thisPin, OUTPUT); suele meterse dentro de un "for" para inicializar una serie de puertos digitales, es curioso que te funcione sin ella, habría que indagar en el funcionamiento interno del atmel.
Avatar de Usuario
Binario
Oct 2011 | 13 Mens.

Rodrigo Zarza @Zarza Offline #7
Claro eso pensé yo, pero se me había olvidado ponerlo y mi sorpresa fue que se encendían, pero con una luz muy débil.

Enviado desde el móvil
Simracer para: 7thRacing
Linkin' Unit
Avatar de Usuario
Veterano
Arduino
May 2011 | 982 Mens.

Rodrigo Zarza @Zarza Offline #8
A ver que os parece la quinta idea. cosecha propia!
Simracer para: 7thRacing
Linkin' Unit
Avatar de Usuario
Veterano
Arduino
May 2011 | 982 Mens.

Gerardo Balboa @Gerardo Offline #9


Aquí dejo mi vídeo basado en la tercera y cuarta idea :)
Imagen
Avatar de Usuario
Administrador
Legendario
Nov 2010 | 2509 Mens.

Rodrigo Zarza @Zarza Offline #10
jajajja mucho mejor, le faltaba la música a mi vídeo
Simracer para: 7thRacing
Linkin' Unit
Avatar de Usuario
Veterano
Arduino
May 2011 | 982 Mens.

Pepotis @pepotis Offline #11
Snif, snif.
Me emocionáis, pequeños polluelos.
¡Qué bonito!
Avatar de Usuario
Veterano
Diferencial
Ene 2011 | 190 Mens.

Volver a Arduino

cron