Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
You are viewing an older revision! See the latest version
PROGRAM MOVIMIENTO SERVOMOTORES
Movimiento de servo-motores con la tarjeta de programación NUCLEO-F411RE¶
Creación y Uso de la cuenta Mbed¶
Selección de la Tarjeta de Programación¶
Descripción del programa¶
Este programa se trabajó en la plataforma online MBED, por medio de un lenguaje de programación c++ orientado a objetos. Se pretende mover un brazo robótico que consta de 4 servomotores, el cuál se explica con detalle a continuación.
include the mbed library with this snippet
#include "mbed.h"
Serial command(USBTX, USBRX); //es la comunicación serial entre la tarjeta y el PC
PwmOut myservo1(PB_4); //asigno PWM al pin PB_4 (D5)para el servomotor #1
PwmOut myservo2(PB_5); //asigno PWM al pin PB_5 (D4)para el servomotor #2
PwmOut myservo3(PB_10); //asigno PWM al pin PB_10 (D6)para el servomotor #3
PwmOut myservo4(PB_3); //asigno PWM al pin PB_3 (D3)para el servomotor #4
#define INITCMD 0xFF //es una varíable global para inicializar el programa
uint8_t N_parametro; //asigno variable de 8 bits, al número de parámetros que voy a leer
uint8_t N_tipocomando; //asigno variable de 8 bits, al número de comando que voy a leer
void setup_uart(); //función para determinar la velocidad de comunicación
void setup_servo(); //función para modificar el periodo y el ancho de pulso del PWM, asignados a los servos
void leer_datos(); //función para leer datos ingresados desde el PC
void posicion(uint8_t tipocomando, uint8_t parametro); //defino función para mover los servos
int main() //función principal
{
setup_uart(); //llamo a la función setup_uart
setup_servo(); //llamo a la función setup_servo
while(1)
{
leer_datos(); //llamo la función leer datos
posicion(N_tipocomando, N_parametro); //asigno los valores de tipo de comande y parámetro a la clase posición
}
}
void leer_datos() //se crea la función datos
{
while(command.getc()!= INITCMD); //si el comando enviado lleva el valor de inicio de programa se leen los demás parámetros
N_tipocomando=command.getc(); //asigna el valor introducido en tipocomando a la variable N_tipocomando
N_parametro=command.getc(); //asigna el valor introducido en tipoparametro a la variable N_parametro
}
void setup_uart() //se crea la función setup_uart
{
command.baud(115200); //se establece la velocidad a la que manejaré la comunicación entre la PC y la tarjeta
}
void setup_servo() //se crea la función setup_servo
{
myservo1.period_ms(20); //se modifica el periodo en ms de los motores
myservo1.pulsewidth_us(1000); //se modifica el ancho de pulso en us de los motores
myservo2.period_ms(20);
myservo2.pulsewidth_us(1000);
myservo3.period_ms(20);
myservo3.pulsewidth_us(1000);
myservo4.period_ms(20);
myservo4.pulsewidth_us(1000);
}
void posicion(uint8_t tipocomando,uint8_t parametro) //se crea la función posición y se asignan los valores leídos a las variables tipocomando y parametro
{
if (tipocomando == 1) //se crea un if para saber que tipo de comando se desea ingresar
{
if (parametro == 1) //se crea un if para saber que parámetro se desea usar
{
uint32_t dpulse=0; //es una variable para asignar los us del ancho de pulso del motor
dpulse=(700+0*1700/180); //en la variable dpulse, se crea una fórmula para pasar de grados a us
myservo1.pulsewidth_us(dpulse); //se carga el valor de la variable dpulse al servo motor en us
wait(0.5); //se espera 0.5 ms para ejecutar el siguiente movimiento
dpulse=0; //es importante cargar el valor dpulse con 0 para que se reinicie la variable en 0
dpulse=(700+0*1700/180);
myservo2.pulsewidth_us(dpulse);
wait(0.5);
dpulse=0;
dpulse=(700+0*1700/180);
myservo3.pulsewidth_us(dpulse);
wait(0.5);
}
if (parametro == 2) //mover a posición material
{
uint32_t dpulse=0;
dpulse=(700+90*1700/180);
myservo1.pulsewidth_us(dpulse);
wait(0.5);
dpulse=0;
dpulse=(700+90*1700/180);
myservo2.pulsewidth_us(dpulse);
wait(0.5);
dpulse=0;
dpulse=(700+90*1700/180);
myservo3.pulsewidth_us(dpulse);
wait(0.5);
}
if (parametro == 3) //mover a posición celda 1
{
uint32_t dpulse=0;
dpulse=(700+180*1700/180);
myservo1.pulsewidth_us(dpulse);
wait(0.5);
dpulse=0;
dpulse=(700+180*1700/180);
myservo2.pulsewidth_us(dpulse);
wait(0.5);
dpulse=0;
dpulse=(700+180*1700/180);
myservo3.pulsewidth_us(dpulse);
wait(0.5);
}
if (parametro == 4) //mover a posición celda 2
{
uint32_t dpulse=0;
dpulse=(700+180*1700/180);
myservo1.pulsewidth_us(dpulse);
wait(0.5);
dpulse=0;
dpulse=(700+180*1700/180);
myservo2.pulsewidth_us(dpulse);
wait(0.5);
dpulse=0;
dpulse=(700+180*1700/180);
myservo3.pulsewidth_us(dpulse);
wait(0.5);
}
if (parametro == 5) //mover a posición celda 3
{
uint32_t dpulse=0;
dpulse=(700+180*1700/180);
myservo1.pulsewidth_us(dpulse);
wait(0.5);
dpulse=0;
dpulse=(700+180*1700/180);
myservo2.pulsewidth_us(dpulse);
wait(0.5);
dpulse=0;
dpulse=(700+180*1700/180);
myservo3.pulsewidth_us(dpulse);
wait(0.5);
}
if (parametro == 6) //mover a posición celda 4
{
uint32_t dpulse=0;
dpulse=(700+180*1700/180);
myservo1.pulsewidth_us(dpulse);
wait(0.5);
dpulse=0;
dpulse=(700+180*1700/180);
myservo2.pulsewidth_us(dpulse);
wait(0.5);
dpulse=0;
dpulse=(700+180*1700/180);
myservo3.pulsewidth_us(dpulse);
wait(0.5);
}
}
if(tipocomando==2) //if del comando abrir y cerrar pinza
{
if (parametro==1) //abrir pinza
{
uint32_t dpulse=0;
dpulse=(700+180*1700/180);
myservo4.pulsewidth_us(dpulse);
wait(0.5);
}
if (parametro==2) //cerrar pinza
{
uint32_t dpulse=0;
dpulse=(700+180*1700/180);
myservo4.pulsewidth_us(dpulse);
wait(0.5);
}
}
}
- include "mbed.h" libreria de MBED
Serial command(USBTX, USBRX); es la comunicación serial entre la tarjeta y el PC PwmOut myservo1(PB_4); asigno PWM al pin PB_4 (D5)para el servomotor #1 PwmOut myservo2(PB_5); asigno PWM al pin PB_5 (D4)para el servomotor #2 PwmOut myservo3(PB_10); asigno PWM al pin PB_10 (D6)para el servomotor #3 PwmOut myservo4(PB_3); asigno PWM al pin PB_3 (D3)para el servomotor #4
- define INITCMD 0xFF es una varíable global para inicializar el programa
uint8_t N_parametro; asigno variable de 8 bits, al número de parámetros que voy a leer uint8_t N_tipocomando; asigno variable de 8 bits, al número de comando que voy a leer
void setup_uart(); función para determinar la velocidad de comunicación void setup_servo(); función para modificar el periodo y el ancho de pulso del PWM, asignados a los servos void leer_datos(); función para leer datos ingresados desde el PC
void posicion(uint8_t tipocomando, uint8_t parametro); defino función para mover los servos
int main() función principal { setup_uart(); llamo a la función setup_uart setup_servo(); llamo a la función setup_servo
while(1) { leer_datos(); llamo la función leer datos posicion(N_tipocomando, N_parametro); asigno los valores de tipo de comande y parámetro a la clase posición } }
void leer_datos() se crea la función datos { while(command.getc()!= INITCMD); si el comando enviado lleva el valor de inicio de programa se leen los demás parámetros N_tipocomando=command.getc(); asigna el valor introducido en tipocomando a la variable N_tipocomando N_parametro=command.getc(); asigna el valor introducido en tipoparametro a la variable N_parametro }
void setup_uart() se crea la función setup_uart { command.baud(115200); se establece la velocidad a la que manejaré la comunicación entre la PC y la tarjeta }
void setup_servo() se crea la función setup_servo { myservo1.period_ms(20); se modifica el periodo en ms de los motores myservo1.pulsewidth_us(1000); se modifica el ancho de pulso en us de los motores myservo2.period_ms(20); myservo2.pulsewidth_us(1000); myservo3.period_ms(20); myservo3.pulsewidth_us(1000); myservo4.period_ms(20); myservo4.pulsewidth_us(1000); }
void posicion(uint8_t tipocomando,uint8_t parametro) se crea la función posición y se asignan los valores leídos a las variables tipocomando y parametro { if (tipocomando == 1) se crea un if para saber que tipo de comando se desea ingresar { if (parametro == 1) se crea un if para saber que parámetro se desea usar { uint32_t dpulse=0; es una variable para asignar los us del ancho de pulso del motor dpulse=(700+0*1700/180); en la variable dpulse, se crea una fórmula para pasar de grados a us myservo1.pulsewidth_us(dpulse); se carga el valor de la variable dpulse al servo motor en us wait(0.5); se espera 0.5 ms para ejecutar el siguiente movimiento
dpulse=0; es importante cargar el valor dpulse con 0 para que se reinicie la variable en 0 dpulse=(700+0*1700/180); myservo2.pulsewidth_us(dpulse); wait(0.5);
dpulse=0; dpulse=(700+0*1700/180); myservo3.pulsewidth_us(dpulse); wait(0.5); }
if (parametro == 2) mover a posición material { uint32_t dpulse=0; dpulse=(700+90*1700/180); myservo1.pulsewidth_us(dpulse); wait(0.5);
dpulse=0; dpulse=(700+90*1700/180); myservo2.pulsewidth_us(dpulse); wait(0.5);
dpulse=0; dpulse=(700+90*1700/180); myservo3.pulsewidth_us(dpulse); wait(0.5); }
if (parametro == 3) mover a posición celda 1 { uint32_t dpulse=0; dpulse=(700+180*1700/180); myservo1.pulsewidth_us(dpulse); wait(0.5);
dpulse=0; dpulse=(700+180*1700/180); myservo2.pulsewidth_us(dpulse); wait(0.5);
dpulse=0; dpulse=(700+180*1700/180); myservo3.pulsewidth_us(dpulse); wait(0.5); }
if (parametro == 4) mover a posición celda 2 { uint32_t dpulse=0; dpulse=(700+180*1700/180); myservo1.pulsewidth_us(dpulse); wait(0.5);
dpulse=0; dpulse=(700+180*1700/180); myservo2.pulsewidth_us(dpulse); wait(0.5);
dpulse=0; dpulse=(700+180*1700/180); myservo3.pulsewidth_us(dpulse); wait(0.5); }
if (parametro == 5) mover a posición celda 3 { uint32_t dpulse=0; dpulse=(700+180*1700/180); myservo1.pulsewidth_us(dpulse); wait(0.5);
dpulse=0; dpulse=(700+180*1700/180); myservo2.pulsewidth_us(dpulse); wait(0.5);
dpulse=0; dpulse=(700+180*1700/180); myservo3.pulsewidth_us(dpulse); wait(0.5); }
if (parametro == 6) mover a posición celda 4 { uint32_t dpulse=0; dpulse=(700+180*1700/180); myservo1.pulsewidth_us(dpulse); wait(0.5);
dpulse=0; dpulse=(700+180*1700/180); myservo2.pulsewidth_us(dpulse); wait(0.5);
dpulse=0; dpulse=(700+180*1700/180); myservo3.pulsewidth_us(dpulse); wait(0.5); } }
if(tipocomando==2) if del comando abrir y cerrar pinza { if (parametro==1) abrir pinza { uint32_t dpulse=0; dpulse=(700+180*1700/180); myservo4.pulsewidth_us(dpulse); wait(0.5); } if (parametro==2) cerrar pinza { uint32_t dpulse=0; dpulse=(700+180*1700/180); myservo4.pulsewidth_us(dpulse); wait(0.5); } } }