Julian Barrero / Mbed 2 deprecated programa_servo

Dependencies:   mbed

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/p1.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/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/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/4.png

PASO 5

Buscamos, con ayuda de CNTRL+F, el nombre de la tarjeta Nucleo-F411RE /media/uploads/barrero_99/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/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/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/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/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/10.png

PASO 11

Y listo, es todo lo que se necesita para poder empezar a programar en la plataforma. /media/uploads/barrero_99/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                                           
#define DEGREES_MAX 180
 
uint8_t N_parametro;                                        //asigno variable de 8 bits, al número de parámetros que voy a leer
uint8_t N_tipocomando;   
uint16_t N_velocidad;                                   //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(uint16_t velocidad);                        //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                                         //llamo a la función setup_servo
    myservo1.period_ms(20);                                 //se modifica el periodo en ms de los motores
    myservo1.pulsewidth_us(1000);                           //se establece 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);
     
    while(1)                                                                                 
     {    
      leer_datos();
      setup_servo(N_velocidad);                                         //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();   
      N_velocidad=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(uint16_t velocidad)                                          //se crea la función setup_servo
    {
     uint8_t diferencia;
     diferencia=100-velocidad;
     
     if (diferencia >= 8)
      {
       uint8_t por_vel;
       por_vel=(diferencia*255)/100;
       myservo1.period_ms(por_vel);                                //se modifica el periodo en ms de los motores
       myservo1.pulsewidth_us(1000);                                 //se establece el ancho de pulso en us de los motores
       myservo2.period_ms(por_vel);
       myservo2.pulsewidth_us(1000);
       myservo3.period_ms(por_vel);
       myservo3.pulsewidth_us(1000);
       myservo4.period_ms(20);
       myservo4.pulsewidth_us(1000);
      }
    }  
    
uint32_t gradosamover(uint8_t parametro){
    if(parametro <= DEGREES_MAX)
          return int(700+parametro*1700/180);
      return 700;
   }

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;                                  
              dpulse=(700+50*1700/180);
              myservo2.pulsewidth_us(dpulse);
              wait(0.5);                           
         
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////77                            
              dpulse=0;                                       
              dpulse=(700+105*1700/180);
              myservo3.pulsewidth_us(dpulse);
              wait(0.5);   
              
              dpulse=(700+120*1700/180);
              myservo4.pulsewidth_us(dpulse);
              wait(0.5);                          
         }    
        
//___________________________________________________________________________________________________________________________________________///

       if (parametro == 2)                                  //mover a posición material
        {
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            
              uint32_t dpulse=0;                                        
              dpulse=(700+20*1700/180);
              myservo1.pulsewidth_us(dpulse);
              wait(0.5);                           
         
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7        
              
              dpulse=0;                               
              dpulse=(700+110*1700/180);
              myservo2.pulsewidth_us(dpulse);
              wait(0.5);                           
         
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////         
              
              dpulse=0;                               
              dpulse=(700+40*1700/180);
              myservo3.pulsewidth_us(dpulse);
              wait(0.5);  
              
              dpulse=(700+120*1700/180);
              myservo4.pulsewidth_us(dpulse);
              wait(0.5);                          
        }
              
///____________________________________________________________________________________________________________________________________________________///

       if (parametro == 3)                                  //mover a posición celda 1
       {
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
              
              uint32_t dpulse=0;                                     
              dpulse=(700+90*1700/180);
              myservo1.pulsewidth_us(dpulse);
              wait(0.5);                           
          
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7        
              
              dpulse=0;                                        
              dpulse=(700+90*1700/180);
              myservo2.pulsewidth_us(dpulse);
              wait(0.5);                           
          
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////         
              
              dpulse=0;                                        
              dpulse=(700+105*1700/180);
              myservo3.pulsewidth_us(dpulse);
              wait(0.5); 
              
              dpulse=(700+120*1700/180);
              myservo4.pulsewidth_us(dpulse);
              wait(0.5);    
        }                     
       
///_________________________________________________________________________________________________________________________________________________///    
    
         if (parametro == 4)                               //mover a posición celda 2
        {
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
              uint32_t dpulse=0;                                         
              dpulse=(700+110*1700/180);
              myservo1.pulsewidth_us(dpulse);
              wait(0.5);                           
          
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7        
              
              dpulse=0;                                    
              dpulse=(700+90*1700/180);
              myservo2.pulsewidth_us(dpulse);
              wait(0.5);                           
          
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////         
              
              dpulse=0;                            
              dpulse=(700+105*1700/180);
              myservo3.pulsewidth_us(dpulse);
              wait(0.5); 
              
              dpulse=(700+120*1700/180);
              myservo4.pulsewidth_us(dpulse);
              wait(0.5);    
        }                             
    
///__________________________________________________________________________________________________________________________________________________///  
      
         if (parametro == 5)                             //mover a posición celda 3
        {
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
              
              uint32_t dpulse=0;                                  
              dpulse=(700+130*1700/180);
              myservo1.pulsewidth_us(dpulse);
              wait(0.5);                           
          
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7        
              
              dpulse=0;                                  
              dpulse=(700+90*1700/180);
              myservo2.pulsewidth_us(dpulse);
              wait(0.5);                           
          
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////         
              
              dpulse=0;                                     
              dpulse=(700+105*1700/180);
              myservo3.pulsewidth_us(dpulse);
              wait(0.5); 
              
              dpulse=(700+120*1700/180);
              myservo4.pulsewidth_us(dpulse);
              wait(0.5);                           
        }  
///_____________________________________________________________________________________________________________________________________________________///
        
     if (parametro == 6)                              //mover a posición celda 4
        {
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
              
              uint32_t dpulse=0;                                     
              dpulse=(700+150*1700/180);
              myservo1.pulsewidth_us(dpulse);
              wait(0.5);                           
        
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7        
              
              dpulse=0;                                 
              dpulse=(700+90*1700/180);
              myservo2.pulsewidth_us(dpulse);
              wait(0.5);                           
          
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////         
              
              dpulse=0;                                      
              dpulse=(700+105*1700/180);
              myservo3.pulsewidth_us(dpulse);
              wait(0.5); 
              
              dpulse=(700+120*1700/180);
              myservo4.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+70*1700/180);
         myservo4.pulsewidth_us(dpulse);
         wait(0.5);
        }
        if (parametro==2)                                  //cerrar pinza
        {
         uint32_t dpulse=0;
         dpulse=(700+120*1700/180);
         myservo4.pulsewidth_us(dpulse);
         wait(0.5);    
        }
     } 
     
///\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\///

    if(tipocomando==3)
     {
      uint32_t dpulse=0;
      dpulse=gradosamover(parametro);
      myservo1.pulsewidth_us(dpulse);  
     }
 
///\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\///
     
     if(tipocomando==4)
     {
      uint32_t dpulse=0;
      dpulse=gradosamover(parametro);
      myservo2.pulsewidth_us(dpulse);  
     }
     
///\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\///     
    
     if(tipocomando==5)
     {
      uint32_t dpulse=0;
      dpulse=gradosamover(parametro);
      myservo3.pulsewidth_us(dpulse);  
     }

///\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\///
     
     if(tipocomando==6)
     {
      uint32_t dpulse=0;
      dpulse=gradosamover(parametro);
      myservo4.pulsewidth_us(dpulse);  
     }
         
 }

Descarga del Programa CoolTerm

El programa CoolTerm, es una aplicación o programa que se usa para comunicar a través del puerto serial a la tarjeta con el PC y enviar dichos valores en hexadecimal. Primero se abre el CoolTerm y se da click en "Connect", para realizar la conexión entre la tarjeta y el pc, esto por medio de un cable de datos /media/uploads/barrero_99/whatsapp_image_2019-03-07_at_11.32.09_pm.jpeg

Inmediatamente, se despliega un recuadro en el cuál debemos establecer el puerto de la tarjeta, la velocidad que se estableció previamente en el programa para la comunicación entre la tarjeta y el pc (115.200), dejamos las demás opciones por defecto y damos click en "OK" /media/uploads/barrero_99/whatsapp_image_2019-03-07_at_11.38.37_pm.jpeg

Nos dirigimos a la barra de herramientas, ubicamos la pestaña que dice "connection" y clickeamos en la opción "send string", pues desde allí se enviarán los datos. /media/uploads/barrero_99/whatsapp_image_2019-03-07_at_11.32.09_pm_-1-.jpeg

Se abre el recuadro y ubicamos la opción "HEX", para empezar a enviar los parámetros y los comandos en hexadecimal /media/uploads/barrero_99/whatsapp_image_2019-03-07_at_11.32.10_pm.jpeg

Se envía un parámetro FF para inicializar el programa, seguidamente se envía un 01 o un 02, para determinar el tipo de comando y por último, se envía el valor del respectivo Parámetro /media/uploads/barrero_99/whatsapp_image_2019-03-07_at_11.32.10_pm_-1-.jpeg

Conexión y Características de los Motores

Los motores usados para la programación y el montaje del brazo robótico son servomotores MG995 de piñonerí metálica 180°

Características:

Modulación: Digital

Torque (kg)(4.8v): 8.5

Stall Torque: 4.8V: 130.54 oz-in (9.40 kg-cm) 6.0V: 152.76 oz-in (13.00 kg-cm)

Velocidad: 4.8V: 0.20 sec/60° 6.0V: 0.16 sec/60°

Periodo: 20 ms

Ancho pulso: 1.0 ~ 2.5 ms

Peso: 1.94 oz (55.0 g)

Dimensiones: Largo:1.60 in (40.7 mm) Ancho:0.78 in (19.7 mm) Alto:1.69 in (42.9 mm)

/media/uploads/barrero_99/servomotor-mg995-pinoneria-metalica-180.jpg

Conexión de los motores en la tarjeta

/media/uploads/barrero_99/whatsapp_image_2019-03-07_at_8.51.32_pm.jpeg

Se ubica en el motor y en la tarjeta el GND y el positivo de los mismos (en el motor: cable café=GND, Cable rojo=Positivo, Cable amarillo=Control PWM), y se procede a realizar la respectiva conexión. /media/uploads/barrero_99/whatsapp_image_2019-03-07_at_8.51.31_pm_-1-.jpeg

Se ubica, dependiendo el pinout de la tarjeta de programacíon un periferico que maneje PWM y así mismo, especificado en el programa prinicipal, para conectar el cable de control del motor /media/uploads/barrero_99/whatsapp_image_2019-03-07_at_8.51.31_pm.jpeg

Planos del Brazo Robótico

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


All wikipages