Dependents:   mbedServer_v1 mbedServer_v3 y_analog y_KXP84_I2C ... more

Files at this revision

API Documentation at this revision

Comitter:
carlos_nascimento08
Date:
Wed Nov 21 17:18:43 2012 +0000
Parent:
2:15a805c1202a
Commit message:
Library personal

Changed in this revision

RoboClaw.cpp Show annotated file Show diff for this revision Revisions of this file
RoboClaw.h Show annotated file Show diff for this revision Revisions of this file
--- a/RoboClaw.cpp	Sun Sep 16 15:07:33 2012 +0000
+++ b/RoboClaw.cpp	Wed Nov 21 17:18:43 2012 +0000
@@ -1,87 +1,1104 @@
-/* mbed TextLCD Library, for RoboClaw 15A
- */
-
-#include "RoboClaw.h"
-#include "mbed.h"
-
-Serial Robo(p28, p27); // tx, rx
-char envia_32 (unsigned int valor);
-char envia_8 (unsigned int valor);
-
-
-char envia_8 (unsigned int valor)
-{
-    char soma = 0 , manda = 0;
-        
-    manda = (valor)&0xFF;
-    Robo.putc(manda);
-    soma = soma + manda;  
-
-    return soma;
-}
-
-char envia_32 (unsigned int valor)
-{
-    char soma = 0 , manda = 0;
-        
-    
-    manda = (valor>>24)&0xFF;
-    Robo.putc(manda);
-    soma = soma + manda;     
-
-    manda = (valor>>16)&0xFF;
-    Robo.putc(manda);
-    soma = soma + manda;  
-
-    manda = (valor>>8)&0xFF;
-    Robo.putc(manda); 
-    soma = soma + manda;
-
-    manda = (valor)&0xFF;
-    Robo.putc(manda);
-    soma = soma + manda;  
-
-    return soma;
-}
-
-
-RoboClaw::RoboClaw(void)
-{
-    Robo.baud(38400);
-}
-
-
-// Comandos:
-
-void RoboClaw::comando46 (char address, unsigned int accel, int qspeedM1, unsigned int distanceM1, int    qspeedM2, unsigned int distanceM2, char cbuffer)
-{
-    char resposta = 0, ccheck8 = 0;
-        
-    resposta = envia_8 (address);
-    ccheck8 = ccheck8 + resposta;
-
-    resposta = envia_8 (46);
-    ccheck8 = ccheck8 + resposta;
-    
-    resposta = envia_32 (accel);
-    ccheck8 = ccheck8 + resposta;
-    
-    resposta = envia_32 (qspeedM1);
-    ccheck8 = ccheck8 + resposta;
-    
-    resposta = envia_32 (distanceM1);
-    ccheck8 = ccheck8 + resposta;    
-    
-    resposta = envia_32 (qspeedM2);
-    ccheck8 = ccheck8 + resposta;
-    
-    resposta = envia_32 (distanceM2);
-    ccheck8 = ccheck8 + resposta;     
-
-    resposta = envia_8 (cbuffer);
-    ccheck8 = ccheck8 + resposta;
-
-    ccheck8 = ccheck8&0x7F;
-    
-    resposta = envia_8(ccheck8);
-}
+/* mbed TextLCD Library, for RoboClaw 15A
+ */
+
+#include "RoboClaw.h"
+#include "mbed.h"
+
+Serial Robo(p28, p27); // tx, rx
+
+AnalogIn sensor1(p15); 
+AnalogIn sensor2(p16); 
+AnalogIn sensor3(p17); 
+AnalogIn sensor4(p19); 
+
+char envia_8(unsigned int valor);
+char signed_envia_32(int valor);
+char unsigned_envia_32(unsigned int valor);
+double le_32_vezes(char valor);
+
+double le_32_vezes(char valor)
+{
+    double x = 0;
+    int i = 0;
+    
+    if(valor == 1)
+    {
+        for(i = 1; i<=32; i++)
+            x = x + sensor1;
+        x = 3.3*x;
+        x = x/32.0;
+        return (x);
+    }
+
+    if(valor == 2)
+    {
+        for(i = 1; i<=32; i++)
+            x = x + sensor2;
+        x = 3.3*x;
+        x = x/32.0;
+        return (x);
+    }
+
+    if(valor == 3)
+    {
+        for(i = 1; i<=32; i++)
+            x = x + sensor3;
+        x = 3.3*x;
+        x = x/32.0;
+        return (x);
+    }
+
+    if(valor == 4)
+    {
+        for(i = 1; i<=32; i++)
+            x = x + sensor4;
+        x = 3.3*x;
+        x = x/32.0;
+        return (x);
+    }
+    else
+        return (-1);
+}
+
+char envia_8(unsigned int valor)
+{
+    char soma = 0 , manda = 0;
+        
+    manda = (valor)&0xFF;
+    Robo.putc(manda);
+    soma = soma + manda;  
+
+    return soma;
+}
+
+char signed_envia_32(int valor)
+{
+    char soma = 0 , manda = 0;
+    
+    manda = (valor>>24)&0xFF;
+    Robo.putc(manda);
+    soma = soma + manda;     
+
+    manda = (valor>>16)&0xFF;
+    Robo.putc(manda);
+    soma = soma + manda;  
+
+    manda = (valor>>8)&0xFF;
+    Robo.putc(manda); 
+    soma = soma + manda;
+
+    manda = (valor)&0xFF;
+    Robo.putc(manda);
+    soma = soma + manda;  
+
+    return soma;
+}
+
+char unsigned_envia_32(unsigned int valor)
+{
+    char soma = 0 , manda = 0;
+    
+    manda = (valor>>24)&0xFF;
+    Robo.putc(manda);
+    soma = soma + manda;     
+
+    manda = (valor>>16)&0xFF;
+    Robo.putc(manda);
+    soma = soma + manda;  
+
+    manda = (valor>>8)&0xFF;
+    Robo.putc(manda); 
+    soma = soma + manda;
+
+    manda = (valor)&0xFF;
+    Robo.putc(manda);
+    soma = soma + manda;  
+
+    return soma;
+}
+
+
+RoboClaw::RoboClaw(void)
+{
+    wait(0.5);
+}
+
+
+// Comandos:
+void RoboClaw::comando0(char address, char value)
+{
+    char resposta = 0, ccheck8 = 0, cmd = 0;
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(value);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}
+
+void RoboClaw::comando1(char address, char value)
+{
+    char resposta = 0, ccheck8 = 0, cmd = 1;
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(value);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}
+
+
+void RoboClaw::comando2(char address, char value)
+{
+    // Minimo 7V -> (7-6)*5=5
+    char resposta = 0, ccheck8 = 0, cmd = 2;
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(value);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}
+
+
+void RoboClaw::comando3(char address, char value)
+{
+    // Maximo 8V -> 42
+    char resposta = 0, ccheck8 = 0, cmd = 3;  
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(value);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}
+
+void RoboClaw::comando4(char address, char value)
+{
+    char resposta = 0, ccheck8 = 0, cmd = 4;
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(value);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}
+
+void RoboClaw::comando5(char address, char value)
+{
+    char resposta = 0, ccheck8 = 0, cmd = 5;
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(value);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}
+
+void RoboClaw::comando8(char address, char value)
+{
+    char resposta = 0, ccheck8 = 0, cmd = 8;  
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(value);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}
+
+
+void RoboClaw::comando9(char address, char value)
+{
+    char resposta = 0, ccheck8 = 0, cmd = 9;  
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(value);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}    
+
+
+void RoboClaw::comando10(char address, char value) //virar para esquerda
+{
+    char resposta = 0, ccheck8 = 0, cmd = 10;  
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(value);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}    
+
+
+void RoboClaw::comando11(char address, char value) //virar para direita
+{
+    char resposta = 0, ccheck8 = 0, cmd = 11;  
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(value);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}
+
+void RoboClaw::comando13(char address, char value)
+{
+    char resposta = 0, ccheck8 = 0, cmd = 13;  
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(value);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}
+
+/*
+        endereco = 128;
+        resposta_encoder = Placa.comando16(endereco);
+        distancia_d = int (resposta_encoder & 0xFFFFFFFF);
+        status_encoder_d = char ((resposta_encoder>>32) & 0xFF);
+    
+        endereco = 128;
+        resposta_encoder = Placa.comando17(endereco);
+        distancia_e = int (resposta_encoder & 0xFFFFFFFF);
+        status_encoder_e = char ((resposta_encoder>>32) & 0xFF);
+
+        resposta_encoder = Placa.comando18(endereco);
+        velocidade_d = int (resposta_encoder & 0xFFFFFFFF);
+        status_encoder_d = char ((resposta_encoder>>32) & 0xFF);
+
+        resposta_encoder = Placa.comando19(endereco);
+        velocidade_e = int (resposta_encoder & 0xFFFFFFFF);
+        status_encoder_e = char ((resposta_encoder>>32) & 0xFF);
+    
+        lcd.cls(); 
+        lcd.printf("DD:%i*DE:%i" , distancia_d, distancia_e);
+        lcd.printf("\nVD:%i*VE:%i" , velocidade_d, velocidade_e);    
+        wait(0.1);
+*/
+
+/*
+    endereco = 128;
+    resposta_encoder = Placa.comando16(endereco);
+    distancia_d = int (resposta_encoder & 0xFFFFFFFF);
+    status_encoder_d = char ((resposta_encoder>>32) & 0xFF);
+
+    endereco = 128;
+    resposta_encoder = Placa.comando17(endereco);
+    distancia_e = int (resposta_encoder & 0xFFFFFFFF);
+    status_encoder_e = char ((resposta_encoder>>32) & 0xFF);
+    
+    lcd.cls(); 
+    lcd.printf("D: %i\nE: %i" , distancia_d, distancia_e);
+    wait(0.5);  
+    // de acordo com o valor de "status_encoder_d" é possível verificar se le foi para frente ou para tras,......
+*/
+
+unsigned long long RoboClaw::comando16(char address)
+{
+    char cmd = 16, recebe[7], chegar = 0, checksum_recebido = 0, checksum = 0;
+    unsigned int i = 0;
+    unsigned long long dist = 0, aux = 0;  
+
+    Robo.baud(38400);
+
+
+    envia_8(address);
+    envia_8(cmd);
+    
+    for(i=1 ; i<=6 ; i++)
+    {
+        chegar = Robo.getc();
+        recebe[i] = chegar; 
+    }
+    
+    aux = recebe[1];
+    aux = (aux<<24);
+    dist = dist + aux;
+    aux = recebe[2];
+    aux = (aux<<16);     
+    dist = dist + aux;
+    aux = recebe[3];
+    aux = (aux<<8);     
+    dist = dist + aux;
+    aux = recebe[4]; 
+    dist = dist + aux;
+
+    aux = recebe[5]; //É o byte 5, status do encoder
+    aux = (aux<<32);
+    dist = dist + aux;
+
+    checksum_recebido = (recebe[6] - 0x10)&0x7F; // Tem que subtrair erro da placa de controle
+
+    checksum = 0;
+    for(i=1 ; i<=5 ; i++)
+    {
+        chegar = recebe[i]; 
+        checksum = checksum + chegar;
+    }
+    checksum = checksum&0x7F;
+
+    if(checksum == checksum_recebido)
+        return (dist);
+    else
+        return (0);
+}
+
+
+unsigned long long RoboClaw::comando17(char address)
+{
+    char cmd = 17, recebe[7], chegar = 0, checksum_recebido = 0, checksum = 0;
+    unsigned int i = 0;
+    unsigned long long dist = 0, aux = 0;  
+
+    Robo.baud(38400);
+
+    envia_8(address);
+    envia_8(cmd);
+    
+    for(i=1 ; i<=6 ; i++)
+    {
+        chegar = Robo.getc();
+        recebe[i] = chegar; 
+    }
+    
+    aux = recebe[1];
+    aux = (aux<<24);
+    dist = dist + aux;
+    aux = recebe[2];
+    aux = (aux<<16);     
+    dist = dist + aux;
+    aux = recebe[3];
+    aux = (aux<<8);     
+    dist = dist + aux;
+    aux = recebe[4]; 
+    dist = dist + aux;
+
+    aux = recebe[5]; //É o byte 5, status do encoder
+    aux = (aux<<32);
+    dist = dist + aux;
+
+    checksum_recebido = (recebe[6] - 0x11)&0x7F; // Tem que subtrair erro da placa de controle 
+
+    checksum = 0;
+    for(i=1 ; i<=5 ; i++)
+    {
+        chegar = recebe[i]; 
+        checksum = checksum + chegar;
+    }
+    checksum = checksum&0x7F;
+
+    if(checksum == checksum_recebido)
+        return (dist);
+    else
+        return (0);
+}
+
+/*
+    Modelo de leitura de velocidade de ambos motores:
+
+    endereco = 128;
+    resposta_encoder = Placa.comando18(endereco);
+    velocidade_d = int (resposta_encoder & 0xFFFFFFFF);
+    status_encoder_d = char ((resposta_encoder>>32) & 0xFF);
+    if(status_encoder_d)
+    {
+        velocidade_d = -velocidade_d;       
+    }
+
+    lcd.cls(); 
+    lcd.printf("D: %i %x\nE: %i %x" , velocidade_d, status_encoder_d , velocidade_e, status_encoder_e); 
+*/
+
+unsigned long long RoboClaw::comando18(char address)
+{
+    char cmd = 18, recebe[7], chegar = 0, checksum_recebido = 0, checksum = 0;
+    unsigned int i = 0;
+    unsigned long long dist = 0, aux = 0;  
+
+    Robo.baud(38400);
+
+
+    envia_8(address);
+    envia_8(cmd);
+    
+    for(i=1 ; i<=6 ; i++)
+    {
+        chegar = Robo.getc();
+        recebe[i] = chegar; 
+    }
+    
+    aux = recebe[1];
+    aux = (aux<<24);
+    dist = dist + aux;
+    aux = recebe[2];
+    aux = (aux<<16);     
+    dist = dist + aux;
+    aux = recebe[3];
+    aux = (aux<<8);     
+    dist = dist + aux;
+    aux = recebe[4]; 
+    dist = dist + aux;
+
+    aux = recebe[5]; //É o byte 5, status da Velocidade
+    aux = (aux<<32);
+    dist = dist + aux;
+
+    checksum_recebido = (recebe[6] + 0x6E)&0x7F; // Tem que subtrair erro da placa de controle 
+
+    checksum = 0;
+    for(i=1 ; i<=5 ; i++)
+    {
+        chegar = recebe[i]; 
+        checksum = checksum + chegar;
+    }
+    checksum = checksum&0x7F;
+
+    if(checksum == checksum_recebido)
+        return (dist);
+    else
+        return (0);
+}
+
+
+
+unsigned long long RoboClaw::comando19(char address)
+{
+    char cmd = 19, recebe[7], chegar = 0, checksum_recebido = 0, checksum = 0;
+    unsigned int i = 0;
+    unsigned long long dist = 0, aux = 0;  
+
+    Robo.baud(38400);
+
+
+    envia_8(address);
+    envia_8(cmd);
+    
+    for(i=1 ; i<=6 ; i++)
+    {
+        chegar = Robo.getc();
+        recebe[i] = chegar; 
+    }
+    
+    aux = recebe[1];
+    aux = (aux<<24);
+    dist = dist + aux;
+    aux = recebe[2];
+    aux = (aux<<16);     
+    dist = dist + aux;
+    aux = recebe[3];
+    aux = (aux<<8);     
+    dist = dist + aux;
+    aux = recebe[4]; 
+    dist = dist + aux;
+
+    aux = recebe[5]; //É o byte 5, status da Velocidade
+    aux = (aux<<32);
+    dist = dist + aux;
+
+    checksum_recebido = (recebe[6] + 0x6D)&0x7F; // Tem que subtrair erro da placa de controle 
+
+    checksum = 0;
+    for(i=1 ; i<=5 ; i++)
+    {
+        chegar = recebe[i]; 
+        checksum = checksum + chegar;
+    }
+    checksum = checksum&0x7F;
+
+    if(checksum == checksum_recebido)
+        return (dist);
+    else
+        return (0);
+}
+
+
+void RoboClaw::comando20(char address)
+{
+    // Maximo 8V -> 42
+    char resposta = 0, ccheck8 = 0, cmd = 20;  
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}
+
+
+void RoboClaw::comando28(char address, unsigned int D, unsigned int P, unsigned int I, unsigned int QPPS)
+{
+    char resposta = 0, ccheck8 = 0, cmd = 28;  
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = unsigned_envia_32(D);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = unsigned_envia_32(P);
+    ccheck8 = ccheck8 + resposta;    
+    
+    resposta = unsigned_envia_32(I);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = unsigned_envia_32(QPPS);
+    ccheck8 = ccheck8 + resposta;     
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}
+
+
+void RoboClaw::comando29(char address, unsigned int D, unsigned int P, unsigned int I, unsigned int QPPS)
+{
+    char resposta = 0, ccheck8 = 0, cmd = 29;  
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = unsigned_envia_32(D);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = unsigned_envia_32(P);
+    ccheck8 = ccheck8 + resposta;    
+    
+    resposta = unsigned_envia_32(I);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = unsigned_envia_32(QPPS);
+    ccheck8 = ccheck8 + resposta;     
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}            
+
+void RoboClaw::comando35(char address, int qspeedM1)
+{
+    char resposta = 0, ccheck8 = 0, cmd = 35;  
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = signed_envia_32(qspeedM1);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+                            
+    resposta = envia_8(ccheck8);
+}
+             
+
+void RoboClaw::comando36(char address, int qspeedM2)
+{
+    char resposta = 0, ccheck8 = 0, cmd = 36;  
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = signed_envia_32(qspeedM2);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+                            
+    resposta = envia_8(ccheck8);
+}
+
+
+void RoboClaw::comando37(char address, int qspeedM1, int qspeedM2)
+{
+    char resposta = 0, ccheck8 = 0, cmd = 37;  
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = signed_envia_32(qspeedM1);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = signed_envia_32(qspeedM2);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+                            
+    resposta = envia_8(ccheck8);
+}
+
+
+void RoboClaw::comando38(char address, unsigned int accel, int qspeedM1)
+{
+    char resposta = 0, ccheck8 = 0, cmd = 38;  
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = unsigned_envia_32(accel);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = signed_envia_32(qspeedM1);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}  
+
+
+
+void RoboClaw::comando39(char address, unsigned int accel, int qspeedM2)
+{
+    char resposta = 0, ccheck8 = 0, cmd = 39;  
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = unsigned_envia_32(accel);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = signed_envia_32(qspeedM2);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}  
+
+
+void RoboClaw::comando40(char address, unsigned int accel, int qspeedM1, int qspeedM2)
+{
+    char resposta = 0, ccheck8 = 0, cmd = 40;  
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = unsigned_envia_32(accel);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = signed_envia_32(qspeedM1);
+    ccheck8 = ccheck8 + resposta;    
+    
+    resposta = signed_envia_32(qspeedM2);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}
+
+
+void RoboClaw::comando41(char address, int qspeedM1, unsigned int distanceM1, char cbuffer)
+{
+    char resposta = 0, ccheck8 = 0, cmd = 41;  
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = signed_envia_32(qspeedM1);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = unsigned_envia_32(distanceM1);
+    ccheck8 = ccheck8 + resposta;    
+
+    resposta = envia_8(cbuffer);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}
+
+
+void RoboClaw::comando42(char address, int qspeedM2, unsigned int distanceM2, char cbuffer)
+{
+    char resposta = 0, ccheck8 = 0, cmd = 42;  
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = signed_envia_32(qspeedM2);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = unsigned_envia_32(distanceM2);
+    ccheck8 = ccheck8 + resposta;     
+
+    resposta = envia_8(cbuffer);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}
+
+
+void RoboClaw::comando43(char address, int qspeedM1, unsigned int distanceM1, int qspeedM2, unsigned int distanceM2, char cbuffer)
+{
+    char resposta = 0, ccheck8 = 0, cmd = 43;  
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = signed_envia_32(qspeedM1);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = unsigned_envia_32(distanceM1);
+    ccheck8 = ccheck8 + resposta;    
+    
+    resposta = signed_envia_32(qspeedM2);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = unsigned_envia_32(distanceM2);
+    ccheck8 = ccheck8 + resposta;     
+
+    resposta = envia_8(cbuffer);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}
+
+
+void RoboClaw::comando44(char address, unsigned int accel, int qspeedM1, unsigned int distanceM1, char cbuffer)
+{
+    char resposta = 0, ccheck8 = 0, cmd = 44;  
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = unsigned_envia_32(accel);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = signed_envia_32(qspeedM1);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = unsigned_envia_32(distanceM1);
+    ccheck8 = ccheck8 + resposta;    
+
+    resposta = envia_8(cbuffer);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}  
+
+
+
+void RoboClaw::comando45(char address, unsigned int accel, int qspeedM2, unsigned int distanceM2, char cbuffer)
+{
+    char resposta = 0, ccheck8 = 0, cmd = 45;  
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = unsigned_envia_32(accel);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = signed_envia_32(qspeedM2);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = unsigned_envia_32(distanceM2);
+    ccheck8 = ccheck8 + resposta;     
+
+    resposta = envia_8(cbuffer);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}  
+
+
+void RoboClaw::comando46(char address, unsigned int accel, int qspeedM1, unsigned int distanceM1, int qspeedM2, unsigned int distanceM2, char cbuffer)
+{
+    char resposta = 0, ccheck8 = 0, cmd = 46;  
+
+    Robo.baud(38400);
+      
+    resposta = envia_8(address);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = envia_8(cmd);
+    ccheck8 = ccheck8 + resposta;
+
+    resposta = unsigned_envia_32(accel);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = signed_envia_32(qspeedM1);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = unsigned_envia_32(distanceM1);
+    ccheck8 = ccheck8 + resposta;    
+    
+    resposta = signed_envia_32(qspeedM2);
+    ccheck8 = ccheck8 + resposta;
+    
+    resposta = unsigned_envia_32(distanceM2);
+    ccheck8 = ccheck8 + resposta;     
+
+    resposta = envia_8(cbuffer);
+    ccheck8 = ccheck8 + resposta;
+
+    ccheck8 = ccheck8&0x7F;
+    
+    resposta = envia_8(ccheck8);
+}  
+
+/*
+Padrao de leitura:
+- Quando fica 0x80=128 ou 0x00 o buffer está vazio
+
+endereco = 128;
+le_buffer = Placa.comando47(endereco);
+buffer_M1 = ((le_buffer>>8) & 0xFF);
+buffer_M2 = (le_buffer & 0xFF);
+
+
+lcd.cls(); 
+lcd.printf("M1: %i\nM2: %i" , buffer_M1, buffer_M2);
+wait(0.5);
+*/
+unsigned short RoboClaw::comando47(char address)
+{
+    char cmd = 47, recebe[7], chegar = 0, checksum_recebido = 0, checksum = 0;
+    unsigned int i = 0;
+    unsigned short dist = 0, aux = 0;  
+
+    Robo.baud(38400);
+
+
+    envia_8(address);
+    envia_8(cmd);
+    
+    for(i=1 ; i<=3 ; i++)
+    {
+        chegar = Robo.getc();
+        recebe[i] = chegar; 
+    }
+    
+    aux = recebe[1];
+    aux = (aux<<8);
+    dist = dist + aux;
+    aux = recebe[2];     
+    dist = dist + aux;
+
+
+    checksum_recebido = (recebe[3] - 0x2F)&0x7F; // Tem que subtrair erro da placa de controle 
+
+    checksum = 0;
+    for(i=1 ; i<=2 ; i++)
+    {
+        chegar = recebe[i]; 
+        checksum = checksum + chegar;
+    }
+    checksum = checksum&0x7F;
+
+    if(checksum == checksum_recebido)
+        return (dist);
+    else
+        return (0);
+}
+        
+// Funcoes Sendor de Distância Sharp:
+double RoboClaw::sharp(char y)
+{
+    double resultado = 0, x = 0;
+    
+    x = le_32_vezes(y);
+
+    // Grafico 2: 
+    //y = 2,266x6 - 25,396x5 + 114,73x4 - 268,77x3 + 349,89x2 - 251,81x + 92,04
+    //y = 2,2659705249x6 - 25,3957269119x5 + 114,7331566401x4 - 268,7667878147x3 + 349,8876615694x2 - 251,8100630442x + 92,0400793302
+
+    if(x <= 0.4)
+        return (-2); // Erro: Distância maior que 30cm
+    if(x >= 2.8)
+        return (-1); // Erro: Distância menor que 4cm
+
+    resultado =2.2659705249*x*x*x*x*x*x;
+    resultado = resultado - 25.3957269119*x*x*x*x*x;
+    resultado = resultado + 114.7331566401*x*x*x*x;
+    resultado = resultado - 268.7667878147*x*x*x;
+    resultado = resultado + 349.8876615694*x*x;
+    resultado = resultado - 251.8100630442*x;
+    resultado = resultado + 92.0400793302;
+
+    if(resultado > 30)
+        return (-2); // Erro: Distância maior que 30cm
+    if(resultado < 4)
+        return (-1); // Erro: Distância menor que 4cm
+    
+    return (resultado);
+}
--- a/RoboClaw.h	Sun Sep 16 15:07:33 2012 +0000
+++ b/RoboClaw.h	Wed Nov 21 17:18:43 2012 +0000
@@ -1,17 +1,47 @@
-/* mbed TextLCD Library, for RoboClaw 15A
- */
-
-#ifndef MBED_ROBOCLAW_H
-#define MBED_ROBOCLAW_H
-
-#include "mbed.h"
-
-class RoboClaw{
-public:
-    RoboClaw(void);
-    void comando46 (char address, unsigned int accel, int qspeedM1, unsigned int distanceM1, int qspeedM2, unsigned int distanceM2, char buffer);
-private:
-}
-;
-
-#endif
+/* mbed TextLCD Library, for RoboClaw 15A
+ */
+
+#ifndef MBED_ROBOCLAW_H
+#define MBED_ROBOCLAW_H
+
+#include "mbed.h"
+
+class RoboClaw {
+public:
+    RoboClaw(void);
+    void comando0(char address, char value);
+    void comando1(char address, char value);
+    void comando2(char address, char value);
+    void comando3(char address, char value); 
+    void comando4(char address, char value);
+    void comando5(char address, char value);
+    void comando8(char address, char value);
+    void comando9(char address, char value);
+    void comando10(char address, char value);
+    void comando11(char address, char value);
+    void comando13(char address, char value);
+    unsigned long long comando16(char address);
+    unsigned long long comando17(char address);
+    unsigned long long comando18(char address);
+    unsigned long long comando19(char address);
+    void comando20(char address);
+    void comando28(char address, unsigned int D, unsigned int P, unsigned int I, unsigned int QPPS);
+    void comando29(char address, unsigned int D, unsigned int P, unsigned int I, unsigned int QPPS);
+    void comando35(char address, int qspeedM1);
+    void comando36(char address, int qspeedM2);
+    void comando37(char address, int qspeedM1, int qspeedM2);
+    void comando38(char address, unsigned int accel, int qspeedM1);
+    void comando39(char address, unsigned int accel, int qspeedM2);
+    void comando40(char address, unsigned int accel, int qspeedM1, int qspeedM2);    
+    void comando41(char address, int qspeedM1, unsigned int distanceM1, char cbuffer);
+    void comando42(char address, int qspeedM2, unsigned int distanceM2, char cbuffer);
+    void comando43(char address, int qspeedM1, unsigned int distanceM1, int qspeedM2, unsigned int distanceM2, char cbuffer);
+    void comando44(char address, unsigned int accel, int qspeedM1, unsigned int distanceM1, char cbuffer);
+    void comando45(char address, unsigned int accel, int qspeedM2, unsigned int distanceM2, char cbuffer);
+    void comando46(char address, unsigned int accel, int qspeedM1, unsigned int distanceM1, int qspeedM2, unsigned int distanceM2, char cbuffer);
+    unsigned short comando47(char address);
+    double sharp(char y);
+}
+;
+
+#endif