Professional Documents
Culture Documents
Este pequeo proyecto es para aquellos que quisieran regalarle un recuerdo a alguien especial, esta
hecho con una matriz de leds de 8x8.
Armado
Para el armado hay varios ejemplos ya hechos en la red y de uno de esos escogimos el siguiente:
1. Arduino UNO
2. Matriz de leds 8x8
3.
Cdigo
/*
matriz de leds 2288AB-5
matriz pin nro
linea
columna
13
12
11
10
16(analogico pin 2)
17(analogico pin 3)
18(analogico pin 4)
19(analogico pin 5)
10
11
12
13
14
15
16
*/
const int rownum[8] = {
2,7,19,5,13,18,12,16 };
const int colnum[8] = {
6,11,10,3,17,4,8,9
float timeCount = 0;
};
int t[8][8] = {
{0,1,1,1,1,1,1,0},
{0,0,0,1,1,0,0,0},
{0,0,0,1,1,0,0,0},
{0,0,0,1,1,0,0,0},
{0,0,0,1,1,0,0,0},
{0,0,0,1,1,0,0,0},
{0,0,0,1,1,0,0,0},
{0,0,0,1,1,0,0,0}};
int e[8][8] = {
{0,1,1,1,1,1,1,0},
{0,1,0,0,0,0,0,0},
{0,1,0,0,0,0,0,0},
{0,1,1,1,0,0,0,0},
{0,1,1,1,0,0,0,0},
{0,1,0,0,0,0,0,0},
{0,1,0,0,0,0,0,0},
{0,1,1,1,1,1,1,0}};
int a[8][8] = {
{0,0,1,1,1,1,0,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0},
{0,1,1,1,1,1,1,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0}};
int m[8][8] = {
{0,1,1,0,0,1,1,0},
{0,1,0,1,1,0,1,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0}};
int o[8][8] = {
{0,0,1,1,1,1,0,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0},
{0,0,1,1,1,1,0,0}};
int cor[8][8] = {
{0,1,1,0,0,1,1,0},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{0,1,1,1,1,1,1,0},
{0,0,1,1,1,1,0,0},
{0,0,0,1,1,0,0,0}
};
int g[8][8] = {
{0,1,1,1,1,1,1,0},
{0,1,0,0,0,0,0,0},
{0,1,0,0,0,0,0,0},
{0,1,0,0,0,0,0,0},
{0,1,0,1,1,1,1,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0},
{0,1,1,1,1,1,1,0}};
int b[8][8] = {
{0,1,1,1,1,1,0,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0},
{0,1,1,1,1,1,0,0},
{0,1,1,1,1,1,0,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0},
{0,1,1,1,1,1,0,0}};
int I[8][8] = {
{0,0,1,1,1,1,0,0},
{0,0,0,1,1,0,0,0},
{0,0,0,1,1,0,0,0},
{0,0,0,1,1,0,0,0},
{0,0,0,1,1,0,0,0},
{0,0,0,1,1,0,0,0},
{0,0,0,1,1,0,0,0},
{0,0,1,1,1,1,0,0}};
int s[8][8] = {
{0,0,1,1,1,1,1,0},
{0,1,0,0,0,0,0,0},
{0,1,0,0,0,0,0,0},
{0,1,0,0,0,0,0,0},
{0,0,1,1,1,1,0,0},
{0,0,0,0,0,0,1,0},
{0,0,0,0,0,0,1,0},
{0,1,1,1,1,1,0,0}};
int blank[8][8] = {
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0}};
int cor1[8][8] = {
{0,0,0,0,0,0,0,0},
{0,1,1,0,0,1,1,0},
{0,1,1,1,1,1,1,0},
{0,1,1,1,1,1,1,0},
{0,1,1,1,1,1,1,0},
{0,0,1,1,1,1,0,0},
{0,0,0,1,1,0,0,0},
{0,0,0,0,0,0,0,0}
};
int cor2[8][8] = {
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,1,0,0,1,0,0},
{0,0,1,1,1,1,0,0},
{0,0,1,1,1,1,0,0},
{0,0,0,1,1,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0}
};
int cor3[8][8] = {
{0,1,1,0,0,1,1,0},
{1,0,0,1,1,1,0,1},
{1,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,1},
{0,1,0,0,0,0,1,0},
{0,0,1,0,0,1,0,0},
{0,0,0,1,1,0,0,0}
};
void setup() {
Serial.begin(9600);
for (int thisPin = 0; thisPin < 8; thisPin++) {
pinMode(colnum[thisPin], OUTPUT);
pinMode(rownum[thisPin], OUTPUT);
digitalWrite(colnum[thisPin], HIGH);
}
}
void loop() {
delay(5);
timeCount += 1;
if(timeCount < 200) {
drawScreen(t);
} else if (timeCount < 230) {
} else if (timeCount < 400) {
drawScreen(e);
} else if (timeCount < 430) {
} else if (timeCount < 600) {
drawScreen(a);
} else if (timeCount < 630) {
} else if (timeCount < 800) {
drawScreen(m);
} else if (timeCount < 830) {
} else if (timeCount < 1000) {
drawScreen(o);
} else if (timeCount < 2830) {
} else if (timeCount < 3000) {
drawScreen(cor2);
} else if (timeCount < 2930) {
} else if (timeCount < 3100) {
drawScreen(cor1);
} else if (timeCount < 3030) {
} else if (timeCount < 3200) {
drawScreen(cor);
} else if (timeCount < 3130) {
} else if (timeCount < 3300) {
drawScreen(cor3);
} else if (timeCount < 3430) {
} else if (timeCount < 3600) {
} else {
timeCount = 0;
}
}
int row(int i) {
if(i == 1) {
return 2;
} else if (i == 2) {
return 7;
} else if (i == 3) {
return 19;
} else if (i == 4) {
return 5;
} else if (i == 5) {
return 13;
} else if (i == 6) {
return 18;
} else if (i == 7) {
return 12;
} else if (i == 8) {
return 16;
}
}
int col(int i) {
if(i == 1) {
return 6;
} else if (i == 2) {
return 11;
} else if (i == 3) {
return 10;
} else if (i == 4) {
return 3;
} else if (i == 5) {
return 17;
} else if (i == 6) {
return 4;
} else if (i == 7) {
return 8;
} else if (i == 8) {
return 9;
}
}
void drawScreen(int character[8][8]) {
for(int j = 0; j < 8; j++) {
int rowNumber = j + 1;
digitalWrite(row(rowNumber), HIGH);
for (int k = 0; k < 8; k++) {
int columnNumber = k + 1;
if(character[j][k] == 1) {
digitalWrite(col(columnNumber), LOW);
}
digitalWrite(col(columnNumber), HIGH);
}
digitalWrite(row(rowNumber), LOW);
}
}
Compartir en
facebook
twitter
google
pinterest
Nivel: Bsico
Coste: < 30
Tiempo: 25
1 x Arduino Uno
1 x Protoboard
1 x LDR
1 x Potencimetro 10k
5 x Diodos LED
5 x Resistencias 220
1 x Resistencia 1K
1 x Juego de Cables
Salidas
LDR
Regulador
Para las salidas, ya hemos aprendido en otros tutoriales como conectar unos diodos LED y
como calcular su resistencia ptima.
En cuanto al LDR, es nuevo para nosotros, en breve tendris disponible un tutorial sobre este
componente, as que de momento nos vamos a quedar en que funciona como una resistencia
variable de manera que, cuanta ms cantidad de luz reciba, menor ser su resistencia, para
que quede claro, si en un potencimetro varibamos la resistencia deslizando un patn por la
pista de material resistivo, aqu lo har la cantidad de luz que reciba la foto-resistencia.
Que si aadimos una resistencia ms, podemos utilizar el LDR para hacer el ya conocido
divisor de tensin de donde sacaremos la seal para conectar a nuestra entrada analgica de
Arduino.
Podemos conectarlo de dos maneras diferentes:
Si utilizamos el LDR como resistencia inferior del divisor de tensin, nos dar la tensin
mxima cuando tengamos el LDR en plena oscuridad, ya que estar oponiendo el mximo de
su resistencia al paso de la corriente derivndose esta por Vout al completo, si lo utilizamos
como resistencia superior, el resultado ser el inverso, tendremos la tensin mxima cuando
est completamente iluminado, ya que se comportar prcticamente como un cortocircuito, con
una resistencia de 50 o 100.
En este caso lo hemos utilizado como resistencia superior, de manera que cuanta ms luz
haya, ms tensin tendremos a la entrada de nuestra entrada analgica pudiendo ajustar as,
de una manera muy intuitiva, la tensin de referencia que ahora explicar.
Como tercera parte del circuito, hemos colocado un potencimetro configurado como divisor de
tensin para hacer las funciones de regulacin del rango de iluminacin a partir del cual se
activar nuestro circuito de iluminacin.
1024 pasos que va a leer nuestro Arduino, pero quizs solo vayamos a trabajar en 500 o 600
pasos, desperdiciando mucha resolucin.
Para solucionar esto, adems de evitar cambiar el programa de Arduino cada vez que lo
cambiemos de entorno, he decido usa una funcin que nos proporciona Arduino muy
internaste, el pin Aref
Qu es el pin AREF?
Cuando Arduino toma una seal analgica y la convierte a digital en 1024 cachitos, lo hace por
defecto pensando que la seal que va a recibir puede variar entre 0v y 5v lo que nos da
aproximadamente un valor por cada 4,88 mV, pero nosotros podemos decirle que no, que
realmente va a trabajar entre 0v y 3v, obteniendo as 1024 cachitos distribuidos entre 0v y 3v, lo
que nos da un valor por cada 2,9 mV, es decir una resolucin mucho mayor.
Debemos tener en cuenta que este pin lleva internamente una resitencia de 32K para evitar
daar el chip, de manera que si vamos a conectar el pin mediante una resistencia fija, se va a
producir un nuevo divisor de tensin, con lo que habr que calcular la resistencia adecuada
para la tensin exacta que queremos introducir mediante una sencilla frmula:
Donde:
De manera que si por ejemplo, estamos introduciendo una tensin de +3v a travs de una
resistencia de 5K, la tensin real de referencia en nuestro Arduino ser de:
(32000/(32000+5000)) x 3 = 2,59v
Porqu evita cambiar el programa continuamente?
Por que variando la seal de referencia, le estamos diciendo que nos tome 1024 valores entre
0v una determinada tensin mxima, y el reparto de esos valores ya los hemos fijado
equitativamente en nuestro programa para que haga una activacin progresiva de las lneas de
iluminacin, por tanto, aunque tengamos un rango muy bajo de iluminacin con el que jugar, de
1v por ejemplo, nos va a distribuir siempre proporcionalmente la activacin de las salidas.
Esa tensin de referencia, ser el punto de iluminacin a partir del cual, si decrece la luz
ambiente, empezar a decrecer los valores obtenidos en la seal analgica de entrada.
Si ponemos esa referencia muy baja, empezar a funcionar los led con menos luz ambiente
que si ponemos una seal muy alta, recordemos:
Parte 3: Programando
Este programa es algo ms largo que los anteriores, pero desgranndolo poco a poco seguro
que seremos capaces de entenderlo.
Primero veamos el cdigo al completo:
/*
Tutorial # 0004 Arduino Academy - Sensor LDR
void setup()
{
//Establecemos como salida los pines para LED
pinMode(pinLed1, OUTPUT);
pinMode(pinLed2, OUTPUT);
pinMode(pinLed3, OUTPUT);
pinMode(pinLed4, OUTPUT);
pinMode(pinLed5, OUTPUT);
void loop()
{
//Guardamos el valor leido en una variable
valorLDR = analogRead(pinLDR);
}
En este programa os tiene que resultar casi todo conocido de los anteriores proyectos, si no, os
recomiendo echar un vistazo alos anteriores tutoriales Arduino que tenemos en la
despensa. La instruccin que no hemos visto nunca es la siguiente:
analogReference(EXTERNAL);
Con esta instruccin le estamos diciendo a nuestro Arduino, que no use su tensin de
referencia por defecto (+5v) sino la que nosotros introduzcamos por el pin AREF de nuestra
placa, como explicamos en la seccin de hardware.
A continuacin podemos ver que en el loop, lo primero que hacemos es almacenar la lectura de
la entrada analgica en una variable para luego, dependiendo de los datos obtenidos, hacer
una cosa u otra.
valorLDR = analogRead(pinLDR);
Y una vez obtenida la lectura empezamos la discriminacin mediante sentencias if.. if else..
else.. Utilizamos if else para aadir varias condiciones seguidas, y un ltimo else para cerrar
las condiciones.
En el siguiente diagrama de flujo de programa podemos ver como actuar Arduino a nuestras
comparaciones:
Podramos haber acortado alguna lnea de programa con un par de cambios, pero creo que de
esta manera se entiende mejor dado que estamos empezando, ya habr tiempo de complicar el
tema!
Y eso es todo por hoy!
Y si hay algn resquicio del proyecto que no acabis de entender, escribir un comentario con
vuestras dudas.
Hasta pronto!!
# Sensor de temperatura NTC
Bienvenidos a un nuevo tutorial para sacar el mximo partido a vuestro Arduino, seguimos con
los sensores, en este caso exploramos las posibilidades de un sensor de temperatura NTC:
Nivel: Bsico
Coste: <30
Tiempo: 25
1 x Arduino Uno
1 x Protoboard
1 x NTC
1 x Potencimetro 10k
5 x Diodos LED
5 x Resistencias 220
1 x Resistencia 1K
1 x Juego de Cables
Salidas.
aumentamos, llegamos a un punto en que esa disipacin afecta a la resistencia del sensor, por
lo que deducimos que la respuesta de una NTC no es lineal sino hiperblica, pero al colocarlo
como un divisor de tensin la variacin de tensin Vout va a ser prcticamente lineal.
En cuanto a la otra resistencia que formar el divisor de tensin, utilizaremos una de 1K, esto
es as para aprovechar el rango de muestreo que nos proporciona Arduino con un consumo de
corriente limitado, veamos rpidamente el motivo.
Si recordamos la ecuacin del divisor de tensin:
Veremos que si la resistencia mxima de nuestra NTC va a ser 10K, y la fija de 1K,
tendremos una variacin de tensin entre 0v y 4,55v. Podis hacer cuentas vosotros mismos
con otros valores y veris que si aumentamos la resistencia, disminuye el rango de Vout, y si la
disminuimos, aumentar los consumos de corriente en exceso.
Entrada de ajuste mnimo de temperatura.
Para tener un mando sobre el que ajustar la temperatura mnima, simplemente colocaremos un
potencimetro dispuesto como divisor de tensin, a una de las entradas analgicas y
utilizaremos su muestreo para mapearlo a nuestro antojo como veremos en la seccin de
programacin.
Salidas.
Para las salidas utilizaremos la ya conocida configuracin de LED ms resistencia.
De manera que el esquema elctrico global nos quedara as:
Parte 3: Programando
Veamos primero el cdigo al completo:
/*
Tutorial # 0005 Arduino Academy - Sensor NTC
//Escala de Avisos
int escala = 2;
// [V]
// [ohm]
// [V]
// [ohm]
void setup() {
void loop()
{
//Primero leemos el pootencimetro
tempMin = analogRead(analogPin2);
//Lo mapeamos a valores de -100 a 800
tempMin = map (tempMin, 0, 1023, -100, 800);
//Y lo dividimos entre 10 para darle un decimal
tempMin = tempMin/10;
Serial.println("-----------------------------------------------");
Serial.println();
Serial.print("AJUSTE DE TEMPERATURA MINIMA A ");
Serial.print(tempMin);
Serial.println(" GRADOS CELSIUS");
Serial.println();
Serial.println("-----------------------------------------------");
digitalWrite(pinLed2, LOW);
digitalWrite(pinLed3, LOW);
digitalWrite(pinLed4, LOW);
digitalWrite(pinLed5, LOW);
}
else if (((TempC <= (tempMin + escala)) & (TempC > tempMin)))
{
digitalWrite(pinLed1, HIGH);
digitalWrite(pinLed2, HIGH);
digitalWrite(pinLed3, LOW);
digitalWrite(pinLed4, LOW);
digitalWrite(pinLed5, LOW);
}
else if (((TempC<=(tempMin+(escala*2)))&(TempC>tempMin+escala)))
{
digitalWrite(pinLed1, HIGH);
digitalWrite(pinLed2, HIGH);
digitalWrite(pinLed3, HIGH);
digitalWrite(pinLed4, LOW);
digitalWrite(pinLed5, LOW);
}
else if ((TempC<=(tempMin+(escala*3)))&(TempC>tempMin+(escala*2)))
{
digitalWrite(pinLed1, HIGH);
digitalWrite(pinLed2, HIGH);
digitalWrite(pinLed3, HIGH);
digitalWrite(pinLed4, HIGH);
digitalWrite(pinLed5, LOW);
}
else if (TempC > (tempMin + (escala*4)))
{
digitalWrite(pinLed1, HIGH);
digitalWrite(pinLed2, HIGH);
digitalWrite(pinLed3, HIGH);
digitalWrite(pinLed4, HIGH);
digitalWrite(pinLed5, HIGH);
}
Ahora introduciremos los datos para hacer las ecuaciones que nos permitirn, en base a a la
lectura de nuestra entrada analgica conectada al divisor de tensin, calcular la temperatura.
float Vin = 5.0;
// [V]
// [ohm]
// [V]
// [ohm]
Veris que a la hora de definir el tipo de cada variable, tenemos algo nuevo, la variable de
tipo float, esta variable es para los nmeros en coma flotante (nmero decimal), estas
variables tienen un valor mximo 3.4028235E+38, y como mnimo -3.4028235E+38. Ocupan
4bytes (32bits) con una resolucin mucho mayor que los enteros, lo que nos permitir hacer
clculos bastante precisos, debemos tener en cuenta no olvidarnos de poner la coma en los
nmeros que utilicemos en la operacin como vemos en las lneas de cdigo, de manera que
evitemos errores de interpretacin en nuestro programa.
En cuanto a los parmetros necesitaremos conocer 2 datos de nuestra NTC que vendrn
dispuestos en el datasheet, una resistencia de referencia a una temperatura determinada, en
nuestro caso 2800 a 25 y la Beta de nuestra NTC en Kelvin, para nosotros 3950 K.
Un poco ms abajo explicaremos en detalle todo esto.
Un vez finalizada la declaracin de variables globales, nos toca configurar el setup, de nuevo
tenemos una lnea nueva!
Serial.begin(9600);
Esta instruccin nos inicializa la comunicacin puerto serie desde Arduino al PC a una
velocidad de 9600 baudios (bits por segundo), con esto, cualquier cosa que enviemos lo
podremos visualizar en el monitor de puerto serie de nuestro software de Arduino o cualquier
otro.
Luego, como siempre, declaramos que pines van a ser entradas y cuales van a ser salidas.
//Declaramos pines de salida
pinMode(pinLed1, OUTPUT);
pinMode(pinLed2, OUTPUT);
pinMode(pinLed3, OUTPUT);
pinMode(pinLed4, OUTPUT);
pinMode(pinLed5, OUTPUT);
Siendo:
Con esta ecuacin podremos saber cual ser la resistencia mxima que nos va a dar nuestra
NTC al calcular su curva caracterstica, en nuestro caso, 10K lo que nos sirve para disear el
divisor de tensin.
Observamos que, si calculamos Rt, tendremos todos los datos para hallar la temperatura en un
valor de resistencia determinado despejando T, veamos la ecuacin despejada que utilizaremos
en nuestro programa:
Bien, ya tenemos la ecuacin para hallar la temperatura, pero nos faltara saber cual es la
resistencia de la NTC, para esto primero calcularemos cual es la tensin de entrada de nuestra
entrada analgica, es decir, la Vout de nuestro divisor de tensin:
Con esto hallamos cuanto vale cada bit de la conversin analgico-digital (recordemos que
nuestro conversor divide los 5 voltios entre 1024 cachitos) y lo multiplicamos por la cantidad de
bit que nos lee la entrada analgica, con lo que tenemos la tensin que le est llegando a la
entrada analgica.
Una vez tenemos esto, si recordamos la frmula del divisor de tensin:
Vemos que tenemos todos los datos a excepcin de Rinferior, que es justo la resistencia de la
NTC que necesitamos para calcular la temperatura, por lo que despejando nos queda:
Con esto ya tenemos todos los datos para calcular nuestra temperatura a partir de las lecturas
de la entrada analgica, de manera que nos quedar de la siguiente manera al plasmarlo en
nuestro programa.
//Primero la Vout del divisor
Vout=(Vin/1024)*(analogRead(analogPin1));
Protoboard o breadboard
Arduino
Un zumbador (buzzer)
Cables para realizar conexiones:
20 macho a macho
Qu es un sensor de ultrasonidos?
Segn la Wikipedia:
El sensor emite un sonido y mide el tiempo que la seal tarda en
regresar. Estos reflejan en un objeto, el sensor recibe el eco producido y
lo convierte en seales elctricas, las cuales son elaboradas en el
aparato de valoracin. Estos sensores trabajan solamente en el aire, y
pueden detectar objetos con diferentes formas, colores, superficies y de
diferentes materiales. Los materiales pueden ser slidos, lquidos o
polvorientos, sin embargo han de ser deflectores de sonido. Los
sensores trabajan segn el tiempo de transcurso del eco, es decir, se
valora la distancia temporal entre el impulso de emisin y el impulso del
eco.
Las conexiones de los componentes son:
Sensor de ultrasonidos:
Leds:
ltimo verde)
Ctodo: Mediante una resistencia de 220 ohmios cada uno a
masa (GND)
Zumbador (buzzer):
//
}
void loop() {
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
los pulsos recibidos por el "echo"
distance = (duration/2) / 29.1;
obstculo segn la duracin entre los pulsos recibidos