Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos,...

21

Transcript of Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos,...

Page 1: Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos, ... •Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente
Page 2: Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos, ... •Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente

Entradas y salidas: digitales y analógicas

• Sensores tipo apagado-encendido – Interruptores (switches)

– Termostatos

– Interruptores magnéticos

– Interruptores de presión

– Interruptores de inclinación

– Sensor de infrarrojos, PIR, (Passive Infrared Sensor)

• Controlar la luz (u otros inputs) con pulsos modulados PWM (Pulse Width Modulation): reguladores de intensidad.

Page 3: Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos, ... •Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente

Salidas analógicas: regulación de intensidad con PWM

• La idea es jugar con los tiempos de encendido y apagado.

• Esto lo podemos hacer colocando retardos en el código, pero es incómodo y poco eficiente.

• Con Arduino podemos modular la intensidad usando los pines analógicos 3, 5, 6, 9, 10 y 11.

• Se controlan con la función analogWrite(pin, valor) – valor: un nº entre 0 y 255

Page 4: Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos, ... •Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente

Los sensores analógicos necesitan un tipo diferente de pin a los de los sensores de respuesta si-no.

• en la placa Arduino hay 6 pines marcados como

‘ANALOG IN’ (A0 a A5). • la función para leer la información de este tipo de

entradas es analogRead(pin).

• analogRead() devuelve un valor entre 0 y 1023 para voltajes entre 0 y 5 voltios. Vamos a practicar con nuestros sensores analógicos.

Entradas y sensores analógicos

Page 5: Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos, ... •Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente

Sketch para aumentar y disminuir la

intensidad del LED

• /* Disminuir y aumentar la intensidad del LED */

• const int LED = 9; // the pin for the LED • int i = 0; // usamos este contador para contar hacia arriba y

// hacia abajo

• void setup() { • pinMode(LED, OUTPUT); // tell Arduino LED is an output • } • void loop() { • for (i = 0; i < 255; i++) { // bucle de 0 a 254 (intensidad

//aumenta) • analogWrite(LED, i); // establecer el brillo del LED • delay(10); // esperar 10ms: analogWrite es instantáneo • // y podríamos no ver el cambio • } • for (i = 255; i > 0; i--) { // loop from 255 to 1 (fade out) • analogWrite(LED, i); // establecemos el brillo del LED • delay(10); // esperar 10ms • } • }

Salidas analógicas

Page 6: Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos, ... •Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente

// Mantener encendido el LED tras la pulsación y cambiar el brillo mientras el botón esté pulsado. const int LED = 9; // the pin for the LED const int BUTTON = 7; // input pin of the pushbutton int val = 0; // stores the state of the input pin int old_val = 0; // stores the previous value of "val" int state = 0; // 0 = LED off while 1 = LED on int brightness = 128; // almacena el valor de la intensidad unsigned long startTime = 0; // when did we begin pressing? void setup() { pinMode(LED, OUTPUT); // el LED es una salida pinMode(BUTTON, INPUT); // y el botón una entrada }

Montar el circuito correspondiente y ejecutar el siguiente sketch

Vamos a juntar ahora el circuito que acabamos de hacer con el del botón: la idea es que según el tiempo que apretemos el botón, la luz sea más o menos intensa.

Page 7: Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos, ... •Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente

void loop() { val = digitalRead(BUTTON); // lee el valor de entrada y lo guarda // comprobamos si ha habido una transición if ((val == HIGH) && (old_val == LOW)) { state = 1 - state; // cambiar el estado de apagado a // encendido o vice-versa startTime = millis(); // millis() es el reloj de Arduino //devuelve las milésimas de seg. transcurridas desde que //se restableció la placa delay(10); } // comprobamos si el botón se ha mantenido pulsado if ((val == HIGH) && (old_val == HIGH)) { // If the button is held for more than 500 ms. if (state == 1 && (millis() - startTime) > 500) { brightness++; // increment brightness by 1 delay(10); // retardo para evitar que el brillo pase demasiado deprisa if (brightness > 255) { // 255 is the max brightness brightness = 0; // if we go over 255 let’s go back to 0

continuación

Page 8: Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos, ... •Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente

} } } old_val = val; // val es ahora antiguo y lo almacenamos if (state == 1) { analogWrite(LED, brightness); // encender el LED al nivel actual de brillo } else { analogWrite(LED, 0); // turn LED OFF } }

Esto funciona! Si pulsamos y soltamos, el LED se enciende y apaga. Si lo mantenemos pulsado, el brillo cambia hasta que lo soltemos.

fin

Page 9: Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos, ... •Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente

• Montamos una nueva versión del circuito del botón y el LED.

• Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente de la luz).

Si tapamos la LDR con las manos, el LED se apaga y si las quitamos, el LED se enciende de nuevo.

Este tipo de sensores nos pueden decir no sólo si hay o

no luz, sino, además y muy importante, la cantidad de luz que hay.

Entradas analógicas: un sensor electrónico en lugar del botón

Page 10: Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos, ... •Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente

montamos el circuito de la figura (o uno mejorado), y ejecutamos el siguiente código:

En la placa de montajes colocamos el fotorresistor y una resistencia de 10 k Ω

// LED que parpadea a la velocidad especificada por el valor de la entrada analógica const int LED = 13; // el pin del LED int val = 0; // variable usada para almacenar el valor //que proviene del sensor void setup() { pinMode(LED, OUTPUT); // LED es una salida } void loop() { val = analogRead(0); // leer el valor del sensor

digitalWrite(LED, HIGH); // encender el LED

delay(val); // detener el programa durante un tiempo digitalWrite(LED, LOW); // apagar el LED delay(val); }

Page 11: Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos, ... •Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente

// Establecer el brillo del LED según el valor de una entrada analógica const int LED = 9; // the pin for the LED int val = 0; // variable used to store the value coming from the sensor void setup() { pinMode(LED, OUTPUT); // LED is as an OUTPUT } void loop() { val = analogRead(0); // read the value from the sensor analogWrite(LED, val/4); // encender el LED con el brillo obtenido del sensor delay(10); // stop the program for some time }

Ahora, vamos a juntar el sensor (LDR) y el actuador (LED) en un mismo circuito.

• Modificamos el circuito. • Cargamos y ejecutamos el siguiente sketch.

Page 12: Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos, ... •Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente

MEDIDOR DE TEMPERATURA

• MATERIAL NECESARIO - 3 LED’s rojos - 1 sensor de temperatura TMP36 - 3 resistencias de 220 Ω - Cables, placa de montajes -1 placa Arduino

• A destacar - entrada analógica - uso del monitor serie

• Descripción del proyecto Vamos a usar un sensor de temperatura (datos analógicos) para medir nuestra temperatura. El voltaje de salida es directamente proporcional a la temperatura en grados centígrados.

(amorímetro)

Page 13: Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos, ... •Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente

MEDIDOR DE TEMPERATURA

la pata corta del LED, cátodo, a tierra a través de la resistencia

patilla izquierda a la corriente y derecha a tierra; la central a A0

corriente y toma de tierra

La conexión USB se puede utilizar para mandar datos al equipo o recibirlos desde el ordenador. Después de cargar el sketch, hacer clic en el icono del monitor serie (arriba, derecha). Hay que especificar la velocidad de la comunicación: 9600 bps.

Page 14: Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos, ... •Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente

// medidor de temperatura // nombramos al pin donde está conectado el sensor const int sensorPin = A0; // room temperature in Celcius (la medimos o estimamos) const float baselineTemp = 20.0; void setup() { // abrimos el puerto serie para ver los datos en pantalla Serial.begin(9600); // declaramos los LED’s como salidas y los apagamos for (int pinNumber = 2; pinNumber < 5; pinNumber++) { pinMode(pinNumber, OUTPUT); digitalWrite(pinNumber, LOW); } }

MEDIDOR DE TEMPERATURA

Page 15: Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos, ... •Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente

void loop() { // leer el valor en el pin A0 y almacenarlo en una variable local // el valor está entre 0 y 1023 int sensorVal = analogRead(sensorPin); Serial.print(“lectura del sensor: "); Serial.print(sensorVal); // convert the ADC reading to voltage float voltaje = (sensorVal / 1024.0) * 5.0; // Send the voltage level out the Serial port Serial.print(", Volts: "); Serial.print(voltaje); // convert the voltage to temperature in degrees C // tenemos en cuenta las especificaciones // del sensor (10mV equivale a 1 ºC) Serial.print(", grados (C): "); float temperature = (voltaje - .5) * 100; Serial.println(temperature);

MEDIDOR DE TEMPERATURA

Page 16: Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos, ... •Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente

// if the current temperature is lower than the baseline // turn off all LEDs if (temperature < baselineTemp) { digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); } // if the temperature rises 2-4 degrees, turn an LED on else if (temperature >= baselineTemp + 2 && temperature < baselineTemp + 4) { digitalWrite(2, HIGH); digitalWrite(3, LOW); digitalWrite(4, LOW); } // if the temperature rises 4-6 degrees, turn a second LED on else if (temperature >= baselineTemp + 4 && temperature < baselineTemp + 6) { digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, LOW); } // if the temperature rises more than 6 degrees, turn all LEDs on else if (temperature >= baselineTemp + 6) { digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); } delay(50); }

MEDIDOR DE TEMPERATURA

Page 17: Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos, ... •Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente

LÁMPARA DE VARIOS COLORES

• MATERIAL NECESARIO - 1 LED rgb - 3 fotocélulas o fotorresistores - 3 resistencias de 10 kΩ - 3 resistencias de 220 Ω - Cables, placa de montajes -1 placa Arduino

• A destacar - Salidas analógicas - Mapear (cambiar de escala) valores

• Descripción del proyecto Vamos a hacer una lámpara que cambia de color en función de las condiciones externas

Page 18: Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos, ... •Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente

LÁMPARA DE VARIOS COLORES

La terminal más larga es el cátodo

Rojo A0 Verde A1 Azul A2

Page 19: Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos, ... •Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente

LÁMPARA DE VARIOS COLORES

// Lámpara multicolor const int greenLEDPin = 9; // LED connected to digital pin 9 const int redLEDPin = 10; // LED connected to digital pin 10 const int blueLEDPin = 11; // LED connected to digital pin 11 const int redSensorPin = A0; // pin with the photoresistor with the red gel const int greenSensorPin = A1; // pin with the photoresistor with the green gel const int blueSensorPin = A2; // pin with the photoresistor with the blue gel int redValue = 0; // valores iniciales int greenValue = 0; int blueValue = 0; int redSensorValue = 0; int greenSensorValue = 0; int blueSensorValue = 0;

void setup() { // inicializamos la comunicación serie Serial.begin(9600); // set the digital pins as outputs pinMode(greenLEDPin, OUTPUT); pinMode(redLEDPin, OUTPUT); pinMode(blueLEDPin, OUTPUT); }

Page 20: Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos, ... •Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente

void loop() { // leer los valores de los sensores y almacenarlos en las variables correspondientes redSensorValue = analogRead(redSensorPin); delay(25); // esperar a que el ADC termine greenSensorValue = analogRead(greenSensorPin); delay(25); blueSensorValue = analogRead(blueSensorPin); // escribir los valores en el monitor serie tabulados Serial.print("raw sensor Values \t red: "); Serial.print(redSensorValue); Serial.print("\t green: "); Serial.print(greenSensorValue); Serial.print("\t blue: "); Serial.println(blueSensorValue);

LÁMPARA DE VARIOS COLORES

Page 21: Entradas y salidas: digitales y - juana-cuarto.wikispaces.comE_S... · –Sensor de infrarrojos, ... •Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente

/* El ADC proporciona un valor entre 0 y 1023 (10 bits) pero analogWrite() usa 8 bits, valores entre 0 y 255. Por lo tanto, dividimos la lectura del sensor entre 4. */ redValue = redSensorValue / 4; greenValue = greenSensorValue / 4; blueValue = blueSensorValue / 4; // print out the mapped values Serial.print(“valores sensores corregidos \t red: "); Serial.print(redValue); Serial.print("\t green: "); Serial.print(greenValue); Serial.print("\t Blue: "); Serial.println(blueValue); // ajustamos los niveles de luz del LED analogWrite(redLEDPin, redValue); analogWrite(greenLEDPin, greenValue); analogWrite(blueLEDPin, blueValue); }

LÁMPARA DE VARIOS COLORES