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
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
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
Conexión completa de los componentes:
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 claseU8G2_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 objetoXServo
de la claseServo
.
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 objetoXServo
al pin del servo.XServo.write(Ang)
: Establece la posición inicial del servo en el ánguloAng
.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 enPotValor
.map(PotValor, 0, 1023, 0, 180)
: Mapea el valor leído del potenciómetro al rango de 0 a 180 grados y lo almacena enAng
.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.
(Enchar buffer[20]
, el «20» significa quebuffer
puede 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 enbuffer
.
(Unbuffer
en general es un trozo de memoria que sirve de «colchón» para los datos, la funciónsprintf
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 enbuffer
.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:
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.