lunes, 27 de junio de 2016

Reloj digital con Arduino y LCD I2C

En esta entrada os dejare un ejemplo de reloj digital con calendario creado con un arduino, con el modulo rtc y la pantalla lcd de entradas anteriores.



Programa completo: Reloj
Entrada sobre la RTC: RTC DS1302
Entrada sobre LCD: LCD I2C Arduino

Las conexiones se explican en las entradas que se encuentran en los links superiores.

En esta entrada seré mas breve que en las anteriores y solo explicare las partes más interesantes, bien comencemos con el código:

Para hacer la lectura de la hora tenemos que crear una variable de tipo Time en la cual cargaremos el valor actual de nuestra RTC, para ello utilizaremos las siguientes funciones:

 Time t; //Para crear la variable de tipo time a la cual llamaremos t
 rtc.getTime(); // Para actualizar el valor de la RTC, esto función deberemos cargarla en la variable t
 t = rtc.getTime();

Para acceder a los datos de la fecha y la hora tendremos que utilizar las siguientes funciones:

t.sec; // Segundos
t.min; // Minutos
t.hour // Horas
t.dow // Dia de la semana
t.date // Dia del mes
t.year //Año

viernes, 17 de junio de 2016

Lectura de mando clásico de WII con Arduino

En esta entrada os dejare la librería y un ejemplo que permite hacer una lectura del mando clásico de WII el cual podréis utilizar luego en futuros proyectos. Esta librería la cree yo modificando una ya existente destinada a la lectura del Nunchuk o Wiichuck.


Librería mando clásico: WiiClassic
Librería original nunchuck: Wiichuck
Ejemplo de lectura de ambas librerías: Ejemplos

Ahora os explicare por encima las funciones más comunes de estas librerías y como seria la conexión de los mando con el Arduino:

La comunicación del mando se realiza por el protocolo I2C, aquí os dejo una imagen con los pines correspondientes a DAT, CLK, VCC(conectar a 3.3V) y GND:

Comencemos con el código:

Como con todas las librerías nuevas lo primero es incluirla en la cabecera del programa, una vez incluida tendremos que declarar el nombre de nuestro mando:

#include <WiiClassic.h>
#include <Wire.h>
WiiClassic classic = WiiClassic();// En mi caso lo nombre como classic

Una vez nombrado tendremos que iniciarlo dentro del void setup():

void setup() 
{
  Serial.begin(9600);
  classic.begin();//Inicia la comunicación
  classic.update();//Actualiza el estado de los botones y sensores
  delay(2000);
}

Ahora que la comunicación ya esta iniciada podremos leer el estado de los botones y de los sensores dentro del void loop():

void loop() 
{  
  classic.update();
  Serial.println("-----------------------");
  Serial.print("Boton L: "); Serial.print((int)classic.LecturaLB()); Serial.println();
  Serial.print("Potenciómetro L: "); Serial.print((int)classic.readL()); Serial.println();
  Serial.print("Boton ZL: "); Serial.print((int)classic.LecturaZL()); Serial.println();
  Serial.println();
  Serial.print("Boton arriba: "); Serial.print((int)classic.LecturaArriba()); Serial.println();
  Serial.print("Boton abajo: "); Serial.print((int)classic.LecturaAbajo()); Serial.println();
  Serial.print("Boton derecha: "); Serial.print((int)classic.LecturaDerecha()); Serial.println();
  Serial.print("Boton izquierda: "); Serial.print((int)classic.LecturaIzquierda()); Serial.println();
  Serial.println();
  Serial.print("Joystick Derecho X: "); Serial.print((int)classic.readJoyRX()); Serial.println();
  Serial.print("Joystick Derecho Y: "); Serial.print((int)classic.readJoyRY()); Serial.println();
  Serial.println();
  Serial.println();
  Serial.print("Boton Menos: "); Serial.print((int)classic.LecturaMenos()); Serial.println();
  Serial.print("Boton Home: "); Serial.print((int)classic.LecturaHome()); Serial.println();
  Serial.print("Boton Mas: "); Serial.print((int)classic.LecturaMas()); Serial.println();
  Serial.println();
  Serial.print("Joystick Izquierdo X: "); Serial.print((int)classic.readJoyLX()); Serial.println();
  Serial.print("Joystick Izquierdo Y: "); Serial.print((int)classic.readJoyLY()); Serial.println();
  Serial.println();
  Serial.print("Boton a: "); Serial.print((int)classic.LecturaA()); Serial.println();
  Serial.print("Boton b: "); Serial.print((int)classic.LecturaB()); Serial.println();
  Serial.print("Boton x: "); Serial.print((int)classic.LecturaX()); Serial.println();
  Serial.print("Boton y: "); Serial.print((int)classic.LecturaY()); Serial.println();
  Serial.println();
  Serial.print("Boton R: "); Serial.print((int)classic.LecturaRB()); Serial.println();
  Serial.print("Potenciómetro R: "); Serial.print((int)classic.readR()); Serial.println();
  Serial.print("Boton ZR: "); Serial.print((int)classic.LecturaZR()); Serial.println();
  Serial.println("-----------------------");
  delay(500);
}

lunes, 13 de junio de 2016

Modulo RTC DS1302

Para emplear este modulo es necesario esta librería: DS1302

Este modulo nos permite trabajar con un reloj de tiempo real, el cual no perderá la hora a menos que la pila se le agote en este caso se perdería toda la configuración y volvería al estado de fabrica, este modulo es muy útil ya que en caso de apagarse el Arduino o de desconectarse no perderá la hora. Lo primero para poder trabajar con el seria ponerle una pila de tipo DL2032, y acto seguido se configurará la hora desde el arduino.

En esta entrada os dejare un ejemplo de como configurar la fecha y la hora del modulo.
Disposición de los pines:

RST-Pin 2
DAT-Pin 3
CLK-Pin 5
VCC-+5
GND-GND

Comencemos con el código:

Lo primero es incluir la librería y declarar los pines en los que conectaremos la rtc:

#include <DS1302.h>

DS1302 rtc(2, 3, 5);//Estos son los pines en los que conectaremos RST, DAT y CLK respectivamente

Una vez declarada la rtc ya podemos configurar la hora desde el void setup(), lo primero es desactivar la protección contra escritura, una vez desprotegido ya podemos comenzar con la configuración:

  void setup():
  {
    rtc.halt(false);
    rtc.writeProtect(false);

    rtc.setDOW(MONDAY);  //Configuramos el día de la semana debéis escribirlo en ingles por la           librería
    rtc.setTime(20, 28, 30);  // Configuramos la hora en formato 24h con minutos y segundos
    rtc.setDate(13, 6, 2016); // Configuramos la fecha en formato día/mes/año
  }

Con esto concluye el programa y ya estaría configurada nuestra rtc, mas adelante subiré un ejemplo de reloj utilizando el Arduino, la pantalla lcd y el modulo DS1302.

Aquí dejo el programa del ejemplo completo: ConfiguraciónRTC

miércoles, 8 de junio de 2016

Pantalla LCD I2C Arduino

En esta entrada comunicaremos una pantalla LCD con un arduino utilizando los pines de I2C, estos pines están situados en las entradas analógicas A4(SDA) y en A5(SCL) y en dos pines independientes situados después del pin de AREF en el lado de los pines digitales.


Lo primero para poder utilizar la pantalla es instalar la librería: LiquidCrystal_I2C

Una vez instalada la librería ya podremos empezar con nuestros proyectos, en el ejemplo que dejare más abajo mostrare las funciones de uso más frecuente cuando trabajamos con la pantalla, para ello en el ejemplo creare una secuencia de 16 números en formato hexadecimal del 0 a la F que irán recorriendo todas las posiciones de la pantalla, en mi caso es de 16x2.

Comencemos con el código:

Lo primero es incluir la librería en nuestro programa al igual que la librería que se encarga de la comunicación I2C:
 
  #include <LiquidCrystal_I2C.h> //Librería de la pantalla
  #include <Wire.h> //Librería de la comunicación I2C

Una vez incluidas las librerías tenemos que declarar el tipo de pantalla que vamos a utilizar, en mi caso, como ya comente antes, mi pantalla es de 16x2:

  LiquidCrystal_I2C lcd (0x27,16,2); //lcd sera el nombre de nuestra pantalla, 16 el número de caracteres por fila y 2 el numero de filas.

Ahora en el void setup() tendremos que iniciarla:

   void setup()
  {
    lcd.begin(); // Inicializa la pantalla
    lcd.clear(); // Limpia la pantalla
    lcd.backlight(); // Enciende la luz de fondo
    lcd.setCursor(2,0); // Posiciona el cursor en el carácter 2 de la fila 0
    lcd.print("Iniciando..."); // Escribe ne la pantalla, este comando es similar al utilizado con la                 función Serial
    delay(500);
  }

Dentro del void loop() creare el bucle que ira escribiendo los números en la pantalla indicando la posición de cada carácter en hexadecimal:

  void loop()
  {
    for(y=0;y<2;y++)
    {
      for(x=0;x<16;x++)
      {
        lcd.clear();
        lcd.setCursor(x,y);
        lcd.print(x,HEX);
        delay(1000);
      }
    }
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Final");
    delay(2000);

  }

Aquí os dejo el link con el código completo: Pantalla_LCD