Vous êtes sur la page 1sur 12

Camins Makers [WORKSHOP.

PANEL SOLAR INTERACTIVO]

1. Inicio
El workshop que realizaremos consiste en construir un panel solar interactivo,
es decir, cuya orientacin responda a la cantidad de luz que reciba (efecto
girasol). El objetivo principal es el de familiarizarnos con herramientas bsicas
de electrnica DIY, con microcontroladores (Arduino o similar) y con
herramientas de programacin visual como Processing. El conocimiento previo
que necesitamos es de matemtica bsica. Construiremos un modelo fsico de
panel solar pero simultneamente un modelo digital. De esta manera, podremos
vincular magnitudes fsicas, modelos reales y modelos digitales en un mismo
proyecto.

Qu equipos necesitamos?

1 Placa Arduino/Genuino UNO


2 Sensores de luz
1 Servomotor
2 resistencias de 220 Ohm
8-10 Jumpers
1 Ordenador

Material para la construccin de un panel. Cartn, cinta, tijera,


papel, celo, rotuladores, papel de plata, etc.

Qu Software necesitamos?

Necesitamos instalar

- Processing (versin 2). www.processing.org


- Arduino IDE www.arduino.cc
- Fritzing (si se quieren generar figuras de circuitos) www.fritzing.org

Cul ser el resultado?

Un objeto fsico que responde a estmulos externos y que adems se visualiza en


la pantalla del ordenaror en tiempo real.

Sensor de luz

Servomotor

Arduino UNO
Camins Makers [WORKSHOP. PANEL SOLAR INTERACTIVO]

2. Processing. Setup() y Draw()


Processing es un programa que permite generar aplicaciones visuales animadas.
Utiliza sintaxis de lenguajes populares tales como Java o Python. Permite
desarrollar prototipos rpidos de animacin y su interactividad con placas de
Hardware en abierto tales como Arduino es muy sencilla. Por esta ltima razn,
utilizaremos Processing para desarrollar la aplicacin virtual de nuestro modelo
fsico.

Debemos conocer el principio bsico de las funciones setup() y draw() en


Processing. La primera se ejecuta una nica vez y la segunda se ejecuta
indefinidamente en forma de loop. En el cdigo que se muestra a continuacin,
podemos ver de manera sencilla una primera aplicacin visual. Se pueden
establecer tres partes bsicas: i) declaracin de variables, ii) funcin setup,
donde se especifica el tamao de pantalla y el color del fondo fijo rojo segn
cdigo RGB y iii), el dibujo de un rectngulo blanco. Se pueden ver 4 funciones,
size(), background(), fill() y rect. Se recomienda la consulta de la ayuda
Help/Reference para conocer con detalle los parmetros constructores de cada
una de ellas. Se recomienda cambiar las variables declaradas en un principio y
ejecutar varias veces el programa.

int ancho=1000;
int alto=1000;
int tamaox=50;
int tamaoy=50;

void setup() {
size(ancho,alto);
background(255,0,0);
}

void draw() {
fill(255,255,255);
rect(ancho/2,alto/2+20,tamaox,tamaoy);
}

SUGERENCIA: La manera natural de interactuar con Processing es la de ensayo y error con los botones
play
. y stop que se encuentran en la parte superior izquierda
Camins Makers [WORKSHOP. PANEL SOLAR INTERACTIVO]

3. Processing. Dibujar Panel


rotatorio
Adems de poder dibujar primitivas bsicas como lneas, rectngulos, elipses,
curvas o puntos, en Processing podemos hacer que las mismas se muevan
siguiendo leyes matemticas y o fsicas. En nuestro workshop, deseamos hacer
rotar un panel de acuerdo a un estmulo fsico. Como un primer paso,
necesitamos conocer la mecnica de desarrollo de primitivas geomtricas que se
encuentren fijas en el tiempo, y otras que se muevan siguiendo ciertos patrones.
En el cdigo que se muestra, se dibujan 2 rectngulos inmviles y uno rotatorio.
Es importante destacar que la funcin background() se encuentra ahora dentro
de draw(). De esta manera, cada vez que el cdigo se ejecuta, el fondo se
actualiza y no vemos una secuencia de rectngulos que se superponen. Dentro
de draw(), vemos que a uno de los rectngulos se le aade la funcin rotate() a
la cual se le indica el parmetro angle, variable a la cual se le aade una pequea
cantidad cada vez que se ejecuta el cdigo. En este cdigo, se deben incluir
funciones de translacin para as poder hacer rotar el rectngulo alrededor de su
centro geomtrico y no alrededor de otro punto.

int ancho=1000;
int alto=1000;
int radio=50;
float angle=0.0;

void setup() {
size(ancho,alto);
}

void draw() {
background(255,0,0);
angle=angle+0.01;
rectMode(CENTER);
fill(0,255,0);
rect(ancho/2,alto/2+20,200,50);
fill(255,255,255);
rect(ancho/2,alto/2-55,10,100);
pushMatrix();
translate(ancho/2,alto/2-105);
rotate(angle);
rect(0,0,10,100);
popMatrix();

SUGERENCIA: Se recomienda hacer pruebas ensayo y error con diferentes cantidades para aadir al
ngulo o bien, actualizando el color dentro del background() de acuerdo a cierta ley matemtica.
Camins Makers [WORKSHOP. PANEL SOLAR INTERACTIVO]

4. Arduino. Blink
Arduino/Genuino es un microcontrolador para el prototipado de proyectos de
electrnica. Permite controlar actuadores y sensores de manera abierta a travs
de una interfaz de desarrollo (IDE). Dicha interfaz sigue una estructura muy
similar a la de Processing, por lo que las ventajas entre las similitudes sintaxis
entre uno y otro son destacables.

Un primer ejemplo que se puede plantear para familiarizarnos con la placa


Arduino/Genuino es el control de una bombilla LED. Se debe plantear un
circuito con 2 cables, 1 resistencia de 220, un breadboard y una bombilla LED
como se muestra en la figura. Se puede ver que la pata larga del LED se conecta
al PIN 13 de la placa y la placa corta del mismo a la resistencia y luego la tierra
(GND). Se desea cargarle a la placa Arduino/Genuino un cdigo que permita
abrir y cerrar el LED de acuerdo a una cierta secuencia bsica. La mecnica de
carga y verificacin de cdigo que existe en el IDE es muy similar a la que
observbamos en Processing.

El cdigo a cargar a la placa es muy sencillo y sigue la misma estructura de


Processing. Una funcin setup() que se ejecuta una vez y una funcin loop() que
se ejecuta indefinidamente. En esta ltima, se incluyen cuatro lneas. Activar el
LED con la funcin digitalWrite(), el pin en cuestin y HIGH (se desactiva con
LOW) y la funcin delay(), que permite establecer un tiempo de espera en
milisegundos.

void setup() {
pinMode(13, OUTPUT);
}

void loop() {
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}

SUGERENCIA: Verificar que la placa est correctamente conectada al ordenador (IDE/Tools/Serial)


Camins Makers [WORKSHOP. PANEL SOLAR INTERACTIVO]

5. Arduino. Potencimetro.
Una de los conceptos fundamentales que se deben manejar al utilizar las placas
Arduino/Genuino es el uso del puerto serial. Para ello, podemos utilizar un
potencimetro, 3 cables y una placa. El circuito que se plantea hace pasar un
voltaje (5V) por el potencimetro con su respectiva vuelta a tierra (GND) en la
placa. Adicionalmente, se aade un cable de lectura a uno de los canales
analgicos de la placa.

El cdigo que se carga a placa contiene una inicializacin del puerto serial a una
tasa determinada (9600 baudios en este caso) y posteriormente, una funcin de
lectura del valor analgico, a la cual se le asigna un nombre de variable. Es
importante destacar que el cdigo indica en cual pin se debe realizar la lectura
(A0 en este ejemplo). Posteriomente, se imprime el valor obtenido (cada
milisegundo) en el puerto serial. Se recomienda variar al potencimetro y
observar los resultados en la pestaa correspondiente.

void setup() {
Serial.begin(9600);
}

void loop() {
int sensorValue = analogRead(A0);
Serial.println(sensorValue);
delay(1); // delay in between reads for stability
}

SUGERENCIA: Agregar un string que acompae el valor medido para una


mejor visualizacin
Camins Makers [WORKSHOP. PANEL SOLAR INTERACTIVO]

6. Arduino. Sensor de Luz


La primera medicin que debemos realizar es la cantidad de luz que recibe una
foto clula. La conexin requiere el uso de una resistencia de 220 , tres cables,
un breadboard y la fotoclula en si. El circuito que se plantea hace pasar un
voltaje (5V) como se muestra en la figura.

El cdigo que se debe cargar a la placa en este caso es idntico al cdigo


anterior, ya que se trata de una magnitud analgica enva una seal al canal
correspondiente (en este caso utilizamos el canal A2).

void setup() {
Serial.begin(9600);
}

void loop() {
int sensorValue = analogRead(A2);
Serial.println(sensorValue);
delay(1); // delay in between reads for stability
}

Si se quieren conectar 2 sensores, adems de definir dos variables, se deben


escribir las mismas utilizando varias lneas de la funcin Serial.print (en lugar
de Serial.println). Cada vez que se ejecuta el cdigo, se escriben de manera
consecutiva los caracteres que se indiquen con Serial.print. Por ejemplo, si se
busca escribir dos valores separados por coma, se debera generar el siguiente
cdigo.
void setup() {
Serial.begin(9600);
}

void loop() {
int sensorValue 1= analogRead(A1);
int sensorValue 2= analogRead(A2);
Serial.print(sensorValue1);
Serial.print(,);
Serial.println(sensorValue2);
delay(1); // delay in between reads for stability
}

SUGERENCIA: Intentar utilizar la funcin Serial.println() concantenando los tres


valores en una misma lnea de cdigo
Camins Makers [WORKSHOP. PANEL SOLAR INTERACTIVO]

7. Arduino. Servo
La siguiente pieza a encajar en el proyecto es el uso de un servomotor. Los
servomotores tienen en sus engranajes ejes que se pueden controlar muy
precisamente. Se les puede indicar una posicin precisa (en ngulos) y el mismo
se orienta hacia la misma. Con algoritmos adecuados, se puede generar un
movimiento determinado. El servomotor que se incluye en la mayora de kits de
iniciacin de electrnica bsica tienen un ngulo de rotacin de 180 grados. Se
observa que un servomotor tiene 3 conexiones, 5V, GND y seal de entrada. La
conexin bsica incluye proporcionar corriente y tierra, y a su vez conectar en
algn pin digital.

El cdigo que se debe cargar a la placa debe incluir una librera desarrollada
previamente para el uso de servos. La misma define mtodos bsicos para la
manipulacin del mismo.

En el cdigo que se incluye, el usuario declara un objeto Servo con un nombre


arbitrario, para posteriormente aadir mtodos al mismo tales como attach,
write u otros, que permiten definir el lugar donde conectar al mismo o bien, la
posicin de su eje.

#include<Servo.h>

Servo servouclm;
int pos = 0;

void setup() {
servouclm.attach(9);
}

void loop() {
pos=pos+1;
servouclm.write(pos);
Serial.write(pos);
delay(15);
}

SUGERENCIA: Intentar controlar la posicin de un servo con un potencimetro.


Camins Makers [WORKSHOP. PANEL SOLAR INTERACTIVO]

8. Arduino. Funciones
Dentro de la funcin loop, se puede operar con gran versatilidad, lo que da
mucho juego para la programacin de aplicaciones tanto fsicas como digitales.
En el ejemplo que estamos desarrollando, es fundamental el uso de la funcin
if, que forma parte del abc de programacin bsica.

Se trata de programar dentro de la funcin loop una decisin que permita


identificar cul de los dos sensores recibe ms intensidad de luz. De esa manera,
la posicin del servo motor se puede controlar con un contador.

if (x>100) {
//escribir accin
}
else if(x<50){
//escribir accin
}
else {
//escribir accin
}

Otras funciones tiles en el entorno Arduino y poco usuales en entornos de


programacin tradicional son:

millis();

Devuelve el tiempo (en milisegundos) durante el cual la placa trabaja.

analogWrite();

Escribe un valor analgico (PWM, pulse width modulation) a un pin


determinado en la placa (los que lo permiten con las siglas PWM). Si se quiere
regular la velocidad de un motor o bien, alterar la intensidad de luz de un LED,
es una funcin til.

delayMicroseconds();

Para la ejecucin del programa por un nmero especificado que representa una
fraccin de un milisegundo.
Camins Makers [WORKSHOP. PANEL SOLAR INTERACTIVO]

9. Processing. Obtener
magnitudes
Existen muchas maneras de enviar datos provenientes del serial port a otros
entornos tales como Processing, Python, Matlab o Excel. La programacin del
envo de datos puede ser de sumo inters en el caso de que se quiera generar un
archivo con los datos provenientes de mediciones de sensores (cuando se utiliza
la placa como sistema de adquisicin de datos). Existen protocolos y ejemplos
desarrollados dentro de los entornos Arduino-Processing como el
StandardFirmata (ver ejemplos/firmata/StandardFirmata) que se pueden
utilizar directamente para la obtencin de magnitudes en Processing y el control
de Servos. En este caso, para entender el funcionamiento de circuitos bsicos de
Arduino, hemos optado por la solucin convencional, es decir, envo de valores
codificados a travs del puerto serial, que se pueden leer como un nmero
entero en el programa en cuestin. Los pasos a seguir se indican a continuacin:

- Se debe incluir la librera serial al inicio del cdigo disponible en


Processing. Es importante destacar que los datos que se escriben en el
puerto serial para su envo posterior a Processing se desarrollen con
Serial.write() en lugar de Serial.println.

- Se declara un objeto Serial (en este caso de nombre myPortuclm).

- Se indican los parmetros del objeto Serial (son 3). En el segundo, se


debe indicar un valor 0,1,2etc, el cual corresponde con el puerto USB
que se est utilizando para dicho envo.

- En la funcin draw(), el valor de la variable angle tomar el valor de la


lectura que venga del serial. Se debe utilizar un delay() tal que
corresponda con la cantidad de datos que llegan en el puerto. En este
caso, se utiliza una variable adicional para transformar el nmero entero
que viene del puerto serial, en un float (radianes) que nos permita
dibujar un ngulo determinado.
Camins Makers [WORKSHOP. PANEL SOLAR INTERACTIVO]

import processing.serial.*;

Serial myPortMEEC;

int ancho=1000;
int alto=1000;
int radio=50;
int angle;
float angulo;

void setup() {
size(1000,1000);
myPortMEEC = new Serial(this, Serial.list()[1], 9600); //El nmero 1 puede variar

void draw() {

if(myPortMEEC.available()>0){
angle= myPortMEEC.read();
angulo = angle*PI/180; // Se transforma a radianes
}

background(255,0,0);
rectMode(CENTER);
fill(0,255,0);
rect(ancho/2,alto/2+20,200,50);
fill(255,255,255);
rect(ancho/2,alto/2-55,10,100);
pushMatrix();
translate(ancho/2,alto/2-105);

rotate(angulo);
rect(0,0,10,100);
popMatrix();
println(angle);
println(angulo);
delay(10);
}

SUGERENCIA: Si desde Arduino se envan varios valores a la vez separados por


comas, entonces se podra utilizar Serial.print() en lugar de Serial.write.
Camins Makers [WORKSHOP. PANEL SOLAR INTERACTIVO]

10. Final. Wrap-Up


Es momento de ensamblar todas las piezas. Un circuito en el que
conectamos dos sensores, dos resistencias y un servo motor, a los pines
analgicos A0 y A1 (sensores) y al pin digital 9 (servo). A partir de ahora,
creatividad en la construccin del artefacto y en el envo en tiempo real de
magnitudes a Processing!

#include <Servo.h>

Servo myservo;
int pos = 80; // Posicin del servo
int inputPhotoLeft = 1; // Fotorresistencia pin analgico 0 de arduino.
int inputPhotoRight = 0;// Fotorresistencia pin analgico 1 de arduino.
int Left = 0; // Almacenar lecturas de fotorresistores.
int Right = 0; // Almacenar lecturas de fotorresistores.

void setup(){
Serial.begin(9600);
myservo.attach(9); // Fijar servo en pin 9.
}

void loop(){
Left = analogRead(inputPhotoLeft);
Right = analogRead(inputPhotoRight);
//Serial.println(Left);
//Serial.println(Right);

if (Left > (Right +20)){


if (pos < 110)
pos++;
myservo.write(pos);
}

if (Right > (Left +20)){


if (pos > 1)
pos -= 1;
myservo.write(pos);
}
Serial.write(pos);
delay(10);
}
Camins Makers [WORKSHOP. PANEL SOLAR INTERACTIVO]

Referencias

Scott Fitzgerald and Michael Shiloh. Arduino Projects Book. Arduino LLC. Italia 2012

Casey Reas and Ben Fry. MAKE: Getting Started with Processing. Maker Media.
Septiembre 2015.

Daniel Shiffman. The Nature of Code. Simulating Natural Systems with Processing.
Paperback. 2012

Webs de inters

Canal Vimeo. Arduino Verkstad CTC. David Cuartielles


https://vimeo.com/arduinoverkstad

Canal Vimeo. The Nature of Code. Daniel Shiffman


https://vimeo.com/shiffman

www.instructables.com

http://caminsmakers.upc.edu (orientada a la Ing. Civil)

www.arduino.cc

www.processing.org

Seminarios y Talleres. Mster en Ingeniera Estructural y de la Construccin


Barcelona, Diciembre de 2016

Vous aimerez peut-être aussi