Tutorial Arduino para Principiantes
Tutorial Arduino para Principiantes
ARDUINO +
[P5, GRASSHOPPER, FIREFLY]
Arduino open source hardware developed by Massimo Banzi, David Cuartielles, Tom Igoe,
Gianluca Martino & David Mellis:
http://www.arduino.cc
Processing developed by Ben Fry & Casey Reas:
http://processing.org
Grasshopper developed by David Rutten:
http://www.grasshopper3d.com
Firefly developed by Andy Payne & Jason K Johnson:
http://www.fireflyexperiments.com/
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
Abrimos Arduino y una vez dentro de él, pulsamos el botón OPEN (El que tiene la flechita hacia
arriba), vamos al submenú DIGITAL y abrimos el ejemplo BLINK.
El uso de Leds es muy útil para monitorizar acciones y comprobar que funcionan conexiones o
sensores. En este ejemplo, el LED sólo tiene dos posiciones, o encendido o apagado, ya que lo estamos
controlando con un pin DIGITAL (que sólo admite esas dos posiciones). Sin embargo, un LED puede
adoptar más estados como veremos más adelante.
1
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
02_Button
Esquema en Fritzing
Pulsamos el botón OPEN (El que tiene la flechita hacia arriba), vamos al submenú DIGITAL y
abrimos el ejemplo BUTTON.
void setup() {
pinMode(ledPin, OUTPUT); // Declaramos el LED como SALIDA
pinMode(buttonPin, INPUT); // Declaramos el Botón como ENTRADA
}
void loop(){
// Leemos (digitalmente) el estado del botón y lo guardamos en la variable buttonState
buttonState = digitalRead(buttonPin);
// Si el botón está pulsado (HIGH) ...
if (buttonState == HIGH) {
digitalWrite(ledPin, LOW); // Encendemos el LED (HIGH → 5 Voltios)
}
// ...en caso contrario (el botón no está pulsado → LOW)
else {
digitalWrite(ledPin, HIGH); // Apagamos el LED (LOW → 0 Voltios)
}
}
Como vemos, en este sketch, no sucede nada, salvo que apretemos el botón y cambiemos el
estado del botón, y a su vez, el de la variable buttonState.
2
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
03_Coche Fantástico
Esquema en Fritzing
Pulsamos el botón OPEN (El que tiene la flechita hacia arriba), vamos al submenú CONTROL y
abrimos el ejemplo ARRAYS.
void loop() {
/* Bucle FOR para ir encendiendo de uno en uno los leds. Funciona así:
Para el PRIMER led...lo enciendo durante los milisegundos que he indicado con la variable
timer...y lo apago...enciendo el SEGUNDO led, etc...
3
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
*/
/* Bucle FOR para ir encendiendo de uno en uno los leds. Funciona así:
Para el ÚLTIMO led...lo enciendo durante los milisegundos que he indicado con la variable
timer...y lo apago...enciendo el PENÚLTIMO led, etc...
*/
Este es el primer sketch donde podemos inspirarnos para realizar una instalación (o parte de ella).
Posteriormente, veremos cómo poder introducir una interacción con este sketch y que ya no esté “todo”
programado, si no que reaccione ante determinada luz, sonido, vibración, temperatura, presencia de
obstáculos,...
4
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
04_Sensor Analógico
Esquema en Fritzing
void setup() {
Serial.begin(9600); // Abrimos el puerto Serie de Arduino a una velocidad de 9600 baudios
pinMode(ledPin, OUTPUT); // Declaramos el LED como SALIDA
}
void loop() {
// Leemos analógicamente el potenciometro y lo guardamos en la variable valor
valor = analogRead(potPin);
// Mapeamos el valor de la variable valor entre el rango original del potenciometro (0 → 1023) y lo
pasamos al rango del LED ( 0 → 255 como en la definición de colores de Processing).
valorMapeado = map(valor,0,1023,0,255);
5
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
// Abrimos el Serial Monitor de Arduino y ahí podremos ver qué valores le vamos pasando al LED
Serial.println(valorMapeado);
}
En este ejemplo, vamos a empezar a ver como monitorizar operaciones o eventos en Arduino,
gracias al Puerto Serie. Esta técnica nos permitirá, posteriormente mandar datos o acciones a otros
programas como Processing, Grasshopper, Pure Data, Flash, o incluso a un Iphone/ Ipad o similar … para
dotar de mayor interactividad a nuestra instalación.
6
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
05_Piezoeléctrico (Zumbador)
Esquema en Fritzing
void setup() {
pinMode(ledPin, OUTPUT); // Declaramos el pin como SALIDA
Serial.begin(9600); // Abrimos el Puerto Serie a 9600 baudios
}
void loop() {
// Leemos analógicamente el piezo y guardamos la lectura en sensorReading
sensorReading = analogRead(knockSensor);
7
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
06_Fotoresistencia (LDR)
Esquema en Fritzing
void setup() {
Serial.begin(9600); // Abrimos el Puerto Serie a 9600 baudios
pinMode(LED_pin,OUTPUT);
// Aunque no es necesario declarar los pines ANALOGOS como INPUTS, lo haremos
pinMode(LDR_pin,INPUT);
}
void loop(){
LDR_val = analogRead(LDR_pin); // leemos el valor del LDR
LDR_mapeado = constrain(LDR_val,0,255);// limitamos el valor del LDR al rango [0-255] para el LED
analogWrite(LED_pin,LDR_mapeado); // Le pasamos al LED el valor mapeado
Serial.print("LDR mapeado = ");// escribimos en el Puerto Serie el valor con que se enciende el LED
Serial.println(LDR_mapeado);
}
Un divisor de tensión es una configuración de un circuito eléctrico que reparte la tensión de una
fuente entre una o más impedancias conectadas en serie.
Un divisor resistivo es un caso especial de divisor de tensión, en el que ambas impedancias son
puramente resitivas.
Como Arduino sólo puede leer voltajes, y muchos sensores son resistivos, (varían la resistencia)
8
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
Este ejemplo funciona exactamente igual si cambiamos la LDR por un Thermistor (NTC) (una
resistencia por calor).
En este ejemplo podemos observar cómo funcionan las funciones constrain() y la diferencia entre
Serial.print () y Serial.println ().
Las LDRs son muy útiles para construir instalaciones sensibles a la luz (o a la oscuridad) y también
se pueden emplear para fabricar barreras de luz (colocamos un puntero láser enfocando constantemente a
la LDR y cuando “algo” interrumpa la luz del láser, la LDR dispara un evento para detectar esa acción.)
9
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
void setup() {
pinMode(ledPin, OUTPUT); // Inicializa el pin 13 como salida digital
pinMode(inPin, INPUT); // Inicializa el pin 7 como entrada digital
}
void loop() {
value = digitalRead(inPin); // Lee el valor de la entrada digital
digitalWrite(ledPin, value);
}
Esquema en Fritzing
Un sensor de inclinación es un componente que puede detectar la inclinación de un objeto. Sin embargo, no
deja de ser un pulsador activado por un mecanismo físico. Este tipo de sensor es la versión básica de un
interruptor de mercurio. El sensor tilt NO tiene polaridad.
Este sensor contiene una bola metálica en su interior que conmuta los dos pines del dispositivo de
encendido a apagado, y viceversa, si el sensor alcanza un cierto ángulo. Es decir, detecta si algo está arriba
o abajo. Cuando el sensor detecta una vibración, enciende el LED.
Este actuador está presente en muchos juguetes infantiles, en los que se activan eventos cuando se
acaricia o se golpea. Posteriomente, veremos cómo hackear un Nunchuck de una Wii para conectarlo a
Arduino y ver el funcionamiento de sus 3 acelerómetros.
10
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
#include "pitches.h"
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(altavoz, OUTPUT);
Serial.begin(9600); // Abrimos Puerto Serie a 9600 baudios
}
void loop() {
// Estamos atentos a la lectura desde el puerto serie para ver que letra escribimos
byteQueIntroducimosPorPuertoSerie = Serial.read();
// Si escribimos cualquier letra...
if (byteQueIntroducimosPorPuertoSerie != -1) {
// guardamos esa letra en la variable valor
valor = byteQueIntroducimosPorPuertoSerie;
// Escribimos la letra en el puerto Serie
Serial.println(valor,BYTE);
// Cambiamos el Estado del LED de OFF a ON o de ON a OFF
estadoLED = !estadoLED;
// Pasamos el nuevo estado al LED
digitalWrite(ledPin, estadoLED);
}
// Desde 0 hasta recorrer toda la Array (de 0 a 4)...
for (contador = 0; contador <= 4; contador ++) {
// ...y si a la letra 0 le corresponde el valor 0...
// es decir...si letra 0 = 'a' ...
if (letras[contador] == valor) {
// Le pasamos al pin del altavoz el tono de la letra 0 ...
tone(altavoz,notas[contador]);
}
}
}
11
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
Esquema en Fritzing
En este ejemplo, podemos ver la utilidad de la función Serial.read (), que nos permite introducir
parámetros dentro de Arduino para disparar eventos.
12
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
09_Theremin
Esquema en Fritzing
// PINES SENSORES
int LDR = 3; // LDR en el pin analogico 3
int altavoz = 9; // Altavoz en el pin PWM 9
int potenciometro = 0; // Potenciometro en el pin analogico 0
void setup(){
pinMode(LDR, INPUT);
pinMode(altavoz, OUTPUT);
pinMode(potenciometro, INPUT);
Serial.begin(9600);
}
void loop(){
// Guardamos la lectura de la LDR en la variable valor
valor = analogRead(LDR);
// Mapeamos la lectura del potenciometro entre un valor de 100 ---> 500 milisegundos
valor_tiempo = map(analogRead(potenciometro),0,1023,100,1000);
// Mapeamos la lectura del LDR con un rango de tonos de notas determinado
valor_mapeado = map(valor,0,1023,956,1915);
// Introducimos una función creada por nosotros para hacer sonar el altavoz
playTone(valor_mapeado,valor_tiempo);
// Imprimos el valor de la lectura de la LDR
Serial.println(valor,DEC);
// 10 milisegundos de retraso para evitar saturar el puerto serie
delay(10);
}
// Esta es la función que hemos creado. Hay que pasarle dos argumentos:
13
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
14
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
10_Servomotor
// Para controlar nuestro Servo, podemos usar la librería Servo
// que ya tiene funciones predeterminadas
#include <Servo.h>
// Creamos un objeto Servo para controlar nuestro servo
Servo miServo;
// Potenciometro en el Pin Analogico 0
int potenciometro = 0;
// Variable para guardar la lectura del potenciometro
int valor;
void setup() {
// Conectamos el servo en el Pin PWM 9
miServo.attach(9);
}
void loop() {
// Leemos el valor del potenciometro
valor = analogRead(potenciometro);
// Mapeamos su valor al rango del servo [0º-180º]
valor = map(valor, 0, 1023, 0, 179);
// Le pasamos al servo el valor escalado
miServo.write(valor);
// Retraso de 15 milisegundos para refrescar el servo
delay(15);
}
Esquema en Fritzing
15
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
Los chips, generalmente, suelen tener una muesca (semicírculo) que nos indica la orientación de
sus pines. El pin nº 1 de este chip será el que se encuentre a la izquierda de la muesca. El resto de la
numeración será antihoraria, como se puede ver en la imagen inferior que muestra en detalle las conexiones
del chip LD293.
Con este chip podemos conectar 2 motores DC, tan sólo con conectar el segundo motor de manera
análoga al primero, pero en la parte derecha del chip.
16
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
void setup() {
pinMode(botonPin, INPUT); // Botón como ENTRADA
pinMode(motorPin1 , OUTPUT); // El resto, como SALIDA
pinMode(motorPin2 , OUTPUT);
pinMode(speedPin, OUTPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(speedPin, HIGH); // Arrancamos el motor desde el principio
// Si el led parpadea 3 veces después de arrancar el motor, quiere
// decir que Arduino se ha reiniciado debido a un cortocircuito
blinkLED(ledPin, 3, 100);
}
void loop() {
if (digitalRead(botonPin) == HIGH) { // Si presionamos el botón ...
// El motor gira en sentido horario
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
}
else {
digitalWrite(motorPin1, HIGH); // En caso contrario ... el motor gira en sentido antihorario
digitalWrite(motorPin2, LOW);
}
}
17
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
void setup() {
Serial.begin(9600);
pinMode(pot1, INPUT); // Potenciometros como ENTRADA
pinMode(pot2, INPUT);
// Declaramos una variable temporal y recorremos la array del Motor como SALIDA
int i;
for(i = 0; i < 2; i++){
pinMode(motor[i], OUTPUT);
}
}
void loop() {
18
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
Serial.print("/t");
Serial.print("RPM : ");
Serial.println(valor_mapeado);
delay(50);
}
Hay que destacar que en las dos funciones auxiliares, hemos incorporado una variable (RPM_1 y
RPM_2, respectivamente) que, en el loop ( ) se completan con la lectura del potenciómetro 2. Como se
puede ver, la sintaxis de Arduino, es prácticamente idéntica a la de Processing. Incluso, para dejar el código
más limpio, podríamos haber colodado las dos funciones auxiliares en una nueva pestaña.
19
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
20
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
void setup(){
Serial.begin(9600);
pinMode(microfono, INPUT); // Micro como SALIDA
for(i = 0; i < longArrayLEDS; i++){ // Todos los LEDs como SALIDAS
pinMode(leds[i], OUTPUT);
}
}
void loop() {
val = analogRead(microfono); // Leemos el micro
val = map(val,610,1023,0,255); // Mapeamos para quitar el ruido
// Si el valor es MAYOR que 15 y MENOR que 23...encendemos el 1er led y el resto apagados
if(val > 15 && val < 23){
for(i = 0; i <= longArrayLEDS - 10; i++){
digitalWrite(leds[i],HIGH);
}
for(i = 1; i <= longArrayLEDS; i++){
digitalWrite(leds[i],LOW);
}
}
21
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
}
}
22
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
Serial.println(val, DEC);
}
23
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
void setup() {
Serial.begin(9600); // Abrimos el puerto Serie de Arduino a una velocidad de 9600 baudios
pinMode(ledPin, OUTPUT); // Declaramos el LED como SALIDA
}
void loop() {
// Leemos analógicamente el potenciometro y lo guardamos en la variable valor
valor = analogRead(potPin);
// Mapeamos el valor de la variable valor entre el rango original del potenciometro (0 → 1023) y lo
pasamos al rango del LED (0 → 255)
valorMapeado = map(valor,0,1023,0,255);
// Abrimos el Serial Monitor de Arduino y ahí podremos ver qué valores le vamos pasando al LED
Serial.println(valorMapeado);
// IMPORTANTE: retraso de 80 miliseg en un nuevo bucle del loop para no saturar el Puerto Serie
delay(80);
}
Antes de pasar al código de Processing, es importante tener en cuenta dos parámetros, para que la
conexión Arduino – Processing funcione correctamente:
1 → En qué Puerto está conectado Arduino. En Windows, suele ser COM ”y un número”. En este
ejemplo. Mi Arduino estaba conectado en el COM4.
2 → A qué velocidad está leyendo Arduino los datos. En este caso, a 9600 baudios (es la
medida estándar de apertura del Puerto Serie).
import processing.serial.*; // Importamos la libreria que se ocupa de la lectura del puerto serie
24
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
void setup(){
size(512,512); // Tamaño de la ventana de visualización
smooth(); // Suavizado de los bordes
//imprimo solo una vez la lista de nombres de puertos series que tiene mi ordenador para ver donde
puedo leer
println(Serial.list());
// Puerto donde está conectado Arduino para poder leer los datos
String portName = "COM4";
// Asigno a mi objeto Serial el puerto que está conectado a Arduino y con la misma velocidad
myPort = new Serial(this, portName, 9600);
}
void draw(){
//si el puerto esta disponible...sirve para que no se sature la ventana de processing
if ( myPort.available() > 0) {
val = myPort.read(); //en la variable val, escribe lo que estás leyendo en el puerto
if(val != 10) { //si val es distinto de 10, o sea...detecto donde cambio de linea con el return (10)
buf += char(val); //...entonces...guardo el valor como una cadena de texto
}else{
diametro = float(buf); //y si no....el diametro vale 1023 menos la transfomarcion de buf, ahora
como float...
buf = ""; //vacio la variable buf...este doble cambio de la variable es un truco para que
funcione bien en processing
}
//si no esta disponible...no hagas nada
}
Este es un ejemplo más complejo para enviar múltiples datos, a partir de las lecturas analógicas de
dos Potenciómetros (que controlan dos Motores DC), desde Arduino a Processing. En este ejemplo,
usaremos las lecturas de los potenciómetros para modificar el diámetro de una circunferencia y para variar
su color de relleno.
int motor1[] = {
9, 10}; // Array de Pines PWM para el motor1
int motor2[] = {
5, 6}; // Array de Pines PWM para el motor2
25
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
void setup() {
Serial.begin(9600);
pinMode(pot1, INPUT); // Potenciómetros como ENTRADA
pinMode(pot2, INPUT);
// Declaramos una variable temporal y recorremos la array del Motor1 y del Motor2 como SALIDA
int i;
for(i = 0; i < 2; i++){
pinMode(motor1[i], OUTPUT);
}
int t;
for(t = 0; t < 2; t++){
pinMode(motor2[t], OUTPUT);
}
}
void loop() {
valor1 = analogRead(pot1); // leemos el pot1
valor2 = analogRead(pot2); // leemos el pot2
// mapeamos los pots para adecuarlos al rango del motor
valor_mapeado1 = map(valor1,0,1023,0,255);
valor_mapeado2 = map(valor2,0,1023,0,255);
import processing.serial.*;
Serial puerto; // Objeto Serial llamado port (donde leo los datos que envía Arduino)
void setup(){
26
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
void draw(){
arduinoPuertoDisponible();
background(0);
fill(rojoVerde , 255-rojoVerde , 0);
ellipse(width/2 , height/2 , diametro , diametro);
}
/////////////////////////////////////////////////////////////////////////////////////
void arduinoPuertoDisponible(){
// Mientras el puerto esté disponible...leo los datos de Arduino
while (puerto.available() > 0) {
serialEvent(puerto.read());
}
}
/////////////////////////////////////////////////////////////////////////////////////
void serialEvent(int Serial) {
// Almacenamos la String que nos manda arduino hasta el salto de línea
String inString = puerto.readStringUntil('\n');
// Dividimos la String por las COMAS y convertimos las subStrings en una array de números enteros
int[ ] sensores = int(split(inString, ","));
// Si la array tiene por lo menos 3 elementos. IMPORTANTE: el primer valor es el "0". Esto lo hago
porque si el valor [0] es igual a 0 (null), genera problemas en las lecturas. Por eso no lo uso
directamente!!!!!
if (sensores.length >=3) {
// Asignamos las distintas lecturas ordenadas a las variables que me interesan. Ver que no uso la
posición sensores [0]!!!!!!!!!!!!!!!!
diametro = sensores[1];
rojoNegro = sensores[2];
}
print(diametro);
print(", ");
println(rojoVerde);
}
}
27
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
http://www.fireflyexperiments.com/
Las instrucciones para instalar este pluging las podeis encontrar en el pdf que hay adjunto al plugin,
al igual que una pormenorizada descripción de las diferentes cajas, e incluso ejemplos. Sin embargo, voy a
describir las cajas más importantes de este pluging para conectar Arduino y GH.
01_Open Port
Entradas:
Open → Hay que conectarle un Toogle para poder cambiar de Falso a Verdadero la booleana
que controla la apertura del Puerto.
Port → Necesita un número entero para que pueda localizar qué puerto COM# está siendo
utilizado por Arduino.
Baud → Precisa de otro número entero para que entienda a que velocidad está trabajando
Arduino. Por defecto, esta entrada está a 9600 baudios.
Salida:
Msg → Con una nota, podemos comprobar que el puerto serie está CERRADO.
28
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
Arduino con la pila llamada Generic Serial Read (se encuentra dentro del subMenú Utility). Para empezar a
recibir datos, es imprescindible, tener operativa la pila de Open Port. Esta pila tiene 4 Entradas y 2
Salidas:
Entradas:
Start → Hay que conectarle un Toogle para poder cambiar de Falso a Verdadero la booleana
que controla la recepción de los datos.
Port → Necesita un número entero para que pueda localizar qué puerto COM# está siendo
utilizado por Arduino. Se puede ligar con la entrada de la pila de Open Port.
Timer → Hay que conectarle un Toogle para poder cambiar de Falso a Verdadero la booleana
que controla el estado del Timer (Temporizador).
Rate → Precisa de un número entero para que controlar el tiempo (en milisegundos) de
retardo con el que empezar cada nueva lectura de los sensores. Es aconsejable que sea el
mismo que hemos usado en el delay () de Arduino.
Salidas:
Out → En esta salida podremos leer los datos que vamos recibiendo desde Arduino.
Para la explicación del funcionamiento de esta pila, hemos usado un sketch en Arduino que manda
la lectura de 2 potenciómetros.
29
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
Entradas:
Start → Hay que conectarle un Toogle para poder cambiar de Falso a Verdadero la booleana
que controla el estado del envío de datos.
Port → Necesita un número entero para que pueda localizar qué puerto COM# está siendo
utilizado por Arduino. Se puede ligar con la entrada de la pila de Open Port.
Salidas:
Out → En esta salida podremos leer los datos que enviamos a Arduino.
Para la explicación del funcionamiento de esta pila, hemos usado, como base, el sketch
Firefly_DUEM_Firmata_1002.pde para Arduino que podemos encontrar dentro de la carpeta Firefly_Build
1.002 / Firefly Arduino Firmata 1.002 / Firefly_DUEM_Firmata_1002. Este sketch está realizado para usar
la pila Duemilanove Write, pero retocándolo un poco y eliminando todo lo que no nos sirve, se puede utilizar
para trabajar con esta pila.
30
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
char buffer[BUFFSIZE];
uint8_t bufferidx = 0;
uint16_t PWM6; // Control del PWM6
char *parseptr;
char buffidx;
int ledPin = 6; // Led al PWM6
void setup() {
Serial.begin(9600);
}
void loop() {
serialread(); // Llamamos a la Funcion serialRead
}
void serialread(){
// Una vez terminada la lectura y el paso del valor al led, empezamos otra vez a leer
31
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
while (str[0] != 0) {
if ((str[0] > '50') || (str[0] < '0'))
return d;
d *= 10;
d += str[0] - '0';
str++;
}
return d;
}
Entradas:
P → Hay que conectarle una lista de números enteros (en milisegundos) para crear la secuencia
de parpadeos.
S → Hay que conectarle un Toogle para poder cambiar de Falso a Verdadero la booleana
que controla el inicio del envío de datos para parpadear.
R → Hay que conectarle un Toogle para poder cambiar de Falso a Verdadero la booleana
que controla si se repite o no la secuencia de parpadeo.
Salida:
B → La salida siempre nos dará o un cero o un uno para enviarlo a Arduino, según la secuencia
de parpadeo determinada en la entrada “P”.Para la explicación del funcionamiento de esta pila, podemos
volver a usar el sketch anterior, modificando solamente qué pin tiene que estar ahora a la escucha de los
datos que le envía Firefly. En el ejemplo anterior era el PWM6, y ahora va a ser el pin Digital 12.
char buffer[BUFFSIZE];
uint8_t bufferidx = 0;
uint16_t DPin12; // Control del DIG 12
32
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
char *parseptr;
char buffidx;
int ledPin = 12; // Led al DIG 12
void setup() {
pinMode(12, OUTPUT); // Led como SALIDA
Serial.begin(9600);
}
void loop() {
serialread(); // Llamamos a la Funcion serialRead
}
void serialread(){
// Una vez terminada la lectura y el paso del valor al led, empezamos otra vez a leer
while (str[0] != 0) {
if ((str[0] > '50') || (str[0] < '0'))
return d;
d *= 10;
33
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
d += str[0] - '0';
str++;
}
return d;
}
05_ Buffer
Instalamos la caja Open Port (con el COM# y la velocidad en Baudios) y ahora, vamos a empezar a
enviar datos desde GH a Arduino con la pila llamada Buffer (se encuentra dentro del subMenú Utility). Para
empezar a recibir datos, es imprescindible, tener operativa la pila de Open Port. Esta pila tiene 2 Entradas
y 3 Salidas:
Entradas:
D → Hay que proporcionarle un dominio para el tamaño que queremos que tenga la tabla de datos.
En este ejemplo es de 0 a 10.
Salidas:
Para la explicación del funcionamiento de esta pila, podemos volver a usar el sketch anterior,
modificando solamente qué pin tiene que estar ahora a la escucha de los datos que le envía Firefly. Esta
caja se puede usar tanto para leer datos desde arduino, como para enviar datos desde Firefly. Yo en este
ejemplo la he usado para enviar datos a un LED analógicamente.
char buffer[BUFFSIZE];
uint8_t bufferidx = 0;
uint16_t PWM6; // Control del PWM6
char *parseptr;
char buffidx;
34
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
void setup() {
Serial.begin(9600);
}
void loop() {
serialread(); // Llamamos a la Funcion serialRead
}
void serialread(){
// Una vez terminada la lectura y el paso del valor al led, empezamos otra vez a leer
while (str[0] != 0) {
if ((str[0] > '50') || (str[0] < '0'))
return d;
d *= 10;
d += str[0] - '0';
str++;
}
return d;
}
35
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
06_ Constrain
Instalamos la caja Open Port (con el COM# y la velocidad en Baudios) y ahora, vamos a empezar a
enviar datos desde Firefly a Arduino con la pila llamada Constrain (se encuentra dentro del subMenú Utility).
Para empezar a recibir datos, es imprescindible, tener operativa la pila de Open Port. Esta pila tiene 2
Entradas y 1 Salida:
Entradas:
D → Hay que proporcionarle un dominio para determinar los límites para el valor constreñido.
En este ejemplo es de 100 a 200.
Salida:
Observad, que el valor que le envío al LED es 70, pero debido a los límites que hemos puesto, el
valor constreñido nunca puede ser MENOR que 100 ni MAYOR que 200. Esta caja puede ser muy útil para
remapear datos tanto si los recibe Firefly, como si los recibe Arduino.
Para la explicación del funcionamiento de esta pila, podemos volver a usar el sketch anterior,
modificando solamente qué pin tiene que estar ahora a la escucha de los datos que le envía Firefly. Esta
caja se puede usar tanto para leer datos desde arduino, como para enviar datos desde Firefly. Yo en este
ejemplo la he usado para enviar datos a un LED analógicamente.
char buffer[BUFFSIZE];
uint8_t bufferidx = 0;
uint16_t PWM6; // Control del PWM6
char *parseptr;
char buffidx;
int ledPin = 6; // Led al PWM6
void setup() {
36
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
Serial.begin(9600);
}
void loop() {
serialread(); // Llamamos a la Funcion serialRead
}
void serialread(){
// Una vez terminada la lectura y el paso del valor al led, empezamos otra vez a leer
while (str[0] != 0) {
if ((str[0] > '50') || (str[0] < '0'))
return d;
d *= 10;
d += str[0] - '0';
str++;
}
return d;
}
37
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
07_ Fader1
Instalamos la caja Open Port (con el COM# y la velocidad en Baudios) y ahora, vamos a empezar a
enviar datos desde Firefly a Arduino con la pila llamada Fader1 (se encuentra dentro del subMenú Utility).
Para empezar a recibir datos, es imprescindible, tener operativa la pila de Open Port. Esta pila tiene 4
Entradas y 1 Salida:
Entradas:
S → Hay que conectarle un Toogle para poder cambiar de Falso a Verdadero la booleana
que controla el inicio del desvanecimiento del Led.
Salida:
O → Valores de salida.
Para la explicación del funcionamiento de esta pila, podemos volver a usar el sketch anterior,
modificando solamente qué pin tiene que estar ahora a la escucha de los datos que le envía Firefly. Esta
caja se puede usar tanto para leer datos desde arduino, como para enviar datos desde Firefly. Yo en este
ejemplo la he usado para enviar datos a un LED analógicamente.
char buffer[BUFFSIZE];
uint8_t bufferidx = 0;
uint16_t PWM6; // Control del PWM6
char *parseptr;
char buffidx;
int ledPin = 6; // Led al PWM6
void setup() {
Serial.begin(9600);
}
38
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
void loop() {
serialread(); // Llamamos a la Funcion serialRead
}
void serialread(){
// Una vez terminada la lectura y el paso del valor al led, empezamos otra vez a leer
while (str[0] != 0) {
if ((str[0] > '50') || (str[0] < '0'))
return d;
d *= 10;
d += str[0] - '0';
str++;
}
return d;
}
39
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
08_ Fader2
Instalamos la caja Open Port (con el COM# y la velocidad en Baudios) y ahora, vamos a empezar a
enviar datos desde Firefly a Arduino con la pila llamada Fader2 (se encuentra dentro del subMenú Utility).
Para empezar a recibir datos, es imprescindible, tener operativa la pila de Open Port. Esta pila tiene 5
Entradas y 1 Salida:
Entradas:
S → Hay que conectarle un Toogle para poder cambiar de Falso a Verdadero la booleana
que controla el inicio del desvanecimiento del Led.
Salida:
O → Valores de salida.
El códígo utilizado en Arduino es idéntico al caso de la pila Fader1. Estas dos pilas pueden ser muy
útiles para controlar Motores DC, controlando sus tiempos de apagado y encendido o su sentido de giro.
40
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
09_ Smoothing
Instalamos la caja Open Port (con el COM# y la velocidad en Baudios) y ahora, vamos a empezar a
enviar datos desde Arduino a Firefly con la pila llamada Smoothing (se encuentra dentro del subMenú
Utility). Para empezar a recibir datos, es imprescindible, tener operativa la pila de Open Port. Esta pila
tiene 2 Entradas y 1 Salida:
Entradas:
V → Valores de Entrada que provienen de la caja “Write”. En este caso, es la lectura de una
Fotoresistencia (LDR).
N → Número de veces que suaviza las lecturas. Este parámetro funciona bien entre 10 y 20.
Salida:
En la gráfica de arriba, se pueden ver los datos de salida directamente leídos desde Arduino, donde
se pueden apreciar los picos de lectura. En la gráfica de abajo, vemos los datos suavizados gracias a la pila
Smoothing. El rango de la LDR se ha mapeado en Arduino a un rango entre 0 y 255, para manipular el Led.
Para la explicación del funcionamiento de esta pila, he usado un sketch para leer una LDR (sensor
analógico con rango entre 0 y 1023) y controlar esa lectura para controlar un LED analógicamente.
void setup() {
Serial.begin(9600); // Abrimos el Puerto Serie a 9600 baudios
pinMode(LED_pin,OUTPUT);
pinMode(LDR_pin,INPUT);
}
void loop(){
41
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
Entradas:
V → Valores de Entrada. En este caso, los valores vienen de suavizarlos con la pila Smoothing
del ejemplo anterior.
R → Hay que conectarle un Toogle para poder cambiar de Falso a Verdadero la booleana
que controla el reseteo del guardado de datos.
T → Hay que conectarle un Toogle para poder cambiar de Falso a Verdadero la booleana
que controla si queremos que a la hora de guardar los datos, se incluya la Fecha y la Hora.
Salida:
T → Valores de Salida.
La pila Data Log puede sernos muy útil para almacenar lecturas de datos o para reproducir los datos
que hemos recogido de una determinada acción y cargarlos para simular la misma acción. De ahí la entrada
que nos permite guardar o no la fecha y hora de recepción de los datos.
Para la explicación del funcionamiento de esta pila, he usado el sketch para leer una LDR (sensor
analógico con rango entre 0 y 1023) del ejemplo anterior de la pila Smoothing.
42
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
Instalamos la caja Open Port (con el COM# y la velocidad en Baudios) y ahora, vamos a empezar a
enviar datos desde Arduino a Firefly con la pila llamada Wii Nunchuck (se encuentra dentro del subMenú
Ot). Para empezar a recibir datos, es imprescindible, tener operativa la pila de Open Port. Esta pila tiene 4
Entradas y 8 Salidas:
Entradas:
Start → Hay que conectarle un Toogle para poder cambiar de Falso a Verdadero la booleana
que controla la recepción de los datos.
Port → Necesita un número entero para que pueda localizar qué puerto COM# está siendo
utilizado por Arduino. Se puede ligar con la entrada de la pila de Open Port.
Timer → Hay que conectarle un Toogle para poder cambiar de Falso a Verdadero la booleana
que controla el estado del Timer (Temporizador).
Rate → Precisa de un número entero para que controlar el tiempo (en milisegundos) de
retardo con el que empezar cada nueva lectura de los sensores. Es aconsejable que sea el
mismo que hemos usado en el delay () de Arduino.
Salidas:
Zbut → Devuelve el valor del estado del Botón Z (por defecto es 0).
Cbut → Devuelve el valor del estado del Botón C (por defecto es 0).
Lo primero que tenemos que tener claro, es cómo se comunica el Nunchuck con Arduino. Si
cortamos el cable del Nunchuck y lo pelamos, observaremos que hay 4 cables: Blanco, Rojo, Verde y
Amarillo (normalmente estos son los colores, aunque si nuestro Nunchuck no es original, sino una imitación,
los colores pueden estar alterados). Ahora identificaremos los cables y veremos como se usan según
nuestro sketch en Arduino.
43
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
#include <Wire.h>
#include <string.h>
#undef int
#include <stdio.h>
uint8_t outbuf[6]; // Array para almacenar los datos de salida
int cnt = 0; // Contador
44
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
void setup () {
Serial.begin(19200); // abrimos el puerto serie a 19200 baudios
Wire.begin (); // juntamos el bus de datos i2c con la direccion 0x52
nunchuck_init (); // Inicializamos el envío de datos del Nunchuck
}
void nunchuck_init () {
Wire.beginTransmission (0x52); // transmite al dispositivo 0x52
Wire.send (0x40); // envia la direccion de la memoria
Wire.send (0x00); // manda un cero
Wire.endTransmission (); // deja de transmitir
}
void send_zero () {
Wire.beginTransmission (0x52); // transmite al dispositivo 0x52
Wire.send (0x00); // manda 1 byte, un cero
Wire.endTransmission (); // deja de transmitir
}
void print () {
int joy_x_axis = outbuf[0];
int joy_y_axis = outbuf[1];
int accel_x_axis = outbuf[2] * 2 * 2;
int accel_y_axis = outbuf[3] * 2 * 2;
int accel_z_axis = outbuf[4] * 2 * 2;
int z_button = 0;
int c_button = 0;
45
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
Serial.print("Boton C = ");
Serial.print (c_button, DEC);
Serial.print ("\t");
Serial.println ();
}
char nunchuk_decode_byte (char x) {
x = (x ^ 0x17) + 0x17;
return x;
}
46
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
Entradas:
API Key → Para poder trabajar con esta pila, es necesario solicitarla a la web Pachube. Un API
Key es como una contraseña para identificarnos.
Salidas:
Msg → Mensaje sobre la dirección a la que estamos conectados, con la fecha y hora.
Esta pila nos puede servir para trabajar con datos desde Internet, monitorizando cualquier evento
(Concentración de CO2, Temperaturas, Tráfico,...). En la web de Pachube podemos encontrar tutoriales
sobre cómo trabajar con sus elementos.
En este ejemplo, he conectando Firefly con Pachube para leer datos via web desde el Laboratorio
de Redes y Sistemas Telemáticos de la Facultad de Ciencias de la Ingenieria (Campus Miraflores,
Universidad Austral de Chile).
47
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
Para terminar la parte de cómo conectar Arduino con Firefly, vamos a explicar el ejemplo que
aparece al final del libro, pero metiendo algo más avanzado. Vamos a empezar con el ejemplo de recibir
datos de Firefly en Arduino y controlar un servomotor, un Led RGB, tres Leds convencionales digitalmente
y un led convencional analógicamente.
Primero, abriremos el Puerto Serie como hemos visto en todos los ejemplos anteriores, con la pila
Open Port (nos aseguraremos que el puerto COM# y la velocidad de comunicación de Arduino, es la misma
que en Firefly).
Una vez que ya podemos abrir el puerto Serie, vamos a trabajar con la pila Duemilanove Write.
Observamos que tiene 11 Entradas y 2 Salidas:
Entradas:
Start → Hay que conectarle un Toogle para poder cambiar de Falso a Verdadero la booleana
que controla el estado de la Escritura a través del Puerto Serie.
DPin13 → Necesita un número entero para controlar el pin Digital de Arduino nº 13. Le hemos
conectado un slider de que sólo admite dos números o CERO o UNO, es decir, apagado o encendido.
DPin12 → Necesita un número entero para controlar el pin Digital de Arduino nº 12. Trabaja
igual que el Dpin13.
DPin11* → Los pines que aparecen con un asterisco (*), nos indican que pueden trabajar
como pines Digitales o como pines PWM (admiten un rango de lectura). Para que Firefly
entienda cómo debe trabajar, debemos pinchar con el botón derecho sobre el pin con * que
queramos y ver el menú que se despliega.
48
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
Si la etiqueta PMW está Activada, ese pin admitirá un rango y trabajará como PWM, si por el
contrario, está desactivada, trabajará como pin Digital. En la imagen anterior, le hemos agregado un
Slider de números Enteros y con un rango entre 0 y 255 (para poder trabajar con un Led) y podemos
observar como este pin PWM admite un rango y lo envía a la ventana de salida que lo mandará a
Arduino. En nuestro ejemplo, utilizaremos este pin como PWM para el control analógico de un led
convencional.
DPin10* → Como lo usaremos como PWM para el control de un servo, activaremos la pestaña
PWM de este pin y le conectaremos un slider de números enteros entre 0 y 180 que es el rango en el
que trabaja el Servo.
DPin9* → En este ejemplo no lo usaremos, pero puede trabajar como PWM o como Digital.
DPin8 → Necesita un número entero para controlar el pin Digital de Arduino nº 8. Le hemos
conectado un slider de que sólo admite dos números o CERO o UNO, es decir, apagado o encendido.
DPin6* → Como lo usaremos como PWM para el control de un Led RGB, activaremos la
pestaña PWM de este pin y le conectaremos un slider de números enteros entre 0 y 255 que es
el rango en el que trabaja el Led. Este pin controla la escritura del color AZUL (B) del Led RGB.
DPin5* → Como lo usaremos como PWM para el control de un Led RGB, activaremos la
pestaña PWM de este pin y le conectaremos un slider de números enteros entre 0 y 255 que es
el rango en el que trabaja el Led. Este pin controla la escritura del color VERDE (G del Led RGB.
DPin3* → Como lo usaremos como PWM para el control de un Led RGB, activaremos la
pestaña PWM de este pin y le conectaremos un slider de números enteros entre 0 y 255 que es
el rango en el que trabaja el Led. Este pin controla la escritura del color AZUL (R) del Led RGB.
Port → Hay que conectarle un Receiver para que esté conectado al mismo puerto COM# que
la pila de Open Port.
Salidas:
Msg → Con una nota, podemos comprobar que el estado de Envío de los datos.
49
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
#include <Servo.h>
char buffer[BUFFSIZE];
uint8_t bufferidx = 0;
uint16_t DPin13, DPin12, PWM11, PWM10, PWM9, DPin8, PWM6, PWM5, PWM3;
char *parseptr;
char buffidx;
int ledAnalogicoPin = 11;
int ledDigitalPin1 = 13;
int ledDigitalPin2 = 12;
int ledDigitalPin3 = 8;
int ledRGB_R = 3;
int ledRGB_G = 5;
int ledRGB_B = 6;
Servo Servo1;
void setup() {
pinMode(ledAnalogicoPin, OUTPUT);
pinMode(ledDigitalPin1, OUTPUT);
pinMode(ledDigitalPin2, OUTPUT);
pinMode(ledDigitalPin3, OUTPUT);
pinMode(ledRGB_R, OUTPUT);
50
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
pinMode(ledRGB_G, OUTPUT);
pinMode(ledRGB_B, OUTPUT);
Servo1.attach(10); // Servo en el PWM 10
Serial.begin(9600);
}
void loop() {
serialread(); // Llamamos a la Funcion serialRead
}
void serialread(){
char c; // captamos un caracter del Puerto Serie
if (Serial.available()) {
c = Serial.read(); // Leemos ese caracter
buffer[bufferidx] = c; // añadimos ese caracter al buffer
DPin13 = parsedecimal(parseptr);
parseptr = strchr(parseptr, ',')+1;
DPin12 = parsedecimal(parseptr);
parseptr = strchr(parseptr, ',')+1;
PWM11 = parsedecimal(parseptr);
parseptr = strchr(parseptr, ',')+1;
PWM10 = parsedecimal(parseptr);
parseptr = strchr(parseptr, ',')+1;
PWM9 = parsedecimal(parseptr);
parseptr = strchr(parseptr, ',')+1;
DPin8 = parsedecimal(parseptr);
parseptr = strchr(parseptr, ',')+1;
PWM6 = parsedecimal(parseptr);
parseptr = strchr(parseptr, ',')+1;
PWM5 = parsedecimal(parseptr);
parseptr = strchr(parseptr, ',')+1;
PWM3 = parsedecimal(parseptr);
if (DPin13 == 1) {
digitalWrite(ledDigitalPin1, HIGH);
}
else {
digitalWrite(ledDigitalPin1, LOW);
}
if (DPin12 == 1) {
digitalWrite(ledDigitalPin2, HIGH);
}
else {
digitalWrite(ledDigitalPin2, LOW);
51
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
if (DPin8 == 1) {
digitalWrite(ledDigitalPin3, HIGH);
}
else {
digitalWrite(ledDigitalPin3, LOW);
}
// Analizamos las diferentes situaciones que podemos tener
if (PWM11 == 1) { // Si es IGUAL a UNO ...
digitalWrite(ledAnalogicoPin, HIGH); // Encendemos el LED
}
else if (PWM11 == 0){ // Si es IGUAL a CERO ...
digitalWrite(ledAnalogicoPin, LOW); // Apagamos el LED
}
else{ // Si NO es ni UNO ni CERO ...
analogWrite(ledAnalogicoPin, PWM11); // Escribimos analogicamente el valor en el LED
}
if (PWM10 == 1) {
digitalWrite(10, HIGH);
}
else if (PWM10 == 0){
digitalWrite(10, LOW);
}
else{
Servo1.write(PWM10);
}
if (PWM6 == 1) { // Si es IGUAL a UNO ...
digitalWrite(ledRGB_B, HIGH); // Encendemos el LED
}
else if (PWM6 == 0){ // Si es IGUAL a CERO ...
digitalWrite(ledRGB_B, LOW); // Apagamos el LED
}
else{ // Si NO es ni UNO ni CERO ...
analogWrite(ledRGB_B, PWM6); // Escribimos analogicamente el valor en el LED
}
if (PWM5 == 1) { // Si es IGUAL a UNO ...
digitalWrite(ledRGB_G, HIGH); // Encendemos el LED
}
else if (PWM5 == 0){ // Si es IGUAL a CERO ...
digitalWrite(ledRGB_G, LOW); // Apagamos el LED
}
else{ // Si NO es ni UNO ni CERO ...
analogWrite(ledRGB_G, PWM5); // Escribimos analogicamente el valor en el LED
}
// Una vez terminada la lectura y el paso del valor al led, empezamos otra vez a leer
52
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
while (str[0] != 0) {
if ((str[0] > '50') || (str[0] < '0'))
return d;
d *= 10;
d += str[0] - '0';
str++;
}
return d;
}
Ahora, Vamos a realizar un ejemplo de enviar datos desde Arduino a Firefly y controlar una LDR
(que a usa vez controla un Led analógicamente) y un Botón (que a su vez controla un led convencional
digitalmente).
Primero, abriremos el Puerto Serie como hemos visto en todos los ejemplos anteriores, con la pila
53
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
Open Port (nos aseguraremos que el puerto COM# y la velocidad de comunicación de Arduino, es la misma
que en Firefly).
Una vez que ya podemos abrir el puerto Serie, vamos a trabajar con la pila Duemilanove Read.
Observamos que tiene 4 Entradas y 10 Salidas:
Entradas:
Start → Hay que conectarle un Toogle para poder cambiar de Falso a Verdadero la booleana
que controla el estado de la Lectura a través del Puerto Serie.
Port → Necesita un número entero para que pueda localizar qué puerto COM# está siendo
utilizado por Arduino. Se puede ligar con la entrada de la pila de Open Port.
Timer → Hay que conectarle un Toogle para poder cambiar de Falso a Verdadero la booleana
que controla el estado del Timer (Temporizador).
Rate → Precisa de un número entero para que controlar el tiempo (en milisegundos) de
retardo con el que empezar cada nueva lectura de los sensores. Es aconsejable que sea el
mismo que hemos usado en el delay () de Arduino.
Salidas:
APin0 → En este ejemplo, lo usaremos para recibir la lectura mapeada a un rango de 0- 255
(para trabajar también con un led analógicamente) de una LDR.
APin1 → En este ejemplo, no lo usaremos. Pero funciona igual que Apin0, recibiendo datos de
un sensor analógico.
APin2 → En este ejemplo, no lo usaremos. Pero funciona igual que Apin0, recibiendo datos de
un sensor analógico.
APin3 → En este ejemplo, no lo usaremos. Pero funciona igual que Apin0, recibiendo datos de
un sensor analógico.
APin4 → En este ejemplo, no lo usaremos. Pero funciona igual que Apin0, recibiendo datos de
un sensor analógico.
APin5 → En este ejemplo, no lo usaremos. Pero funciona igual que Apin0, recibiendo datos de
un sensor analógico.
DPin2 → En este ejemplo, lo usaremos para recibir la lectura del estado de un Botón, que a su
vez, controla si un led se enciende o no.
DPin4 → En este ejemplo, no lo usaremos. Pero funciona igual que DPin2, recibiendo datos de
un componente digital.
DPin7 → En este ejemplo, no lo usaremos. Pero funciona igual que DPin2, recibiendo datos de
un componente digital.
Msg → Con una nota, podemos comprobar que el estado de Recepción de los datos.
54
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
// Estos pines los definimos para que la pila en GH funcione bien, pero no los usaremos ahora
int APin1 = 0;
int APin2 = 0;
int APin3 = 0;
int APin4 = 0;
int APin5 = 0;
int DPin4 = 0;
int DPin7 = 0;
void setup() {
pinMode(buttonPin, INPUT); // Botón y LDR como ENTRADAS
pinMode(ledPin, OUTPUT);
pinMode(LDR_pin, INPUT); // Los 2 Leds como SALIDAS
pinMode(LED_pin, OUTPUT);
Serial.begin(9600);
}
void loop(){
// Leemos el resto de pines, aunque en este ejemplo no los usamos.
// Si no lo hacemos, la pila Read en GH puede funcionar mal.
APin1 = analogRead(1);
APin2 = analogRead(2);
55
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
APin3 = analogRead(3);
APin4 = analogRead(4);
APin5 = analogRead(5);
DPin4 = digitalRead(4);
DPin7 = digitalRead(7);
Serial.print(LDR_mapeado);
Serial.print(",");
Serial.print(APin1);
Serial.print(",");
Serial.print(APin2);
Serial.print(",");
Serial.print(APin3);
Serial.print(",");
Serial.print(APin4);
Serial.print(",");
Serial.print(APin5);
Serial.print(",");
Serial.print(buttonState);
Serial.print(",");
Serial.print(DPin4);
Serial.print(",");
Serial.print(DPin7);
Serial.print(",");
Serial.println("eol");
delay(50);
}
//////////////////////// FUNCIONES AUXILIARES ////////////////////////////////////
void ldrYled(){
LDR_val = analogRead(LDR_pin); // leemos el valor del LDR
LDR_mapeado = constrain(LDR_val,0,255);//Limitamos el valor del LDR al rango [0-255] para el LED
analogWrite(LED_pin,LDR_mapeado); // Le pasamos al LED el valor mapeado
}
void botonLED(){
buttonState = digitalRead(buttonPin); // Leemos el estado del Botón
// Si NO apretamos el botón, el Led está apagado
if (buttonState == HIGH) {
digitalWrite(ledPin, LOW);
}
else {
// SI apretamos el botón, encendemos el Led
digitalWrite(ledPin, HIGH);
}
}
56
Juanma Sarrió García
Tutorial Arduino, Arduino + P5, Arduino + GH + Fiirefly
57