Control de Servomotor con Potenciómetro y Display OLED 128x32 en Arduino

Introducción:

A continuación, presentaremos a detalle el desarrollo y funcionamiento de un circuito Servomotor controlado mediante un Arduino y un Potenciómetro, que además muestra los valores de ángulo en una Pantalla Oled.

 

Elementos utilizados:

Protoboard Mediana
–  Arduino UNO y cable (USB del PC al puerto de Arduino)
Potenciómetro 10K
Servomotor 180° no continuo
Pantalla OLED 128×32 I2C 0.91″ SSD1306
Cables Macho Macho
Cables Macho Hembra

 

Conexiones, por partes:

Servomotor

– Pin «Power» de Servomotor (Rojo) a 5V de Arduino
– Pin «Ground» de Servomotor (Café) a GND de Arduino
– Pin «Signal» del Servomotor (Naranja) a Pin 9 de Arduino
Control de Servomotor con Potenciómetro y Display OLED 128x32 en Arduino Control de Servomotor con Potenciómetro y Display OLED 128x32 en Arduino

 

Potenciómetro

– Pin VCC de Potenciómetro a 5V de Arduino
– Pin de Salida del Potenciómetro a A3 de Arduino
– Pin GND de Potenciómetro a GND de Arduino
Control de Servomotor con Potenciómetro y Display OLED 128x32 en Arduino Control de Servomotor con Potenciómetro y Display OLED 128x32 en Arduino

 

Pantalla OLED

– Pin VCC de Pantalla OLED a 5V de Arduino
– Pin GND de Pantalla OLED a Arduino
– Pin SDA de Pantalla OLED a A4 de Arduino
– Pin SCL de Pantalla OLED a A5 de Arduino
Control de Servomotor con Potenciómetro y Display OLED 128x32 en Arduino Control de Servomotor con Potenciómetro y Display OLED 128x32 en Arduino

 

Conexión completa de los componentes:

Control de Servomotor con Potenciómetro y Display OLED 128x32 en Arduino

 

Código:

A partir del siguiente código se podrá comprobar el funcionamiento del circuito:

Descargar Servo.Potenciómetro.Pantalla.ino

 

Código, explicación por partes:

#include <Arduino.h>
#include <U8g2lib.h>
#include <Servo.h>

  • Arduino.h: Es la biblioteca principal de Arduino y proporciona funciones básicas para programar en Arduino.
  • U8g2lib.h: Esta biblioteca es utilizada para controlar pantallas OLED, en este caso, un SSD1306 de 128×32 píxeles.
  • Servo.h: Es la biblioteca para controlar servomotores en Arduino.

U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);

  • Se crea un objeto u8g2 de la clase U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C para controlar la pantalla OLED.

int ServoPin = 9;
int Ang = 0;
int PotPin = A3;
int PotValor;
Servo XServo;

  • Se definen variables para los pines del servo (ServoPin), el ángulo del servo (Ang), el pin del potenciómetro (PotPin), y el valor leído del potenciómetro (PotValor). Además, se crea un objeto XServo de la clase Servo.

void setup() {
u8g2.begin();
XServo.attach(ServoPin);
XServo.write(Ang);
Serial.begin(9600);
}

  • u8g2.begin(): Inicia la comunicación con la pantalla OLED.
  • XServo.attach(ServoPin): Asocia el objeto XServo al pin del servo.
  • XServo.write(Ang): Establece la posición inicial del servo en el ángulo Ang.
  • Serial.begin(9600): Inicia la comunicación serial a una velocidad de 9600 baudios para la depuración a través del puerto serial.

void loop() {
PotValor = analogRead(PotPin);
Ang = map(PotValor, 0, 1023, 0, 180);
XServo.write(Ang);
delay(100);
Serial.println(PotValor);
}

  • analogRead(PotPin): Lee el valor analógico del potenciómetro y lo almacena en PotValor.
  • map(PotValor, 0, 1023, 0, 180): Mapea el valor leído del potenciómetro al rango de 0 a 180 grados y lo almacena en Ang.
  • XServo.write(Ang): Actualiza la posición del servo según el nuevo ángulo.
  • delay(100): Espera 100 milisegundos para evitar lecturas rápidas del potenciómetro.
  • Serial.println(PotValor): Imprime el valor del potenciómetro en el monitor serial.

u8g2.drawStr(0,10,"Mechatronics");
u8g2.sendBuffer();

  • u8g2.drawStr(0,10,"Mechatronics"): Dibuja el texto «Mechatronics» en la pantalla OLED en la posición (0, 10).
  • u8g2.sendBuffer(): Envía el contenido del búfer a la pantalla para que sea visible.

char buffer[20];
sprintf(buffer, "PotValor: %d", PotValor);
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB08_tr);
u8g2.drawStr(0, 20, buffer);
sprintf(buffer, "Angulo: %d", Ang);
u8g2.drawStr(0, 30, buffer);

  • Se utiliza un buffer (char buffer[20]) para formatear las cadenas que se mostrarán en la pantalla.
    (En char buffer[20], el «20» significa que bufferpuede guardar hasta 20 letras o caracteres. Se usa para almacenar información, como palabras de hasta 20 letras.)
  • sprintf(buffer, "PotValor: %d", PotValor): Formatea la cadena con el valor del potenciómetro y la almacena en buffer.
    (Un bufferen general es un trozo de memoria que sirve de «colchón» para los datos, la función sprintf formatea una cadena con los valores que le pasemos, y escribe el resultado en un búfer.)
  • u8g2.clearBuffer(): Borra el contenido del búfer de la pantalla OLED.
  • u8g2.setFont(u8g2_font_ncenB08_tr): Selecciona la fuente para el texto en la pantalla.
  • u8g2.drawStr(0, 20, buffer): Dibuja la cadena formateada en la posición (0, 20) de la pantalla.
  • sprintf(buffer, "Angulo: %d", Ang): Formatea la cadena con el valor del ángulo y la almacena en buffer.
  • u8g2.drawStr(0, 30, buffer): Dibuja la cadena formateada en la posición (0, 30) de la pantalla.

 

En el siguiente video se comprueba el correcto funcionamiento del circuito, además de visualizar de forma óptima los resultados:

servo y pantalla

 

Conclusión:

En conclusión, este proyecto integra un Servomotor controlado por un Arduino y un Potenciómetro, con resultados visibles en una Pantalla OLED. Las conexiones detalladas y el código explicado facilitan la comprensión y aplicación práctica, ofreciendo una experiencia completa para aquellos interesados en la mecatrónica. El video complementario valida el funcionamiento eficiente de este circuito.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *