El ESP-WROOM-32 (ESP32) Core y el módulo Wi-Fi, Bluetooth (CW02) permiten a los usuarios enviar datos desde xChips modulares de XinaBox a la nube y controlar el dispositivo de acuerdo con los datos obtenidos.
El xChip OC05 se comunica con CW02 utilizando el protocolo I2C. OC05 tiene 8 canales PWM. OC05 utiliza el controlador PCA9685 PWM para controlar motores servo utilizando Modulación por Ancho de Pulso. Los motores servo se pueden alimentar opcionalmente a través de una batería externa que luego se regula utilizando el regulador BU33SD5. Los motores servo también se pueden usar con OC05 sin baterías. Con CW02 conectado a OC05, CW02 obtiene datos y procesa para establecer PWM para controlar la posición de los motores servo.
Al final de esta guía, podrás controlar motores servo de forma remota utilizando Ubidots y Xinabox xChips IP01, CW02 y OC05.
Requisitos
Paso a Paso
Configuración de Hardware
Configurando el Arduino IDE
Modificar la Biblioteca Ubidots ESP MQTT
Crear Widget de Control deslizante
Codificación
Compilar y Cargar el código
Resumen
1. Configuración de Hardware
Conecta CW02, OC05 e IP01 juntos utilizando los conectores XC10 xBUS. Puedes conectarlo como se muestra en el diagrama a continuación. Por favor, consulta esta guía sobre cómo ensamblar xChips en general.
Luego, conecta tu dispositivo y PC a través del USB de IP01.
2. Configurando el Arduino IDE
Instala Arduino IDE 1.8.8.
Instala estas bibliotecas/núcleos en Arduino:
NOTA: Si no estás familiarizado con cómo instalar bibliotecas, consulta el enlace: Instalando bibliotecas de Arduino
Con el núcleo ESP32 instalado, selecciona el dispositivo ESP32 con el que estás trabajando. En este caso, estamos trabajando con un “CW02(módulo ESP32)”. Para seleccionar tu placa desde el Arduino IDE, selecciona Tools > Board “XinaBox CW02”.
3. Modificar la Biblioteca Ubidots ESP MQTT
La Biblioteca Ubidots ESP MQTT está por defecto hecha para ESP8266. Se deben hacer algunas modificaciones dentro de la biblioteca UbidotsESPMQTT para que sea utilizable para ESP32.
Abre UbidotsESPMQTT.h
, desde <ubicación del sketchbook>\libraries
con Notepad o Notepad++ (preferido):
Comenta o elimina #include <ESP8266WiFi.h>
, y agrega estas dos líneas:
#include <Arduino.h>#include <WiFi.h>
Reemplaza la siguiente línea:
#define SERVER "industrial.api.ubidots.com"
con:
#define SERVER "industrial.ubidots.com"
El código final puede verse así:
4. Crear Widget de Control deslizante
1. Inicia sesión en tu cuenta de Ubidots:
1. Crea un nuevo dispositivo. Para crear un nuevo dispositivo, haz clic en el icono "+" en la esquina superior derecha de la sección de Dispositivos de tu cuenta. Luego, asigna el nombre del dispositivo “OC05”:
Una vez que se crea el dispositivo, aparecerá listado en la sección de dispositivos:
3. Ingresa al dispositivo creado y agrega una nueva variable en bruto presionando el icono "+". La variable debe llamarse “grados”:
Una vez que se crea la variable, deberías tener el siguiente resultado:
NOTA IMPORTANTE: Para poder establecer la comunicación, la etiqueta de Dispositivo y Variable asignada en la plataforma debe ser la misma asignada en el código. Para aprender más sobre Etiquetas de Dispositivos y Variables, consulta el siguiente artículo.
4. Ve a la sección dashboard ("Data > Dashboards") para crear un nuevo widget de control. Para crear un nuevo widget de control en el Dashboard, haz clic en el icono “+” en la esquina superior derecha de la interfaz de usuario del dashboard. Luego, selecciona "Deslizador" como tipo de widget y asigna el dispositivo y la variable creados anteriormente.
Establece el valor mínimo en “0” y el máximo en “180” grados. Ingresa el tamaño del paso en 1:
Una vez que se crea el widget, deberías tener el siguiente resultado:
5. Codificación
Incluyendo bibliotecas:
#include "UbidotsESPMQTT.h"#include <xOC05.h>#include <xCore.h>
Ingresa tus credenciales de Wi-Fi y el TOKEN de Ubidots donde se indica:
#define TOKEN "" // Pon aquí tu TOKEN de Ubidots#define WIFINAME "" //Pon aquí tu SSID de WiFi#define WIFIPASS "" // Pon aquí tu contraseña de Wifi
Definiendo constantes:
#define DEVICE "oc05" // Pon aquí tu etiqueta de dispositivo de Ubidots#define VARIABLE "grados" // Pon aquí tu etiqueta de variable de Ubidots#define SERVO_MAX 450 //Máximo PWM del Motor Servo#define SERVO_MIN 130 //Mínimo PWM del Motor Servo#define SERVO_CHANNEL 1 //Seleccionar canal de Servo entre 1-8
NOTA IMPORTANTE: Asegúrate de que la ETIQUETA de Dispositivo y Variable estén asignadas respectivamente.
Creando Variables y Objetos:
Ubidots client(TOKEN,"esp32");xOC05 OC05;uint16_t value,prevValue;
Ubidots MQTT necesita que se le asigne una función de callback que se llame cada vez que se detecte un cambio en la variable.
void callback(char* topic, byte* payload, unsigned int length) { //El mensaje se imprime en el Monitor Serial, cada vez que se detecta un cambio Serial.print("Mensaje recibido ["); Serial.print(topic); Serial.print("] "); for (int i=0;i<length;i++) { Serial.print((char)payload[i]); } value = atoi((char*)payload); memset(payload,'\0',sizeof(payload)); //Mapear grados al rango PWM del Motor Servo value= map(value,0,180,SERVO_MIN,SERVO_MAX); //Cambiar la posición del motor si el valor ha cambiado if(prevValue!=value) { //Cambiar la posición del Motor Servo OC05.setPWM(SERVO_CHANNEL,value); prevValue=value; } }
Configuración única:
void setup() { //Serial.begin(115200); //Descomenta esta línea para habilitar la depuración Serial //client.setDebug(true); //Pasa un valor booleano verdadero o falso para activar //mensajes de depuración client.wifiConnection(WIFINAME, WIFIPASS); //Conectar al Punto de Acceso client.begin(callback); //Iniciar conexión MQTT con la función “callback” Wire.begin(); //Iniciar comunicación I2C OC05.begin(); //Iniciar OC05 OC05.setPWMFreq(60); //Establecer frecuencia PWM en 60Hz //Inicializar variables value=0; prevValue=0; } //El mensaje se imprime en el Monitor Serial, cada vez que se detecta un cambio Serial.print("Mensaje recibido ["); Serial.print(topic); Serial.print("] "); for (int i=0;i<length;i++) { Serial.print((char)payload[i]); } value = atoi((char*)payload); memset(payload,'\0',sizeof(payload)); //Mapear grados al rango PWM del Motor Servo value= map(value,0,180,SERVO_MIN,SERVO_MAX); //Cambiar la posición del motor si el valor ha cambiado if(prevValue!=value) { //Cambiar la posición del Motor Servo OC05.setPWM(SERVO_CHANNEL,value); prevValue=value; } }
Operación del bucle, sigue ejecutándose y actualizándose una y otra vez:
void loop() { //Reconectar si no está conectado al Ubidots MQTT if(!client.connected()){ client.reconnect(); //Suscribirse al DISPOSITIVO y VARIABLE previamente configurados client.ubidotsSubscribe(DEVICE,VARIABLE); } client.loop();}
El Código Completo, por favor lee los comentarios:
#include "UbidotsESPMQTT.h"#include <xOC05.h>#include <xCore.h>#define TOKEN "" // Pon aquí tu TOKEN de Ubidots#define WIFINAME "" //Pon aquí tu SSID de WiFi#define WIFIPASS "" // Pon aquí tu contraseña de Wifi#define DEVICE "oc05" // Pon aquí tu etiqueta de dispositivo de Ubidots#define VARIABLE "grados" // Pon aquí tu etiqueta de variable de Ubidots#define SERVO_MAX 450 //Máximo PWM del Motor Servo#define SERVO_MIN 130 //Mínimo PWM del Motor Servo#define SERVO_CHANNEL 1 //Seleccionar canal de Servo entre 1-8Ubidots client(TOKEN,"esp32");xOC05 OC05;uint16_t value,prevValue;void callback(char* topic, byte* payload, unsigned int length) { //El mensaje se imprime en el Monitor Serial, cada vez que se detecta un cambio Serial.print("Mensaje recibido ["); Serial.print(topic); Serial.print("] "); for (int i=0;i<length;i++) { Serial.print((char)payload[i]); } value = atoi((char*)payload); memset(payload,'\0',sizeof(payload)); //Mapear grados al rango PWM del Motor Servo value= map(value,0,180,SERVO_MIN,SERVO_MAX); //Cambiar la posición del motor si el valor ha cambiado if(prevValue!=value) { //Cambiar la posición del Motor Servo OC05.setPWM(SERVO_CHANNEL,value); prevValue=value; } } void setup() { //Serial.begin(115200); //Descomenta esta línea para habilitar la depuración Serial //client.setDebug(true); //Pasa un valor booleano verdadero o falso para activar //mensajes de depuración client.wifiConnection(WIFINAME, WIFIPASS); //Conectar al Punto de Acceso client.begin(callback); //Iniciar conexión MQTT con la función “callback” Wire.begin(); //Iniciar comunicación I2C OC05.begin(); //Iniciar OC05 OC05.setPWMFreq(60); //Establecer frecuencia PWM en 60Hz //Inicializar variables value=0; prevValue=0;}void loop() { //Reconectar si no está conectado al Ubidots MQTT if(!client.connected()){ client.reconnect(); //Suscribirse al DISPOSITIVO y VARIABLE previamente configurados client.ubidotsSubscribe(DEVICE,VARIABLE); } client.loop();}
6. Compilar y Cargar el código
Ahora usarás el Arduino IDE para compilar y luego cargar el código en el CW02, asegurándote de haber seleccionado la placa CW02 y de estar conectado al puerto USB correcto.
En el Dashboard de Ubidots, el OC05 se puede controlar con el widget deslizante que se agregó. Cuando deslizas, el motor servo rota a esa posición específica.
7. Resumen
En este tutorial, hemos mostrado cómo controlar motores servo utilizando los xChips CW02/OC05/IP01 de XinaBox con Ubidots de forma remota desde cualquier lugar. Con XinaBox y Ubidots, ahora puedes controlar puertas y ventanas desde cualquier lugar para automatizar tu hogar. El proyecto es bastante simple y puede tardar entre 20 y 25 minutos.
Otros lectores también han encontrado útil...