programma commando motori

Dependencies:   mbed HCSR04 mbed-rtos

Revision:
3:5b91f83642bf
Parent:
2:7df0fc7d8d3c
diff -r 7df0fc7d8d3c -r 5b91f83642bf main.cpp
--- a/main.cpp	Thu May 25 07:12:44 2017 +0000
+++ b/main.cpp	Tue May 30 07:30:45 2017 +0000
@@ -9,9 +9,14 @@
 
     #define CTRL_SIRENA D11  //D11 - pin aggancio sensore sonoro
     
-    #define DISTANCE_CTRL 10 /*decido una distanza, in cm, per i vari controlli dell' ultrasuono, esempio utilizzo come valore
+    #define DISTANCE_CTRL 15 /*decido una distanza, in cm, per i vari controlli dell' ultrasuono, esempio utilizzo come valore
                                per capire quando la macchina si deve fermare*/
 
+    #define NUMBER_CRC 9 //numero utilizzato per controlli nell avanzamento automatico (vedi nella funzione che lo utilizza per spiegazione approfondita)
+
+    
+    #define LED_AUTOMATIC PB_2 //attacco led controolo modalita automatica
+
     /*---PIN BLUETHOOT---*/
     /*I pin utilizzati per TX e RX sono pin morfo, a livello hardware collegare il pin TX dell HC05 al PA_12 e quello RX a PA_11 ( a livello harware vanno invertiti )*/
     #define TX PA_11
@@ -51,6 +56,8 @@
     HCSR04 ultrasuoniDestra(DESTRA_TRIGGER, DESTRA_ECHO);
     /*--------------------------*/
     
+    DigitalOut ledAutomatic(LED_AUTOMATIC); //pin in rifermineto al led controllo mod automatica
+    
     Serial pc(USBTX, USBRX); //istanzio oggetto per utilizzo monitor seriale
     
     Serial device(TX, RX); //oggetto per gestione seriale bluethoot
@@ -58,6 +65,8 @@
     bool flagSirena = true; //utilizzato per bloccare il robot nel caso senta una sirena
     
     bool flagAutomatic; //utilizzo per sapere se utilizzare modalita automatica o meno
+    
+    bool flagStopAvanti;
 /*----------------*/
 
 /*---PROTOTIPI---*/
@@ -69,23 +78,45 @@
     bool checkFermo();
     void automaticProgram();
     void check_sirena_thread(void const *args);
-    void check_stop_thread(void const *args); 
+    void check_stop_thread(void const *args);
+    void check_stop_avanti(void const *args); 
 /*---------------*/
 
 int main() {
     
     unsigned char rx;
+    int distanceTemp;
     
     motorBpower.period_ms(10); //setto periodo per impulsi da inviare ai motori ( consiglio di non variare )
     motorApower.period_ms(10); //setto periodo per impulsi da inviare ai motori ( consiglio di non variare )
     
+    Thread sirenaThread(check_sirena_thread); // start Thread controllo sirena
+    Thread ctrlStopThread(check_stop_thread); // start Thread controllo fine processo automatico
+    Thread ctrlStopAvanti(check_stop_avanti); // start Thread controllo fine processo avanzamento
+    
     while(true){
         if( device.readable() ) { //funzione simile alla Serial.available() di arduino, solo se il monitor e` attivo permette di utilizzarlo
             rx = device.getc(); //funzione simile alla Serial.read() di arduino, legge il carattere dal seriale del bluethoot
             //pc.printf("recived: %c \r\n",rx); //stampa a video
             switch(rx){ //in base alla lettera che riceve sa cosa deve fare
                 case 'a':
-                    avanti();
+                    flagStopAvanti = true; /*il thread check_stop_avanti viene avviato appena tale flag diventa true*/
+                    /*a causa di problemi riscontrati con l'utilizzo dell'ultrasuono si e' deciso di ripere l'operazione di acquisizione
+                      dati dall'ultrasuono per piu' volte (tante quante NUMBER_CRC) in modo da essere sicuri del valore ottenuto*/
+                    for(int j = 0; j < NUMBER_CRC && flagStopAvanti; j++){
+                        distanceTemp = MAX;
+                        for( int i = 0; i < 100 && ( distanceTemp < 2 || distanceTemp > 400 && flagStopAvanti ); i++ ){ //questo perche il range dell'ultrasuono usato va da 2 cm a 4 m ( 400 cm )
+                            ultrasuoniAvanti.start();
+                            distanceTemp = ultrasuoniAvanti.get_dist_cm();
+                            //wait_ms(10);
+                        }
+                        while( distanceTemp > 5 && flagStopAvanti ){
+                            avanti();
+                            ultrasuoniAvanti.start();
+                            distanceTemp = ultrasuoniAvanti.get_dist_cm();
+                        }
+                        fermo();
+                    }
                     break;
                 case 'b':
                     indietro();
@@ -101,7 +132,9 @@
                     break;
                 case 'f':
                     flagAutomatic = true;
+                    ledAutomatic = 1; //accensione led mod automatica
                     automaticProgram(); //funzione pilota automatico
+                    ledAutomatic = 0; //spegnimento led
                     break;
             }
         }
@@ -115,9 +148,6 @@
     
     int distanceDx, distanceSx;
     
-    Thread sirenaThread(check_sirena_thread); // start Thread controllo sirena
-    Thread ctrlStopThread(check_stop_thread); // start Thread controllo sirena
-    
     fermo();
     
     while(flagAutomatic){ //flag modificabile dal thread che aspetta il segnale di stop
@@ -138,6 +168,8 @@
             if( checkFermo() && flagSirena && flagAutomatic ){    
                 /*funzione utilizzata per leggere un valore attendibile ( nel range dell ultrasuono ). se dopo 100 tentativi
                   il valore non e' ancora attendibile allora esco dal controllo in modo da non rimanere bloccato*/    
+                distanceDx = MAX;
+                distanceSx = MAX;
                 for( int i = 0; i < 100 && ( distanceDx < 2 || distanceDx > 400 ); i++ ){ //questo perche il range dell'ultrasuono usato va da 2 cm a 4 m ( 400 cm )
                     ultrasuoniDestra.start();
                     distanceDx = ultrasuoniDestra.get_dist_cm();
@@ -159,7 +191,7 @@
                 if( distanceDx < 2 || distanceDx > 400 )
                     distanceDx = MAX;
                 
-                pc.printf("distanceSx: %d  distanceDx: %d\r\n",distanceSx, distanceDx);
+                //pc.printf("distanceSx: %d  distanceDx: %d\r\n",distanceSx, distanceDx);
                 
                 //in base ai valori letti capisco da che lato e' piu vicino la superficie piana e in base a cio sono da che parte girare
                 if( distanceSx > distanceDx ){
@@ -196,17 +228,31 @@
     }
 }
 
+void check_stop_avanti(void const *args) 
+{ 
+    /*questo thread ha il compito di attendere che l utente richieda lo stop del mezzo, quando cio avviene il thread setta il flag a 
+    false e interrompe sia se stesso che la funzione avanti*/
+    unsigned char rx;
+    while(true) 
+        while( flagStopAvanti )
+            if( device.readable() ) { //funzione simile alla Serial.available() di arduino, solo se il monitor e` attivo permette di utilizzarlo
+                rx = device.getc(); //funzione simile alla Serial.read() di arduino, legge il carattere dal seriale del bluethoot
+                if( rx == 'e' )
+                    flagStopAvanti = false;
+            }
+}
+
 void check_stop_thread(void const *args) 
 { 
     /*thread che controlla se l'utente via dispositivi ha chiesto lo stop del proamma automatico*/
     unsigned char rx;
-    while(true) {
-        if( device.readable() ) { //funzione simile alla Serial.available() di arduino, solo se il monitor e` attivo permette di utilizzarlo
-            rx = device.getc(); //funzione simile alla Serial.read() di arduino, legge il carattere dal seriale del bluethoot
-            if( rx == 'g' )
-                flagAutomatic = false;
-        }
-    } 
+    while(true) 
+        while( flagAutomatic )
+            if( device.readable() ) { //funzione simile alla Serial.available() di arduino, solo se il monitor e` attivo permette di utilizzarlo
+                rx = device.getc(); //funzione simile alla Serial.read() di arduino, legge il carattere dal seriale del bluethoot
+                if( rx == 'g' )
+                    flagAutomatic = false;
+            }
 }
 
 void check_sirena_thread(void const *args)