Quantcast
Channel: Arduino Guay - Proyectos Arduino, Electrónica y Micros
Viewing all 12 articles
Browse latest View live

Bienvenidos

$
0
0
Hola a todos
Comienzo con este blog para compartir mis experiencias en electrónica, mis  'cacharreos', y toda la posible información que pueda proporcionar.
La idea es publicar sobre todo mis experiencias en los desarrollos con Arduino.
Hasta ahora había cacharreado más con los PICS, pero descubrí el mundo de Arduino y tengo que decir que me ha gustado mucho.
Para el que no lo conozca, es una plataforma abierta para la que podéis encontrar infinidad de material, tanto   Hardware como Software.
Por cierto también soy aficionado a comprar en Dealextreme, y últimamente tiene infinidad de cacharritos para nuestros desarrollos, ya los iré mostrando.
Poco a poco iré mostrando cosas sobre esta plataforma: enlaces, librerías, y todo lo que pueda.
Pero bueno, menos rollo y vamos al tema .....


Led RGB 'Rainbow' con Arduino

$
0
0
Bueno, vamos a empezar con una 'tontá' para ir entrando en materia. La idea es hacer que un led RGB haga un efecto 'Rainbow' como lo hacen algunos por si solos (son leds RGB que varían su color automáticamente pasando por los colores del arco iris).
En mi caso voy a utilizar un led RGB de Dealextreme. Este led teóricamente de 5W, produce una gran cantidad de luz y es muy robusto.
Como el arduino no puede dar una corriente muy grande por sus salidas, utilizare un ULN2003  como driver para no cargar demasiado.

Este es el montaje:

RGB Led 'Rainbow' con Arduino 




Y este el esquema:

Esquema RGB Led 'Rainbow' con Arduino

Y aquí os dejo un vídeo del sistema funcionando:


El código es bastante sencillo  (para copiar el código hacer doble click sobre el)

/*
* RGB Rainbow
* Ejemplo de como hacer un led 'Rainbow' con un led RGB de
* ánodo común Se utilizan tres salidas con la instrucción
* 'analogWrite' que produce una salida PWM para controlar
* el brillo de cada led.
* Autor: Jose Daniel Herrera
* Fecha: 22/08/2012
* http://arduino-guay.blogspot.com.es
*/

// Retardo que determina la velocidad de la transicion entre
// colores
#define RETARDO 10
#define MAXBRILLO 50

// Salidas para cada color (tiene que permitir PWM).
int rojo = 9;
int verde = 11;
int azul = 10;

/*
* Funcion para variar el valor de PWM
* Para dir =1 aumenta para dir = -1 disminuye
*/
void fade(int pin, int dir)
{
if ( dir != 1 )
{
for (int i = MAXBRILLO; i >= 0; i--)
{
analogWrite(pin, i);
delay(RETARDO);
}
}
else
{
for (int i = 0; i <= MAXBRILLO; i++)
{
analogWrite(pin, i);
delay(RETARDO);
}
}
}

/*
* Ponemos los pines como salidas , y
*/
void setup()
{
pinMode(rojo, OUTPUT);
pinMode(verde, OUTPUT);
pinMode(azul, OUTPUT);

//Partimos del amarillo
analogWrite(rojo, MAXBRILLO);
analogWrite(verde, MAXBRILLO);
analogWrite(azul, 0);

}

/*
* Vamos cambiando los tres colores de modo que se produce
* Un paso por todos los colores RGB y sus mezclas 2 a 2
*/
void loop()
{

fade(verde,-1); // amarillo -> rojo
fade(azul,1); // rojo -> violeta
fade(rojo,-1); // violeta -> azul
fade(verde,1); // azul -> cian
fade(azul,-1); // cian -> verde
fade(rojo,1); // verde -> amarillo
}

Arduino RGB led manejado por control remoto

$
0
0
Aprovechando el post anterior, vamos a añadir al circuito un receptor de infrarrojos de manera que podamos variar el color y el brillo del led con un mando a distancia de Dealextreme que viene perfecto para el proyecto. El mando en cuestión el el SKU: 47019, es un mando muy barato que viene con pila incluida :
Mando infrarrojo remoto RGB

Para conseguir que el Arduino lo detecte, utilizaremos un receptor infrarrojo del tipo TSOP 1738 o similar (en mi caso tengo un 1736 y funciona igualmente a pesar de que el mando utiliza una portadora de 38KHz).



El esquema es el siguiente:
Led RGB controlado por IR remoto con Arduino

 Y el montaje queda de esta manera:

Led RGB controlado por IR remoto con Arduino

Ahora necesitamos la librería IRRemote , que permite leer los códigos de multitud de mandos a distancia. En particular funciona perfectamente con nuestro mando (que utiliza el protocolo de NEC).
Debemos descargar la librería  e instalarla en nuesto entorno de Arduino.

El código para ejemplo sería el siguiente (para copiar el código hacer doble click sobre el):

/*
* Control remoto de LED RGB
* Ejemplo de como hacer variar el color y el brillo con un led RGB
* con un mando a distancia.
* Se utiliza un receptor de infrarrojos del tipo TSOP1738
* Autor: Jose Daniel Herrera
* Fecha: 28/08/2012
* http://arduino-guay.blogspot.com.es
*/

#include "IRremote.h"

int RECV_PIN = 8;
int R_PIN = 9;
int G_PIN = 6;
int B_PIN = 10;

#define ON 0XFFE01F
#define OFF 0xFF609F
#define BRIGHTNESS_UP 0xFFA05F
#define BRIGHTNESS_DOWN 0xFF20DF
#define FLASH 0xFFF00F
#define STROBE 0xFFE817
#define FADE 0xFFD827
#define SMOOTH 0xFFC837

#define RED 0xFF906F
#define GREEN 0XFF10EF
#define BLUE 0xFF50AF
#define WHITE 0xFFD02F

#define ORANGE 0xFFB04F
#define YELLOW_DARK 0xFFA857
#define YELLOW_MEDIUM 0xFF9867
#define YELLOW_LIGHT 0xFF8877

#define GREEN_LIGHT 0XFF30CF
#define GREEN_BLUE1 0XFF28D7
#define GREEN_BLUE2 0XFF18E7
#define GREEN_BLUE3 0XFF08F7

#define BLUE_RED 0XFF708F
#define PURPLE_DARK 0XFF6897
#define PURPLE_LIGHT 0XFF58A7
#define PINK 0XFF48B7

#define INCREMENTO 10

unsigned long rgb = 0;
byte r,g,b;

IRrecv irrecv(RECV_PIN);

decode_results results;


void setup()
{
irrecv.enableIRIn(); // Inicializamos el receptor
Serial.begin(9600);
pinMode(R_PIN, OUTPUT);
pinMode(G_PIN, OUTPUT);
pinMode(B_PIN, OUTPUT);
}


void variar (byte* color, char valor) {
if (valor > 0) {
if ( *color + valor <= 255) {
*color += valor;
} else {
*color = 255;
}
} else {
if (*color + valor >= 0) {
*color += valor;
} else {
*color = 0;
}
}
}

void RGB(unsigned long valor) {
r = valor >> 16;
g = (valor >> 8) & 0xFF;
b = valor & 0xFF;
}

void loop() {
if (irrecv.decode(&results)) {
if ( results.value != 0xFFFFFFFF) {
switch (results.value) {
case BRIGHTNESS_UP :
variar (&r, INCREMENTO);
variar (&g, INCREMENTO);
variar (&b, INCREMENTO);
break;
case BRIGHTNESS_DOWN :
variar (&r, -INCREMENTO);
variar (&g, -INCREMENTO);
variar (&b, -INCREMENTO);
break;
case OFF :
r = g = b = 0;
break;
case RED : RGB(0x00FF0000); break;
case GREEN : RGB(0x0000FF00); break;
case BLUE : RGB(0x000000FF); break;
case WHITE : RGB(0x00FFFFFF); break;
case ORANGE : RGB(0x00FF7F00); break;
case YELLOW_DARK : RGB(0x00FFAA00); break;
case YELLOW_MEDIUM : RGB(0x00FFD400); break;
case YELLOW_LIGHT : RGB(0x00FFFF00); break;
case GREEN_LIGHT : RGB(0x0000FFAA); break;
case GREEN_BLUE1 : RGB(0x0000FFFF); break;
case GREEN_BLUE2 : RGB(0x0000AAFF); break;
case GREEN_BLUE3 : RGB(0x000055FF); break;
case BLUE_RED : RGB(0x00000080); break;
case PURPLE_DARK : RGB(0x003F0080); break;
case PURPLE_LIGHT : RGB(0x007A00BF); break;
case PINK : RGB(0x00FF00FF); break;
}
Serial.println(results.value, HEX);
Serial.println(r,DEC);
Serial.println(g, DEC);
Serial.println(b, DEC);
analogWrite(R_PIN,r);
analogWrite(G_PIN,g);
analogWrite(B_PIN,b);
}
irrecv.resume(); // Receive the next value
}
}
¡Cuidado!: La librería IRremote utiliza internamente el TIMER2 del Arduino.Esto hace que las salidas 11 y 3 no funcionen como PWM (por eso he cambiado el led verde a la salida 6). Por otro lado hay una versión más nueva de la librería IRremote , que reconoce bastantes protocolos más de códigos infrarrojos, pero al parecer después de varias pulsaciones los códigos obtenidos parecen aleatorios ....¿?.Puede serviros para soportar otros mandos a distancia o para otros proyectos.
Para obtener las constantes, he utilizado el ejemplo que viene con la librería 'IRrecvDemo', que permite mostrar en la consola los códigos enviados por cada botón del mando.
Esto mismo es válido si se desea utilizar otro mando a distancia distinto.

Aquí dejo un vídeo del invento funcionando:



Órgano de luces psicodélicas con Arduino

$
0
0


Introducción

Los que tengáis unos cuantos años como yo recordaréis que allá por los 80, en cualquier discoteca o fiesta que se terciara, eran obligatorias las las luces psicodélicas, es decir aquellas luces que variaban al ritmo de la música. Podía ser una única luz o varias, normalmente 3 que variaban con sonidos graves, medios  y agudos de la música.
Se podían conseguir ya hechas (muy caras para aquella época), en kit (los míticos SalesKit) o bien hacértelas tu mismo.
Bien pues yo era un fan de las luces (y de las fiestas) y construí un par de ellas, la primera hace más  de 30 años  (si, si, ...) en una estupenda caja hecha de chapa de madera, pero por desgracia hace algunos meses acabó en la basura ..
La segunda de hace unos 30 años .. todavía sigue vivíta y coleando .....

Organo de luces sicodélicas Elektor 1982

Sacada de la estupenda revista Elektor de Marzo de 1982

Revista Elektor Marzo 1982

Bueno pues después de esta historia del abuelo cebolleta, vamos a ver como emular aquellas míticas luces con nuestro querido Arduino.
La idea es utilizar una fuente de sonido, en mi caso un micrófono, adecuarla al nivel de las entradas del Arduino, aplicarle un proceso de FFT para separar las distintas frecuencias, agrupar estas en tres canales (graves, medios y agudos), y en función de que estos superen un determinado nivel poner a nivel alto tres salidas del Arduino.
Estas salidas inicialmente pueden atacar unos leds, pero para que sea más auténtico luego utilizaremos unas etapa de salida con triacs para poder atacar unas bombillas.

¿Te interesa? sigue leyendo en el siguiente post ...


El vídeo del sistema funcionando para ir haciendo boca......


Órgano de luces con Arduino (II)

$
0
0

<< Organo de luces (I) - IntroducciónOrgano de luces (III) - Etapa de potencia >>

Obtención de la señal

Como comentaba en el post anterior, en mi caso voy a  a utilizar un micrófono como fuente de señal, esto evita tener que conectar la fuente directamente y proporciona más libertad de movimiento.
Yo he utilizado un módulo de Dealextreme (como no), el SKU: 135533, que es un módulo detector de sonido con una salida digital y una analógica. Aquí utilizaremos esta última.
Como el nivel de la señal que entrega es muy pequeño, he utilizado un vetusto u741 (pero funcional) que había por un cajón, para adecuar la señal a la entrada del Arduino.
También es posible utilizar directamente un micrófono electret , pero habrá que amplificarlo adecuadamente (podéis encontrar infinidad de esquemas en internet), o bien utilizar un módulo ya amplificado como este 

El esquema de montaje es este (clik en las imágenes para ampliar):

Esquema del organo de luces con Arduino
Y el montaje este:

Montaje del organo de luces con Arduino



Algunos detalles:

  • La resistencia de 1k para alimentar el módulo reduce en gran manera el ruido en la alimentación producido por el Arduino, que se traslada luego a la salida. 
  • El u714 está en una configuración básica de amplificador, a su salida se obtiene una señal de aproximadamente 1Vpp con un offset de 5V/2  ~ 2.5V.
  • Como la entradas analógicas de Arduino necesitan señales de 0 a 5V,  el divisor de tensión formado por R1/R2 crean un offset de aprox 0.5V para que la señal tenga un rango del 0 a 1 V aprox.
  • Para poder medir con mayor precisión, programaremos la referencia del conversor analógico del Arduino como INTERNAL, que tiene un valor de 1,1V en vez de los 5V de defecto.
El código, puedes descargarlo aquí:    Código
/*
* Organo de luces psicodelicas
* Organo de luces de tres canales , utilizando la FFT
* Autor: Jose Daniel Herrera
* Fecha: 05/09/2012
* http://arduino-guay.blogspot.com.es
*/

#include "fix_fft.h"

#define MUESTRAS 128 // Numero de muestras para el cálculo de la FFT
#define LOGM 7 // Logaritmo en base 2 del número de muestras

#define BAJOS_MEDIOS 7 // Nº de banda para el corte entre Bajos y Medios
#define MEDIOS_AGUDOS 35 // Nº de banda para el corte entre Medios y Agudos

#define BPIN 9 // Pin de salida Bajos
#define MPIN 10 // Pin de salida Medios
#define APIN 11 // Pin de salida Agudos

#define MAX_PASADAS 10 // Nº de pasadas para el cálculo de los límites

char data[MUESTRAS]; // Array con los valores muestreados (parte real)
char im[MUESTRAS]; // Array con los valores muestreados (parte imaginaria)

unsigned char salida[MUESTRAS/2]; // Valores obtenidos de la FFT (espectro de 64 bandas)
unsigned char bajos,medios,agudos; // Valores calculados para cada canal

byte pasada, // nº de pasada para el cáculo de los límites
acumBajos,acumMedios,acumAgudos, // acumuladores de veces que se supera el límite
limBajos,limMedios,limAgudos; // límites calculados para cada canal


/*
* Funcion que aplica una ventana de Hann a los datos muestreados para reducir el
* efecto de las discontinuidades en los extremos
*/
void aplicaVentana (char *vData) {
double muestrasMenosUno = (double(MUESTRAS) - 1.0);
// Como la ventana es simétrica , se calcula para la mitad y se aplica el factor por los dos extremos
for (uint8_t i = 0; i < MUESTRAS/2 ; i++) {
double indiceMenosUno = double(i);
double ratio = (indiceMenosUno / muestrasMenosUno);
double factorPeso = 0.5 * (1.0 - cos(6.28 * ratio));
vData[i] *= factorPeso;
vData[MUESTRAS - (i + 1)] *= factorPeso;
}
}

void setup() {
// Configuramos el prescaler a 32 -> 16Mhz/32 = 500 KHz
// como cada conversion son 13 ciclos 500/13 ~ 38.4KHz
// Es decir podemos medir en teoria hasta unos 19KHz,
// que para este proyecto sobra.
bitWrite(ADCSRA,ADPS2,1);
bitWrite(ADCSRA,ADPS1,0);
bitWrite(ADCSRA,ADPS0,1);

// Como la señal es muy baja,utilizamos la referencia interna
// de 1.1 V en vez de la de defecto de 5 V.
analogReference(INTERNAL);

// Salidas para los canales de Bajos,Medios y Agudos
pinMode(BPIN,OUTPUT);
pinMode(MPIN,OUTPUT);
pinMode(APIN,OUTPUT);

// Variables para el cálculo de los límites
pasada = 0;
acumBajos = acumMedios = acumAgudos = 0;
limBajos = limMedios = limAgudos = 50;
}

void loop() {

// Realizamos el muestreo
for( int i=0; i < MUESTRAS; i++) {
data[i] = analogRead(0)/4 -128; //Convertimos de 0..1024 a -128..127
im[i] = 0; // parte imaginaria = 0
}

// Aplicamos la ventana de Hann
aplicaVentana (data);

// Calculamos la FFT
fix_fft(data,im,LOGM,0);

// Sólo nos interesan los valores absolutos, no las fases, asi que
// calculamos el módulos de los vectores re*re + im*im.
// Dado que los valores son pequeños utilizamos el cuadrado
for (int i=0; i < MUESTRAS/2; i++){
salida[i] = data[i] * data[i] + im[i] * im[i];
}

// Ahora repartimos las bandas entre las 3 salidas
// En vez de sacar la media, utilizo sólo el valor máximo de
// una banda
bajos = 0;
for (int i=2; i < BAJOS_MEDIOS; i++){
bajos += salida[i];
}
bajos = bajos/2;

medios = 0;
for (int i=BAJOS_MEDIOS ; i < MEDIOS_AGUDOS; i++){
medios += salida[i];
}
medios = medios/2;

agudos = 0;
for (int i=MEDIOS_AGUDOS; i < MUESTRAS/2; i++){
agudos += salida[i];
}
agudos = agudos/2;

// Calculamos si el canal correspondiente
// supera le límite para encenderlo
int siBajos = bajos > limBajos;
int siMedios = medios > limMedios;
int siAgudos = agudos > limAgudos;

digitalWrite(BPIN,siBajos ? HIGH : LOW);
digitalWrite(MPIN,siMedios? HIGH : LOW);
digitalWrite(APIN,siAgudos? HIGH : LOW);

// Utilizamos las veces que se supera para
// recalcular el límite y evitar que con los
// cambios de volumen los canales se saturen
// o no funcionen.
acumBajos += siBajos;
acumMedios += siMedios;
acumAgudos += siAgudos;

if ( ++pasada > MAX_PASADAS ) {
pasada = 0;
limBajos = 20 + acumBajos*5;
limMedios = 20 + acumMedios*5;
limAgudos = 20 + acumAgudos*5;
acumBajos = 0;
acumMedios = 0;
acumAgudos = 0;
}
}

Necesitaréis la librería fix_fft que podéis descargar de aquí :  fix_fft

El código

El código está comentado para poderlo seguir fácilmente, pero veamos básicamente su funcionamiento.
Esta parte contiene una dosis de matemática que puede ser algo aburrida para algunos, si no te interesa simplemente pasa de ella :-). 

Inicialización
Se configura como antes hemos dicho la referencia analógica como INTERNAL, para medir tensiones del orden de 1V. También se configura el prescaler a 32 (el prescaler divide la frecuencia de reloj del micro para realizar las conversiones A/D entre otras cosas), para conseguir un a frecuencia de muestreo de unos 38 KHz, lo cual es más que suficiente para este proyecto. Luego se configuran los pines de salida.

Bucle
Se realiza un muestreo de 128 muestras, se pasa pon una función de ventana (Hann), para minimizar los efectos de las discontinuidades al principio y al final del muestreo y luego se aplica la transformada rápida de Fourier con la llamada a fix_fft.
Después de esto en data tenemos los valores de las 64 bandas (Nmuestras/2) .
Como nos interesan en valor absoluto y no las partes reales e imaginarias por separado, calculamos el módulo, y puesto que el valor es algo pequeño lo dejamos al cuadrado.

A continuación sólo queda agrupar los valores en tres bandas (graves, medios y agudos) y en función de si superan un límite activar las salidas.
El límite varía en función de la cantidad de veces que cada canal se enciende, lo que proporciona una cierta realimentación y evita que con los cambios de volumen un canal se sature o no se encienda.
La agrupación de las bandas y los límites los he obtenido probando, podéis realizar vuestras pruebas para obtener otros resultados.

Si te ha gustado no te pierdas el próximo post para ver como conectarlo a bombillas de verdad :




Órgano de luces con Arduino (III)

$
0
0


ATENCIÓN: En este parte se utiliza la tensión de red, lo cual puede llevar sus riesgos. Si no tienes suficiente experiencia o no te crees capacitado, mejor utiliza unos cuantos leds a baja tensión y evítate un susto. El autor no se hace responsable de cualquier posible daño producido por no tomar las debidas medidas de seguridad.
Para la etapa de potencia he utilizado unos triacs del tipo BT137 controlados por optoacopladores del tipo MOC3041. Dependiendo de la potencia que queráis controlar, es posible cambiar el tipo de TRIAC por uno de menor potencia (o mayor ...).
Los optoacopladores MOC3041 contienen internamente un circuito de control para el disparo al paso por cero, es decir el triac siempre se cerrará la pasar la tensión por cero evitando interferencias.
Se pueden utilizar otro tipo de optoacopladores respetando el circuito recomendado por el fabricante.

El esquema es el siguiente:

Etapa de potencia para órgano de luces sicodélicas con Arduino

Y este el aspecto una vez montado (en mi caso la etapa es de 4 canales)

Etapa de potencia para órgano de luces sicodélicas con Arduino

Observar que está montado en una caja convenientemente aislada. Los Triacs llevan disipadores para soportar cargas continuas elevadas (en este caso soportan 8A, lo que permite unos 1500W por canal).

El resultado:


Que os divirtáis ....

Reproductor MP3 con Arduino I

$
0
0



Después de algún tiempo trabajando y peleando,  os presento este nuevo proyecto Arduino: Un completo reproductor de MP3 basado en Arduino.
Como podéis observar en la foto, la idea era construir un reproductor independiente, al estilo de las antiguas radios o 'cassetes', en plena era de los Iphones ....
El reproductor utiliza un pequeño módulo basado en el chip VS1002d de VLSI (ya descatalogado, pero que tenía por un cajón). El módulo en cuestión lo compré en Futurlec . Actualmente se pueden conseguir módulos similares en ebay por algo más de 9€ , aunque el chip es el VS1003 o VS1053. También podéis utilizar una MP3 shield , pero bastante más cara (esta shield ya incluye una ranura SD).
Por lo que he podido ver los tres chips son bastante compatibles en cuanto a la programación, y de hecho casi toda la inicialización la he sacado de la librería para la MP3 Shield de SparkFun ;-)


Bueno el proyecto consta de :
  1. Arduino (como no)
  2. Módulo Mp3 basado en chip VS 1XXX
  3. Modulo SD (también se puede conseguir en ebay)
  4. LCD 4x20 caracteres
  5. Pequeño amplificador
  6. 2 altavoces.
Tanto el módulo SD como el MP3 se conectan al Arduino mediante el bus SPI. El LCD lo he conectado en modo 4 bits para ahorrar pines del Arduino.
Aquí os muestro una tabla con las distintas conexiones entre el Arduino y los distintos elementos. Entre paréntesis, la denominación de las distintas conexiones en los módulos (y la patilla correspondiente en el caso de la SD). Como podéis ver, he tenido que utilizar las entradas analógicas como salidas digitales para controlar el LCD.

PIN Arduino Módulo MP3Tarjeta SDLCDBotones
0-- -- --Adelante
1-- -- --Atrás
2DREQ-- ----
3-- -- RS--
4-- -- ENABLE  --
5(RESET)-- ----
6CS (XCS)-- ----
7DCS (BSYNC)   -- ----
8-- -- --Encoder A
9-- CS (CD/DAT3-1)   ----
10-- -- --Encoder B
11MOSI (SI) MOSI (CMD-2)----
12MISO (SO)MISO (DATO-7)----
13CLK (SCLK)CLK (5)----
A0-- -- D4--
A1-- -- D5--
A2-- -- D6--
A3-- -- D7--
A4-- -- ----
A5-- -- ----

Tanto el módulo MP3 como la tarjeta SD funcionan con 3,3V, así que toca adaptar niveles para hacerlos compatibles con los 5V del Arduino. La opción más sencilla es utilizar divisores de tensión con un par de resistencias , en mi caso he utilizado un divisor formado por una resistencia de 2,2K y una de 3,3 K. Para la señales hacia el micro no hace falta, los 3,3V se interpretan como nivel alto sin problema.
El esquema es el siguiente (clik para agrandar):
Esquema reproductor mp3 arduino vs1003
Según los módulos que utilicéis para el MP3 y la SD, deberéis ajustar los pines de los conectores (el orden mostrado en el esquema no corresponde a ningún módulo en concreto).
Si se utiliza el MP3 shield de SparkFun, revisad la documentación para ajustar  los pines de CS tanto para el MP3 como para la SD y modificarlo si es necesario en el códio fuente.

El resultado:

Reproductor MP3 Arduino VS1003

Aquí os dejo unas cuantas fotos del proceso de montaje :



En el próximo post el código ...

Reproductor MP3 con Arduino II

$
0
0

 << Reproductor Mp3 con Arduino I (Circuito)

La estructura de la SD

Es este post voy a intentar explicar un poco el código de nuestra 'Gramola' con corazón de Arduino.
El principal problema que encontré para realizar este proyecto, fue la limitación de la librería SD, con su FAT  reducida que sólo permitía la los nombres en formato 8.3.
La solución fue crear un pequeño catálogo en un archivo de texto de donde poder leer las entradas.

La estructura de directorios en la SD tiene el siguiente formato:
raiz
+-artistas.txt
+-[ARTIST01]
| +-album.txt
| +-[ALBUM01]
| | +-track.txt
| | +-track001.mp3
| | +-track002.mp3
| | .....
| | +-track0nn.mp3
| +-[ALBUM02]
| .......
| +-[ALBUMnn]
+-[ARTIST02]
.....
+-[ARTISTnn]
Es decir hay tres niveles : artista, álbum y  pista. Cada nivel tiene un fichero de texto con las entradas del catálogo (una linea de texto por cada artista, álbum  o canción).
Los nombres de las carpetas y los archivos deben ser tal como están en el esquema (siempre podéis cambiar el código).
Es un poco engorroso para crear la tarjeta, pero.... vale la pena.Yo he utilizado un programa que facilita mucho la tarea MP3Tag, que permite exportar a texto las pistas de un directorio y renombrar los mp3.



El código

Consta de una librería 'AGMp3' que maneja el chip y la SD , y el sketch del reproductor. Podéis descargarlos de aquí


La librería se encarga de la inicialización del chip,el bus SPI y  la SD. Tiene métodos para escribir/leer en los registros del chip, y para reproducir un mp3.
En cuanto al sketch comienza leyendo el fichero 'artistas.txt' que se encuentra en la raiz de la SD y luego a través del encoder y los botones 'navega' por la estructura de directorios. En cada nivel lee el fichero de texto correspondiente para cargar la lista del catálogo. En el último nivel reproduce el mp3 seleccionado.
Una vez se esta reproduciendo, el encoder se encarga de variar el volumen, que se muestra en el LCD con un valor de 0 a 10. El botón adelante permite pasar a la siguiente canción durante la reproducción.
Para mostrar el progreso de la canción, he definido unos caracteres sobre el LCD.

Aquí os dejo unas cuantas fotos del proceso de construcción:



Espero que os guste ! ....

 << Reproductor Mp3 con Arduino I (Circuito)


Árbol de Navidad Shield para Arduino

$
0
0
Árbol de Navidad Shield para Arduino con WS2812b

Llegan las Navidades, y nada más típico que montar un arbolito de Navidad para dar un poco de ambiente. Los hay de muchos tipos, pero este está pensado para los mas frikis, basado en leds RGB de última generación y pensado para 'plantarlo' sobre un Arduino.



El esquema no puede ser más simple: un Arduino, 20 leds direccionables WS2812b, unos cuantos condensadores de 100nF y un zumbador piezoeléctrico.

Esquema Árbol de Navidad Shield para Arduino con WS2812b


Los WS2812b se conectan en cascada a través de un único cable, con lo que la comunicación con Arduino es extremadamente sencilla, sólo un pin, los datos se van pasando de un circuito al siguiente, y esto permite que se pueda controlar cada led independientemente. Esto permite crear tiras o matrices de leds RGB más fácil que nunca.
El WS2812b, creo sin exagerar que es una auténtica joya. Internamente incluye los tres leds (R,G,B) y un circuito integrado WS2811, que es el encargado de manejar los datos pon un único pin, enviarlos al siguiente y controlar cada led con 256 niveles de intensidad.
Aquí os dejo un par de fotos que pude hacer al susodicho:


Árbol de Navidad Shield para Arduino con WS2812b

Imagen de WS2812b , WS2812, WS2811



¡Ojo! Hay otra versión el WS2812 igual al WS2812b pero con 6 pines, en la que la alimentación de los leds y del circuito van por separado.
Dado el boom que han tenido, es fácil encontrarlos en ebay, bien en tiras adhesivas dónde sólo hay que conectar el pin de entrada y la alimentación, o bien sueltos como es este caso.

Para el manejo del los leds, utilizo una estupenda librería: Adafruit neopixel, capaz de manejar de manera sencilla este tipo de leds.

El código

Como ya he comentado, utilizo la librería de Adafruit para controlar los leds. Básicamente es el ejemplo 'strandtest' de  la librería, al que he añadido una primera parte en la que se toca la melodía de 'Jingle Bells' utilizando la función tone, y algún efecto más.
Por si no se quiere oír constantemente la melodía, es necesario hacer un puente entre los pines 2 y 7 para que suene.

Este es el diseño del circuito impreso que he hecho:

PCB Árbol de Navidad Shield para Arduino con WS2812

Aunque teóricamente es necesario un condensador de desacoplo de 100 nF por cada led, yo he puesto unos cuantos repartidos por el circuito (si algún led se despista en un momento dado, no creo que vaya a ser muy grave), de momento no he visto que falle ninguno.

Descargar

Puedes descargar el código, el PCB y el esquema aquí : 

Fotos del proyecto AQUI

¡Feliz Navidad!

Si te ha gustado, recuerda compartirlo en tu red social favorita. Gracias

Caleidoscopio con Arduino y tiras de leds

$
0
0

Caleidoscopio con Arduino y tiras de leds RGB



Os presento un nuevo proyecto Arduino: un Caleidoscopio (o algo parecido) , con una construcción y una lista de materiales de los más sencilla.
Podéis ver el resultado en el vídeo. Se puede utilizar como decoración en un salón o como adorno para la cuna del bebé, seguro que alucina ... Muy relajante acompañado de música Chill-Out.
Gracias a la aparición de las tiras de leds direccionables, o tiras de pixels, es extremadamente sencillo (y barato) poder crear proyectos con múltiples leds RGB.
Estas tiras, contienen pequeños leds RGB formato 5050, donde cada led va acompañado de un circuito WS2811, capaz de controlar un led RGB (o varios) con 256 niveles para cada color.
En el post anterior (Arbol de navidad shield para Arduino) ya hable de las bondades de estos chips
Las tiras tienen tres conexiones +5V, GND y la entrada de datos (DI). Hay que tener cuidado, pues en las tiras viene indicado el sentido de los datos, los datos deben entrar por DI y salen por DO (en el lado opuesto). Para conectar un trozo de tira con otro, hay que conectar el DO del primero con el DI del segundo.
Las tiras se pueden cortar con unas simples tijeras por las zonas indicadas


El montajes es muy sencillo, simplemente una tira de leds de 60 leds/m cortada en 12 partes de 5 leds cada una y montadas sobre una pieza de PVC (forex) . Las tiras son adhesivas, por lo que es muy sencillo. Como se puede observar en la foto , he utilizado un Arduino pro mini, que ahora es posible encontrarlos en ebay por menos de 3€ ..

Caleidoscopio con Arduino y tiras de leds

Una plancha de plexiglas opalino, se encarga de difuminar la luz de los leds y realzar el efecto.

Caleidoscopio con Arduino y tiras de leds

El circuito es tan sencillo que no necesita esquema ..., tan solo un pin de salida del Arduino, conectado a la estrada de datos de las tiras (DI), y por supuesto la alimentación (GND y 5V).

El código realiza una serie de patrones aleatorios simétricos para simular el funcionamiento de un Caleidoscopio.
Descargar

Puedes descargar el código aquí : 



Si te ha gustado, recuerda compartirlo en tu red social favorita. Gracias

Vela con control remoto y Arduino Pro Mini

$
0
0

Vela con control remoto y Arduino Pro Mini 

Vela con control remoto y Arduino Pro Mini

Aquí os presento otro proyecto basado en una tira de leds direccionables, formada por leds del tipo WS2812b.
Consiste en una vela 'electrónica', que además de simular la luz de una vela real, permite seleccionar colores fijos regular la intensidad, y realizar distintos efectos como arco-iris, fade y fuego.
El proyecto surgió a raíz de la compra de un farol de IKEA modelo BORBY ... la  idea era sustituir una vela de tamaño considerable por algo más ... moderno.
Gracias a la tira de leds tipo Neopixel (para saber más sobre estas tiras puedes ver el anterior post ), el circuito es muy sencillo y sólo consta de un Arduino Pro Mini  (para poderlo ocuiltar dentro de la 'falsa' vela), un trozo de tira de leds direccionables (5 leds en mi caso) , un receptor de infrarrojos tipo TSOP1738 (el TSOP1736 también funciona), una resistencia de 330 Omhs, un condensador electrolítico de 4,7uF , un pequeño interruptor y un portapilas.




Este es el esquema:

Esquema vela con control remoto y Arduino Pro MIni

Para la vela he utilizado un bote de edulcorante de un conocido supermercado ..., luego le he dejado caer cera por encima para darle el aspecto deseado.

Vela con control remoto y Arduino Pro Mini

El circuito lo he montado sobre una pequeña placa de prototipo, pegada al portapilas

Circuito Vela con control remoto y Arduino Pro Mini

El código

El programa está basado en las librerías IRRemote para el mando a distancia y Adafruit Neopixel para la tira de leds.
El programa realiza un bucle en el que lee los códigos del mando a distancia, y en función de estos cambia el estado de los leds.
Hay que resaltar que es necesario utilizar algunos retardos y realizar varias llamadas a la rutina que lee el código para dar tiempo a 'pillar' justo el momento en que pulsamos un botón del mando.
Por supuesto se podría dejar fijo el efecto de la vela y no haría falta ni mando a distancia ni receptor ...,  pero quedaría mas sosón.

Aquí os dejo los vídeos:



El código

Si te ha gustado, recuerda compartirlo en tu red social favorita. Gracias


Reloj Cromático Steampunk con Arduino

$
0
0

Reloj Cromático Steampunk con Arduino

Reloj Cromático Steampunk con Arduino

¿Necesitas un regalo original para estas navidades?, pues aún estás a tiempo ...
Te presento este original reloj (no es por que lo haya hecho yo ... ), que a diferencia de lo normal no utiliza números sino colores, si has leído bien ....
Tras muuuchos años leyendo códigos de colores en resistencias y condensadores he creído que podía utilizarse para algo un poco más original.


Este reloj, utiliza un módulo RTC DS3231, de alta estabilidad y precisión, y un módulo medidor de humedad DTH22. Incluye un sensor de luminosidad LDR para ajustar el brillo de los leds WS2812 encargados de los 'dígitos'.
Los dígitos, vienen expresados por colores y la mayoría corresponden a los colores utilizados en electrónica para indicar los valores, salvo el 0 que pasa de negro a blanco muy débil para poderlo ver en la oscuridad, y el 8 que pasa de gris a cían puesto que el gris no es factible:

    0-Blanco muy débil
    1-Marrón
    2-Rojo
    3-Naranja
    4-Amarillo
    5-Verde
    6-Azul
    7-Violeta
    8-Cían
    9-Blanco

NOTA: Aunque en las fotos y el vídeo parezca que los colores están un poco 'lavados', en un problema de las cámaras, debido a la diferencia de brillo entre los dígitos y el entorno. En la realidad los colores son saturados y perfectamente distinguibles (bueno vale los daltónicos lo tienen un poco chungo ...)



Funciones:
 -hora / minutos / segundos
 -día / mes / año
 -temperatura / Humedad relativa / temperatura de bochorno.

Realiza ciclos hora - fecha - humedad,  indicado por tres bombillas, y se 'duerme' pasados unos 30 minutos.
Se despierta cuando 'detecta' algún código IR de algún mando: TV, Radio, HI-FI ..., o bien cuando hay un cambio brusco de luminosidad (en mi caso es ta en el salón y esta pensado para que se active cuando alguien está viendo la TV, escuchando música, o al encender la luz).
Hay un led debajo de la placa que cambia de color produciendo un efecto decorativo ..

La estructura está realizada con tubo de cobre de 12 mm fácil de encontrar en cualquier ferretería / fontanería / almacén de bricolaje, unos cuantos codos y 'T's del mismo calibre, unos codos de 1/2" para soldar a 12 mm y unos entronques  del mismo calibre. Para cortar el tubo utilicé una herramienta especial muy barata que corta el tubo sin esfuerzo (versión mini). 
La base es una madera de pino, cortada fresada y barnizada.
Los dígitos están formados por unos leds WS2812 (de los que vienen montados sobre una pequeña plaquita con su condensador) , y una canicas de tamaño XL (unos 20 mm).

WS2812 board
WS2812B montado sobre una mini-placa

El circuito

Esquema reloj cromático Arduino

Este es el esquema del reloj.
Los componentes necesarios son:
  1. Arduino (pro-mini, uno, nano, ...)
  2. 7 leds WS2812 (en realidad con 6 son suficientes, uno es 'decorativo')
  3. Placa reloj tiempo real DS3231(o DS1307)
  4. Sensor de humedad DHT22DHT11)
  5. Receptor de infrarrojos 38Khz
  6.  Foto-resistencia
  7. ULN2003
  8. 4 bombillas de unos 6V
  9. Algunas resistencias y condensadores ...
  10. Un cargador USB (lo utilizo como alimentador)
Bueno esta es la lista de componentes, todo fácil de localizar en Internet.
No he utilizado PCB sino una placa de prototipos :

Montaje Reloj Cromático Arduino

Se puede utilizar un DS1307 para el reloj, pero es menos preciso (varios segundos al día).
El DHT11 también es menos preciso que el DHT22, pero puede servir.

El Código


Detalle dígito Reloj Cromático Steampunk con Arduino

Detalle sensor IR Reloj Cromático Steampunk con Arduino



Si te ha gustado, recuerda compartirlo en tu red social favorita. Gracias

Viewing all 12 articles
Browse latest View live