Guía 2.4
Guía 2.4
Guía 2.4
505
GUÍA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ÚLTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 12/04/2017
Las interrupciones son útiles para hacer que las cosas sucedan automáticamente en los programas de
microcontroladores y pueden ayudar a resolver problemas de tiempo. Con las interrupciones, no necesita verificar
constantemente el valor actual del pin. Cuando se detecta un cambio, se activa un evento (se llama a una función).
Cuando ocurre una interrupción, el procesador detiene la ejecución del programa principal para ejecutar una tarea y
luego vuelve al programa principal. Esto es especialmente útil para desencadenar una acción cada vez que se detecta
movimiento o cuando se presiona un botón sin la necesidad de verificar constantemente su estado. Los pines de
interrupción en la ESP32 son todos los GPIO, excepto, GPIO 6 al GPIO 11.
ENCODER
Encoder es un dispositivo de detección que proporciona una respuesta. Los Encoders convierten el movimiento en una
señal eléctrica que puede ser leída por algún tipo de dispositivo de control en un sistema de control de movimiento, tal
como un mostrador o PLC. El encoder envía una señal de respuesta que puede ser utilizada para determinar la
posición, contar, velocidad o dirección. Un dispositivo de control puede usar esta información para enviar un comando
para una función particular.
ESP32-CAM
Tarjeta de desarrollo ESP32 incluido cámara de 2 MPx. y dotado de un lector de tarjeta micro sd. Para su
funcionamiento independiente se debe utilizar un convertidor USB a TTL,
OBJETIVOS:
● Conocer las capacidades de ESP32.
● Pines de interrupción.
● Resolución de ejercicios propuestos.
MATERIALES:
REACTIVOS: INSUMOS:
Dejar en blanco / No aplica Dejar en blanco / No aplica
EQUIPOS:
● PC portátil
● Microcontrolador ESP32
● Microcontrolador ESPCam
● Conversor Interfaz Ft232rl Usb Ftdi Arduino Serial
● Protoboard (1)
CÓDIGO: SGC.DI.505
GUÍA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ÚLTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 12/04/2017
● Cables
● Un motor DC
● Módulo encoder
● Rueda encoder
● Driver L298N, 2 motores
● ESP32-CAM
● Módulo USB to TTL (Cualquier modelo)
MUESTRA:
Dejar en blanco / No aplica
INSTRUCCIONES:
NOTA: La siguiente práctica se realiza por medio de un módulo encoder infrarrojo con el uso de una rueda para
encoder conjunto a un motor. Se puede utilizar un encoder de efecto Hall incorporado al motor sin necesidad de
cambiar el código, pero teniendo en consideración la conexión física de la misma.
1. Lectura de encoder.
#Se define a pir como pin de interrupcion Se usa Pin.IRQ_RISING para detectar en alto
#y se pone handle_interrupt como funcion de accin en la interrupcion
pir.irq(trigger=Pin.IRQ_RISING, handler=handle_interrupt)
#Programa principal
while True:
print(contador) #Imprimimos el valor del contador
sleep(0.5) #Colocamos un tiempo de espera
1.3. Preguntas
2. Detección de velocidad
#Programa principal
while True:
#Configuración de dirección de motor
pin1.value(0);
pin2.value(1);
#Control de potencia de motor
motor.duty(potenciaMotor)
tiempo_actual=utime.ticks_ms() #Tomamos el tiempo actual de la ESP32
if (tiempo_actual-tiempo_inicial>=dt): #Verificamos si ha pasado dt
print((contador*60)/(dt*ppr)) #Imprimimos el valor de velocidad en RPMS con formula
tiempo_inicial=tiempo_actual #Reseteamos el tiempo inicial
contador=0
2.3. Preguntas
- Varíe la variable <potenciaMotor> 10 veces y observe como varía la velocidad. Haga una tabla y exprese un
modelo matemático simple de relación entre la velocidad y pwm de <potenciaMotor>.
CÓDIGO: SGC.DI.505
GUÍA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ÚLTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 12/04/2017
El siguiente código ha sido compilado con el uso de platformio IDE y arduino IDE pero se puede utilizar otro de su
agrado. Para conocer el uso de estos programas puede revisar:
https://docs.platformio.org/en/latest/integration/ide/vscode.html#ide-vscode
https://www.prometec.net/instalando-esp32/
Para poder usar el siguiente código es necesario la implementación de la librería esp32cam del repositorio
https://github.com/yoursunny/esp32cam.git. Si se usa platformio colocar la carpeta descomprimida dentro de la carpeta
lib de su WORKSPACE y si se usa arduino descargarlo e instalar libreria .zip. Para arduino puede consultar el url:
https://www.geekfactory.mx/tutoriales/tutoriales-arduino/como-instalar-una-libreria-de-arduino/ .
#include <WebServer.h>
#include <WiFi.h>
#include <esp32cam.h>
const char* WIFI_SSID = "<Colocar nombre de su router>"; //Usar su SSID del router
const char* WIFI_PASS = "Colocar contraseña de router"; //Usar su contraseña del router
WebServer server(80);
static auto loRes = esp32cam::Resolution::find(320, 240);
static auto hiRes = esp32cam::Resolution::find(800, 600);
void
handleBmp()
{
if (!esp32cam::Camera.changeResolution(loRes)) {
Serial.println("SET-LO-RES FAIL");
}
CÓDIGO: SGC.DI.505
GUÍA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ÚLTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 12/04/2017
server.setContentLength(frame->size());
server.send(200, "image/bmp");
WiFiClient client = server.client();
frame->writeTo(client);
}
void
serveJpg()
{
auto frame = esp32cam::capture();
if (frame == nullptr) {
Serial.println("CAPTURE FAIL");
server.send(503, "", "");
return;
}
Serial.printf("CAPTURE OK %dx%d %db\n", frame->getWidth(), frame->getHeight(),
static_cast<int>(frame->size()));
server.setContentLength(frame->size());
server.send(200, "image/jpeg");
WiFiClient client = server.client();
frame->writeTo(client);
}
void
handleJpgLo()
{
if (!esp32cam::Camera.changeResolution(loRes)) {
Serial.println("SET-LO-RES FAIL");
}
serveJpg();
}
void
handleJpgHi()
CÓDIGO: SGC.DI.505
GUÍA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ÚLTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 12/04/2017
{
if (!esp32cam::Camera.changeResolution(hiRes)) {
Serial.println("SET-HI-RES FAIL");
}
serveJpg();
}
void
handleJpg()
{
server.sendHeader("Location", "/cam-hi.jpg");
server.send(302, "", "");
}
void
handleMjpeg()
{
if (!esp32cam::Camera.changeResolution(hiRes)) {
Serial.println("SET-HI-RES FAIL");
}
Serial.println("STREAM BEGIN");
WiFiClient client = server.client();
auto startTime = millis();
int res = esp32cam::Camera.streamMjpeg(client);
if (res <= 0) {
Serial.printf("STREAM ERROR %d\n", res);
return;
}
auto duration = millis() - startTime;
Serial.printf("STREAM END %dfrm %0.2ffps\n", res, 1000.0 * res / duration);
}
void
setup()
{
Serial.begin(115200);
Serial.println();
{
using namespace esp32cam;
Config cfg;
cfg.setPins(pins::AiThinker);
cfg.setResolution(hiRes);
cfg.setBufferCount(2);
cfg.setJpeg(80);
bool ok = Camera.begin(cfg);
Serial.println(ok ? "CAMERA OK" : "CAMERA FAIL");
}
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
CÓDIGO: SGC.DI.505
GUÍA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ÚLTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 12/04/2017
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
Serial.print("http://");
Serial.println(WiFi.localIP());
Serial.println(" /cam.bmp");
Serial.println(" /cam-lo.jpg");
Serial.println(" /cam-hi.jpg");
Serial.println(" /cam.mjpeg");
server.on("/cam.bmp", handleBmp);
server.on("/cam-lo.jpg", handleJpgLo);
server.on("/cam-hi.jpg", handleJpgHi);
server.on("/cam.jpg", handleJpg);
server.on("/cam.mjpeg", handleMjpeg);
server.begin();
}
void
loop()
{
server.handleClient();
}
Nota:
- Colocar el nombre y contraseña de su router. No utilizaremos una red global, sino local.
- Para cargar el programa debe estar conectado GPI0 y GND. Una vez cargado desconecte estos pines abra el
serial.
- Abra un puerto serial con banda 115200 y reinicie la ESP32-CAM y obtenga la dirección ip del dispositivo y
opciones de visualización.
CÓDIGO: SGC.DI.505
GUÍA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ÚLTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 12/04/2017
Nota 1: Una vez cargado y obtenido el IP, es recomendable desconectar el Rx y Tx, dejando solo la alimentación de 5v.
CÓDIGO: SGC.DI.505
GUÍA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ÚLTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 12/04/2017
Nota 2: En ocasiones debido a la conexión de cables o la misma cámara, la conexión se reiniciará constantemente y se
deberá reiniciar manualmente algunas veces para obtener la ip y opciones. Esto se corrige en gran parte al desconectar
Tx y Rx, luego de obtener IP. La ip se puede obtener por medio de CMD o terminal si lo desea.
3.3.. Preguntas
4.1. Generar un control PID para regular la velocidad del motor. Ingresando en código la velocidad a regular y
mostrando su velocidad. Puede utilizar librerías preestablecidas de esp32 para controladores PID. Regule las
constantes Kp, Ki, Kd de forma empírica.
4.2. Preguntas
5.1. Usando la ESP32-CAM configurada anteriormente, elabore un programa en Python utilizando openCV que obtenga
la imagen de esta, la muestre y detecte el contorno de los objetos captados.
5.2. Preguntas
F: ……………………………………………
F: ……………………………………
F: …………………………………… Ing. Johanna Tobar
Ing. Francisco Terneus COORDINADOR/JEFE DE
COORDINADOR DE ÁREA DE LABORATORIO
DOCENTE CONOCIMIENTO