Nociones de programación con Arduino

Nociones de programación en Java para Arduino

1 Detalles a tener en cuenta

Al programar hemos de tener en cuenta algunas cuestiones generales de sintaxis:

Cada línea termina con punto y coma ‘;’.

Los bloques de código están contenidos entre llaves ‘{ }’.

Las funciones comienzan con una definición como void.

Las funciones tienen parámetros que figuran entre paréntesis ‘( )’, y pueden tener tantos parámetros como se necesiten.

Los comentarios se escriben después de dos barras inclinadas '//'. Todo lo que escribamos entre una barra y un asterisco '/*' y un asterisco y una barra '*/' también será un comentario.

2 Estructura básica de un programa

setup y loop

Al igual que los programas de Processing que siempre necesitan tener una función setup() y una función draw(), los programas Arduino necesitan las funciones setup() y loop():

setup(): Esta parte del programa sólo se ejecuta al principio. Aquí podrás configurar las funcionalidades de los pins, ya sean inputs (entradas) u outputs (salidas), o si van a realizar una función más compleja como enviar señales a través del cable USB.

loop(): Esta parte funcionará infinitamente (o hasta que desconectes la fuente de alimentación). Los comandos en el loop serán ejecutadas en orden, una tras otra. Cuando llegamos al último comando, comenzará de nuevo desde el principio.

Ejemplo de programa:

void setup() {

pinMode(13, OUTPUT);

}

void loop() {

digitalWrite(13, HIGH);

delay(1000);

digitalWrite(13, LOW);

delay(1000);

}

El programa enciende el LED conectado en el pin 13, espera 1 segundo, lo apaga y espera otro segundo. Luego esto lo repite una y otra vez hasta el infinito.

3 Uso de variables

Una variable es un valor que Arduino puede almacenar en su memoria, y que posteriormente podrá ser utilizado o modificado.

Los tipos de variables más utilizados son:

int

int: almacena un número entero entre -32769 y 32767 (2 bytes).

long

long: almacena un número entero muy largo, entre -2147483648 y 2147483647 (4 bytes).

float

float: almacena un número decimal con un rango entre -3.4028235·1038 y 3.4028235·1038 (4 bytes).

const

const: especifica que la variable definida no podrá ser cambiada durante el programa, siendo siempre un valor constante:

const float pi=3.1415;

Es importante saber que es posible declarar una variable sin asignarle un valor inicial, y hacerlo posteriormente durante el transcurso del programa:

int x;

x=4;

#define

#define: declara una constante y le asigna un valor. Entre el nombre de la constante y su valor no se ha de poner el signo igual.

#define angulo 23

4 Encender y apagar un LED

pinMode

pinMode(pinNumber, INPUT | OUTPUT | INPUT_PULLUP): Se utiliza para determinar si el Pin digital en Arduino está escribiendo (OUTPUT) o leyendo (INPUT | INPUT_PULLUP) las señales desde/hacia el entorno.

digitalWrite

digitalWrite(pinNumber, HIGH | LOW): Se utiliza para hacer que un Pin digital concreto envíe 5 voltios(HIGH) ó 0 voltios (LOW) a una salida.

5 Esperar un tiempo antes de hacer otra cosa

delay

delay(time): Detiene el programa durante cierta cantidad de tiempo. El tiempo se expresa en milisegundos. Si quieres detener el programa durante 2 segundos, deberías escribir delay(2000).

Existe otro comando para producir un retardo, se trata de delayMicroseconds(10);. En este caso se indica el retardo en microsegundos (10 en este ejemplo).

6 Como saber cuando se ha apretado un pulsador

digitalRead

El comando, digitalRead(inputPin) lee el valor del voltaje en el inputPin y devuelve un HIGH o LOW. Devuelve HIGH cuando la tensión sea de 5V y LOW cuando se conecte a GND.

7 Toma de decisiones - uso de funciones condicionales

if

La instrucción condicional if comprueba el valor de una estrada o una variable y toma una decisión.

Cuando se quieren comparar dos valores en un programa, se debe utilizar dos veces el signo ‘igual a’, es decir, ==. Esto hace que el ordenador entienda que se les quiere comparar (en lugar de asignar). Este “doble igual” es lo que llamamos un operador. Hay otros operadores para comparar otro tipo de valores.

A continuación se escribe lo que debe hacer el programa si se cumple la condición. Si la condición no se cumple el programa ejecuta la orden que se encuentra después de else.

Ejemplo de programa:

int inputPin = 5;

int ledPin = 13;

void setup() {

pinMode(inputPin, INPUT);

pinMode(ledPin, OUTPUT);

}

void loop() {

if (digitalRead(inputPin) == HIGH) {

digitalWrite(ledPin, HIGH);

} else {

digitalWrite(ledPin, LOW);

}

}

Con este programa conseguimos que el LED (Conectado al pin 13) se encienda cuando el botón (Conectado al pin 5) está pulsado, y se apague cuando se deja de pulsar.

Una instrucción condicional puede contener más de una condición que se puede cumplir:

if (pinFiveInput < 500)

// primera condición

{

// hacer rutina A

}

else if (pinFiveInput >= 1000)

// segunda condición

{

// hacer rutina B

}

else

// en cualquier otro caso

{

// hacer rutina C

}

Una instrucción condicional se puede escribir de forma correcta de estas cuatro maneras:

if (x > 120) digitalWrite(LEDpin, HIGH);

if (x > 120)

digitalWrite(LEDpin, HIGH);

if (x > 120){ digitalWrite(LEDpin, HIGH); }

if (x > 120){

digitalWrite(LEDpin1, HIGH);

digitalWrite(LEDpin2, HIGH);

}

En una condicional se pueden utilizar los siguiente comparadores:

x == y (x es igual a y)

x != y (x es diferente de y)

x < y (x es menor que y)

x > y (x es mayor que y)

x <= y (x es menor o igual que y)

x >= y (x mayor o igual que y)

8 Lectura de sensores analógicos

analogRead

analogRead (pinNumber): Este comando toma la lectura de un Pin analógico especificado por la variable pinNumber, que puede ser desde el A0 hasta el A5. El valor leído variará entre 0 (0V) y 1023 (5V).

Los pines analógicos sólo se pueden usar como entradas, por lo que no es necesario declarar el pinMode en el setup.

Ejemplo de programa:

int ledPin = 13;

void setup() {

pinMode(ledPin, OUTPUT);

}

void loop() {

int val = analogRead(A5);

digitalWrite(ledPin, HIGH);

delay(val);

digitalWrite(ledPin, LOW);

delay(val);

}

En este programa la lectura del potenciómetro conectado al pin analógico A5 cambiará el tiempo de retardo, delay, y por lo tanto la velocidad con la que parpadea el LED del pin 13. Cuando se gira el potenciómetro, se puede ver el cambio en la frecuencia de parpadeo. Se ha de conectar el pin central del potenciómetro al pin analógico A5, los otros pins se conectan a 5V y GND.

9 Escalando los valores de una entrada analógica

map

map(valor, desdeBajo, desdeAlto, hastaBajo, hastaAlto): Reasigna un número de un rango a otro. valor es el valor que queremos reasignar. desdeBajo y desdeAlto son el valor mínimo y máximo que el valor puede tomar. En este caso desde 0 a 1023. hastaBajo y hastaAlto son el mínimo y el máximo valor que queremos. En este caso, desde 0 hasta 255.

Podemos utilizar la función map para escalar los valores analógicos proporcionados por un sensor del tipo LDR.

Utilizamos analogRead() para leer el valor del LDR, cuyo rango va de 0 a 1023. Entonces usamos la función map() para transformar dicho valor de forma que el nuevo sea proporcional a un valor entre 0 y 255. Si ldrValue es 1023, ledValue será 255, si ldrValue es 512 ledValue será 127. Una vez el valor haya sido reasignado, lo utilizamos para encender el LED. El LED se hará oscuro o luminoso dependiendo de la cantidad de luz que el LDR detecte.

Ejemplo de programa:

int ledPin=10;

int ldrPin=A1;

void setup() {

//sin configuración

}

void loop() {

int ldrValue=analogRead(ldrPin);

int ledValue=map(ldrValue,0,1023,0,255);

analogWrite(ledPin, ledValue);

delay(10);

}

El LED conectado al pin 10 se ilumina más o menos, en función del valor de entrada medido por el LDR

10 Salidas analógicas PWM

La modulación por ancho de pulsos (También conocida como PWM, siglas en inglés de pulse-width modulation) es una técnica utilizada para regular la velocidad de giro de los motores eléctricos, aunque también se puede utilizar para variar el brillo de un LED. En el caso de los motores, mantiene el par motor constante a cualquier velocidad de giro.

analogWrite

analogWrite(pinNumber, fadeLevel): Envía una señal analógica a un pin PWM. pinNumber es el número de pin PWM que se utiliza, fadeLevel es un número entre 0 y 255. 0 es igual a digital LOW, 255 es igual a digital HIGH.

Ejemplo de programa:

int ledPin = 10;

int fade = 0;

void setup() {

// sin configuración

}

void loop() {

analogWrite(ledPin, fade);

delay(10);

fade = fade + 10;

if (fade > 255) fade = 0;

}

Cuando se utiliza un Pin digital normal para enviar HIGH o LOW, se obtienen bien 5V o 0V. Pero los pines que admiten la función PWM tienen una habilidad diferente, se les puede utilizar para obtener un nivel de tensión en cualquier punto entre 5V y 0V. Con esto, se puede atenuar un LED sin problemas entre ON y OFF.

No es necesario llamar a la función interna pinMode cuando se utiliza analogWrite. Se puede dejar la configuración vacía.

El LED conectado en el pin 10 se va iluminando poco a poco hasta llegar a su máxima intensidad, y luego vuelve a apagarse para comenzar de nuevo indefinidamente.

11 Comunicaciones con el ordenador por el puerto serie

Serial.print

Serial.print(mensaje): Muestra un mensaje en la pantalla del ordenador, enviado a través del puerto serie. Cada vez que se ejecuta Serial.print(), el siguiente mensaje aparece a continuación, sin salto de línea. El mensaje es una cadena de texto.

Para utilizar la función anterior se ha de haber ejecutado la función:

Serial.begin(velocidad): Inicia la comunicación a través del puerto serie. Velocidad indica lo rápido que los mensajes son transmitidos. Es importante que tanto el emisor (en este caso la placa Arduino) y el receptor (en este caso el monitor del puerto serie) se comuniquen a la misma velocidad. De otra manera, sería como dos personas que intentan hablar, uno chino y el otro en español. Se suele utilizar una velocidad de 9600. Esta es la velocidad más común cuando se trabaja con Arduino y Processing.

Serial.println(mensaje): Muestra un mensaje a través del puerto serie, con un salto de línea al final. Así que cada vez que se ejecuta la función Serial.println(), el mensaje siguiente se inicia en una nueva línea.

Ejemplo de programa:

void setup() {

Serial.begin(9600);

}

void loop() {

Serial.println("Hola Caracola");

delay(1000);

}

Este programa envía continuamente el texto "Hola Caracola" por el puerto serie.

Ejemplo de programa:

void setup() {

Serial.begin(9600);

}

void loop() {

int lecturaSensor = analogRead(A1);

Serial.println(lecturaSensor);

delay(1000);

}

Este programa lee el valor dado por un LDR conectado al pin A1, lo almacena en la variable lecturaSensor y lo envía por el puerto serie.

Serial.read

Serial.read(): Lee un byte del puerto serie.

Sólo queremos leer la señal procedente del puerto serie cuando haya datos entrantes. Por tanto, primero comprobamos con Serial.available si hay algo que leer.

Serial.available(): Comprueba si hay señales procedentes del puerto serial. Devuelve bien true (verdadero) o false (falso). De esta forma se leen las señales sólo cuando están disponibles.

Ejemplo de programa:

int ledPin=13;

int incomingByte;

void setup() {

Serial.begin(9600);

pinMode(ledPin,OUTPUT);

}

void loop() {

if(Serial.available()>0)

{

incomingByte=Serial.read();

if(incomingByte=='H'){

digitalWrite(ledPin, HIGH);

}

if(incomingByte=='L')

{

digitalWrite(ledPin,LOW);

}

}

}

Este programa permite controlar el encendido y apagado de un LED conectado al pin 13 con las letras H y L enviadas a través del monitor del puerto serie.

Se abre el monitor del puerto serie desde el entorno Arduino, en Herramientas -> Monitor Serial o con el icono al final de la barra de tareas. Hay un cuadro de entrada de texto con el botón enviar al lado. Si se escribe H en el cuadro de entrada y y se hace clic en el botón enviar, se enciende el LED conectado al pin 13 de Arduino. Si se teclea L y se envía, el LED se apaga.

Se lee el valor enviado mediante Serial.read() y se guarda en incomingByte. Luego se comprueba si incomingByte es igual a ‘H’ o ‘L’ y se enciende o apaga el LED.

12 Uso de librerías

Una librería es un archivo de código al que se va a llamar, mediante el comando #include <>, desde un programa, con la finalidad de que realice una tarea concreta. Existen multitud de librerías que permiten dotar a arduino de nuevas funcionalidades, como por ejemplo controlar servos, encender y apagar LEDs de forma secuencial, crear un GPS, enviar mensajes SMS, manejar pantallas LCD o TFT, etc.

Podemos crear nuestras propias librerías para no reescribir código o bien usar otras creadas por terceras personas. En cualquier caso, una vez se dispone de ellas, hay que instalarlas. La carpeta de la librería la hemos de colocar en la carpeta "libraries" del directorio del IDE de Arduino instalado en nuestro ordenador.

13 Accionando un servo

Los servomotores tienen tres cables: corriente (positivo), tierra (negativo), y señal. El cable de alimentación es normalmente de color rojo, y debe conectarse al pin de 5V de la placa Arduino. El cable de tierra es de color negro o marrón y debe conectarse a un pin de tierra de la placa Arduino. El cable de señal es de color amarillo, naranja o blanco y debe ser conectado a un pin digital de la placa Arduino. Se ha de tener en cuenta que los servos consumen bastante potencia, por lo que si se han de conectar más de uno o dos, es probable que se necesite una alimentación independiente (Es decir, diferente del pin + 5V de Arduino). El pin de tierra de la placa Arduino y el negativo del conjunto de pilas, para alimentar los servos, se han de conectar juntos.

En una placa Arduino UNO se puede utilizar cualquier pin, entre el 0 y el 13, para conectar un servo.

Para trabajar con servos Arduino dispone de una librería (Servo.h) que permite accionarlos. Una librería es un fragmento de código que ya ha sido escrito y que se puede llamar cada vez que se necesite utilizar. En lugar de tener que escribir todo el código, solo se ha de añadir esta línea de código #include <Servo.h> al programa.

Los servos son motores con engranajes que permiten un movimiento preciso de su eje. Los servos estándar permiten situar su eje en cualquier ángulo, por lo general entre 0 y 180 grados. Los servos de rotación continua permiten la rotación del eje para ajustarse a diversas velocidades.

La librería Servo.h admite hasta 12 servos en la mayoría de las placas Arduino y 48 en el Arduino Mega. En las placas que no sean las Mega, el uso de la librería desactiva analogWrite() (PWM) en los pines 9 y 10, haya o no haya un servo en esos pines. En las placas Arduino Mega, pueden ser utilizados hasta 12 servos sin interferir con la funcionalidad PWM. Si se utilizan más de 12 servos (Hasta 23) se desactivará PWM en los pines 11 y 12.

A continuación podemos ver un ejemplo de programa que acciona servos y los hace girar en función del valor que proporciona un potenciómetro:

#include <Servo.h>

Servo myservo;

int potPin = A0;

int val;

void setup() {

myservo.attach(9);

}

void loop() {

val = analogRead(potPin);

val = map(val, 0, 1023, 0, 179);

myservo.write(val);

delay(15);

}

Para empezar se recurre a la librería del servo #include <Servo.h>. A continuación se crea un objeto servo al que se le asigna un nombre Servo myservo;, en este caso se le asigna el nombre myservo.

attach

El comando myservo.attach(pinNumber) indica en qué Pin se conecta este servo.

servo.write

El comando myservo.write(degrees) le dice al servo a qué posición angular girar. Como solo puede girar 180 grados, este valor varía de 0 a 180.

Este programa utiliza dos variables: potpin es el número del pin utilizado para un potenciómetro y val para el valor de lectura desde el potenciómetro.

En loop() se comienza leyendo el valor del potenciómetro. Estos valores se escalan mediante el comando map. Los valores que leemos del potenciómetro van de 0 a 1023 pero necesitamos valores de 0 a 180 para controlar el servo. Para ello, utilizamos la función map(value, fromLow, fromHigh, toLow, toHigh) para ajustar los valores del potenciómetro al rango que podemos utilizar con el servo. Esto significa que si leemos 1023 del potenciómetro obtendremos 180, si leemos 511 obtendremos 90, etc.

Utilizamos una variable (val) para establecer la posición del servo.

Utilizamos un pequeño delay para darle tiempo a girar al servo.

Podemos utilizar el siguiente programa, que se encuentra en el IDE de Arduino (Sweep) para comprobar el funcionamiento de un servo.

#include <Servo.h>

Servo myservo;

int pos = 0;

void setup()

{

myservo.attach(13);

}

void loop()

{

for(pos = 0; pos < 180; pos += 1)

{

myservo.write(pos);

delay(15);

}

for(pos = 180; pos>=1; pos-=1)

{

myservo.write(pos);

delay(15);

}

}

Las funciones for modifican gradualmente el valor de la variable pos, para hacer que vaya primero de 0 a 180 y después de 180 a 0, y así sucesivamente.

14 Conectando y desconectando servos

Cuando se utilizan dos servos a la vez, la placa Arduino puede tener problemas para darles la suficiente corriente. Hay diferentes técnicas para controlar esto. Suponemos que se conectan dos servos a la placa, uno a D9 y otro a D10.

detach

El comando detach permite desconectar un servo.

El siguiente programa desconecta myservo2 antes de utilizar myservo1. Hace girar myservo1 un ángulo de 70 grados, espera 1 segundo y luego gira el mismo motor a 120 grados. Del mismo modo, para hacer el mismo movimiento con myservo2 se necesita desconectar mysevo1 y conectar myservo2.

#include <Servo.h>

Servo myservo1, myservo2;

void setup() {

myservo1.attach(9);

myservo2.attach(10);

}

void loop() {

myservo2.detach();

myservo1.attach(9);

myservo1.write(70);

delay(1000);

myservo1.write(120);

delay(1000);

myservo1.detach();

myservo2.attach(10);

myservo2.write(70);

delay(1000);

myservo2.write(120);

delay(1000);

}

15 Hacer girar un servo de rotación continua

El servo de giro continuo tiene el mismo aspecto que un servo estándar, pero es capaz de girar continuamente como un motor normal. En él no se puede controlar en qué ángulo puede quedar, pero se puede variar la rapidez con la que gira y en qué dirección debe girar.

El siguiente programa hará que el servo gire a una velocidad de 120. Se puede utilizar una velocidad entre 0 y 180. 180 es la velocidad más rápida en una dirección y 0 la más rápida también, pero en la dirección opuesta. 90 debería dejarlo parado. Este valor no es exacto y puede variar de un servo a otro, por lo que se debe calibrar.

Como se puede ver el comando #include llama a dos librerías, <BasicEducationShield.h> y <Servo.h>.

/* Servo de giro continuo

*/

#include <BasicEducationShield.h>

#include <Servo.h>

Servo me;

void setup(){

me.attach(9);

}

void loop(){

//Hace girar el servo con velocidad 120.

me.write(120);

}

16 Uso del sensor de ultrasonidos

El emisor/receptor de ultrasonidos HC-SR04 se emplea en todo tipo de proyectos, siendo su principal uso el de reconocer obstáculos, aunque debido a su buena resolución, también se emplea para medir la distancias a objetos. Puede medir distancias entre 3 Cm y 3 metros, con una precisión de 3 mm.

Lo más singular del sensor de ultrasonidos HC-SR04 es quizás su "par de ojos", estos no son más que un emisor y un receptor de ultrasonidos que trabajan a una frecuencia de 40KHz (una frecuencia inaudible para las personas).

Este sensor tiene 4 pines, la alimentación (Vcc) a 5 voltios, un disparador (Trig), el receptor (Echo) y la masa (GND). Para el correcto funcionamiento del sensor es necesario conectar estos 4 pines.

El principio en el que se basa su funcionamiento es muy sencillo, tan solo hay que generar una onda sónica en el emisor mediante un pulso en la patilla que pone "trig" (trigger o disparador), esta onda al encontrarse con algún obstáculo rebotará, volviendo al sensor y siendo registrada por el receptor, traduciéndose esta en un pulso en la patilla "Echo".

Con esto podemos hacer dos cosas, detectar un obstáculo esperando simplemente que Arduino reciba un "Echo" o contar el tiempo que transcurre desde que se manda el pulso por el trigger hasta que se recibe, de esta forma, y conociendo cual es la velocidad del sonido, podemos determinar de forma muy sencilla la distancia exacta a la que se encuentra el objeto en el que esta rebotando la señal.

Para aclarar un poco el factor de multiplicación que vamos a introducir en Arduino, basta con decir que la velocidad es igual al espacio dividido por el tiempo que se tarda en recorrer dicho espacio. La velocidad del sonido es conocida (343 m/s) y el tiempo lo vamos a determinar, como el tiempo que transcurre desde que efectuamos el disparo hasta que recibimos el eco.

El siguiente programa emite un pulso por el pin 9 que está asignado al "trigger" que previamente se habrá reseteado (puesto a LOW) para evitar problemas.

digitalWrite(pulso,LOW); //Por cuestión de estabilización del sensor

delayMicroseconds(5);

digitalWrite(pulso, HIGH); //envío del pulso ultrasónico

delayMicroseconds(10);

Y en las siguientes instrucciones se obtiene el tiempo (al recibir el "echo") y se aplica la fórmula explicada anteriormente para obtener la distancia exacta al objeto

tiempo = pulseIn(rebote, HIGH); //función para medir el tiempo y guardarla en la variable "tiempo"

distancia = 0.01715*tiempo; //fórmula para calcular la distancia

#define es un comando que permite asignar valor a una constante antes de compilar el programa. En este programa también podríamos haber escrito int pulso = 9; y int rebote = 10;.

/*

PRACTICA 1 "SENSOR DE ULTRASONIDOS"

Muestra la distancia a la que se encuentran los objetos

*/

#define pulso 9 //define la salida por donde se manda el pulso como 9

#define rebote 10 //define la salida por donde se recibe el rebote como 10

int distancia; //crea la variable "distancia"

float tiempo; //crea la variable tiempo (como float)

void setup()

{

Serial.begin(9600); //inicializa el puerto serie

pinMode(pulso, OUTPUT); //Declaramos el pin 9 como salida (pulso ultrasonido)

pinMode(rebote, INPUT); //Declaramos el pin 10 como entrada (recepción del pulso)

}

void loop()

{

digitalWrite(pulso,LOW); //Por cuestión de estabilización del sensor

delayMicroseconds(5);

digitalWrite(pulso, HIGH); //envío del pulso ultrasónico

delayMicroseconds(10);

tiempo = pulseIn(rebote, HIGH); //función para medir el tiempo y guardarla en la variable "tiempo"

distancia = 0.01715*tiempo; //fórmula para calcular la distancia

/*Monitorización en centímetros por el monitor serial*/

Serial.print("Distancia: ");

Serial.print(distancia);

Serial.println(" cm");

delay(3000);

}

17 Control de un LED RGB

Los LEDs RGB no son mas que tres LEDs en un mismo componente. Estos LEDs son de los tres colores primarios: rojo (Red), verde (Green), y azul (Blue). Al variar la intensidad de corriente de cada LED se pueden producir todos los colores del espectro.

Con el siguiente programa de Arduino se enciende un LED-RGB, proporcionando diferentes colores, en función los diferentes valores de entrada que proporcionan tres potenciómetros.

Los colores están comprendidos entre los valores 0 y 255, siendo 0 apagado y 255 el color a la máxima intensidad. Los valores 0 y 1032 hacen referencia a lo que Arduino lee de los potenciómetros. Esta señal siempre está comprendida entre 0 y 1032, independientemente de la resistencia del potenciómetro.

La pata central de los potenciómetros deberá conectarse en una entrada analógica (En este caso se ha elegido la A0, A1 y A2). También se ha de conectar la tensión de 5V y la tierra GND a las patas de los extremos, para que al girar el potenciómetro varíe la resistencia del mismo y por tanto el valor de tensión que proporciona a las entradas analógicas A0, A1 y A2.

Una vez hecho esto se ha de conectar el LED-RGB a Arduino. La primera pata empezando por la derecha es la equivalente al color rojo (Si el ánodo, o común, también está en el lado derecho), la segunda es la que usamos para alimentar el LED conectándolo a los 5V, la tercera es la equivalente al color verde y la cuarta y última la que nos da el color azul. Es muy importante no olvidar las resistencias ya que estas son las encargadas de crear la diferencia de potencial necesaria para que los diferentes colores se iluminen. Cada una de las patas de color estan conectadas a las salidas digitales 9, 10 y 11 (Rojo, Verde y Azul respectivamente).

El programa es este:

/*

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

LED RGB + Potenciómetro

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

Programa que varia el color del LED según el valor obtenido por unos potenciómetros.

*/

//--------------------------------------------------

//Declara puertos de entradas y salidas y variables

//--------------------------------------------------

int ledRojo = 9; //Declara Pin LED Rojo

int ledVerde=10; //Declara Pin LED Verde

int ledAzul=11; //Declara Pin LED Azul

int pinPot0 = A0; //Declara Pin Potenciómetro Rojo

int pinPot1 = A1; //Declara Pin Potenciómetro Verde

int pinPot2 = A2; //Declara Pin Potenciómetro Azul

int valorsensor0 = 0; //Valores analógicos de la salida del potenciómetro

int valorsensor1 = 0; // || || || ||

int valorsensor2 = 0; // || || || ||

float divisionR;

float divisionV;

float divisionA;

//------------------------------------

//Función principal

//------------------------------------

void setup() // Se ejecuta cada vez que el Arduino se inicia

{

pinMode(ledRojo,OUTPUT); //El LED Rojo como una salida

pinMode(ledVerde,OUTPUT); //El LED Verde como una salida

pinMode(ledAzul,OUTPUT); //El LED Azul como una salida

Serial.begin(9600);

}

//------------------------------------

//Función cíclica

//------------------------------------

void loop() {

// Llamada a la función Color que recibe

// 1ª posición: Intensidad Rojo

// 2ª posición: Intensidad Verde

// 3ª posición: Intensidad Azul

float Constante = (float) 255 / 1023; //Divide el máximo valor de color entre el máximo valor del potenciómetro

valorsensor0 = analogRead(pinPot0);

valorsensor1 = analogRead(pinPot1);

valorsensor2 = analogRead(pinPot2);

divisionR = Constante * valorsensor0;

divisionV = Constante * valorsensor1;

divisionA = Constante * valorsensor2;

color(divisionR,divisionV,divisionA); // Carga un valor para (ROJO,VERDE,AZUL)

//según el valor de tres potenciómetros.

// Llama a la función color

}

//------------------------------------

//Función color

//------------------------------------

void color(int rojo, int verde, int azul){

//ROJO. Le resta al total (255) el valor obtenido de los potenciómetros

analogWrite(ledRojo, 255-rojo);

//VERDE. Le resta al total (255) el valor obtenido de los potenciómetros

analogWrite(ledVerde, 255-verde);

//AZUL. Le resta al total (255) el valor obtenido de los potenciómetros

analogWrite(ledAzul, 255-azul);

}

18 Control de un VU-Meter

Un VU–Meter es un conjunto de varios LED colocados en linea. Este ejemplo explica cómo conectarlos entre sí y cómo controlarlos usando la librería BasicEducationShield. Se pueden utilizar cuantos LED se quiera, siempre y cuando Arduino tenga suficientes Pines.

En este ejemplo se utilizan 5 LEDs.

/*

VU-Meter

*/

#include <BasicEducationShield.h>

//Primeramente se declara el objeto VUMeter, poniéndole un nombre, en este caso vumeter

VUMeter vumeter;

//Esta variable indica el número de los pines utilizados por los LEDs

int pins[]={2,3,4,5,6};

//Esta variable indica el número de LEDs que se van a utilizar

int pinCount=5;

void setup(){

//Se configura el VUMeter utilizando los parámetros fijados previamente.

vumeter.config(pinCount,pins);

//En la linea siguiente se inicializa el componente.

vumeter.begin();

}

void loop(){

//Se encienden 5 LEDs desde el que ocupa la posición 0 hasta el que ocupa la posición 4

vumeter.fill(5);

delay(3000);

//Se apagan todos los LEDs

vumeter.clear();

delay(1000);

//Se enciende el LED que ocupa la posición 2, conectado en el pin 4

vumeter.on(2);

delay(1000);

//Se apaga el LED que ocupa la posición 2, conectado en el pin 4

vumeter.off(2);

delay(1000);

//Se encienden y apagan sucesivamente todos los LEDs hacia la derecha,

//cada 700 milisegundos

vumeter.scrollRight(700);

//Se encienden y apagan sucesivamente todos los LEDs hacia la izquierda,

//a partir del LED conectado en el pin 5

//(El que está en la posición 1, empezando por la derecha)

vumeter.scrollLeft(700,1);

//El LED que ocupa la posición 2, conectado en el pin 4,

//parpadea 10 veces, cada vez

//se enciende durante 100 milisegundos y se apaga durante otros 100 milisegundos

vumeter.blink(2,100,10);

//Todos los LEDs parpadean 10 veces

vumeter.blinkAll(100,10);

//Se encienden los LEDs desde el que ocupa la posición 1 hasta el que ocupa la posición 3

//(Los conectados entre los pines 3 y 5)

vumeter.fillFrom(1,3);

delay(2000);

}

clear(): Apaga todos los LEDs.

on(LEDindex): Enciende un LED determinado.

off(LEDindex): Apaga un LED determinado.

scrollRight(speed, startIndex): Los LEDs se van encendiendo de uno en uno de de izquierda a derecha.

scrollLeft(speed, startIndex): Los LEDs se van encendiendo de uno en uno de derecha a izquierda.

blink(LEDindex,speed, times): Un LED determinado parpadea a una velocidad y durante una cantidad de veces determinados.

blinkAll(speed, times): Todos los LEDs parpadean a un ritmo y durante una cantidad de veces determinados.

fillFrom(startIndex, stopIndex): Los LEDs se van encendiendo desde el correspondiente a startIndex hasta el correspondiente a stopIndex.

fill(numberOfLEDs): Los LEDs se van encendiendo desde el primero hasta el correspondiente a numberOfLEDs (número de LED).

19.- Uso del Joystick

El siguiente programa permite controlar dos servos mediante un Joystick.

#include <BasicEducationShield.h>

#include <Servo.h>

//El joystick utiliza dos pines de antrada analógica, el A0 y el A1

Joystick joystickdecontrol = Joystick(A1,A0);

Servo horizontal;

Servo vertical;

int horizontalAngle = 90; //Este es el valor de la posición intermedia del servo horizontal

int verticalAngle = 90; //Este es el valor de la posición intermedia del servo vertical

int horizontalJoystick = 0;

int verticalJoystick = 0;

void setup(){

horizontal.attach(9);

vertical.attach(10);

}

void loop(){

horizontalJoystick = joystickdecontrol.getX(); //Valor de X que indica el joystick

verticalJoystick = joystickdecontrol.getY(); //Valor de Y que indica el joystick

if(horizontalJoystick!=0){

if(horizontalJoystick==1 && horizontalAngle<180) horizontalAngle++;

else if(horizontalJoystick==-1 && horizontalAngle>0) horizontalAngle--;

}

if(verticalJoystick!=0){

if(verticalJoystick==1 && verticalAngle<180) verticalAngle++;

else if(verticalJoystick==-1 && verticalAngle>0) verticalAngle--;

}

horizontal.write(horizontalAngle);

vertical.write(verticalAngle);

delay(5);

}

20.- Control de Arduino mediante bluetooth

El siguiente programa permite controlar el led conectado al pin 13 mediante letras enviadas a través del bluetooth, desde un teléfono móvil u otro dispositivo que cuente con una aplicación adecuada.

El módulo de bluetooth JY - MCU dispone de cuatro terminales de conexión, dos de alimentación (VCC y GND), uno de transmisión TXD y otro de recepción RXD.

El esquema de montaje del módulo de bluetooth sobre el Arduino es el siguiente. El terminal TXD del bluetooth se conecta al pin 0 (RX) del Arduino y el termina RXD con el pin 1 (TX).

Para poder cargar el programa se han de desconectar los pines 0 y 1, que son los que utiliza el puerto serie que comunica con el cable USB y el ordenador.

void setup(){

pinMode(13,OUTPUT);

Serial.begin(9600);

}

void loop(){

char dato = Serial.read();

if(dato == 'a')digitalWrite(13,HIGH);

if(dato == 'b')digitalWrite(13,LOW);

}

Este programa enciende el led conectado en el pin 13 cuando recibe una "a" a través del puerto serie, en donde habremos conectado el receptor de bluetooth. Cuando recibe una letra "b" apaga el led conectado en el pin 13.

También podemos utilizar los recursos que proporciona la conexión bluetooth, utilizando una librería específica.

#include <SoftwareSerial.h>

void setup(){

pinMode(13,OUTPUT);

Serial.begin(9600);

}

void loop(){

char dato = Serial.read();

if(dato == 'a')digitalWrite(13,HIGH);

if(dato == 'b')digitalWrite(13,LOW);

}

Otro programa similar sería el siguiente.

#include<SoftwareSerial.h>

SoftwareSerial blue(0,1);

int led=13;

char caracter;

void setup()

{

pinMode(led,OUTPUT);

blue.begin(9600);

}

void loop()

{

caracter=blue.read();

if(caracter=='a')

{

digitalWrite(led,HIGH);

}

if(caracter=='b')

{

digitalWrite(led,LOW);

}

}

Modificando el programa anterior podemos conectar TXD y RXD del módulo bluetooth en cualquier otro pin. En el programa siguiente TXD se ha de conectar al pin 8 y RXD al pìn 9. De esta forma no hace falta desconectarlos mientras se carga el programa desde el IDE de Arduino.

#include<SoftwareSerial.h>

SoftwareSerial blue(8,9);

int led=13;

char caracter;

void setup()

{

pinMode(led,OUTPUT);

blue.begin(9600);

}

void loop()

{

caracter=blue.read();

if(caracter=='a')

{

digitalWrite(led,HIGH);

}

if(caracter=='b')

{

digitalWrite(led,LOW);

}

}

También podemos utilizar el bluetooth para accionar un servo. en el siguiente programa utilizamos una aplicación para enviar una "a" o una "b", de forma que aumente o disminuya el ángulo que se ha de mover el servo. En este programa dos funciones condicionales, limitan, por arriba y por debajo, el valor de la variable angulo a 170 y 10.

#include <Servo.h>

Servo myservo1;

int angulo=10;

void setup(){

pinMode(13,OUTPUT);

myservo1.attach(9);

Serial.begin(9600);

}

void loop(){

char dato = Serial.read();

if(dato == 'a')angulo=angulo+10;

if(dato == 'b')angulo=angulo-10;

if(angulo<10)angulo=10;

if(angulo>170)angulo=170;

myservo1.write(angulo);

delay(1000);

}

https://lh3.googleusercontent.com/-gCv5IIYjAtg/U4SiZ_eZ5cI/AAAAAAAAbfw/TVBII1vOjJA/w33-h30-no/flechaazul.gif

Aquí podemos encontrar algunos ejercicios resueltos.