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

Selección de la Tarjeta de Programación

En esta sección se explica la forma de escoger o de cargar al MBED, la tarjeta de programación que se usará, en este caso, será la STMNucleo-F411RET6.

PASO 1

Primeramente, ingresamos a nuestra cuenta MBED /media/uploads/barrero_99/paso_1.png

PASO 2

Para seleccionar la tarjeta correspondiente, en la esquina superior derecha, encontramos el nombre de la tarjeta, damos click en el recuadro. /media/uploads/barrero_99/paso_2.png

PASO 3

Nos aparece un recuadro en cuál nos aparece la tarjeta ya cargada en la plataforma MBED, sólo la seleccionamos y damos click en "Select Platform" /media/uploads/barrero_99/paso_3.png

PASO 4

En caso de no tenerla cargada en la plataforma, damos click en "Add Board", lo que nos redigirá a una nueva pestaña, en donde encontarremos un gran número de componentes y tarjetas de programación /media/uploads/barrero_99/paso_4.png

PASO 5

Buscamos, con ayuda de CNTRL+F, el nombre de la tarjeta Nucleo-F411RE /media/uploads/barrero_99/paso_5.png

PASO 6

Damos click en el recuadro de la tarjeta, esto nos abre una pesataña en donde encontramos toda la información con respecto a la tarjeta, las características, el pinout de la misma, y demás. /media/uploads/barrero_99/paso_6.png

PASO 7

En los recuadros de la parte inferior derecha, aparecerá un recuadro que dice: "Add to your MBED compiler", damos click en el y automáticamente quedará cargada en nuestra cuenta de MBED y se procede a seguir el paso 3, anteriormente mencionado. /media/uploads/barrero_99/paso_7.png

PASO 8

Para crear un nuevo programa, en la parte superior izquierda, encontramos el ícono de "NEW", damos click en el /media/uploads/barrero_99/paso_8.png

PASO 9

Inmediatamente después, nos aparecerá un recuadro en el que podemos ver la tarjeta o la plataforma de programación, nos permite escoger una plantilla y obviamente, ponerle un nombre al programa. /media/uploads/barrero_99/paso_9.png

PASO 10

Nos abrirá una página en el que aparece un archivo main.cpp, damos click en el y nos llevara a la página para crear el código /media/uploads/barrero_99/paso_10.png

PASO 11

Y listo, es todo lo que se necesita para poder empezar a programar en la plataforma. /media/uploads/barrero_99/paso_11.png

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.

Programa Servomotores

#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);    
        }
    }
 }

Descarga del Programa CoolTerm

Conexión y Características de los Motores

Planos del Brazo Robótico

A continuación, se anexan los planos del brazo robótico, suados para este proyecto. /media/uploads/barrero_99/corte_brazo_robotico.pdf


All wikipages