sábado, 28 de marzo de 2015
Because we can
Me ha hecho mucha gracia el vídeo que se muestra a continuación, porque me he sentido muy identificado. Una de las ideas que tenía justamente es encender una lampara con Arduino de la misma forma que se muestra en el vídeo.
domingo, 22 de marzo de 2015
Encender rápidamente una serie de LEDs con un potenciómetro
Al girar el potenciómetro encendemos una serie de LEDs de forma acumulada. En esta ocasión podemos mover rápidamente la rueda del potenciómetro.
Un potenciómetro o resistencia variable nos permite disponer de valores analógicos entre 0 y 1023, en total son 1024 valores que podemos asociar a una entrada analógica como A0 y luego con condicionales establecer en el código las acciones que necesitamos. En este caso encenderemos una serie de LEDs de forma secuencial.
Ahora podemos mover rápidamente el potenciómetro y conseguiremos que se enciendan siempre no solo el LED que toque sino todos los anteriores. Esto se logra dando la instrucción en el código de que se enciendan todos los previos. Y el proceso análogo al apagarlos.
int i; int j; int pinPotenciometro = A0; int valorPotenciometro = 0; void setup() { pinMode(pinPotenciometro, INPUT); for (i = 0; i < 14; i++) pinMode(i, OUTPUT); Serial.begin(9600); } void loop() { valorPotenciometro = analogRead(pinPotenciometro); for (i = 0; i < 14; i++) { if (valorPotenciometro == 0) apagarLeds(); if (valorPotenciometro > i*73 && valorPotenciometro <= (i+1)*73) encenderHasta(); //en este rango está el LED que toca encender if (valorPotenciometro == 1023) encenderLeds(); } } void encenderHasta() { for (j = 0; j < 14; j++) if (j<=i) digitalWrite(j, HIGH); //se enciende el LED que toca (el i-esimo) y todos los anteriores else digitalWrite(j, LOW); //el resto se apagan } void apagarLeds() { for (i = 0; i < 14; i++) digitalWrite(i, LOW); } void encenderLeds() { for (i = 0; i < 14; i++) digitalWrite(i, HIGH); }
Encender uno a uno una serie de LEDs con un potenciómetro
Al girar el potenciómetro encendemos uno a uno una serie de LEDs y luego los apagamos. Solo hay uno encendido salvo en los extremos del potenciómetro.
Encendemos uno a uno 14 LEDs usando un potenciómetro, salvo en los extremos de la rueda del potenciómetro donde en un extremo apagamos todos y en contrario encendemos todos.
int i; int j; int pinPotenciometro = A0; int valorPotenciometro = 0; int tocaLed; //este es el LED que toca encender en cada momento void setup() { pinMode(pinPotenciometro, INPUT); for (i = 0; i < 14; i++) pinMode(i, OUTPUT); Serial.begin(9600); } void loop() { valorPotenciometro = analogRead(pinPotenciometro); for (i = 0; i < 14; i++) { if (valorPotenciometro == 0) apagarLeds(); if (valorPotenciometro > i*73 && valorPotenciometro <= (i+1)*73) //en este rango está el LED que toca encender { tocaLed = i; for (j=0; j<14; j++) //creamos otro bucle para encender el LED que toca y apagar el resto { if (j==tocaLed) digitalWrite(j, HIGH); else digitalWrite(j, LOW); } } if (valorPotenciometro == 1023) encenderLeds(); } } void apagarLeds() { for (i = 0; i < 14; i++) digitalWrite(i, LOW); } void encenderLeds() { for (i = 0; i < 14; i++) digitalWrite(i, HIGH); }
sábado, 21 de marzo de 2015
Encender lentamente una serie de LEDs con un potenciómetro
Vamos a ver cómo actúa un potenciómetro al ir encendiendo una serie de LEDs y luego al ir apagándolos.
En este caso se trata de girar la rueda del potenciómetro o resistencia variable para conseguir que se vayan encendiendo los 14 LEDs, de forma que al encenderse uno de ellos queden encendidos los anteriores. Podemos girar la rueda hasta su posición final que es cuando todos quedan encendidos, y luego podemos ir girando en sentido contrario de forma que se irán apagando los LEDs hasta que al volver a la posición original todos quedarán apagados.
Disponemos de un voltímetro para ir mirando las lecturas que nos proporciona la resistencia variable.
int i = 0; int pinPotenciometro =A0; int valorPotenciometro = 0; void setup() { pinMode(pinPotenciometro, INPUT); for (i = 0; i < 14; i++) pinMode(i, OUTPUT); Serial.begin(9600); } void loop() { valorPotenciometro = analogRead(pinPotenciometro); //Las dos siguientes líneas de código se ponen si deseamos ver los valores por el monitor serial //Serial.println(valorPotenciometro, DEC); //delay(100); for (i = 0; i < 14; i++) { if (valorPotenciometro == 0) apagarLeds(); if (valorPotenciometro > i*73 && valorPotenciometro < (i+1)*73) digitalWrite(i, HIGH); if (valorPotenciometro > (i-1)*73 && valorPotenciometro < i*73) digitalWrite(i, LOW); if (valorPotenciometro == 1023) encenderLeds(); } } void apagarLeds() { for (i = 0; i < 14; i++) digitalWrite(i, LOW); } void encenderLeds() { for (i = 0; i < 14; i++) digitalWrite(i, HIGH); }
Potenciómetro y LED
Introducimos un potenciómetro o resistencia variable que proporcionará valores analógicos a la placa Arduino entre 0 y 1023. Esto es, existen 1024 valores analógicos que se recogen en la entrada A0 del Arduino.
El código analiza esos valores y lo que hace es que al inicio del recorrido del potenciómetro el LED está apagado, en el recorrido intermedio del potenciómetro el LED se enciende de forma intermitente y en su recorrido final el LED queda encendido de forma continua.
En términos aproximados estos son los intervalos según el voltímetro que se adjunta.
- de 0V a 1.4V el LED está apagado
- de 1.5V a 3.4V el LED está encendido de forma intermitente
- de 3.5V a 5V el LED está encendido de forma continua
Hemos añadido un voltímetro para ir viendo los valores que arroja entre 0V y 5V al ir girando el potenciómetro.
int valorPotenciometro = 0; void setup() { pinMode(A0, INPUT); pinMode(13, OUTPUT); Serial.begin(9600); } void loop() { valorPotenciometro = analogRead(A0); //delay(100); if (valorPotenciometro < 300) digitalWrite(13, LOW); if (valorPotenciometro >= 300 && valorPotenciometro < 700) intermitencia(); if (valorPotenciometro >= 700) digitalWrite(13, HIGH); } void intermitencia() { digitalWrite(13, HIGH); delay(200); digitalWrite(13, LOW); delay(200); }
En una entrada posterior vamos a controlar una serie de LEDs con un potenciómetro, para que se vayan encendiendo de forma secuencial.
viernes, 13 de marzo de 2015
Apagar un LED mientras esté apretado un botón
En la entrada anterior de este blog hemos visto el caso denominado Encender un LED mientras esté apretado un botón.
Para este caso hemos respetado el código íntegramente y el circuito únicamente cambia en dos puntos que están marcados en la siguiente imagen mediante un circulo de color azul que rodea la resistencia y uno de los cables, que son los dos únicos que cambian.
Este es el proyecto:
/* El LED está asociado al pin digital 12. El botón está asociado al pin digital 2. El LED está permanentemente encendido sólo se apaga al presional el pulsador */ // Variables estáticas int pinBoton = 2; // Declaramos la variable pin del Botón int pinLed = 12; // Declaramos la variable pin del Led // Variables dinámicas int estadoBoton = 0; // Variable para estado del botón void setup() { // Inicializa el pin del LED como salida: pinMode(pinLed, OUTPUT); // Inicializa el pin del botón como entrada: pinMode(pinBoton, INPUT); } void loop(){ // Lee el valor del pin del botón y lo almacena // en la variable estadoBoton estadoBoton = digitalRead(pinBoton); // Chequea si el botón está pulsado: if (estadoBoton == HIGH) { // Si es así, enciende el LED: digitalWrite(pinLed, HIGH); } else { // Si no, lo mantiene apagado: digitalWrite(pinLed, LOW); } }
También podríamos sustituir el código del proyecto anterior por el siguiente código y funcionaría perfectamente.
int estado; void setup(){ pinMode(12,OUTPUT); pinMode(2,INPUT); } void loop(){ estado = digitalRead(2); digitalWrite(12,estado); delay(50); }
Encender un LED mientras esté apretado un botón
Puedes ver el proyecto en el siguiente enlace:
También puedes verse otro proyecto donde se consigue el mismo resultado pero con código mucho más corto. Es el siguiente proyecto:
/* El LED se conecta al pin digital 12. El botón está conectado al pin digital 2. Al pulsar el botón se enciende el LED */ // Variables estáticas int pinBoton = 2; // Declaramos la variable Botón int pinLed = 12; // Declaramos la variable Led // Variables dinámicas int estadoBoton = 0; // Variable para estado del botón void setup() { // Inicializa el pin del LED como salida: pinMode(pinLed, OUTPUT); // Inicializa el pin del botón como entrada: pinMode(pinBoton, INPUT); } void loop(){ // Lee el valor del pin del botón y lo almacena // en la variable estadoBoton estadoBoton = digitalRead(pinBoton); // Chequea si el botón está pulsado: if (estadoBoton == HIGH) { // Si es así, enciende el LED: digitalWrite(pinLed, HIGH); } else { // Si no, lo mantiene apagado: digitalWrite(pinLed, LOW); } }
También puedes verse otro proyecto donde se consigue el mismo resultado pero con código mucho más corto. Es el siguiente proyecto:
int estado; void setup(){ pinMode(2,OUTPUT); pinMode(8,INPUT); } void loop(){ estado = digitalRead(8); digitalWrite(2,estado); delay(50); }
jueves, 12 de marzo de 2015
Encender y apagar un LED presionando un botón
El LED lleva su resistencia para que no se queme y el botón lleva también una resistencia pero es para hacer una derivación a masa (tierra o GND).
Usamos dos pines digitales, el 8 para leer el botón y el 2 para actuar sobre el LED.
Necesitamos:
- Placa Arduino
- LED
- Botón pulsador de 4 patillas
- una resistencia de 100 Ohm para el LED
- una resistencia de 10KOhm para la derivación a tierra del botón
Al pulsar el botón el LED se enciende y permanece encendido hasta que se vuelve a presionar el botón.
const int pinLed = 2; //El pin del LED const int pinBtn = 8; // El pin del botón int encender = 0; // Si está encendido el LED int anterior = 0; // Pulsación anterior int estado = 0; //El estado actual del botón void setup() { pinMode(pinLed, OUTPUT); // Ponemos el pin del LED como salida pinMode(pinBtn, INPUT); // Ponemos el pin del botón como entrada } void loop() { estado = digitalRead(pinBtn); //Comprobamos el estado if (estado && anterior == 0) // Comprobamos si el anterior era sin pulsar y el estado actual es pulsado { encender = 1 - encender; // Asignamos el estado contrario delay(30); // Anti-rebote } anterior = estado; // Guardamos el estado actual para posteriores comprobaciones if(encender) // Si encender es 1 digitalWrite(pinLed, HIGH); // Endendemos el LED else // Si no digitalWrite(pinLed, LOW); // Apagamos el LED }
martes, 10 de marzo de 2015
LEDs con encendido aleatorio
Vamos a usar la función RANDOM() para generar números aleatorios que nos digan que LED toca encender cada vez.
Puedes ver el proyecto en el siguiente enlace:
La línea siguiente se añade para elegir una nueva semilla para la serie de números pseudo-aleatorios:
Lo que hace es una llamada al pin analógico cero para escuchar el ruido blanco del sistema y usarlo como semilla. Equivale a barajar un mazo de cartas. El problema es que si esto lo probamos en el simulador no hay ruido blanco y por tanto la secuencia de encendido de los LEDs se repite siempre siguiendo la misma serie de números pseudo-aleatorios.
También se podría generar una nueva semilla usando la expresión siguiente:
Puedes ver el proyecto en el siguiente enlace:
int timer=300; int cont = 13; //tenemos 13 LEDs void setup(){ for (int pin=1; pin<=cont; pin++){ pinMode (pin, OUTPUT); } randomSeed(analogRead(0)); //para generar una nueva semilla } void loop () { int rnd=random(14); // ponemos hasta 14 ya que nunca se llega a 14 digitalWrite (rnd, HIGH); delay (timer); digitalWrite (rnd, LOW); delay (timer); }
La línea siguiente se añade para elegir una nueva semilla para la serie de números pseudo-aleatorios:
randomSeed(analogRead(0));
Lo que hace es una llamada al pin analógico cero para escuchar el ruido blanco del sistema y usarlo como semilla. Equivale a barajar un mazo de cartas. El problema es que si esto lo probamos en el simulador no hay ruido blanco y por tanto la secuencia de encendido de los LEDs se repite siempre siguiendo la misma serie de números pseudo-aleatorios.
También se podría generar una nueva semilla usando la expresión siguiente:
randomSeed(millis()); // genera una semilla para aleatorio a partir de la función millis()
LEDs secuenciales sucesivos
Veamos el encendido y apagado secuencial de 13 LEDs sin el uso de matrices (ARRAY), simplemente usando un FOR para hacer la secuencia correlativa.
El proyecto se puede ver en el siguiente enlace:
En esta ocasión no hemos utilizado una matriz para indicar los pines utilizados, ya que usamos todos (del uno al trece), por lo que simplemente usamos un FOR que recorre todos ellos. Se encienden y apagan de forma secuencial y correltiva.
El proyecto se puede ver en el siguiente enlace:
En esta ocasión no hemos utilizado una matriz para indicar los pines utilizados, ya que usamos todos (del uno al trece), por lo que simplemente usamos un FOR que recorre todos ellos. Se encienden y apagan de forma secuencial y correltiva.
// LEDs en secuencia correlativa de encendido y apagado int timer=100; int cont = 13; void setup(){ for (int pin=1; pin<=cont; pin++){ pinMode (pin, OUTPUT); } } void loop () { for (int pin=1; pin<=cont; pin++) { digitalWrite (pin, HIGH); delay (timer); digitalWrite (pin, LOW); } for (int pin=cont; pin>=0; pin--) { digitalWrite (pin, HIGH); delay (timer); digitalWrite (pin, LOW); } }
Botón pulsador
Vamos a estudiar el comportamiento de un botón de 4 patillas. El típico será uno de 6*6*5 mm.
Estos pulsadores actúan como interruptores cuando los cables están "cruzados". Para ver esto hemos planteado un ejemplo sin el uso de ninguna placa Arduino. Usamos simplemente una pila.
El proyecto se puede ver en el siguiente enlace:
Estos pulsadores actúan como interruptores cuando los cables están "cruzados". Para ver esto hemos planteado un ejemplo sin el uso de ninguna placa Arduino. Usamos simplemente una pila.
El proyecto se puede ver en el siguiente enlace:
No existe código asociado al montaje ya que no usamos una placa Arduino.
lunes, 9 de marzo de 2015
Serie de LEDs con encendido secuencial
Vamos a encender y apagar secuencialmente un conjunto de LEDs y efectuaremos el viaje de ida y vuelta.
Puedes verlo en el siguiente enlace:
Puedes verlo en el siguiente enlace:
int timer=100; //establecemos el tiempo de espera en milisegundos int cont = 5; //indica que usamos 5 LEDs y por tanto 5 pines digitales int matriz[5] = {5, 7, 9, 11, 13}; //la matriz contiene los cinco pines digitales usados y su orden void setup(){ for (int pin=0; pin < cont; pin++){ //recorremos los 5 pines pinMode (matriz [pin], OUTPUT); //establecemos la salida de cada pin } } void loop () { for (int pin=0; pin < cont; pin++) //recorremos los 5 pines { digitalWrite (matriz [pin], HIGH); //encendemos el LED que toca delay (timer); //el LED permanece encendido el tiempo indicado en la variable timer digitalWrite (matriz [pin], LOW); //transcurrido el tiempo de espera se apaga el LED } for (int pin=cont-1;pin>=0; pin --) //recorremos los 5 pines pero ahora en sentido contrario { digitalWrite (matriz [pin], HIGH); //encendemos el LED que toca delay (timer); //el LED permanece encendido el tiempo indicado en la variable timer digitalWrite (matriz [pin], LOW); //transcurrido el tiempo de espera se apaga el LED } }
Majarduino: Reto 0. Analógico y digital
#Majarduino
Reto 0
Comprender funcionamiento de entradas salidas analógica y digitales
1. Pulsadores y leds
- Al pulsar un botón encender un led.
- Ampliación: utilizar 2 botones para apagar 2 leds que están siempre encendidos.
2. Potenciómetro
- Encender 1 Led cuando hemos girado mas de la mitad del potenciómetro.
- Dividir el ángulo de giro del potenciómetro para encender 5 leds diferentes dependiendo de la posición del potenciómetro.
Hola Mundo con Arduino
Hemos comenzado un proyecto vital: aprender a manejar una placa de Arduino y con ello algo de electrónica, robótica y programación. Con el apoyo y el entusiasmo de MajadaLab en un taller de Arduino donde nos orienta Jompy cuando tenemos dudas. Y algunos somos realmente novatos, y tenemos que preguntarle por la polaridad de un LED.
En este blog pretendemos ir dejando constancia de nuestros progresos a lo largo del tiempo. Ilusión tenemos mucha, a ver hasta donde llegamos. Y como la velocidad se demuestra andando vamos con el primer proyecto con Arduino. Es el típico "Hola Mundo" para aprender a manejarnos con las conexiones, los componentes y la programación.
Usando este simulador tinkercad.com hemos creado nuestro primer circuito con Arduino.
Lo hemos titulado Hola Mundo con Arduino.
La resistencia de 220 ohm se usa para conectar un led a las salidas digitales. Si se usa el pin 13 no necesita resistencia ya que internamente ya la lleva puesto que es la que tiene conectado un pequeño led en la placa.
En este blog pretendemos ir dejando constancia de nuestros progresos a lo largo del tiempo. Ilusión tenemos mucha, a ver hasta donde llegamos. Y como la velocidad se demuestra andando vamos con el primer proyecto con Arduino. Es el típico "Hola Mundo" para aprender a manejarnos con las conexiones, los componentes y la programación.
Usando este simulador tinkercad.com hemos creado nuestro primer circuito con Arduino.
Lo hemos titulado Hola Mundo con Arduino.
// primer montaje con Arduino
// objetivo: conseguir encender y apagar un LED de forma intermitente
int Pin = 12; // hacemos que la variable Pin tome el valor del pin 12 u otro pin digital elegido
void setup() {
pinMode(Pin, OUTPUT); //inicializamos el pin de la variable Pin como de salida
}
void loop() { // loop hace que se repita indefinidamente
digitalWrite(Pin, HIGH); // hacemos que el LED se encienda (HIGH es el nivel de voltaje)
delay(1000); // esperamos 1000 milisegundos
digitalWrite(Pin, LOW); // apagamos el LED haciendo el nivel de voltaje LOW
delay(1000); // esperamos un segundo
}