Cómo convertir cualquier motor CC en un servomotor

¿Alguna vez te has preguntado si es posible convertir un motor CC en un servomotor? ¡La respuesta es sí! En este artículo te enseñaremos cómo puedes convertir cualquier motor de corriente continua en un servomotor. Descubre todos los pasos necesarios para lograrlo y las ventajas que ofrece esta conversión. ¡No te lo pierdas!

En este tutorial, aprenderemos cómo convertir cualquier motor de CC en un servomotor personalizado, independiente y con muchas funciones. A diferencia de los servos normales que tienen un movimiento limitado de 180 o 270 grados, este tiene un rango ilimitado de 360 ​​grados y además tenemos la opción de ajustar el rango de rotación a cualquier valor deseado.

Cómo convertir cualquier motor CC en un servomotor

En>

Puede ver el vídeo a continuación o leer el tutorial escrito a continuación.

Otra característica es que podemos ajustar la sensibilidad o velocidad de respuesta del servo a nuestras entradas. En lo que a entrada se refiere, podremos elegir entre tres modos de entrada diferentes.

Cómo convertir cualquier motor CC en un servomotor

Podemos>

Cómo convertir cualquier motor CC en un servomotor

También>

En la parte superior de esta lista de características del servomotor se encuentra el modo de rotación continua. Eso es correcto. También podemos controlar y rastrear la posición del servomotor en este modo de rotación continua. Podemos configurar el eje del servomotor para que vaya a cualquier posición con un número infinito de revoluciones.

Todo esto es posible gracias al codificador de 12 bits de este servomotor, al sensor de posición de rotación magnético AS5600 y al control PID implementado para accionar el motor de CC.

Cómo convertir cualquier motor CC en un servomotor

Hice>

Cómo convertir cualquier motor CC en un servomotor

Todo>

Cómo convertir cualquier motor CC en un servomotor

Ahora>

Principio de funcionamiento del servomotor.

Para explicar el principio de funcionamiento de un servomotor, desmontemos un servomotor RC típico y echemos un vistazo a lo que hay dentro.

Cómo convertir cualquier motor CC en un servomotor

Podemos>

Esta es una configuración típica para la mayoría de los servomotores RC o aficionados. El potenciómetro está conectado al eje de salida del motor de CC y actúa como sensor de posición. Le dice al controlador la posición actual del eje del servomotor. La placa controladora controla el motor de CC en función de la señal de entrada (la posición deseada) y la posición real que obtenemos como retroalimentación del potenciómetro. Esto representa un sistema de control cerrado.

Cómo convertir cualquier motor CC en un servomotor

La>

Cómo crear un servomotor personalizado

Entonces, si queremos construir nuestro propio servomotor con motores de CC más grandes que los que usan estos servos RC típicos, podemos implementar el mismo sistema de control de circuito cerrado.

Cómo convertir cualquier motor CC en un servomotor

Todo>

En cuanto al sensor de posición, la solución más sencilla es utilizar un potenciómetro sencillo como vimos en los servos RC. Sin embargo, el problema con este tipo de potenciómetros es que tienen un rango de rotación limitado de sólo 270 grados, lo que limita directamente el rango de rotación del servomotor. También existen otros tipos de potenciómetros que pueden realizar múltiples giros y ofrecer mejor alcance y resolución, pero aún tienen un rango de rotación limitado.

Cómo convertir cualquier motor CC en un servomotor

Si>

Codificador AS5600 – Sensor de posición giratorio magnético

Elegí un codificador magnético o el sensor de posición giratorio magnético AS5600 porque es muy compacto, fácil de implementar y ofrece alta precisión y resolución. Basta con mirar lo pequeño que es este microchip.

Cómo convertir cualquier motor CC en un servomotor

Dispone>Campo magnético. Entonces, todo lo que tenemos que hacer es colocar un imán en el eje de salida del motor y colocarlo cerca del microchip a una distancia de 0,5 a 3 mm.

Cómo convertir cualquier motor CC en un servomotor

Ahora,>

Cómo convertir cualquier motor CC en un servomotor

Esto>

Muy bien, ¿qué más necesitamos? Un microcontrolador y un driver para el motor DC. Elegí el controlador de motor de CC DRV8871, que puede manejar hasta 3,5 amperios de corriente, y el microcontrolador Atmega328.

Cómo convertir cualquier motor CC en un servomotor

Elegí>

Diagrama de cableado del servomotor personalizado

Aquí está el esquema completo de este servomotor personalizado.

Cómo convertir cualquier motor CC en un servomotor

Puede>

  • Codificador magnético AS5600 ………………….. Amazonas / AliExpress
  • Controlador de motor de CC DRV8871……………….…. Amazonas / AliExpress
  • Atmega328p-AU……………………………………. Amazonas / AliExpress
  • Oscilador de cristal de 16 MHz…………………….. Amazonas / AliExpress
  • Regulador de voltaje AMS1117 5V…………..…. Amazonas / AliExpress
  • Potenciómetro cuadrado 3386P………………. Amazonas / AliExpress
  • Kit condensadores 0805 ………………………….…. Amazonas / AliExpress
  • Motor de 12 VCC – ~50 RPM………….……. Amazonas / AliExpress

Divulgación: estos son enlaces de afiliados. Como asociado de Amazon, gano con compras que califican.

Entonces tenemos el microcontrolador Atmega328 junto con su circuito mínimo recomendado que incluye un oscilador de 16MHz, algunos capacitores y una resistencia.

Cómo convertir cualquier motor CC en un servomotor

Para>

Aquí está el sensor de posición AS5600 con su circuito recomendado que incluye dos condensadores y dos resistencias pull-up para comunicación IC2.

Cómo convertir cualquier motor CC en un servomotor

El>

Aquí hay un resumen de este circuito y su flujo de trabajo. La entrada o la posición angular deseada se recibe a través de estos dos pines y puede ser un voltaje analógico de un potenciómetro o una señal PWM digital de un receptor RC. La entrada ingresa al microcontrolador donde se compara con la posición angular real detectada por el codificador o el sensor de posición AS5600. Este sensor se comunica con el microcontrolador mediante el protocolo IC2.

Cómo convertir cualquier motor CC en un servomotor

Luego,>

Todo el circuito se alimenta con 12 V y el regulador de voltaje AS1117 proporciona 5 V al microcontrolador y los demás componentes.

diseño de PCB

Intenté hacer la placa lo más pequeña posible según el diagrama del circuito y obtuve el tamaño de 40 x 40 mm.

Cómo convertir cualquier motor CC en un servomotor

Coloco>Cómo convertir cualquier motor CC en un servomotor

Todos>

Pedí la placa de circuito de PCBWay. Aquí podemos simplemente cargar el archivo Gerber, seleccionar las propiedades de nuestra PCB y pedirlo a un precio razonable.

Cómo convertir cualquier motor CC en un servomotor

Diseñé>

Busque y descargue el archivo Gerber desde Comunidad de intercambio de proyectos PCBWay a través del cual también puedes pedir la placa de circuito directamente.

Sin embargo, la placa llegó al cabo de unos días. La calidad de la tabla es excelente, todo es exactamente como en el diseño y la recibí con un acabado de superficie dorado.

Cómo convertir cualquier motor CC en un servomotor

Bien,>

Cómo convertir cualquier motor CC en un servomotor

En>

El mayor desafío fue soldar el microcontrolador Atmega328 ya que los pines son muy pequeños y están muy juntos, pero de alguna manera lo logré.

Cómo convertir cualquier motor CC en un servomotor

El>

Cómo convertir cualquier motor CC en un servomotor

De>

Cómo convertir cualquier motor CC en un servomotor

Ahora>

Modelo 3D de servo personalizado

Diseñé la caja de cambios para este servomotor personalizado usando Onshape. Por supuesto, el diseño de la caja de cambios depende del motor de CC. Como se mencionó anteriormente, combinado con la placa controladora que acabamos de crear, podemos usar motores de CC de cualquier tamaño.

Cómo convertir cualquier motor CC en un servomotor

Aquí>

Cómo convertir cualquier motor CC en un servomotor

Por>

Coloqué el tablero de control en la parte trasera de esta transmisión y lo alineé perfectamente en el centro del eje de salida.

Cómo convertir cualquier motor CC en un servomotor

Si>

Descargar modelo 3D y archivos STL

Puedes ver y explorar el modelo 3D de este servomotor personalizado. directamente en su navegador web con Onshape. (Necesita una cuenta Onshape para esto, Puedes crear una cuenta gratuita para uso doméstico.)

Por supuesto, también puedes descargar el modelo 3D y los archivos STL necesarios para imprimir las piezas en 3D aquí:

Archivo PASO:

Archivos STL para impresión 3D:

Montaje del servo personalizado

Aquí están las piezas impresas en 3D para esta construcción para que podamos comenzar a ensamblar el servomotor.

Cómo convertir cualquier motor CC en un servomotor

También>

Primero, fijé el motor de CC a la placa base usando unos tornillos M3 de 8 mm de largo.

Cómo convertir cualquier motor CC en un servomotor

Luego>

Cómo convertir cualquier motor CC en un servomotor

En>

También agregué inserciones roscadas al engranaje más pequeño que lo une al eje del motor de CC. Ahora podemos deslizar los engranajes emparejados a su posición. Dado que estos son engranajes de flecha, debemos empujarlos a ambos en su lugar al mismo tiempo; de lo contrario, no podremos emparejarlos si los insertamos uno a la vez.

Cómo convertir cualquier motor CC en un servomotor

Utilicé>

Con el panel lateral, el cojinete de bolas del eje de salida y la cubierta superior en su lugar, podemos completar el ensamblaje de la caja de cambios.

Cómo convertir cualquier motor CC en un servomotor

Agregué>

Cómo convertir cualquier motor CC en un servomotor

Fijamos>

Cómo convertir cualquier motor CC en un servomotor

Tenga>

Cómo convertir cualquier motor CC en un servomotor

Terminé>

Cómo convertir cualquier motor CC en un servomotor

Luego>

Cómo convertir cualquier motor CC en un servomotor

Programando el controlador

Lo que queda por hacer ahora es darle vida a este servo o programar el controlador. Para ello, primero necesitamos grabar un gestor de arranque en el microcontrolador ATmega328p. Sin un gestor de arranque, el microcontrolador no puede entender el lenguaje o el código que le enviamos.

Grabar gestor de arranque

Para grabar el gestor de arranque en el ATmega328p necesitamos una placa Arduino, en mi caso usaré una placa Arduino Nano.

Cómo convertir cualquier motor CC en un servomotor

Usaremos>

Cómo convertir cualquier motor CC en un servomotor

Ahora,>

A continuación, como programadores, debemos seleccionar «Arduino» como ISP en el menú «Herramientas» y luego hacer clic en «Grabar cargador de arranque».

Cómo convertir cualquier motor CC en un servomotor

Mientras>

Subir código

Una vez que hayamos terminado con eso, ahora podemos programar o cargar el código en la placa del controlador usando un módulo de interfaz USB a UART.

Cómo convertir cualquier motor CC en un servomotor

La>

Cómo convertir cualquier motor CC en un servomotor

Ahora>

Y listo, nuestro servomotor personalizado está listo. Ahora podemos conectar un potenciómetro para probarlo. Solo tenga en cuenta que la entrada analógica va al pin «S» de la placa del controlador, no al pin «A».

Cómo convertir cualquier motor CC en un servomotor

Al>

Cómo convertir cualquier motor CC en un servomotor

Y>

Cómo convertir cualquier motor CC en un servomotor

Código fuente

Ahora veamos el código de este servomotor hecho a medida.

/*
 *    Custom-built Servo Motor - Arduino Code
 *    by Dejan, www.HowToMechatronics.com
 * 
 *   Libraries:
 *   AS5600 encoder: https://github.com/RobTillaart/AS5600
 *   PID conroller: https://github.com/br3ttb/Arduino-PID-Library/blob/master/PID_v1.h
 */


#include "AS5600.h"
#include "Wire.h"
#include <PID_v1.h>


AS5600 as5600;   //  use default Wire

double Pk1 = 2;  //speed it gets there
double Ik1 = 0;
double Dk1 = 0.025;

//Define Variables we'll be connecting to
double Setpoint, Input, Output;

PID myPID(&Input, &Output, &Setpoint, Pk1, Ik1, Dk1, DIRECT);

#define motor_IN1 5
#define motor_IN2 6
#define ch1 2
#define centerSet 7
#define inputSwitch 3
#define modeSwitch 4

int ch1Value;

int encoderValue, inputValue, pwmValue;
String inString = "";  // string to hold input

int centerAngle = 2047; // 180 degrees
int angleDifference = 0;
int angleValue = 0;
int leftLimit = 30;
int rightLimit = 4067;
int rangeAdjustment = 0;
float sensitivityAdjustment = 0;
float angle = 0;

int quadrantNumber = 2;
int previousQuadrantNumber = 3;
int numberOfTurns = 0;
float totalAngle = 0;

int error = 0;

char incomingByte = 0;
int intInput = 0;

void setup() {
  Serial.begin(115200);
  Serial.println(__FILE__);
  Serial.print("AS5600_LIB_VERSION: ");
  Serial.println(AS5600_LIB_VERSION);

  Wire.begin();

  pinMode(motor_IN1, OUTPUT);
  pinMode(motor_IN2, OUTPUT);
  // Activate the Arduino internal pull-up resistors
  pinMode(centerSet, INPUT_PULLUP);
  pinMode(inputSwitch, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);

  myPID.SetMode(AUTOMATIC);              // PID Setup
  myPID.SetOutputLimits(-255, 255);
  myPID.SetSampleTime(20);

}

void loop() {
  // Read encoder value - current position
  encoderValue = as5600.readAngle();

  // Continuous rotation mode
  if (digitalRead(modeSwitch) == 0) {
    // Enter desired angle for the servo to go to through the serial monitor
    while (Serial.available() > 0) {
      int inChar = Serial.read();
      if (isDigit(inChar)) {
        // convert the incoming byte to a char and add it to the string:
        inString += (char)inChar;
      }
      // if you get a newline, print the string, then the string's value:
      if (inChar == 'n') {
        Setpoint = inString.toInt(); // Setpoint - desired angle
        // clear the string for new input:
        inString = "";
      }
    }
    if (digitalRead(inputSwitch) == 0) { // Potentiometer as input
      inputValue = analogRead(A0);
      if (inputValue < 400) {
        Setpoint = Setpoint - 0.3;
      }
      if (inputValue < 300) {
        Setpoint = Setpoint - 0.3;
      }
      if (inputValue < 200) {
        Setpoint = Setpoint - 0.3;
      }

      if (inputValue > 600) {
        Setpoint = Setpoint + 0.3;
      }
      if (inputValue > 700) {
        Setpoint = Setpoint + 0.3;
      }

      if (inputValue > 800) {
        Setpoint = Setpoint + 0.3;
      }
    }
    else if (digitalRead(inputSwitch) == 1) {
      inputValue = pulseIn(ch1, HIGH, 30000); // RC receiver as input
      if (inputValue < 1450) {
        Setpoint--;
      }
      if (inputValue < 1350) {
        Setpoint--;
      }
      if (inputValue < 1250) {
        Setpoint--;
      }
      if (inputValue < 1150) {
        Setpoint--;
      }
      if (inputValue > 1550) {
        Setpoint++;
      }
      if (inputValue > 1650) {
        Setpoint++;
      }
      if (inputValue > 1750) {
        Setpoint++;
      }
      if (inputValue > 1850) {
        Setpoint++;
      }
    }

    // Convert encoder RAW values into angle value
    angle = encoderValue * 0.087890625;
    // Quadrant 1
    if (angle >= 0 && angle <= 90) {
      quadrantNumber = 1;
    }
    // Quadrant 2
    if (angle >= 90 && angle <= 180) {
      quadrantNumber = 2;
    }
    // Quadrant 3
    if (angle >= 180 && angle <= 270) {
      quadrantNumber = 3;
    }
    // Quadrant 4
    if (angle >= 270 && angle <= 360) {
      quadrantNumber = 4;
    }

    if (quadrantNumber != previousQuadrantNumber) {
      // Transition from 4th to 1st quadrant
      if (quadrantNumber == 1 && previousQuadrantNumber == 4) {
        numberOfTurns++;
      }
      // Transition from 1st to 4th quadrant
      if (quadrantNumber == 4 && previousQuadrantNumber == 1) {
        numberOfTurns--;
      }
      previousQuadrantNumber = quadrantNumber;
    }
    if (totalAngle >= 0) {
      totalAngle = (numberOfTurns * 360) + angle;
    }
    else {
      totalAngle = (numberOfTurns * 360) + angle;
    }

    // Establish Input value for PID
    Input = totalAngle;
  }

  // Limited Rotation Mode
  else if (digitalRead(modeSwitch) == 1) {

    rangeAdjustment = analogRead(A1);
    leftLimit = 0 + 30 + rangeAdjustment;
    rightLimit = 4097 - 30 - rangeAdjustment;


    if (digitalRead(inputSwitch) == 0) {  // Analog input - Potentiometer
      // Get value from potentiometer
      inputValue = analogRead(A0);
      if (inputValue < 15) {
        inputValue = 15;
      }
      if (inputValue > 1008) {
        inputValue = 1008;
      }
      Setpoint = map(inputValue, 15, 1008, -255, 255);
    }
    else if (digitalRead(inputSwitch) == 1) {  // Digital input - RC transmitter
      inputValue = pulseIn(ch1, HIGH, 30000); // Read RC receiver as input
      Setpoint = map(inputValue, 1000, 2000, -255, 255);
    }

    // Set center angle
    if (digitalRead(centerSet) == LOW) {
      centerAngle = encoderValue;
      angleDifference = 2047 - encoderValue;
      delay(1000);
    }
    // Adjust angle value according to the center point (angleDifference)
    if (centerAngle < 2047) {
      angleValue = encoderValue + angleDifference;
      if (encoderValue < 4097 && encoderValue > (4096 - angleDifference)) {
        angleValue = encoderValue - 4097 + angleDifference;
      }
    }
    if (centerAngle > 2047) {
      angleValue = encoderValue + angleDifference;
      if (encoderValue >= 0 && encoderValue < abs(angleDifference)) {
        angleValue = encoderValue + 4097 + angleDifference;
      }
    }
    else if (centerAngle == 2047) {
      angleValue = encoderValue;
    }

    // Establish Input value for PID
    Input = map(angleValue , leftLimit, rightLimit, -255, 255);
  }
  // Adjusting sensitivity
  Pk1 = analogRead(A2) * 0.002;
  myPID.SetTunings(Pk1, Ik1, Dk1);

  // Run PID process to get Output value
  myPID.Compute();
  // Move right
  if (Output > 1 ) {
    pwmValue = Output;

    if (pwmValue < 30 && pwmValue > 5) {
      pwmValue = pwmValue + 30;
    }
    if (pwmValue <= 5) {
      pwmValue = 0;
    }
    digitalWrite(motor_IN1, LOW);
    analogWrite(motor_IN2, pwmValue);
  }
  // Move left
  else if (Output < 1 ) {
    pwmValue = abs(Output);

    if (pwmValue < 30 && pwmValue > 5) {
      pwmValue = pwmValue + 30;
    }
    if (pwmValue <= 5) {
      pwmValue = 0;
    }
    analogWrite(motor_IN1, pwmValue);
    digitalWrite(motor_IN2, LOW);
  }
  // Do not move
  else if (Output > -1 && Output < 1) {
    pwmValue = 0;
    digitalWrite(motor_IN1, LOW);
    digitalWrite(motor_IN2, LOW);
  }

  //Serial.print(Setpoint);
  //Serial.print("t");
  //Serial.println(totalAngle);
}Code language: Arduino (arduino)

Descripción general del código

Por lo tanto, iniciamos el ciclo leyendo el valor del codificador o la posición actual del eje.

// Read encoder value - current position
  encoderValue = as5600.readAngle();Code language: Arduino (arduino)

Luego cuando estemos en modo de rotación continua, aceptamos valores del monitor serie y los utilizamos como punto de ajuste o ángulo deseado para el controlador PID.

// Enter desired angle for the servo to go to through the serial monitor
    while (Serial.available() > 0) {
      int inChar = Serial.read();
      if (isDigit(inChar)) {
        // convert the incoming byte to a char and add it to the string:
        inString += (char)inChar;
      }
      // if you get a newline, print the string, then the string's value:
      if (inChar == 'n') {
        Setpoint = inString.toInt(); // Setpoint - desired angle
        // clear the string for new input:
        inString = "";
      }
    }Code language: Arduino (arduino)

Si el modo de entrada está configurado en potenciómetro, leemos su entrada analógica y corregimos el punto de ajuste dependiendo de cuánto lo giramos.

if (digitalRead(inputSwitch) == 0) { // Potentiometer as input
      inputValue = analogRead(A0);
      if (inputValue < 400) {
        Setpoint = Setpoint - 0.3;
      }
      if (inputValue < 300) {
        Setpoint = Setpoint - 0.3;
      }
      if (inputValue < 200) {
        Setpoint = Setpoint - 0.3;
      }

      if (inputValue > 600) {
        Setpoint = Setpoint + 0.3;
      }
      if (inputValue > 700) {
        Setpoint = Setpoint + 0.3;
      }

      if (inputValue > 800) {
        Setpoint = Setpoint + 0.3;
      }
    }Code language: Arduino (arduino)

Hacemos la misma corrección del setpoint si la entrada es el receptor RC.

Aquí convertimos los valores del codificador RAW en valores de ángulo y usamos estas declaraciones if para rastrear en qué cuadrante se encuentra la posición actual del eje.

// Convert encoder RAW values into angle value
    angle = encoderValue * 0.087890625;
    // Quadrant 1
    if (angle >= 0 && angle <= 90) {
      quadrantNumber = 1;
    }
    // Quadrant 2
    if (angle >= 90 && angle <= 180) {
      quadrantNumber = 2;
    }
    // Quadrant 3
    if (angle >= 180 && angle <= 270) {
      quadrantNumber = 3;
    }
    // Quadrant 4
    if (angle >= 270 && angle <= 360) {
      quadrantNumber = 4;
    }Code language: Arduino (arduino)

Con esta información podemos seguir cómo gira el eje y cuándo da una revolución completa. El ángulo total es el valor de entrada para el controlador PID.

if (quadrantNumber != previousQuadrantNumber) {
      // Transition from 4th to 1st quadrant
      if (quadrantNumber == 1 && previousQuadrantNumber == 4) {
        numberOfTurns++;
      }
      // Transition from 1st to 4th quadrant
      if (quadrantNumber == 4 && previousQuadrantNumber == 1) {
        numberOfTurns--;
      }
      previousQuadrantNumber = quadrantNumber;
    }
    if (totalAngle >= 0) {
      totalAngle = (numberOfTurns * 360) + angle;
    }
    else {
      totalAngle = (numberOfTurns * 360) + angle;
    }

    // Establish Input value for PID
    Input = totalAngle;Code language: Arduino (arduino)

Por otro lado, cuando estamos en modo de rotación limitada, primero leemos el valor del potenciómetro utilizado para ajustar el rango de rotación y ajustamos los límites de rotación izquierda y derecha en consecuencia.

rangeAdjustment = analogRead(A1);
    leftLimit = 0 + 30 + rangeAdjustment;
    rightLimit = 4097 - 30 - rangeAdjustment;Code language: Arduino (arduino)

Si el modo de entrada es potenciómetro, usamos su valor como punto de ajuste para el controlador PID.

if (digitalRead(inputSwitch) == 0) {  // Analog input - Potentiometer
      // Get value from potentiometer
      inputValue = analogRead(A0);
      if (inputValue < 15) {
        inputValue = 15;
      }
      if (inputValue > 1008) {
        inputValue = 1008;
      }
      Setpoint = map(inputValue, 15, 1008, -255, 255);
    }Code language: Arduino (arduino)

Si el modo de entrada es el receptor RC, leemos el valor PWM entrante del receptor y usamos este valor como punto de ajuste.

else if (digitalRead(inputSwitch) == 1) {  // Digital input - RC transmitter
      inputValue = pulseIn(ch1, HIGH, 30000); // Read RC receiver as input
      Setpoint = map(inputValue, 1000, 2000, -255, 255);
    }Code language: Arduino (arduino)

Para establecer un punto central diferente, comprobamos si hemos pulsado el pulsador y registramos esta posición como el nuevo punto central.

// Set center angle
    if (digitalRead(centerSet) == LOW) {
      centerAngle = encoderValue;
      angleDifference = 2047 - encoderValue;
      delay(1000);
    }Code language: Arduino (arduino)

En consecuencia, debemos ajustar los valores medidos actuales del codificador y compensarlos con la diferencia angular entre el punto central nuevo y el antiguo. Usamos este valor como valor de entrada para el controlador PID.

if (centerAngle > 2047) {
      angleValue = encoderValue + angleDifference;
      if (encoderValue >= 0 && encoderValue < abs(angleDifference)) {
        angleValue = encoderValue + 4097 + angleDifference;
      }
    }
    else if (centerAngle == 2047) {
      angleValue = encoderValue;
    }

    // Establish Input value for PID
    Input = map(angleValue , leftLimit, rightLimit, -255, 255);Code language: Arduino (arduino)

Usando la entrada analógica del otro potenciómetro, ajustamos la ganancia proporcional del controlador PID y finalmente ejecutamos el proceso PID para obtener un valor de salida.

// Adjusting sensitivity
  Pk1 = analogRead(A2) * 0.002;
  myPID.SetTunings(Pk1, Ik1, Dk1);

  // Run PID process to get Output value
  myPID.Compute();Code language: Arduino (arduino)

Utilizamos este valor de salida para accionar los motores DC con señal PWM, izquierda o derecha o en posición de reposo dependiendo del valor de salida del controlador PID o dependiendo del error entre la posición deseada y la posición real que lee el encoder.

// Move right
  if (Output > 1 ) {
    pwmValue = Output;

    if (pwmValue < 30 && pwmValue > 5) {
      pwmValue = pwmValue + 30;
    }
    if (pwmValue <= 5) {
      pwmValue = 0;
    }
    digitalWrite(motor_IN1, LOW);
    analogWrite(motor_IN2, pwmValue);
  }Code language: Arduino (arduino)

Eso es todo por este video. Tenga en cuenta que el código no está bien optimizado y se puede mejorar.

Además, si intenta recrear este proyecto, prepárese para solucionar problemas. Muchas cosas pueden salir mal, especialmente al soldar estos pequeños componentes SMD.

Cómo convertir cualquier motor CC en un servomotor

No>

Esta sección del artículo aún está en construcción, vuelva a consultarla más tarde….

Categorías Proyectos
Error 403 The request cannot be completed because you have exceeded your quota. : quotaExceeded

Cómo convertir cualquier motor CC en un servomotor: Guía paso a paso

En esta guía aprenderás cómo convertir cualquier motor CC en un servomotor personalizado independiente con muchas características. A diferencia de los servos normales que tienen un movimiento limitado de 180 o 270 grados, este servo tiene un rango ilimitado de 360 grados y además tenemos la capacidad de ajustar el rango de rotación a cualquier valor que necesitemos. Eso resulta muy práctico, y además, podemos ajustar el punto central del servo. Así que podemos ajustar tanto el punto central como el rango de rotación al mismo tiempo.

Preguntas Frecuentes:

¿Qué es un servomotor?
Un servomotor es un dispositivo que combina un motor, un controlador y un sensor de posición para lograr movimientos precisos en un rango determinado. Son comúnmente utilizados en aplicaciones de robótica, modelismo y automatización.

¿Por qué convertir un motor CC en un servomotor?
Convertir un motor CC en un servomotor te permite tener un control preciso sobre el movimiento del motor en un rango de 360 grados. Esto puede ser útil en aplicaciones donde se requiera un movimiento preciso y controlado, como en mecanismos de dirección, brazos robóticos, entre otros.

¿Qué componentes se necesitan para convertir un motor CC en un servomotor?
Para convertir un motor CC en un servomotor, necesitarás un microcontrolador, un sensor de posición como el AS5600, un controlador de motor CC como el DRV8871, un potenciómetro, algunos componentes electrónicos como resistencias y capacitores, y un sistema de transmisión como un engranaje o correa.

¿Cuál es el proceso para convertir un motor CC en un servomotor?
El proceso para convertir un motor CC en un servomotor implica diseñar un controlador personalizado que incluya un microcontrolador, un sensor de posición y un controlador de motor. Luego, debes ensamblar los componentes en un PCB personalizado, ajustar los parámetros del controlador PID y realizar pruebas para verificar el funcionamiento del servo motor.

Conclusión:
Convertir un motor CC en un servomotor personalizado te brinda la flexibilidad y control sobre el movimiento del motor en una amplia gama de aplicaciones. Con la combinación adecuada de componentes y un poco de conocimiento en electrónica y programación, puedes crear tu propio servomotor con características avanzadas. ¡Anímate a probar este proyecto y experimentar con la robótica y la automatización!

5 comentarios en «Cómo convertir cualquier motor CC en un servomotor»

  1. ¡Qué interesante forma de aprovechar al máximo los motores CC! Definitivamente voy a probar esta técnica en mis futuros proyectos. ¡Gracias por compartir esta increíble idea! ¡A darle más vida a esos motores! 🚀🤖

Deja un comentario