El xChip OC05 se comunica con el CW01 utilizando el protocolo I2C. El OC05 tiene 8 canales PWM. El OC05 utiliza el controlador PWM PCA9685 para controlar servomotores mediante Modulación por Ancho de Pulso. Los servomotores se alimentan a través de una batería externa que luego se regula utilizando el regulador BU33SD5. Con el CW01 conectado al OC05, el CW01 obtiene datos y procesa para establecer PWM y controlar la posición de los servomotores.
Al final de esta guía, podrás controlar servomotores de forma remota utilizando ubidots y los xChips de Xinabox IP01, CW01 y OC05.
Requisitos
1. Configuración de Hardware
1. Conecta CW01, OC05 y 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 del IP01. Tu servo puede conectarse a uno de los 8 conectores en el OC05.
2. Configuración del Arduino IDE
1. Instala Arduino IDE 1.8.8.
2. Instala estas bibliotecas/núcleos en Arduino:
NOTA: Si no estás familiarizado con cómo instalar bibliotecas, por favor consulta el enlace: Instalación de bibliotecas de Arduino
3. Con la plataforma ESP8266 instalada, selecciona el dispositivo ESP8266 con el que estás trabajando. En este caso, estamos trabajando con un “CW01”. Para seleccionar tu placa desde el Arduino IDE, selecciona Herramientas > Placa “XinaBox CW01”.
3. Crear Widget de Control deslizante
1. Inicia sesión en tu cuenta de Ubidots:
2. 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 que la asignada en el código. Para aprender más sobre las Etiquetas de Dispositivos y Variables, consulta el siguiente artículo.
4. Ve a la sección del panel ("Datos > Paneles") para crear un nuevo widget de control. Para crear un nuevo widget de control en el Panel, haz clic en el icono “+” en la esquina superior derecha de la interfaz de usuario del panel. 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:
4. Programación
Incluyendo bibliotecas:
#include "Ubidots.h"#include <xOC05.h>#include <xCore.h>
Definiendo constantes:
#define SERVO_MAX 450 //máximo PWM del servomotor#define SERVO_MIN 130 //mínimo PWM del servomotor#define SERVO_CHANNEL 1 //Habilitando solo el canal 1
Ingresa tus credenciales de Wi-Fi y el TOKEN de Ubidots donde se indica:
const char* UBIDOTS_TOKEN = "..."; // Pon aquí tu TOKEN de Ubidotsconst char* WIFI_SSID = "..."; // Pon aquí tu SSID de Wi-Ficonst char* WIFI_PASS = "..."; // Pon aquí tu contraseña de Wi-Ficonst char* DEVICE_LABEL_TO_RETRIEVE_VALUES_FROM = "OC05"; // Reemplaza por la etiqueta de tu dispositivoconst char* VARIABLE_LABEL_TO_RETRIEVE_VALUES_FROM = "grados"; // Reemplaza por la etiqueta de tu variable
NOTA IMPORTANTE: Puedes elegir tu propia Etiqueta de Dispositivo y Variable, pero las etiquetas de ambas deben ser asignadas respectivamente.
Configuración única, consulta los comentarios para autoexplicación:
void setup() { value = 0; //Valor actual del deslizador prevValue = 0; //Valor anterior del deslizador //Serial.begin(115200); //Habilítalo para depuración serial ubidots.wifiConnect(WIFI_SSID, WIFI_PASS);//Establecer Wi-Fi //conexión con el punto de acceso Wire.begin(); //Iniciar comunicación I2C OC05.begin(); //Comienza con la dirección I2C predeterminada 0x78 OC05.setPWMFreq(60); //Establecer frecuencia PWM a 60Hz //ubidots.setDebug(true); // Descomentar esta línea para establecer}
Operación del bucle, sigue ejecutándose y actualizándose una y otra vez
void loop() { //Obteniendo el valor del deslizador float value = ubidots.get(DEVICE_LABEL_TO_RETRIEVE_VALUES_FROM, VARIABLE_LABEL_TO_RETRIEVE_VALUES_FROM); //Mapeando grados(0-180) al rango PWM del servomotor value = map(value, 0, 180, SERVO_MIN, SERVO_MAX); // Evalúa los resultados obtenidos if (value != ERROR_VALUE) { //Verificando si el valor del deslizador cambió if (prevValue != value) { OC05.setPWM(SERVO_CHANNEL, value); prevValue = value; } } delay(500);}
El Código Completo, por favor lee los comentarios:
#include "Ubidots.h"#include <xOC05.h>#include <xCore.h>#define SERVO_MAX 450 //máximo PWM del servomotor#define SERVO_MIN 130 //mínimo PWM del servomotor#define SERVO_CHANNEL 1 //Habilitando solo el canal 1const char* UBIDOTS_TOKEN = "..."; // Pon aquí tu TOKEN de Ubidotsconst char* WIFI_SSID = "..."; // Pon aquí tu SSID de Wi-Ficonst char* WIFI_PASS = "..."; // Pon aquí tu contraseña de Wi-Ficonst char* DEVICE_LABEL_TO_RETRIEVE_VALUES_FROM = "OC05"; // Reemplaza por la etiqueta de tu dispositivoconst char* VARIABLE_LABEL_TO_RETRIEVE_VALUES_FROM = "grados"; // Reemplaza por la etiqueta de tu variableUbidots ubidots(UBIDOTS_TOKEN, UBI_HTTP); //Creando cliente ubidotsxOC05 OC05; //Creando objeto OC05float value, prevValue; //Declarando variables para almacenar valores actuales y pasadosvoid setup() { value = 0; //Valor actual del deslizador prevValue = 0; //Valor anterior del deslizador //Serial.begin(115200); //Habilítalo para depuración serial ubidots.wifiConnection(WIFI_SSID, WIFI_PASS);//Establecer Wi-Fi //conexión con el punto de acceso Wire.begin(); //Iniciar comunicación I2C OC05.begin(); //Comienza con la dirección I2C predeterminada 0x78 OC05.setPWMFreq(60); //Establecer frecuencia PWM a 60Hz //ubidots.setDebug(true); // Descomentar esta línea para establecer}void loop() { //Obteniendo el valor del deslizador float value = ubidots.get(DEVICE_LABEL_TO_RETRIEVE_VALUES_FROM, VARIABLE_LABEL_TO_RETRIEVE_VALUES_FROM); //Mapeando grados(0-180) al rango PWM del servomotor value = map(value, 0, 180, SERVO_MIN, SERVO_MAX); // Evalúa los resultados obtenidos if (value != ERROR_VALUE) { //Verificando si el valor del deslizador cambió if (prevValue != value) { OC05.setPWM(SERVO_CHANNEL, value); prevValue = value; } } delay(500);}
5. Compilar y Subir desde Arduino IDE
1. Ahora usarás Arduino IDE para Compilar y luego Subir el código al CW01, asegurándote de haber seleccionado la placa CW01 y de estar conectado al puerto USB correcto.
2. En el Panel de Ubidots, el OC05 puede ser controlado con el widget de deslizador que se agregó. Cuando deslizas, el servomotor rota a esa posición específica.
7. Resumen
En este tutorial, hemos mostrado cómo controlar servomotores utilizando XinaBox xChips CW01/OC05/IP01 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 15 y 20 minutos.
Otros lectores también han encontrado útil...