Práctica 6

La práctica 6 trata sobre el uso del sensor de ultrasonidos HC-SR04. Este sensor emite un eco y al recibirlo de vuelta produce una señal analógica acorde con el tiempo que ha tardado en recibirlo.  Esto es, obtendremos valores enteros desde “0″ a “1023″ según la distancia al obstáculo.  Mediante el monitor se podrán representar los valores obtenidos. La “entrada de información” será pues el sensor de ultrasonidos y como “salida de información” usaremos LEDs y un servo.

Sensor HC-SR04

Es importante conectarlo bien a los pines indicados. Para usarlo se definirá los valores constantes de los pines (así como llamar a la librería del servo):

#include Servo.h;
#define echoPin 6 
#define trigPin 7

Después se emite un eco de 8 milisengundos de duración por el trigPin:

Y mediante la función “pulseIn” se lee en el echoPin lo que tarda en ser recibido:

 duration = pulseIn(echoPin, HIGH);
 distance = duration/58.2;

El “58.2″ está relacionado con la velocidad del sonido. Son los microsegundos que tarda el sonido en recorrer 1 cm dos veces (una que va y la otra que vuelve).  Modificando este valor obtendremos medidas de distancia erróneas.

Sensor_ObjDec_Ultra_HC_SR04_7Componentes necesarios para esta práctica

Los ejercicios a realizar en esta práctica son:

  1. El ejercicio a consiste en usar 4 LEDs para representar distancias entre 0 y 20cm, esto es, si el obstáculo (una taza en este caso) está entre los 0 y los 5cm, se enciende un LED, si está entre los 5 y los 10cm se encienden dos, y así hasta 20cm. Si pasa de 20cm, entonces los cuatro LEDs parpadearán.
  2. El ejercicio consiste en hacer uso de un servo para representar la distancia en vez de los LEDs.

Código ejercicio a

Código ejercicio b

Archivos .ino

Descarga el ejercicio a haciendo click aquí
Descarga el ejercicio b haciendo click aquí

Comentario final y RETO SEMANAL

El reto de este semana es representar la misma distancia (20cm) con 10 LEDs en vez de 4.

Según lo vayáis completando, mandad el código (y si queréis, fotos o vídeos) a la siguiente dirección: practicas@thinkbit.org

Enlaces relacionados

Página Arduino Playground(ENG): SR04
Opiron: Todo sobre sensores de ultrasonidos
My Robot Lab(ENG): Use HC SR04 sensors
Three House Projects: HC-SR04 Ultrasonic Tutorial
Instructables(ENG): Simple Arduino and HC-SR04 example
Instructables (ENG): Ultrasonic distance sensor
Instructables(ENG): GoPro + HC-SR04

Práctica 4

La práctica 4 es la primera donde usaremos algo distinto a los leds como “salidas de información”: servomotores. Un servomotor, normalmente llamado servo (lo llamaremos así a partir de ahora), es simplemente un motor con unos topes que le permiten girar en un rango de 180º (media vuelta), y que puede ubicarse y mantenerse estable en cualquier posición de este rango. Aprenderemos lo que son las librerías, su importancia, y a hacer un bucle condicional for.

Librerías

Podemos imaginarnos las librerías tal como suenan: una gran estantería llena de libros, al que acudimos cuando necesitamos saber o usar algo. En programación, son códigos ya escritos que podemos incluir en nuestro código, para añadirle muchas funcionalidades, como controlar hardware, etc…  Por ejemplo:  queremos usar un servo ahora, pero hacer la programación desde cero para usar un servo no estaría a nuestro alcance, por lo que acudimos a la librería del servo para simplificarnos la vida.

Vienen algo más de una decena de ellos instalados de serie con el IDE de Arduino, pero podemos instalar (¡o hacer nosotros mismos!) todas las que queramos.

La manera de incluir una librería en nuestro código es con:

#include <nombredelalibrería.h>

Servos

Ya hemos explicado lo que son los servos, asi que vamos a aprender a usarlos.

Servo

Servo

 

Podemos observar que de los servos salen tres cables: El más oscuro (Marrón o negro normalmente) es siempre el de tierra, es decir, GND. El rojo será el que hay que conectar a 5V, y el sobrante es el llamado de señal, el que le dice en que posición tiene que estar.

Vamos a ver ahora como usar uno en Arduino.

Primero, incluimos la librería del servo:

#include <Servo.h>

Después, llamaremos a nuestro servo algo, para poder tener varios a la vez y poder distinguirlos:

Servo nombredelservo;

En void setup, tendremos que inciar el servo, diciendo en que pin está conectado el cable de señal:

nombredelservo.attach(pinseñal);

Ahora, solo quedaría girarlo, metiendole un valor entre 0 y 179:

nombredelservo.write(valor)

Bucle Condicional : For

Un bucle es un proceso que se repite una y otra vez (¡Como el void loop!). Son importantísimos en la programación, porque simplifican mucho la vida y nos hacen los códigos más cortos.

Lo que vamos a aprender es a hacer un bucle condicional: Un bucle que se repite solo cuando se cumple una condición. Usaremos la estructura for para ello:

for (Inicialización; Condición; Incremento){
 Código a realizar
}

Vamos a ver esto de una forma más gráfica:

En este bucle: Empezariamos con una variable x=0. La condición para que se vaya repitiendo el bucle es que x sea menor que 100. Mientras se cumpla esta condición, vamos a irle añadiendo 1 a x en cada vuelta. (NOTA: x++ es igual a x=x+1). Cada vez que se repite el bucle, estamos imprimiendo por el serial el valor x, por lo que contaremos de 0 a 99.

Map

Al leer el potenciómetro, nos llega un valor en el rango de 0 a 1023. El servo solo puede girar de 0 a 180 grados, ¿Que hacemos?. Podríamos simplemente dividir 180/1023 y multiplicar esto por el valor del potenciómetro, y obtener un valor “escalado”, pero vamos a ver que hay un método más cómodo: La función map. Tiene la siguiente estructura:

map(nombrevariable, desdevalorbajo, desdevaloralto, hastavalorbajo, hastavaloralto)

Vamos a ver un ejemplo con números. Si tenemos que x=10, y hacemos lo siguiente:

x = map(x, 0, 20, 0, 100)

Obtendríamos x = 50 

Componentes necesarios para esta práctica

 

Los ejercicios a realizar en esta práctica son:

  1. El ejercicio a consiste en simplemente abrir un ejemplo  preinstalado en arduino (Sweep), y cargarlo. El servo empezará a girar de un lado a otro.
  2. El ejercicio b usa un ejemplo preinstalado también (Knob). Ahora se controlará el giro del servo con un potenciómetro.

Código ejercicio a

Código ejercicio b

Archivos .ino

Descarga el ejercicio a haciendo click aquí 
Descarga el ejercicio b haciendo click aquí

Comentario final y RETO SEMANAL

El reto de este semana es modificar el ejercicio b para que el potenciómetro, a la vez que se determine la posición del servo, determine cuántos LEDs se encienden (usar 5 LEDs). Esto es, construir un indicador de posición del servo mediante LEDs. Ningún LED encendido si estamos en 0 grados, todos encendidos si estamos en 180 grados (habrá que usar una estructura if para dividir en cinco segmentos la lectura analógica 0-1023 y aplicar una estructura for para encender los LEDs).

Según lo vayáis completando, mandad el código (y si queréis, fotos o vídeos) a la siguiente dirección: practicas@thinkbit.org

Enlaces relacionados

Página oficial Arduino(ENG): Servo with knob
Página oficial Arduino(ENG): Include
Tronixstuff(ENG): entre otras cosas...servos
Arduteka: El servomotor
BricoGeek: Control de servomotores
Adafruit(ENG): Lesson 14: servomotors
Instructables(ENG): Using servos
Instructables(ENG): Arduino+Servo+potentiometer
Instructables(ENG): How to #Arduino servo
ArduinoArts(ENG): Servo on IKEA lamp
Página oficial Arduino : Función map

 

Práctica 3

La práctica 3 es una introducción a señales analógicas, esto es, obtendremos valores enteros desde “0″ a “1023″ en vez de “0″ y “1″ como en la práctica anterior. Se introducirá el monitor, que representa los valores obtenidos. La “entrada de información” se hará con un potenciómetro y un LDR (o “light dependent resistor”, resistencia variable con la luz) y volveremos a hacer uso de diodos LED como “salida de información”. Recordad que, simplificando mucho, la labor del microcontrolador es esa, recibir entradas (digitales y analógicas), procesarlas y producir salidas (digitales y analógicas).

Monitor (puerto serie)

Se usa para visualizar los valores obtenidos por Arduino. Mediante el puerto serie (a través del USB) el ordenador recibe información del microprocesador, en concreto el valor de una variable en un instante determinado. Para ello debemos primero inicializar el puerto serie mediante Serial.begin(9600), donde el número entre paréntesis, 9600, corresponde a los baudios (pulsos por segundo). Después en el “void loop” se usa la expresión “Serial.print(nombredelavariable)”, para ver en el monitor el valor de la variable, aunque es más útil “Serial.println(nombredelavariable)” pues así en el monitor vemos un valor por línea (en el caso anterior los coloca seguidos). Para activar el monitor basta con hacer CTRL+Shift+M después de compilar y descargar al Arduino el código.

monitor

Divisor de tensión

Un divisor de tensión es un circuito usado para dividir la tensión (ohh si, premio para mí) entre varias resistencias. Nosotros lo usaremos para obtener la señal analógica del LDR. Tendrá este aspecto:

divisordevoltaje

 

Componentes necesarios para esta práctica

Los ejercicios a realizar en esta práctica son:

  1. El ejercicio a consiste en controlar la frecuencia de encendido de un LED mediante un potenciómetro. Girando el potenciómetro variamos el valor de su resistencia. Sacamos ese valor mediante un pin “ANALOG IN”, en este caso el A0, lo leemos con un “analogRead” y así conseguimos un valor desde “0″ a “1023″. Asignamos esa lectura al delay.
  2. El ejercicio b usa prácticamente el mismo código que el ejercicio a. La diferencia importante es que sustituye el potenciómetro por un LDR, que varía su resistencia no mediante un giro mecánico sino mediante la luz que recibe.  Para ello, debemos realizar un circuito denominado “divisor de tensión”. Para añadir interés a la práctica, hemos realizado un escalado del valor de la lectura abriendo la posibilidad de dar un valor máximo de delay deseado al declarar una variable tipo “float“, un número real en el cual almacenaremos el resultado de la operación de reescalado.

Código ejercicio a

Código ejercicio b

Archivos .ino

Descarga el ejercicio a haciendo click aquí
Descarga el ejercicio b haciendo click aquí

Comentario final y RETO SEMANAL

El reto de este semana es encender secuencialmente 5 LEDs controlando la velocidad (o sea el delay) con un potenciómetro. Intentad que sea lo más sensible posible a los cambios que realizáis (que no tenga que esperar al siguiente loop para cambiar de velocidad. Con esto nos referimos a simplemente volver a leer el potenciómetro antes de cada delay).

Según lo vayáis  completando, mandad el código (y si queréis, fotos o vídeos) a la siguiente dirección: practicas@thinkbit.org

Enlaces relacionados

Página oficial Arduino: AnalogInput
Página oficial Arduino(ENG): Analog Read Serial
Página oficial Arduino(ENG): Calibration
Opiron: Todo sobre el LDR
Arduteka: Sensor LDR
Arduteka: Entrada analógica y salida PWM
Adafruit(ENG): Digital inputs
Ladyada(ENG): Lesson 4: serial communications
Sparkfun(ENG): Analog Signals
Sparkfun(ENG): Analog to digital conversion
Instructables(ENG): Serial communications + bluetooth
Bildr(ENG): Simple light reading with LDR

Práctica 2

En esta práctica 2 vamos a empezar a trabajar con señales digitales, “1″ y “0″ lógicos, y mediante condicionales (“if”) decirle al microcontrolador qué hacer en cada uno de los dos casos. La “entrada de información” se hará con pulsadores (o “pushers”) y volveremos a hacer uso de diodos LED como “salida de información”. Recordad que, simplificando mucho, la labor del microcontrolador es esa, recibir entradas (digitales y analógicas), procesarlas y producir salidas (digitales y analógicas). La práctica 2 va sólo de las digitales.

ESTRUCTURA CONDICIONAL “IF”

Se usa para determinar si se ha producido la situación que queremos. En el ejemplo de abajo:

Quiere decir esto: si la señal que viene del pulsador es “HIGH” (o sea un “1″ lógico, o sea que está pulsado), entonces poner el pin 4 en “HIGH” ( en “1″, enceder el LED que está en ese pin); si no, ponerlo en “LOW” (“0″ lógico, apagarlo).

 IMPORTANTE: entre el GND y el pulsador hay una resistencia llamada “pull down” que nos garantizará que de inicio tenemos un “0″ lógico. En realidad es redundante, pues Arduino ya tiene internamente esta resistencia, pero el concepto es importante.

IMPORTANTE+: Al final de cada línea se pone el símbolo punto y coma–>;

Si no lo ponemos el código no funcionará

IMPORTANTE++: una vez tengáis listo el código, para cargarlo en la placa Arduino tenéis que darle a este botón

compilar y cargar

Componentes necesarios para esta práctica

 

Los ejercicios a realizar en esta práctica son:

  1. El ejercicio a consiste en encender un LED a partir de un pulsador, pero no como lo hacíamos en la práctica 0 (donde el pulsador era un mero interruptor). En este caso lo haremos mediante una señal digital que controlaremos con el pulsador.
  2. El ejercicio b consiste en dos pulsadores y tres LEDs: si pulsamos el pulsador derecho, se enciende el LED derecho, si pulsamos el LED izquierdo, se enciende el izquierdo. Si pulsamos los dos a la vez, se encienden y parpadean los tres LEDs. Esta última condición se expresa mediante el símbolo “&&”, que indica que en un condicional deben ocurrir dos cosas a la vez.

Código ejercicio a

Código ejercicio b

Archivos .ino

Descarga el ejercicio a haciendo click aquí
Descarga el ejercicio b haciendo click aquí

Comentario final y RETO SEMANAL

En el ejercicio b usamos la misma resistencia para los tres LEDs, de esa manera ahorramos espacio.

El reto de este semana es incluir un tercer pulsador al ejercicio b, con las siguientes condiciones:

  1. si pulsamos los dos pulsadores de la izquierda a la vez, se encienden los dos LEDs de la izquierda.
  2. si pulsamos los dos pulsadores de la derecha a la vez, se encienden los dos LEDs de la derecha.
  3. si pulsamos los tres pulsadores a la vez, sólo se enciende el LED del centro.

Podéis mandar el código (y si queréis, fotos o vídeos) a la siguiente dirección: practicas@thinkbit.org

Enlaces relacionados

Página oficial Arduino: flowcontrol condicional if
Página oficial Arduino(ENG): DigitalReadSerial(CTRL+Mayúscula+M para Serial Monitor)
Página oficial Arduino(ENG): Button+LED(CTRL+Mayúscula+M para Serial Monitor)
Arduteka: E/S digitales
Adafruit(ENG): Digital inputs
Ladyada(ENG): Lesson 5: digital inputs,if/if-else statements 
Sparkfun(ENG): Digital Signals 
Sparkfun(ENG): Pull-up resistors

 

Práctica 1

En esta práctica 1 vamos a empezar a usar el Arduino IDE, el entorno de programación de la placa. El ejemplo será encender diodos LED, y hacerlos parpadear. La diferencia con la práctica anterior, es que ahora controlaremos el LED mediante código y no mediante un pulsador.

ESTRUCTURA DE UN CÓDIGO DE ARDUINO

Si volvemos al código del blink en el led 13, de la práctica 0, (o en Archivo->Ejemplos->Basics->Blink):

6Y ahora, borramos todos los “comentarios”, es decir, toda la parte escrita de color gris (o más concretamente, la que empieza por “//” o está dentro de un “/*       */”. Tendremos todo más “limpio”:

18

VOIDS

Para empezar, vemos que hay dos grandes trozos del código:

  • Void setup(): Esta parte del código solo se ejecuta 1 vez, es decir, al conectar la placa.
  • Void loop(): Esta parte del código se ejecuta eternamente (hasta que desconectemos el Arduino).

La llave “{” determinan el principio y “}” el final de cada void.

¡Pero espera! Nos estás engañando, ¡hay una linea al principio del todo que no está en ninguno de los dos trozos de antes!. Es verdad, esta linea está inicializando una variable: Es decir, está diciendole a algo lo que vale. Aqui tenemos que saber que:

  • Variable: Algo a lo que le puedes asignar un valor cualquiera.
  • int : Simplemente está diciendo que la variable es un numero entero (…,-3,-2,-1,0,1,2,3,4…)

Por ejemplo, si una manzana vale 1 euro, podria crear la variable “manzana” y decir que es igual a 1 euro:

int manzana = 1

O por ejemplo, si hace 20º fuera, podría crear la variable “temperatura” y decir:

int temperatura = 20

Podemos llamar a la variable como queramos (excepto algunos símbolos extraños). En el código entonces, lo que estamos haciendo es decir en qué número de pin está conectado el diodo LED. Seguimos leyendo el código y vemos qué es lo que aparece.

En void setup (sólo se ejecuta 1 vez):

  • pinMode(led, OUTPUT) -> nos pone el pin al que esta conectado el led en modo salida (Dar voltaje)

En void loop (se ejecuta continuamente):

  • digitalWrite(led, HIGH) -> enviamos corriente por el pin al que está conectado el led (5 voltios)
  • delay(1000) -> le decimos al Arduino que espere, que no haga nada, durante 1000 milisegundos, es decir, 1 segundo.
  • digitalWrite(led, LOW) -> le dejamos de enviar corriente por el pin al led, por lo que se apagará.
  • delay(1000) -> volvemos a esperar 1 segundo.

En la siguiente imagen podemos verlo de forma resumida:

24IMPORTANTE: Al final de cada línea se pone el símbolo punto y coma–>; 

Si no lo ponemos el código no funcionará

IMPORTANTE++: una vez tengáis listo el código, para cargarlo en la placa Arduino tenéis que darle a este botón

compilar y cargar

Componentes necesarios para esta práctica

 

Los ejercicios a realizar en esta práctica son:

  1. El ejercicio a consiste en hacer parpadear un LED (del color que queráis), con una frecuencia determinada, partiendo del ejemplo “Blink”.
  2. El ejercicio b consiste en hacer parpadear dos LEDs (de los colores que elijáis también), de forma sucesiva, de nuevo con una frecuencia determinada.

 

Código ejercicio a

Código ejercicio b

Archivos .ino

Descarga el ejercicio a haciendo click aquí
Descarga el ejercicio b haciendo click aquí

Comentario final y RETO SEMANAL

Como habrás notado, en un ejercicio (en el “b”) usamos una variable que contiene el tiempo que queremos que dure el parpadeo del led, y en el otro (ejercicio “a”) simplemente hemos metido ese tiempo en el delay(aquí) en número. Cualquiera de las dos formas es correcta, pero usar variables es mucho más cómodo en códigos más complejos. ¡Enhorabuena! ¡Ya sabes hacer parpadear Leds con Arduino!

Ahora, te retamos a hacer parpadear 5 leds en línea, uno tras otro, con la velocidad que queráis (y que sea vistoso).

Podéis mandar el código (y si queréis, fotos o vídeos) a la siguiente dirección: practicas@thinkbit.org

Enlaces relacionados

Página oficial Arduino(ENG): Blink
Página oficial Arduino(ENG): Blink without delay
Arduteka: HOLA MUNDO
Opiron: Semáforo
Tronixstuff(ENG): LEDs
Bricogeek: Primeros pasos
Adafruit(ENG): All about LEDs
Instructables(ENG): Blinking LED
Instructables(ENG): Multiple blinking LEDs