Documentos de Académico
Documentos de Profesional
Documentos de Cultura
II Ciclo
1. Objetivos
● Identificar los conceptos de protocolos de comunicación
2. Seguridad
Advertencia:
●Obligatorio el uso de Mascarilla y careta de protección
●Desinfectar las manos con alcohol al ingreso del laboratorio
●Mantener siempre la distancia durante el laboratorio
●No obstruir las vías de evacuación con mochilas, sillas en mala
posición, etc.
●Ubicar maletines y/o mochilas al final del aula o en los casilleros
asignados al estudiante.
●No ingresar con líquidos, ni comida al aula de Laboratorio.
●Al culminar la sesión de laboratorio apagar correctamente la
computadora y la pantalla, y ordenar las sillas utilizadas.
●En este laboratorio está prohibida la manipulación del hardware,
conexiones eléctricas o de red
3. Equipos y Materiales
Una computadora con:
● Windows 7 o superior
● Conexión a la red
● Python 3.9 o superior, VS Code
● PlatformIO IDE, VSPD, PICSimLab
● Pyfirmata
4. Fundamento Teórico
MicroPython Tool (Ampy): Herramienta para interactuar con un tarjeta con Python o MicroPython a
través de comunicación serial, con ampy puedes enviar archivos desde tu computadora al sistema
de archivos de la placa, descargar archivos desde una placa a tu computadora e incluso enviar un
script de Python a una placa para que se ejecute.
esptool: Es una herramienta de línea de comando para comunicarse con el ROM bootloader en
microcontroladores ESP8266 & ESP32, nos permite actualizar el firmware, leer el firmware,
consultar los parámetros del chip, etc.
Lab. N° 11 Python-ESP32
Para instalar los drivers vamos a la página de los fabricantes e instalamos los drivers, generalmente
la página se encuentra al reverso de la tarjeta de desarrollo.
https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers http://www.wch.cn/product/CH340.html
Por lo general podemos encontrar el modelo en el chip y reverso de la tarjeta, por ejemplo en la
figura podemos observar que el modelo de nuestro ESP32 es un DEVKIT V1
En el PIO IDE configuramos un nuevo proyecto con el modelo de nuestro ESP32, en la figura de
arriba podemos observar que tenemos el modelo DEVKIT V1, del fabricante DOIT.
#include <Arduino.h>
void setup() {
pinMode(2, OUTPUT);
}
void loop() {
digitalWrite(2, HIGH);
delay(1000);
digitalWrite(2, LOW);
delay(1000);
}
Ejercicio 1: Crear un programa utilizando el PIO IDE, para prender y apagar un led desde el Python.
Copiar el programa de abajo, compilar, analizar y comentar lo que sucede.
Ejercicio 2: Crear un programa utilizando el PIO IDE y el Python, para prender y apagar el led del pin
2 del ESP32, desde el Python usando el TKinter.
#include <Arduino.h>
String dataString = "";
bool dataComplete = false;
int ledState = 0;
char inChar;
void serialEvent(){
while (Serial.available()){
inChar = (char)Serial.read();
dataString += inChar;
if(inChar == '\n'){
dataComplete = true;
}
}
}
void task(){
Serial.println(dataString);
if(ledState == 1){digitalWrite(2, HIGH);}
else{digitalWrite(2, LOW);}
delay(20);
}
void setup() {
Serial.begin(115200);
pinMode(2, OUTPUT);
digitalWrite(2, LOW);
}
void loop() {
if(Serial.available()) serialEvent();
if (dataComplete){
ledState = dataString.toInt();
task();
dataString = "";
dataComplete = false;
}
}
try:
arduino = serial.Serial('COM3',115200)
except:
print('Cannot conect to the port')
def onClosing():
root.destroy() #Cierra la ventana creada
arduino.close()
def pressButton1():
arduino.write(('1\n').encode())
label_0['text'] = "ON"; label_0["bg"]="white"; label_0["fg"]="Black"
c.itemconfig(id, fill="white")
def pressButton2():
arduino.write(('0\n').encode())
label_0['text'] = "OFF"; label_0["bg"]="gray35"; label_0["fg"]="White"
c.itemconfig(id, fill="gray35")
root = Tk()
root.protocol("WM_DELETE_WINDOW", onClosing)
root.title('Tecsup')#Titulo de la ventana
root.config(bg='#213141')
myFont = font.Font(size=10)
fm1 = Frame(root,padx=0,pady=0) #Frame
c = Canvas(fm1,width=80,height=80,bg='#213141')
id=c.create_oval(2,2,80,80,outline="gray0",fill="gray32")
label_0 = Label(fm1,width=4,height=1,text="...",font="calibri 16
bold",bd=0,highlightthickness=0)
fm1.pack() #Posicionamiento relativo (pack)
c.grid(row=0, column=0)
label_0.grid(row=0, column=0)
button1 = Button(root,text
='ON',command=pressButton1,bg='#00aeef',fg='#ffffff',height=2,width=20)
button1['font'] = myFont
button1.pack(padx=20,pady=10)
button2 = Button(root,text
='OFF',command=pressButton2,bg='#00aeef',fg='#ffffff',height=2,width=20)
button2['font'] = myFont
button2.pack(padx=20,pady=10)
root.mainloop()
Ejercicio 3: Reto Tecsup, crear un programa utilizando el PIO IDE, para prender y apagar un led RGB
desde el Python, emulando el funcionamiento de un semáforo.
uint8_t temprature_sens_read();
void setup() {
Serial.begin(115200);
}
void loop() {
Serial.print("Temperatura: ");
// Convierte la temperatura a Centígrados.
Serial.print((temprature_sens_read() - 32) / 1.8);
Serial.println(" C");
delay(2000);
}
#include <Arduino.h>
void setup() {
Serial.begin(115200);
delay(1000);
}
void loop() {
int pot = analogRead(34);
Serial.println(pot);
delay(100);
}
Ejercicio 7 (Reto Tecsup): Realizar la interfaz gráfica en python para mostrar el valor del
potenciómetro de 0 a 100%.
Para el manejo del sensor de temperatura-humedad DHT22 vamos a necesitar instalar la librería de
Adafruit, para los cual en el PlatformIO y en la opción librerías, buscamos e instalamos la librería.
Copiamos y pegamos el ejemplo en main.cpp que está en la carpeta src de nuestro proyecto en el
PlatformIO, no te olvides de completar la librería de Arduino.h al inicio, en este ejemplo vamos a usar
el PIN Nro. D2 para conectar el DHT22, tal como se muestra en el circuito esquemático.
ESP32 y finalmente abrimos el Serial Monitor del PlatformIO y revisamos si tenemos conexión
serial con el sensor DHT22.
Ejercicio 9: Crear un programa utilizando el PIO IDE, para leer el sensor DHT22, de temperatura y
humedad y realizar el monitoreo en tiempo real en el python a través del canal serial.
#include <Arduino.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
DHT_Unified dht(2, DHT22);
uint32_t delayMS;
void setup(){
Serial.begin(115200);
dht.begin();
Serial.println(F("DHT22 Unified Sensor"));
sensor_t sensor;
dht.temperature().getSensor(&sensor);
dht.humidity().getSensor(&sensor);
delayMS = sensor.min_delay / 1000;
}
void loop(){
delay(delayMS);
// Get temperature event and print its value.
sensors_event_t event;
dht.temperature().getEvent(&event);
if (isnan(event.temperature)) {
Serial.println(F("Error reading temperature!"));
}
else {
Serial.println(event.temperature);
}
import serial
import time
import collections
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.animation as animation
from tkinter import *
from threading import Thread
import sys
def getData():
time.sleep(1)
serialConnection.reset_input_buffer()
while (isRun):
global isReceiving
global ValueError
for i in range(sizeData):
value[i] = float(serialConnection.readline().strip())
isReceiving = True
def onClosing():
global isRun
isRun = False
thread.join()
serialConnection.close()
root.quit()
root.destroy()
def plotData(self,lines,lineValueText,lineLabel):
for i in range(sizeData):
data[i].append(value[i])
lines[i].set_data(range(samples),data[i])
lineValueText[i].set_text(lineLabel[i]+' = '+str(value[i]))
#Declaración de variables
serialPort = 'COM6'
baudRate = 115200
sizeData = 2
isReceiving = False
isRun = True
#Gráficas
samples = 100
sampleTime = 100
value = []
data = []
for i in range(sizeData):
data.append(collections.deque([0]*samples, maxlen=samples))
value.append(0)
xmin = 0
xmax = samples
ymin = 0
ymax = 100
lineLabel = ['Temperatura','Humedad']
style = ['r-','b-']
lines = []
lineValueText = []
#Crear gráfica
fig = plt.figure(facecolor='0.94')
ax = plt.axes(xlim=(xmin,xmax), ylim=(ymin,ymax))
plt.title('Monitoreo en tiempo real')
plt.grid()
ax.set_xlabel('Muestras')
ax.set_ylabel('°C - %')
for i in range(sizeData):
lines.append(ax.plot([],[],style[i],label=lineLabel[i])[0])
lineValueText.append(ax.text(0.65,0.90-i*0.05, '',transform=ax.transAxes))
plt.legend(loc="upper left")
#Abrir puerto serial
try:
serialConnection = serial.Serial(serialPort,baudRate)
except:
sys.exit('No se puede conectar al puerto')
#Recivir datos en segundo plano
thread = Thread(target=getData)
thread.start()
while isReceiving != True:
print('Iniciando recepción de datos')
time.sleep(0.1)
#Interfaz Gráfica
root = Tk()
root.title("Tecsup")
root.protocol('WM_DELETE_WINDOW',onClosing)
canvas = FigureCanvasTkAgg(fig,master=root)
canvas._tkcanvas.grid(row=0,column=0)
anim =
animation.FuncAnimation(fig,plotData,fargs=(lines,lineValueText,lineLabel),
interval=sampleTime)
root.mainloop()
El ESP32 Tiene dos tipos de Bluetooth el clásico y low energy (BLE), en este ejemplo vamos a
realizar el programa para configurar el Bluetooth clásico, para lo cual vamos a usar la librería
BluetoothSerial.h.
#include <BluetoothSerial.h>
BluetoothSerial BT;
const String deviceName = "ESP32BT";
void serialEvent(){
if(Serial.available())
BT.write(Serial.read());
if(BT.available())
Serial.write(BT.read());
delay(20);
}
void setup(){
Serial.begin(9600);
BT.begin(deviceName);
Serial.println(deviceName + " listo para emparejar...");
}
void loop(){
serialEvent();
}
Para esté ejercicio vamos a utilizar nuestro celular y la aplicación Serial Bluetooth Terminal
Una vez descargado el programa del Bluetooth, emparejamos el ESP32 con nuestro celular, para lo
cual vamos a las opciones de activar y configurar el Bluetooth.
Ejercicio 11: Crear un programa utilizando el PIO IDE, para la conexión Bluetooth clásico el cúal nos
permitirá prender y apagar un Led.
#include <BluetoothSerial.h>
BluetoothSerial BT;
const String deviceName = "ESP32ASM";
String message = "";
char incomingChar;
void serialEvent(){
if(Serial.available())
BT.write(Serial.read());
if(BT.available()){
incomingChar = BT.read();
if (incomingChar != '\n'){message += String(incomingChar);}
else{message = "";}
Serial.write(incomingChar);
}
if (message == "1"){digitalWrite(2, HIGH);}
else if (message == "2"){digitalWrite(2, LOW);}
delay(20);
}
void setup(){
Serial.begin(9600);
BT.begin(deviceName);
pinMode(2, OUTPUT);
Serial.println(deviceName + " listo para emparejar...");
}
void loop(){
serialEvent();
}
Ejercicio 12: (Reto Tecsup): Crear un programa utilizando el PIO IDE, para la conexión Bluetooth
clásico el cúal nos permitirá prender y apagar un Led desde el App Inventor 2
#include <BluetoothSerial.h>
BluetoothSerial BT;
const String deviceName = "ESP32ASM";
String mensaje = "";
char caracterEntrante;
void serialEvent(){
if(Serial.available())
BT.write(Serial.read());
if(BT.available()){
caracterEntrante = BT.read();
if(caracterEntrante != '\n')
mensaje += String(caracterEntrante);
else
mensaje = "";
Serial.write(BT.read());
}
if (mensaje == "1")
digitalWrite(2, HIGH);
else if (mensaje == "2")
digitalWrite(2, LOW);
delay(20);
}
void setup(){
Serial.begin(115200);
BT.begin(deviceName);
pinMode(2, OUTPUT);
Serial.println(deviceName + "Listo para emparejar...");
}
void loop(){
serialEvent();
}
Ejercicio 13: (Reto Tecsup): Crear un programa utilizando el PIO IDE y el AppInventor para la
conexión Bluetooth de la temperatura y humedad en el celular.