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/50);     //en la variable dpulse, se crea una fórmula para pasar de grados a u     
                       myservo2.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;
         dpulse=(700+180*1700/105);
         myservo4.pulsewidth_us(dpulse);
         wait(0.5);      
        }   
       if (parametro == 2)                                        //mover a posición material
        {
         uint32_t dpulse=0;
         dpulse=(700+90*1700/20);
         myservo1.pulsewidth_us(dpulse);
         wait(0.5);
         
         dpulse=0;                                                         //es importante cargar el valor dpulse con 0 para que se reinicie la variable en 0
         dpulse=(700+90*1700/110);
         myservo2.pulsewidth_us(dpulse);
         wait(0.5);
         
         dpulse=0;
         dpulse=(700+180*1700/40);
         myservo4.pulsewidth_us(dpulse);
         wait(0.5);  
       }
       if (parametro == 3)                                  //mover a posición celda 1
       {
         uint32_t dpulse=0;
         dpulse=(700+180*1700/90);
         myservo1.pulsewidth_us(dpulse);
         wait(0.5);
         
         dpulse=0;
         dpulse=(700+180*1700/90);
         myservo2.pulsewidth_us(dpulse);
         wait(0.5);
         
         uint8_t i;                                                            //se crea una variable i de 8 bits
         for (i=110;i>90;i--)                                     //se crea un form con el valor de la variable i, para hacer un barrido de grados
         {                                                  
         dpulse=(700+0*1700/180);
         wait(0.1);
         myservo3.pulsewidth_us(dpulse);
        }
         wait(0.5);
        }  
        
         if (parametro == 4)                               //mover a posición celda 2
        {
         uint32_t dpulse=0;
         dpulse=(700+180*1700/110);
         myservo1.pulsewidth_us(dpulse);
         wait(0.5);
         
         dpulse=0;
         dpulse=(700+180*1700/180);
         myservo2.pulsewidth_us(dpulse);
         wait(0.5);
         
          uint8_t i;
         for (i=110;i>90;i--)
         {                                                  
         dpulse=(700+0*1700/105);
         wait(0.1);
         myservo3.pulsewidth_us(dpulse);
        }
         wait(0.5);       }  
        
         if (parametro == 5)                             //mover a posición celda 3
        {
         uint32_t dpulse=0;
         dpulse=(700+180*1700/110);
         myservo1.pulsewidth_us(dpulse);
         wait(0.5);
         
         dpulse=0;
         dpulse=(700+180*1700/130);
         myservo2.pulsewidth_us(dpulse);
         wait(0.5);
         
          uint8_t i;
         for (i=110;i>90;i--)
         {                                                  
         dpulse=(700+0*1700/105);
         wait(0.1);
         myservo3.pulsewidth_us(dpulse);
        }
         wait(0.5);
        }  
        
     if (parametro == 6)                              //mover a posición celda 4
        {
         uint32_t dpulse=0;
         dpulse=(700+180*1700/150);
         myservo1.pulsewidth_us(dpulse);
         wait(0.5);
         
         dpulse=0;
         dpulse=(700+180*1700/180);
         myservo2.pulsewidth_us(dpulse);
         wait(0.5);
         
          uint8_t i;
         for (i=110;i>90;i--)
         {                                                  
         dpulse=(700+0*1700/105);
         wait(0.1);
         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/70);
         myservo4.pulsewidth_us(dpulse);
         wait(0.5);
        }
        if (parametro==2)                                  //cerrar pinza
        {
        uint32_t dpulse=0;
         dpulse=(700+180*1700/108);
         myservo4.pulsewidth_us(dpulse);
         wait(0.5);    
        }
    }
 }

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.

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