programma steve fine giornata 23-05

Dependencies:   HCSR04 mbed-rtos mbed

Files at this revision

API Documentation at this revision

Comitter:
Wonderjack996
Date:
Wed May 24 08:04:12 2017 +0000
Commit message:
programma steve fine giornata 23-05

Changed in this revision

HCSR04.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-rtos.lib 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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HCSR04.lib	Wed May 24 08:04:12 2017 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/prabhuvd/code/HCSR04/#71da0dbf4400
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed May 24 08:04:12 2017 +0000
@@ -0,0 +1,169 @@
+/*---LIBRERIE---*/
+#include "mbed.h"
+#include "rtos.h"
+#include "hcsr04.h"
+/*--------------*/
+
+/*---COSTANTI---*/
+#define PWMB PC_7  //D9
+#define DIRB D8    //D8
+
+#define PWMA PB_4  //D5
+#define DIRA D4    //D4
+
+#define avantiTrigger PA_5  //D13
+#define avantiEcho PA_6     //D12
+#define sinistraTrigger PA_8  //D7
+#define sinistraEcho PB_10    //D6
+#define destraTrigger PA_10  //D2
+#define destraEcho PB_3 //D3
+
+#define CTRL_SIRENA D11  //D11
+/*--------------*/
+
+/*---VARIABILI GLOBALI---*/
+PwmOut motorApower(PWMA); //istanzio oggetto per controllo motore A ( vedi scheda per capire quale sia )
+DigitalOut motorAdirection(DIRA);
+
+PwmOut motorBpower(PWMB); //istanzio oggetto per controllo motore B ( vedi scheda per capire quale sia )
+DigitalOut motorBdirection(DIRB);
+
+HCSR04 ultrasuoniAvanti(avantiTrigger, avantiEcho); //istanzio oggetti per controllo ultrasuoni
+HCSR04 ultrasuoniSinistra(sinistraTrigger, sinistraEcho); 
+HCSR04 ultrasuoniDestra(destraTrigger, destraEcho); 
+
+
+Serial pc(USBTX, USBRX); //istanzio oggetto per utilizzo monitor seriale
+
+int distanceCtrl = 10; /*decido una distanza, in cm, per i vari controlli dell' ultrasuono, esempio utilizzo come valore
+                         per capire quando la macchina si deve fermare*/
+                         
+bool flagSirena = true; //utilizzato per bloccare il robot nel caso senta una sirena
+/*-----------------------*/
+
+
+/*---PROTOTIPI DELLE FUNZIONI---*/
+void avanti();
+void indietro();
+void destra();
+void sinistra();
+void fermo();
+bool checkFermo();
+void check_sirena_thread(void const *args);
+/*-------------------------------*/
+
+int main() {
+    
+    int avantiDis, sinistraDis;
+    
+    Thread sirenaThread(check_sirena_thread); // start Thread controllo sirena
+    
+    motorBpower.period_ms(10); //setto periodo per impulsi da inviare ai motori ( consiglio di non variare )
+    motorApower.period_ms(10);
+    
+    fermo();
+    
+    while(true){ //utilizzo per mandare in loop la funzione principale ( main tipo )
+        while(flagSirena){ //il robot si puo' muovere liberamente finche non sente il suono della sirena tipo ambulanza
+            ultrasuoniAvanti.start();
+            avantiDis = ultrasuoniAvanti.get_dist_cm();
+            //pc.printf("avanti: %d \r\n",avantiDis);
+            while( avantiDis >= distanceCtrl && flagSirena ){ //finche il valore letto dall' ultrasuono e' maggiore della distanza di urto la macchina puo' procedere
+                avanti();
+                ultrasuoniAvanti.start();
+                avantiDis = ultrasuoniAvanti.get_dist_cm();
+                //pc.printf("avanti: %d \r\n",avantiDis);
+                wait_ms(10);
+            }
+            
+            fermo();
+            
+            if( checkFermo() ){
+                destra();
+                wait_ms(1000);
+                
+                ultrasuoniSinistra.start();
+                sinistraDis = ultrasuoniSinistra.get_dist_cm();
+                //pc.printf("sinistra: %d \r\n",sinistraDis);
+                while(sinistraDis >= distanceCtrl && flagSirena ){ //il robot continua la rotazione per evitare l' ostacolo finche l' ultrasuono di destra lo avverte di aver trovato una superficie piana
+                    ultrasuoniSinistra.start();
+                    sinistraDis = ultrasuoniSinistra.get_dist_cm();
+                    //pc.printf("sinistra: %d \r\n",sinistraDis);
+                }
+                wait_ms(200);
+                
+                fermo();
+            }
+        }
+    }
+    
+}
+
+void check_sirena_thread(void const *args) {
+    /*thread che controlla sempre il pin dedicato alla sirena, se il pin diventa alto comunica il cambiamento 
+    con un flag al main che si adatta alla situazione*/
+    DigitalIn in(CTRL_SIRENA);
+    while(true){
+        int val = in.read();
+        if( val == 1 )
+            flagSirena = false;
+        else
+            flagSirena = true;
+    } 
+}
+
+bool checkFermo()
+{
+    /*funzione utilizzata per evitare che disturbi dell ultrasuono vengano presi in considerazione come valori utili
+    La funzione controlla per un TOT volte se il valore e' attendibile e in caso positivo ritorna TRUE*/
+    bool ret = true;
+    int avantiDis, ctrl = 50;
+    for(int i = 0; i < ctrl; i++){
+        ultrasuoniAvanti.start();
+        avantiDis = ultrasuoniAvanti.get_dist_cm();
+        if( avantiDis >= distanceCtrl ){
+            ret = false;
+            break;
+        }
+        wait_ms(10);
+    }
+    return ret;
+}
+
+void avanti()
+{
+    motorBdirection = 1; 
+    motorAdirection = 0;
+    motorBpower.pulsewidth(0.01); // 100%
+    motorApower.pulsewidth(0.01); // 100%
+}
+
+void indietro()
+{
+    motorBdirection = 0; 
+    motorAdirection = 1;
+    motorBpower.pulsewidth(0.01); // 100%
+    motorApower.pulsewidth(0.01); // 100%
+}
+
+void destra()
+{
+    motorBdirection = 0; 
+    motorAdirection = 0;
+    motorBpower.pulsewidth(0.01); // 100%
+    motorApower.pulsewidth(0.007); // 70%
+}
+
+void sinistra()
+{
+    motorBdirection = 1; 
+    motorAdirection = 1;
+    motorBpower.pulsewidth(0.007); // 100%
+    motorApower.pulsewidth(0.01); // 100%
+}
+
+void fermo()
+{
+    motorBpower.pulsewidth(0); // fermo
+    motorApower.pulsewidth(0); // fermo
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Wed May 24 08:04:12 2017 +0000
@@ -0,0 +1,1 @@
+https://mbed.org/users/mbed_official/code/mbed-rtos/#58563e6cba1e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed May 24 08:04:12 2017 +0000
@@ -0,0 +1,1 @@
+https://mbed.org/users/mbed_official/code/mbed/builds/093f2bd7b9eb
\ No newline at end of file