Ir al contenido principal
Todas las coleccionesTutoriales de proyectos IoT
Controlar servomotores de forma remota utilizando XinaBox xChip OC05 (PCA9685) y CW02 (ESP32), conectados a ubidots a través de MQTT
Controlar servomotores de forma remota utilizando XinaBox xChip OC05 (PCA9685) y CW02 (ESP32), conectados a ubidots a través de MQTT

Controla servomotores (hasta 8) utilizando XinaBox xChip OC05 – Controlador de Servos (Controlador PWM PCA9685 y Regulador BU33SD5) y xChip CW02 (ESP32).

Sergio M avatar
Escrito por Sergio M
Actualizado hace más de una semana

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

  1. Configuración de Hardware

  2. Configurando el Arduino IDE

  3. Modificar la Biblioteca Ubidots ESP MQTT

  4. Crear Widget de Control deslizante

  5. Codificación

  6. Compilar y Cargar el código

  7. 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

  1. 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

  1. 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...

¿Ha quedado contestada tu pregunta?