Mostrando las entradas con la etiqueta pantalla. Mostrar todas las entradas
Mostrando las entradas con la etiqueta pantalla. Mostrar todas las entradas

domingo, 16 de diciembre de 2018

ESP8266 y ILI9341

Hoy les traigo cómo utilizar el display gráfico (y a color!) basado en el driver ILI9341, el display gráfico en cuestión es uno de 2,2" y cuenta con un lector de memorias SD (que de momento no vamos a utilizar). Se maneja bajo el protocolo de comunicación SPI. La diferencia más notoria entre este display y el SPFD5408 es la velocidad con que se maneja, si bien el SPFD5408, al igual que el ILI9341, admite el uso de SPI como protocolo de comunicación lo que pude ver es que la velocidad con la que se refresca la pantalla es muchísimo más alta. Otra clara ventaja es que usa menos pines (aunque no probé el SPI de la SPFD5408, en su configuración "base" de hardware la cantidad de pines es menor), aunque no todo son ventajas, el ILI9341 no cuenta con una una entrada táctil, por lo que debemos desarrollar algo para que poder interactuar con el micro de ser necesario.


Como vamos a utilizar el ESP8266 para usar con este módulo vamos a necesitar una librería especial para este micro. El mapa de los pines utilizados es el siguiente:

DISPLAY        NodeMCU

SDO/MISO      D6 (no conecta si no se "lee" el display)
LED                 VIN (or 5V, see below)
SCK                 D5
SDI/MOSI       D7
DC (RS/AO)   D3
RESET            D4 (o RST, depende de la configuración)
CS                   D8 (o RST, depende de la configuración)
GND               GND (0V)
VCC               5V or 3.3V

Como es muy sencillo utilizar este display con los códigos de ejemplo que vienen con la librería debería bastar para que puedan entender la base. De todas formas les comento que esta librería posee un archivo que sirve para realizar algunas configuraciones, como por ejemplo:

*qué driver tiene la pantalla (en nuestro caso es la ILI9341)
*configuraciones especiales para ciertos drivers
*modificar los pines que se utilizan para la comunicación (los pines que se pueden evitar usar)
*qué fuentes se utilizan
*la frecuencia del SPI

Hay bastantes configuraciones disponibles con esta librería para adaptarla al proyecto que deseemos (más que nada para la optimización de la memoria del microcontrolador, y velocidad de la pantalla).

Algunos de los comandos útiles para el uso de este display son los siguientes:

  • drawPixel(x, y, color): este comando dibuja un pixel en la posición X e Y (que son del tipo UINT) y de color especificado en esa variable (también UINT, el color va a ser de 16 bits, 5 rojos, 6 verdes y 5 azules, utiliza la codificación RGB565 y se pueden generar con este programita)
  • fillScreen(color): útil para llenar toda la pantalla con un color.
  • drawLine(x0, y0, x1, y1, color): dibuja una línea entre los puntos (x0, y0) y (x1, y1) del color especificado.
  • draw/fillRect(x, y, medidaX, medidaY, color): dibuja un rectángulo con punto de inicio en (x, y) y de medidas de medidaX y medidaY, si es draw lo dibuja sin fondo, y si es fill es con fondo, el color hace referencia al color de lo que dibuja.
  • draw/fillRect(x, y, r, color): dibuja un círculo con centro en (x, y) de radio r y con el color pasa lo mismos que con el punto anterior.
  • drawString(texto, x, y, fuente): escribe el texto con puntos iniciales en (x, y) y con una fuente que como un valor genérico podría ser el 2.

Hay una lista muy larga de comandos que habría que explicar uno a uno, pero con los explicados arriba debería bastar para entender la dinámica básica del funcionamiento de la librería.

domingo, 16 de agosto de 2015

¿Sonar?

Bueno, luego de hacer las publicaciones del medidor de distancia por ultrasonido, del servo y de la pantalla, se me ocurrió realizar un radar. En el título lo puse entre signos de pregunta, porque no sé hasta que punto es factible realizarlo, pero si es necesario lo vamos a realizar en 2 o 3 publicaciones.

No es un proyecto propiamente dicho porque no va a tener utilidad. Quizá se pregunten ¿porqué?, bueno la razón o razones son sencillas:

1) Tiene un alcance ridículamente limitado (en las publicación del ultrasonido pude ver que tenía un máximo de 2 metros aproximadamente)

2) Los tiempos van a ser cruciales, por lo que parecería que no se va a poder mostrar en tiempo real el objeto.

Pero a pesar de esas cosas voy a desarrollarlo por "amor al arte" y ver que sale, quizá se pueda conseguir algo interesante.

Entonces, para empezar, voy a reciclar código (como no podía ser de otra forma) de la publicación del servo, de la pantalla y del ultrasonido.

La idea sería mostrar en la pantalla los puntos que se consideran que bloqueen la "vista" del ultrasonido.

Sin más, les dejo el código:


//pantalla
#include <Adafruit_GFX.h>                                    // Core graphics library
#include "SWTFT.h"                                           // Hardware-specific library
//algunos colores
#define negro     0x0000
#define azul      0x001F
#define rojo      0xF800
#define verde     0x07E0
#define cyan      0x07FF
#define magenta   0xF81F
#define amarillo  0xFFE0
#define blanco    0xFFFF
//de la pantalla
SWTFT tft;

//para el touch
#include <stdint.h>
#include "TouchScreen.h"
//declaraciones para el touch
#define YP A1                                                // must be an analog pin, use "An" notation!
#define XM A2                                                // must be an analog pin, use "An" notation!
#define YM 7                                                 // can be a digital pin
#define XP 6                                                 // can be a digital pin

#define MINPRESSURE 10
#define MAXPRESSURE 1000

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

//servo
#include <SoftwareServo.h>
SoftwareServo servo1;

//ultrasonido
#define trigPin 32
#define echoPin 34

int x = 0, y = 0, x1 = 0, y1 = 0, check = 1;
long distancia;

void setup() {
  servo1.attach(30);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  tft.reset();
  tft.begin();
  tft.fillScreen(negro);
  tft.setRotation(3);
  tft.fillCircle(50, 50, 10, blanco);
  Serial.begin(9800);
}

void loop() {
  tft.fillScreen(negro);
  for (int val = 0; val <= 180; val++)
  {
    servo1.write(val);
    ultrasonido();                                                                      //obtenemos la distancia hasta el objeto
    tft.fillCircle((160-(distancia*cos(val))), (240-((distancia*sin(val))/2)), 2, blanco);  //ubicamos el cursor en el medio abajo 
    SoftwareServo::refresh();                                                           //y situamos el punto donde esté el objeto
  }
  tft.fillScreen(negro);
  for (int val = 180; val >= 0; val--)
  {
    servo1.write(val);
    ultrasonido();                                                                      //obtenemos la distancia hasta el objeto
    tft.fillCircle((160-(distancia*cos(val))), (240-((distancia*sin(val))/2)), 2, blanco);  //ubicamos el cursor en el medio abajo
    SoftwareServo::refresh();                                                           //y situamos el punto donde esté el objeto
  }
}

void ultrasonido() {

  long duracion;
a:;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5); 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(15);
  digitalWrite(trigPin, LOW);
  duracion = pulseIn(echoPin, HIGH);
  SoftwareServo::refresh();
  distancia = (duracion/2) / 29.1;
  if (distancia > 450)
  {
    goto a;                                                                              //si el objeto está muy lejos volvemos a
  }                                                                                      //buscar el valor
  Serial.println(distancia);
}


viernes, 7 de agosto de 2015

Proyecto: integración de módulos (1)

Hoy les quiero mostrar un proyecto en el que llevo trabajando un poco más de 6 meses y sigo ampliándolo casi todos los días.


Se trata de un "dispositivo" a falta de un mejor nombre, que consta de un arduino MEGA 2560, la pantalla de mcufriend (hablé anteriormente en esta otra entrada), el transceptor NRF24L01 y el sensor de temperatura y humedad DTH11.








El proyecto lo realicé porque quería ver cuantas cosas podía integrar en un solo arduino, y como los arduino UNONANO y LEONARDO tenían pocos pines I/O decidí pasar al MEGA, con el cual puedo disponer de 53 pines I/O y 15 entradas analógicas. El sistema cuenta con: una comunicación con otro dispositivo (las direcciones todavía no se pueden cambiar) llamado "serv1", un reloj configurable, una linterna en pantalla y sensor de temperatura y humedad. A futuro estoy pensando en agregar un control remoto de domótica y un "generador de ondas" que serviría para generar señales cuadradas con ciertos patrones o frecuencias.






De momento el dispositivo solo puede establecer comunicación inalámbrica con la computadora (por puerto serie) con un arduino NANO y un tranceptor como interfaz (para recibir estoy usando el programa del chat que está en esta otra entrada), pero estoy seguro que si se obtiene el mismo equipo y realizando cambios mínimos (como la dirección de recepción y la dirección de emisión) se debería poder tener ambos equipos con una comunicación entre ellos.


En algunos días, subiré el programa y las librerías. Cuando yo considere que está terminado, voy a crear una página dedicada al proyecto completo para que se pueda ver sin tener que buscar viejas entradas.

miércoles, 29 de julio de 2015

Pantalla táctil 2,4"

Hola nuevamente, hoy les traigo unas pantallas del fabricante "mcufriend", el controlador es el SPFD5408. Me costó bastante encontrar las librerías y demás.
Cuenta con un lector de tarjetas micro SD y tiene una resolución de 240 x 320, son un poco lentas pero sirven para la mayoría de las aplicaciones.

Se puede conseguir en DX, al final después de las descargas les dejo el link.

En la librería se pueden encontrar algunos ejemplos muy claros de como funciona, con lo cual no es necesario poner algún ejemplo de mi parte, en la página "proyecto: integrador arduino" van a ver un ejemplo bastante interesante sobre como funciona.

En la carpeta de las librerías de la pantalla ("SWTFT-Shield") hay una carpeta que dice placas, dentro de ella se pueden encontrar 2 archivos, uno es para el arduino UNO y el otro para el mega. Esto es por la disposición de ciertos pines o definiciones de variables (lo corregí hace un tiempo largo ya, por lo que no recuerdo exactamente cual de las 2 cosas era). Para cambiar de placa solo hay que poner el archivo de la placa correcta, borrar lo que tiene en el paréntesis y cambiarlo por el SWTFT que está en la carpeta "SWTFT-Shield". Actualmente está puesto para hacerlo funcionar en un MEGA como se puede apreciar en las fotos de abajo.



Y ahora tienen un pequeño programa de ejemplo que viene con las librerías que es un "paint" en el cual se puede dibujar. Ese programa de ejemplo, en el arduino mega anda mal, está invertido el exe "x" y el eje "y", se podría modificarlo con la función map, pero como son los ejemplos "originales" decidí dejarlo como estaba





Descargas:

Pantalla:

https://mega.co.nz/#!H5gCzSiL!9PSVtEKC326hzOGqBiLbj_rzA-WvoyYP7OYyO4FoJvc


Donde comprar:

http://www.dx.com/p/diy-2-4-tft-lcd-touch-screen-shield-expansion-board-for-arduino-uno-350121