Program version 1

Dependencies:   FatFileSystemSD MSCFileSystem TextLCD mbed-rtos mbed

Fork of USBFlashDiskTest by Chris Styles

Files at this revision

API Documentation at this revision

Comitter:
carlos_nascimento08
Date:
Wed Nov 21 17:20:27 2012 +0000
Parent:
2:f1f6b33cd7bd
Commit message:
Problem

Changed in this revision

RoboClaw.lib Show annotated file Show diff for this revision Revisions of this file
TextLCD.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r f1f6b33cd7bd -r 10da2a723362 RoboClaw.lib
--- a/RoboClaw.lib	Sun Sep 16 15:13:32 2012 +0000
+++ b/RoboClaw.lib	Wed Nov 21 17:20:27 2012 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/carlos_nascimento08/code/TextLCD/#15a805c1202a
+http://mbed.org/users/carlos_nascimento08/code/TextLCD/#2544cb29d82e
diff -r f1f6b33cd7bd -r 10da2a723362 TextLCD.lib
--- a/TextLCD.lib	Sun Sep 16 15:13:32 2012 +0000
+++ b/TextLCD.lib	Wed Nov 21 17:20:27 2012 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/carlos_nascimento08/code/TextLCD/#8d777e7fe49b
+http://mbed.org/users/carlos_nascimento08/code/TextLCD/#ab287c4899bf
diff -r f1f6b33cd7bd -r 10da2a723362 main.cpp
--- a/main.cpp	Sun Sep 16 15:13:32 2012 +0000
+++ b/main.cpp	Wed Nov 21 17:20:27 2012 +0000
@@ -5,147 +5,277 @@
 #include "cmsis_os.h"
 
 #define tempo_period 50 //Periodo do PWM
-#define diametro_direita 42.74 //mm
-#define diametro_esquerda 42.67 //mm
-#define pi 3.1415926535897
+#define diametro_direita 40.50 //mm
+#define diametro_esquerda 40.50 //mm
+#define pi 3.1415926535897 
 #define velocidade_max 220.00 //cm/seg
-#define tam_vetor 64
+#define dist_minima 7.0 //cm
  
 TextLCD lcd(p5, p6, p7, p8, p29, p30, TextLCD::LCD20x4); // rs, e, d4-d7
-RoboClaw Placa(void);
+RoboClaw Placa;
+
 MSCFileSystem  sd("sd");
 
-
-//Serial Robo(p28, p27); // tx, rx
-
-AnalogIn sensor1(p15); 
-AnalogIn sensor2(p16); 
-AnalogIn sensor3(p17); 
-AnalogIn sensor4(p19); 
+Timer tempo;
 
 DigitalOut led1(LED1);
 DigitalOut led2(LED2);
 DigitalOut led3(LED3);
 DigitalOut led4(LED4);
 
+// Variavel de leitura de distancia do sensor Sharp
+float valor1 = 0, valor2 = 0, valor3 = 0, valor4 = 0;
+
+// Leitura de dados Pendrive
+float read_tempo = 0;
 
 //Declaracao de variaveis universal RoboClaw:
 char endereco = 128;
-char comando = 0;
 char valor = 0;
 char check8 = 0;    
 char buffer = 0;  
+char status_encoder_e = 0; 
+char status_encoder_d = 0;  
 unsigned int aceleracao = 0;
-int velocidade = 0;
 int velocidade_e = 0;
 int velocidade_d = 0;
-unsigned int cmd_distancia = 0;
 unsigned int cmd_distancia_e = 0;
 unsigned int cmd_distancia_d = 0;
-unsigned int distancia_e = 0;
-unsigned int distancia_d = 0;
+int distancia_e = 0;
+int distancia_d = 0;
+int temp_distancia_e = 0;
+int temp_distancia_d = 0;
 unsigned int Kp = 65536;
 unsigned int Ki = 32768;
 unsigned int Kd = 16384;
 unsigned int QPPS = 800;
-
-
-//Funcoes Universais
-double distancia(int y);
-
+unsigned long long resposta_encoder = 0;
+unsigned short le_buffer = 0;
+char buffer_M1 = 0, buffer_M2 = 0;
+char usando_na_thread = 0;
+char usando_na_main = 1;
 
 
 /*
 //Rotina Interrupcao Thread -> Controle de Velocidade
 void thread_interrompe(void const *argument) 
 {
+    char parar = 0;
+    
     while (true) 
     {
-        
-        
-        osDelay(0.001);
+        valor1 = Placa.sharp(1);
+        valor2 = Placa.sharp(2);
+        valor3 = Placa.sharp(3);
+        valor4 = Placa.sharp(4);
+
+        if(((valor1 <= dist_minima) && (valor1 >=0)) || ((valor2 <= dist_minima) && (valor2 >=0)) || ((valor3 <= dist_minima) && (valor3 >=0)) || ((valor4 <= dist_minima) && (valor4 >=0)))
+        {
+            endereco = 128;
+            parar = 0;
+            Placa.comando8(endereco, parar);
+            lcd.cls();
+            lcd.printf("1/%4.2f 2/%4.2f\n3/%4.2f 4/%4.2f" , valor1, valor2, valor3, valor4);
+            wait(2);
+        }      
+        osDelay(0.1);
     }
 }
-osThreadDef(thread_interrompe, osPriorityNormal, DEFAULT_STACK_SIZE);
+osThreadDef(thread_interrompe, osPriorityNormal, DEFAULT_STACK_SIZE);   */ 
 
+/*
 //Rotina Interrupcao Thread -> Atualiza vetor de tempo
 void vetor_atualiza(void const *argument) 
 {
     while (true) 
     {
-    
-        osDelay(1);
+        if(usando_na_main != 1)
+        {
+            usando_na_thread = 1;
+            endereco = 128;
+            le_buffer = Placa.comando47(endereco);
+            buffer_M1 = ((le_buffer>>8) & 0xFF);
+            buffer_M2 = (le_buffer & 0xFF);
+            usando_na_thread = 0;
+        }                
+        osDelay(0.1);
     }
 }
-osThreadDef(vetor_atualiza, osPriorityNormal, DEFAULT_STACK_SIZE);
-          */
+osThreadDef(vetor_atualiza, osPriorityNormal, DEFAULT_STACK_SIZE);*/
+
 
 //////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////
 int main() 
-{
-    //char resp = 0, string[40], imprimir = 0;
-    //int i = 0;
-    //unsigned int aux = 0, dist = 0;
-    //float valor1 = 0, valor2 = 0, valor3 = 0, valor4 = 0;
-    
-    //DIR *d;
-    //struct dirent *p;
-    
-    //Robo.baud(38400);
-    //Robo.attach(&callback);
+{ 
+
+    FILE *fp = fopen("/sd/dad.txt","w");
+    if ( fp == NULL )
+    {
+        error("Could not open file for write\n");
+        led2 = 1;
+    }
    
+    usando_na_main = 1;
     // Comeca Thread
     //osThreadCreate(osThread(thread_interrompe), NULL);
     //osThreadCreate(osThread(vetor_atualiza), NULL);
     
+    wait(1);
+                                
+    //Minimo volts main battery: 6V
+    endereco = 128;
+    valor = 0;
+    Placa.comando2(endereco, valor);
+
+    //Máximo volts main battery: 9V
+    endereco = 128;
+    valor = 47;
+    Placa.comando3(endereco, valor); 
     
+    // Zera o encoder
+    endereco = 128;
+    Placa.comando20(endereco);
+    
+    // Configura o motor M1 = Direita
+    endereco = 128;
+    Kp = 1000000;       
+    Ki = 500000;
+    Kd = 250000;
+    QPPS = 880;  // 840+ 10%
+    Placa.comando28(endereco, Kd, Kp, Ki,QPPS);
+
+    // Configura o motor M2 = Esquerda
+    endereco = 128;
+    Kp = 1000000;       
+    Ki = 500000;
+    Kd = 250000;
+    QPPS = 880;  // 840+ 10%
+    Placa.comando29(endereco, Kd, Kp, Ki,QPPS); 
+
 
     endereco = 128;  
-    aceleracao = 0;
-    velocidade_e = 150;
-    velocidade_d = 150;
-    cmd_distancia_e = 140;
-    cmd_distancia_d = 140;
+    aceleracao = 50;
+    velocidade_e = 50;
+    velocidade_d = 50;
+    cmd_distancia_e = 179;
+    cmd_distancia_d = 179;
+    buffer = 1;
+    //Placa.comando37(endereco, velocidade_d, velocidade_e);
+    Placa.comando46(endereco, aceleracao, velocidade_d, cmd_distancia_d, velocidade_e, cmd_distancia_e, buffer);
+
+    endereco = 128;  
+    aceleracao = 125;
+    velocidade_e = 0;
+    velocidade_d = 0;
+    cmd_distancia_e = 10;
+    cmd_distancia_d = 10;
     buffer = 0;
+    Placa.comando46(endereco, aceleracao, velocidade_d, cmd_distancia_d, velocidade_e, cmd_distancia_e, buffer);
 
-    Placa.comando46 (endereco, aceleracao, velocidade_d, cmd_distancia_d, velocidade_d, cmd_distancia_e, buffer);
-}
-
+    // Monitoramento no Pendrive
+    endereco = 128;
+    resposta_encoder = Placa.comando18(endereco);
+    velocidade_d = int (resposta_encoder & 0xFFFFFFFF);
+    resposta_encoder = Placa.comando19(endereco);
+    velocidade_e = int (resposta_encoder & 0xFFFFFFFF);
 
 
-// Funcoes auxiliares:
-double distancia(int y)
-{
-    double resultado = 0, x = 0;
+    while((velocidade_d==0) || (velocidade_e==0))
+    {
+        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);
+    }
+    
+    tempo.start();
+    
+    endereco = 128;
+    resposta_encoder = Placa.comando18(endereco);
+    velocidade_d = int (resposta_encoder & 0xFFFFFFFF);
+    resposta_encoder = Placa.comando19(endereco);
+    velocidade_e = int (resposta_encoder & 0xFFFFFFFF);
+    
+    while((velocidade_d!=0) || (velocidade_e!=0))
+    {
+        led4 != led4;
+        endereco = 128;
+        resposta_encoder = Placa.comando16(endereco);
+        distancia_d = int (resposta_encoder & 0xFFFFFFFF);
+        status_encoder_d = char ((resposta_encoder>>32) & 0xFF);
     
-    if(y == 1)
-        x = 3.3*sensor1;
-    else
-        if(y == 2)
-            x = 3.3*sensor2;
-        else
-            if(y == 3)
-                x = 3.3*sensor3;
-            else
-                if(y == 4)
-                    x = 3.3*sensor4;
-                else
-                    x = 0;
+        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);
+        
+        read_tempo = tempo.read_ms();
+        
+        fprintf(fp, "%f\t" , read_tempo);
+        fprintf(fp, "%d\t" , velocidade_e);
+        fprintf(fp, "%d\t\t" , distancia_e);
+        
+        fprintf(fp, "%f\t" , read_tempo);
+        fprintf(fp, "%d\t" , velocidade_d);
+        fprintf(fp, "%d-" , distancia_d);
+        
+        wait_us(800);   
+    }
+        
+    fclose(fp);
     
-    // Grafico 2: y = 2,266x6 - 25,396x5 + 114,73x4 - 268,77x3 + 349,89x2 - 251,81x + 92,04
+    led4 = 1;
+
+
+    /*    
+    while(1)
+    {
+        valor1 = Placa.sharp(1);
+        valor2 = Placa.sharp(2);
+        valor3 = Placa.sharp(3);
+        valor4 = Placa.sharp(4);
+
+        led3 = !led3;
+                
+        lcd.cls();
+        lcd.printf("1/%4.2f 2/%4.2f\n3/%4.2f 4/%4.2f" , valor1, valor2, valor3, valor4);
+        wait(0.1);
+
+        
+        endereco = 128;
+        resposta_encoder = Placa.comando16(endereco);
+        distancia_d = int (resposta_encoder & 0xFFFFFFFF);
+        status_encoder_d = char ((resposta_encoder>>32) & 0xFF);
     
-    resultado = 2.266*x*x*x*x*x*x;
-    resultado = resultado - 25.396*x*x*x*x*x;
-    resultado = resultado + 114.73*x*x*x*x;
-    resultado = resultado - 268.77*x*x*x;
-    resultado = resultado + 349.89*x*x;
-    resultado = resultado - 251.81*x;
-    resultado = resultado + 92.04;
+        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);
     
-    
-    if( (resultado >= 40) || (resultado < 0))
-        resultado = -1;
-     
-    return (resultado);
+        lcd.cls(); 
+        lcd.printf("DD:%i*DE:%i" , distancia_d, distancia_e);
+        lcd.printf("\nVD:%i*VE:%i" , velocidade_d, velocidade_e);    
+        wait(0.2); 
+    } 
+    */          
 }
diff -r f1f6b33cd7bd -r 10da2a723362 mbed.bld
--- a/mbed.bld	Sun Sep 16 15:13:32 2012 +0000
+++ b/mbed.bld	Wed Nov 21 17:20:27 2012 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/10b9abbe79a6
\ No newline at end of file
+http://mbed.org/users/mbed_official/code/mbed/builds/24d45a770a51
\ No newline at end of file