Julian Barrero / Mbed 2 deprecated programa_servo

Dependencies:   mbed

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);    
        }
    }
 }
  1. 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

  1. 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); } } }

Descarga del Programa CoolTerm

Conexión y Características de los Motores

Planos del Brazo Robótico


All wikipages