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.
Diff: main.cpp
- Revision:
- 0:17f865015626
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Nov 20 01:45:51 2018 +0000
@@ -0,0 +1,635 @@
+#include "mbed.h"
+#include <Serial.h>
+#include "Color.h"
+
+//*****************************************************************************//
+// Universidad ECCI - Ingenieria mecatronica
+// Sistemas embebidos - Control por telecomandos
+// Mario Esteban Galeano Rodriguez
+//*****************************************************************************//
+
+//*****************************************************************************//
+//Declaración de variables
+    
+    uint8_t data [3];
+    int color, ciclos;
+    char status = 0;
+    Serial pc(SERIAL_TX, SERIAL_RX, 9600);
+
+//*****************************************************************************//
+// Timer para lectura del sensor
+
+    Timer timeRead;
+    Timer timeSerial;
+    AnalogIn value_y (A0);
+    AnalogIn value_x(A1);
+    
+    float valor_y;
+    float valor_x;
+    
+//*****************************************************************************//
+// Posiciones movimientos
+    
+    int arriba = 5;
+    int abajo = 25;
+
+//*****************************************************************************//
+// Otras variables
+
+    int tiempo = 200;
+    
+//*****************************************************************************//
+// Distribución pines servomotores
+
+// Brazo derecho delante 
+    PwmOut servo_1 (PA_10);     //D0
+    PwmOut servo_2 (PB_3);      //D1
+
+// Brazo derecho atras
+    PwmOut servo_3 (PB_5);      //D8
+    PwmOut servo_4 (PB_4);      //D9
+
+// Brazo izquierdo adelante
+    PwmOut servo_5 (PB_10);     //D10
+    PwmOut servo_6 (PA_8);      //D11
+
+// Brazo izquierdo atras
+    PwmOut servo_7 (PA_9);      //D12
+    PwmOut servo_8 (PB_6);      //D13
+
+//*****************************************************************************//
+// Función para el control de servomotores
+
+void controlServo(int n_servo, int degrees)
+{        
+    int p_width = ((degrees*2000)/180)+500;
+     
+    switch (n_servo)
+    {
+        case 1:
+            servo_1.pulsewidth_us(p_width);
+            break;
+            
+        case 2:
+            servo_2.pulsewidth_us(p_width);
+            break;
+        
+        case 3:
+            servo_3.pulsewidth_us(p_width);
+            break;
+            
+        case 4:
+            servo_4.pulsewidth_us(p_width);
+            break;
+        
+        case 5:
+            servo_5.pulsewidth_us(p_width);
+            break;
+            
+        case 6:
+            servo_6.pulsewidth_us(p_width);
+            break;
+        
+        case 7:
+            servo_7.pulsewidth_us(p_width);
+            break;
+            
+        case 8:
+            servo_8.pulsewidth_us(p_width);
+            break;
+        
+        default:
+            break;
+    }
+}
+
+//*****************************************************************************//
+// Funcion para movimiento de los brazos
+
+void controlBrazo (int Brazo, int movimiento)
+{
+    if (Brazo == 0x01)
+    {
+        switch (movimiento)
+        {
+            case 1:// handRightUp
+                controlServo(2, arriba-5);
+                break;
+            
+            case 2:// handRightDown
+                controlServo(2, abajo-5);
+                break;
+            
+            case 3:// handRightForward
+                controlServo(1, 70);
+                break;
+                
+            case 4:// handRightReverse
+                controlServo(1, 15);
+                break;
+            
+            default:
+                break;
+        }
+    }
+    
+    else if (Brazo == 0x02)
+    {
+        switch (movimiento)
+        {
+            case 1:// legRightUp
+                controlServo(4, arriba-5);
+                break;
+            
+            case 2:// legRightDown
+                controlServo(4, abajo-10);
+                break;
+            
+            case 3:// legRightForward
+                controlServo(3, 150);
+                break;
+                
+            case 4:// legRightReverse
+                controlServo(3, 95);
+                break;
+            
+            default:
+                break;
+        }
+    }
+    
+    else if (Brazo == 0x03)
+    {
+        switch (movimiento)
+        {
+            case 1:// handLeftUp
+                controlServo(6, arriba);
+                break;
+            
+            case 2:// handLeftDown
+                controlServo(6, abajo);
+                break;
+            
+            case 3://handLeftForward
+                controlServo(5, 60);
+                break;
+                
+            case 4:// handLeftReverse
+                controlServo(5, 118);
+                break;
+            
+            default:
+                break;
+        }
+    }
+    
+    else if (Brazo == 0x04)
+    {
+        switch (movimiento) 
+        {
+            case 1:// legLeftUp
+                controlServo(8, arriba);
+                break;
+            
+            case 2:// legLeftDown
+                controlServo(8, abajo);
+                break;
+            
+            case 3:// legLeftForward
+                controlServo(7, 10);
+                break;
+                
+            case 4:// legLeftReverse
+                controlServo(7, 65);
+                break;
+            
+            default:
+                break;
+        }
+    }    
+}
+
+//*****************************************************************************//
+//Funciones movimientos
+
+void inicialPosition ()
+{   
+    controlServo(2,arriba);
+    controlServo(1,50);
+    wait_ms(80);
+    controlServo(2,abajo-12);
+    
+    controlServo(4,arriba);
+    controlServo(3,105);
+    wait_ms(80);
+    controlServo(4,abajo-12);
+    
+    controlServo(6,arriba);
+    controlServo(5,80);
+    wait_ms(80);
+    controlServo(6,abajo);
+    
+    controlServo(8,arriba);
+    controlServo(7,45);
+    wait_ms(80);
+    controlServo(8,abajo);    
+}
+
+void forward()
+{       
+    //*************************************************************//
+    // POSICION INICIAL
+                
+    controlServo(5,118);    // Brazo 3 atras
+    controlServo(7,5);      // Brazo 4 adelante
+    wait_ms(tiempo);        // Tiempo en posicion
+                
+    //*************************************************************//
+    // PRIMER PASO
+                
+    controlBrazo(3,1);      // brazo 3 arriba
+    controlServo(7,50);     // Brazo 4 atras
+    controlServo(5,50);     // Brazo 3 avanza
+    controlServo(3,90);     // Brazo 2 atras 
+    wait_ms(tiempo);        // tiempo en posicion arriba
+                
+    controlBrazo(3,2);      // Brazo 3 baja
+    controlServo(1,25);     // Brazo 1 atras
+    wait_ms(tiempo);
+                
+    //*************************************************************//
+    // SEGUNDO PASO
+                
+    controlBrazo(2,1);      // Brazo 2 arriba
+    controlServo(1,8);      // Brazo 1 atras
+    controlServo(3,150);    // Brazo 2 adelante
+    controlServo(7,50);     // Brazo 4 atras 
+    wait_ms(tiempo);        // Tiempo en posicion arriba
+                
+    controlBrazo(2,2);      // brazo 2 abajo
+    controlServo(5,100);    // Brazo 3 atras
+                
+    //*************************************************************//
+    // TERCER PASO
+                
+    controlBrazo(1,1);      // Brazo 1 arriba
+    controlServo(3,90);     // Brazo 2 atras
+    controlServo(1,60);     // Brazo 1 adelante
+    controlServo(7,65);     // Brazo 4 atras
+    wait_ms(tiempo);
+    controlBrazo(1,2);      // Brazo 1 abajo
+    controlServo(5,118);
+    
+    //*************************************************************//
+    // TERCER PASO            
+    controlBrazo(4,1);
+    controlServo(7,5);      // Brazo 4 adelante
+    wait_ms(tiempo);
+    controlBrazo(4,2);
+}
+
+void reverse()
+{       
+    //*************************************************************//
+    // POSICION INICIAL
+                
+    controlServo(5,118);    // Brazo 3 atras
+    controlServo(7,5);      // Brazo 4 adelante
+    wait_ms(tiempo);        // Tiempo en posicion
+                
+    //*************************************************************//
+    // PRIMER PASO
+    
+    controlBrazo(4,1);      // brazo 4 arriba
+    controlServo(5,60);     // Brazo 3 atras
+    controlServo(7,65);     // Brazo 4 avanza
+    controlServo(1,70);     // Brazo 1 atras 
+    wait_ms(tiempo);        // tiempo en posicion arriba
+                
+    controlBrazo(4,2);      // Brazo 4 abajo
+    controlServo(3,120);    // Brazo 1 atras
+    wait_ms(tiempo);
+    
+    //**************************************************************//
+    // SEGUNDO PASO
+    
+    controlBrazo(1,1);      // Brazo 1 arriba
+    controlServo(5,70);     // Brazo 3 atras
+    controlServo(1,8);      // Brazo 1 adelante
+    controlServo(3,150);    // Brazo 2 atras 
+    wait_ms(tiempo);        // Tiempo en posicion arriba
+                
+    controlBrazo(1,2);      // brazo 1 abajo
+    controlServo(7,35);     // Brazo 4 atras
+                
+    //*************************************************************//
+    // TERCER PASO
+    
+    controlBrazo(2,1);      // Brazo 2 arriba
+    controlServo(1,70);     //Brazo 1 adelante
+    controlServo(3,95);     //Brazo 2 atras
+    controlServo(5,60);     // Brazo 4 adelante
+    wait_ms(tiempo);
+    
+    controlBrazo(2,2);      // Brazo 2 abajo
+    controlServo(7,10);     // Brazo 4 adelante
+    
+    //*************************************************************//
+    // TERCER PASO      
+          
+    controlBrazo(3,1);      //Brazo 3 arriba
+    controlServo(5,118);    // Brazo 4 adelante
+    wait_ms(tiempo);
+    controlBrazo(3,2);
+}
+
+void right()
+{
+    //*************************************************************//
+    // POSICION INICIAL
+                
+    controlServo(5,118);    // Brazo 3 atras
+    controlServo(7,5);      // Brazo 4 adelante
+    wait_ms(tiempo);        // Tiempo en posicion
+    
+    //*************************************************************//
+    // PASO 1
+    
+    controlBrazo(3,1);
+    controlServo(5,60);
+    controlServo(1,70);
+    controlServo(7,40);
+    controlServo(3,130);
+    wait_ms(tiempo);
+    controlBrazo(3,2);
+    
+    // PASO 2
+    controlBrazo(1,1);
+    controlServo(1,8);
+    controlServo(3,150);
+    controlServo(5,80);
+    controlServo(7,55);
+    wait_ms(tiempo);
+    controlBrazo(1,2);
+    
+    // PASO 3
+    controlBrazo(2,1);
+    controlServo(3,95);
+    controlServo(1,30);
+    controlServo(5,100);
+    controlServo(7,65);
+    wait_ms(tiempo);
+    controlBrazo(2,2);
+    
+    //PASO 4
+    controlBrazo(4,1);
+    controlServo(7,10);
+    controlServo(5,118);
+    controlServo(1,45);
+    controlServo(3,105);
+    wait_ms(tiempo);
+    controlBrazo(4,2);
+}
+
+void left()
+{
+    //*************************************************************//
+    // POSICION INICIAL
+                
+    controlServo(1,8);      // Brazo 3 atras
+    controlServo(3,150);    // Brazo 4 adelante
+    wait_ms(tiempo);        // Tiempo en posicion
+    
+    //*************************************************************//
+    // PASO 1
+    
+    controlBrazo(1,1);
+    controlServo(3,105);
+    controlServo(1,70);
+    controlServo(5,60);
+    controlServo(7,55);
+    wait_ms(tiempo);
+    controlBrazo(1,2);
+    
+    // PASO 2
+    controlBrazo(3,1);
+    controlServo(1,50);
+    controlServo(5,118);
+    controlServo(3,80);
+    controlServo(7,15);
+    wait_ms(tiempo);
+    controlBrazo(3,2);
+    
+    // PASO 3
+    controlBrazo(4,1);
+    controlServo(5,100);
+    controlServo(7,65);
+    controlServo(3,95);
+    controlServo(1,30);
+    wait_ms(tiempo);
+    controlBrazo(4,2);
+    
+    //PASO 4
+    controlBrazo(2,1);
+    controlServo(1,8);
+    controlServo(3,150);
+    controlServo(5,80);
+    controlServo(7,45);
+    wait_ms(tiempo);
+    controlBrazo(2,2);
+    controlBrazo(1,2);
+    controlBrazo(3,2);
+}
+
+//*****************************************************************************//
+// Funcion para la lectura de datos
+
+uint8_t readComand()
+{
+    timeSerial.reset();
+    timeSerial.start();
+    
+    while (timeSerial.read_ms() <= 120)
+    {
+        if(pc.readable())
+        {
+            char charRead = pc.getc();
+            
+            if (charRead == 0xFF)
+            {            
+                for (int i=0; i<3; i++)
+                {
+                    data[i] = pc.getc();
+                }     
+            }    
+            
+            charRead = pc.getc();
+                
+            if (charRead != 0xFD)
+            {
+                pc.printf("\nError al recibir comando, intente nuevamente\n");
+                return 0;    
+            }
+                
+            return 1;
+        }
+    }
+    return 0;
+}
+
+void readSensor()
+{
+    valor_y = value_y.read();
+    valor_y = valor_y*3300;
+    //pc.printf("\nValor Y: %f\n",valor_y);
+    
+    valor_x = value_x.read();
+    valor_x = valor_x*3300;
+    //pc.printf("\nValor X: %f\n",valor_x);
+}
+
+void up (void)
+{
+    controlBrazo(1,2);
+    controlBrazo(2,1);
+    controlBrazo(3,2);
+    controlBrazo(4,1);
+}
+
+// *********************************************************************************************************************************//
+// Programa principal
+
+
+int main ()
+{
+    inicialPosition ();
+    wait(1);
+        
+    while (1)
+    {
+       // Lectura constante del color  
+       color = readColor();
+       
+       // lectura del joystick cada 100 ms
+       timeRead.start();
+       
+       if (timeRead.read_ms() >= 100)
+       {
+           readSensor();
+           timeRead.reset();
+       }
+       
+       while (readComand())
+       {    
+            // Codigo para comandos desde CoolTerm
+       
+            if (data[0] == 0x01)
+            {
+                // Codigo para movimiento independiente de los servomotores desde CoolTerm
+                controlServo(data[1],data[2]);       
+                pc.printf("\nNumero motor: %d", data[1]);
+                pc.printf("\nGrados: %d\n", data[2]);
+            }   
+                   
+            else if(data[0]==0x02)
+            {
+                // Codigo para movimiento de las extremidades desde CoolTerm
+                pc.printf("\nNumero brazo: %d", data[1]);
+                pc.printf("\nMovimiento: %d\n", data[2]);
+                controlBrazo(data[1],data[2]);
+            }
+            
+            else if (data[0] == 3)
+            {
+                // Codigo para llevar a posicion inicial desde CoolTerm
+                inicialPosition ();
+            }
+            
+            else if (data[0] == 4)
+            {
+                // Codigo para lectura de color desde CoolTerm
+                color = readColor();
+                pc.printf("\nColor: %d\n", color);
+            } 
+        }
+               
+        if (valor_y <= 1000)
+        {
+            // Codigo para movimiento adelante segun joystick
+            
+            if (readColor() == 1)
+            {
+                for (int i=0; i<2; i++)
+                {
+                    // Si el color es rojo gira a la derecha
+                    right();
+                }
+            }
+            
+            else if(readColor() == 2)
+            {
+                for (int i=0; i<2; i++)
+                {
+                    // Si el color es azul gira a la izquierda
+                    left();
+                }
+            }
+            
+            else
+            {
+                forward();
+                status=1;
+            }
+        } 
+                
+        else if (valor_y >= 2000)
+        {
+            // Codigo para movimiento atras segun joystick
+            reverse();
+            status=1;
+        }
+                
+        if (valor_x <= 1000)
+        {
+            // Codigo para giro derecho segun joystick
+            
+            if (readColor() == 3)
+            {
+                // Si el color es verde se "sienta"
+                up();
+            }
+            
+            else 
+            {
+                // Si el color es diferente de verde gira a la izquierda
+                right();
+                status=1;
+            }
+        } 
+                
+        else if (valor_x >= 2000)
+        {
+            // Codigo para giro izquierdo segun joystick
+            
+            if (readColor() == 3)
+            {
+                // Si el color es verde se "sienta"
+                up();
+            }
+            
+            else 
+            {
+                // Si el color es diferente de verde gira a la izquierda
+                left();
+                status=1;
+            }
+        }
+                
+        else if(status == 1)
+        {
+            inicialPosition ();
+            status=0;
+        }
+
+    }
+}
\ No newline at end of file