Teclado y pantalla lcd con solo dos pines

Un problema habitual al trabajar con estos componentes es que requieren muchos puertos de nuestro microcontrolador; para el caso de ejemplo utilizaremos un ESP8266, un NodeMCU.

¿Cual es la trampa?

Necesitamos de otro chip que se ocupe de extender los puertos necesarios, para el caso del teclado utilizaremos un MCP23017, es lo que tengo a mano, pero estimo que puede ser cualquier chip de la familia. Requeriremos además tres resistencias de 10k, el diagrama de como conectarlo es el siguiente:

Requeriremos además instalar la librería keypad, si ya la tenemos instalada no será necesario. Para instalar desde el IDE de Arduino, debemos ir al menú Programa – Incluir Librería – Añadir desde ZIP.

Además también sera necesario arduino_keypads-master, simplemente debemos descomprimir dentro de la carpeta Libraries (en mi caso esta en C:\Users\Guillermo\Documents\Arduino\libraries ).

Luego que se hayan instalados estas librerías y construido el circuito anterior, es conveniente chequear cual es la dirección que tiene nuestro chip MCP23017 para poder comunicarnos adecuadamente con él; para ello cargaremos en el nodemcu un sketch para buscar las direcciones disponibles:

Si copia y pega el código verifique que no vayan caracteres incorrectos, tengo la mala experiencia que en oportunidades al pegar no llevar el carácter adecuado.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include  < Wire.h >
 
void setup() {
  Wire.begin();
 
  Serial.begin(9600);
  Serial.println("\nI2C Scanner");
}
 
 
void loop() {
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    } else if (error==4) {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for next scan
}

Si todo esta correctamente conectado, en el monitor serie deberíamos ver un mensaje como el siguiente:

Donde 0x20 es la dirección de MCP23017.

El paso siguiente seria cargar el ejemplo para poder interactuar con el teclado:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <Keypad_MC17.h>
#include <Keypad.h>
#include <Wire.h>

#define I2CADDR 0x20

const byte ROWS = 4; //four rows
const byte COLS = 4; //five columns

char hexaKeys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'#','0','*','D'}
};
byte rowPins[ROWS] = {7, 6, 5, 4};
byte colPins[COLS] = {3, 2, 1, 0};

Keypad_MC17 customKeypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS, I2CADDR);

void setup(){
//  Wire.begin( );
  customKeypad.begin( );        // GDY120705
  Serial.begin(9600);
  Serial.println("Iniciando");
}
 
void loop(){
  char customKey = customKeypad.getKey();
 
  if (customKey != NO_KEY){
    Serial.println(customKey);
  }
}

De esta forma podemos conectar el teclado a una placa NodeMCU, también funciona con Arduino, utilizando solo dos pines.

Queda por ver si es posible utilizar los otros 8 pines restantes del MCP23017 para realizar otras operaciones y ampliar aún mas la cantidad de entradas y salidas.

ESP32-Cam: primeros pasos y algo de Python

Estos días estuve probando esta versión de ESP32 con cámara, si bien esta hace ya algún tiempo, recién logro tener uno para hacer algunas pruebas, y puedo decir que quede impresionado.

No solo que es muy compacto, sino que la resolución y la forma de instalarse es muy sencilla. A continuación los primeros pasos para trabajar con este módulo.

Entorno de desarrollo

Al igual que con el ESP8266 es necesario incluir una serie de librerías y herramientas para utilizar el ESP32-CAM junto con el Arduino IDE, para ello debemos agregar dentro de Archivos – Preferencias la siguiente URL: https://dl.espressif.com/dl/package_esp32_index.json

Confirmamos, y luego desde el menú Herramientas – Gestor de tarjetas, buscamos ESP32 y lo instalamos. En mi caso tenia instalado una versión anterior, tuve que eliminar y volver a instalar la nueva.

Libreria ESP32CAM

Utilizaremos esta librería para acceder fácilmente a la cámara del modulo; la descargamos desde Github en el siguiente link:
https://github.com/yoursunny/esp32cam

Luego la instalamos desde Programas – Incluir librerías – Añadir biblioteca ZIP.

Concluidos estos pasos, podemos pasar a ver como lo conectamos

Conexiones

Para cargar el programa en el ESP32-CAM, debido a que no cuenta con un puerto USB, sera necesario utilizar un conversor USB-Serial, se utiliza el siguiente esquema:

Conversor USB-SerialESP32-CAM
RXTX
TXRX
VCC5V (no conectarlo a 3v3)
GNDGND

Además debemos conectar, solo para programarlo, en el modulo ESP32-CAM el GND al GPIO0.

Programa de ejemplo

Utilizaremos uno de los ejemplos provistos por la librería, para convertir el ESP32-CAM en una cámara IP, puede encontrarlo en Archivos – Ejemplos – esp32cam – WifiCam.

En el ejemplo solo debemos editar las lineas indicando el nombre de nuestra red inalámbrica y la contraseña de la misma.


1
2
const char* WIFI_SSID = "my-ssid";
const char* WIFI_PASS = "my-pass";

Antes de cargar el programa al ESP32-CAM debemos presionar el botón de Reset del mismo, cargar el código al mismo, desconectar el cable que puentea GND con GPIO0 y volver a reiniciar para que cargue el código.

Si abrimos el Monitor Serie veremos que nos indica una URL, a la cual podemos conectarnos desde el navegador.

Tomar imágenes desde Python

La gran ventaja de utilizar esta librería es que es muy sencillo integrarla con nuestras aplicaciones en Python; pueden encontrar el programa en el siguiente repositorio de github:
https://github.com/gsampallo/esp32cam-python

Solo debemos tener en cuenta de reemplazar la IP de la URL por la correcta en el programa y luego ejecutarlo; cada vez que se ejecute toma una foto.