Problemi

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MicRobot-Rev085.cpp Source File

MicRobot-Rev085.cpp

00001 // pilotaggio carrello tramite BLE.
00002 // testato su L476RG e F401RE
00003 
00004 #include "mbed.h"
00005 #include<stdlib.h>
00006 
00007 // dimensione massima del pacchetto ricevuto su seriale
00008 #define PACKETDIM   8
00009 
00010 
00011 // Definizione periferica USB seriale del PC
00012 Serial pc(USBTX, USBRX, 921600); // seriale di comunicazione con il PC. Associati a PA_11 e PA_12
00013 
00014 // Definizione periferica seriale del Modulo BLE ELETT114A
00015 Serial myBLE(PA_9, PA_10, 9600); //Tx, Rx, bps // F401
00016 //Serial myBLE(PG_7, PG_8, 9600); //Tx, Rx, bps // L496
00017 
00018 // Input di Reset per il Modulo BLE HC-05
00019 DigitalOut BleRst(PA_8);
00020 
00021 // User Button, LED  
00022 DigitalIn myButton(USER_BUTTON); // pulsante Blu sulla scheda. Associato a PC_13
00023 DigitalOut myLed(LED2); // LED verde sulla scheda. Associato a PA_5
00024 
00025 
00026 //carattere di comando ricevuto dal BLE e relativo parametro
00027 volatile char cCommandBLE; // cambia nella routine di interrupt
00028 volatile char cParamBLE; // cambia nella routine di interrupt
00029 volatile int nParamBLE; // corrispondente valore numerico di cParamBLE
00030 
00031 // memorizza l'ultimo comando ricevuto e relativo parametro. Ci saranno delle azioni solo se il comando ricevuto o il parametro è cambiato rispetto al precedente
00032 char cOldCommandBLE;
00033 int nOldParamBLE; 
00034 
00035  // indice per i cicli
00036 int nIndex;
00037 
00038 // esponente della base 10, per cui bisognerà moltiplicare i caratteri per trasformarli in numeri
00039 double fEsponente;
00040 
00041 // array per la ricezione dei messaggi da BLE
00042 volatile char caRxPacket[PACKETDIM]; 
00043 // contatore di caratteri ricevuti daBLE
00044 volatile int nCharCount; 
00045 
00046 // flag che indica se il sw è in Reset
00047 volatile bool bReset;
00048 
00049 /**************************************************************************************/
00050 /* Routine di gestione Interrupt associata al fronte di salita del segnale di encoder */
00051 /**************************************************************************************/
00052 
00053 /**********************************************/
00054 //          IRQ associata a Rx da PC 
00055 //**********************************************/
00056 void pcRxInterrupt(void)
00057 {
00058     // array per la ricezione dei messaggi da seriale
00059     char cReadChar; 
00060     
00061     // ricevi caratteri su seriale, se disponibili   
00062     while((pc.readable()))
00063     {
00064         // acquisice stringa in input e relativa dimensione
00065         cReadChar = pc.getc(); // read character from PC
00066         //myBLE.putc(cReadChar); // Diagnostica: write char to BLE
00067         //pc.putc(cReadChar); // Diagnostica: write char to PC
00068         
00069         //pc.printf("W>: 0x%02x\n\r",cReadChar); // diagnostica
00070        /* if(cReadChar == '0') // se scrivo '0', invia questa stringa
00071         {
00072             // DIAGNOSTICA:
00073             // Invia Stringa di comando al Robot
00074             myBLE.printf("\r\n> Prova di Trasmissione \r\n");
00075          }*/
00076     }
00077 }
00078 
00079 //**********************************************/
00080 //          IRQ associata a Rx da BLE 
00081 //**********************************************/
00082 void BLERxInterrupt(void)
00083 {
00084     
00085     // carattere ricevuto da BLE
00086     char cReadChar; 
00087     
00088     while((myBLE.readable()))
00089     {
00090         // acquisice stringa in input e memorizza in array
00091         cReadChar = myBLE.getc(); // Read character
00092         //caRxPacket[nCharCount]=cReadChar;
00093         //nCharCount++;
00094        // pc.printf("%c", cReadChar); // diagnostica
00095         
00096         // acquisisce il carattere di start comando o coordinate da APP
00097         if(cReadChar=='(')
00098         {
00099             // acquisisce il primo carattere di comando o di coordinate
00100             cReadChar = myBLE.getc(); // Read character       
00101            // pc.printf("%c", cReadChar); // diagnostica 
00102             
00103             // +++++++++++++++++ INIZIO gestione Comando da Button +++++++++++++++++
00104             // Ho ricevuto il comando da un Button se il primo carattere è una lettera maiuscola tra A e T
00105             if((cReadChar > 0x40) && (cReadChar < 0x55)) // caratteri alfabetici da 'A' a 'T'
00106             {
00107                 // memorizza come comando il carattere appena letto
00108                 cCommandBLE = cReadChar; 
00109                 // legge e memorizza come paramentro il successivo carattere
00110                 cReadChar = myBLE.getc(); // legge parametro
00111               //  pc.printf("%c", cReadChar); // diagnostica 
00112                 nParamBLE = cReadChar-0x30;
00113                 cReadChar = myBLE.getc(); // legge la ')' di chiusura comando       
00114                 //pc.printf("%c", cReadChar); // diagnostica 
00115 
00116                 // visualizza comando e parametro inviato da BLE
00117                // pc.printf("> %c%d \r\n\r",cCommandBLE, nParamBLE); // diagnostica
00118                 if(cReadChar==')') 
00119                     {
00120                         //pc.printf("(fX , fY) = (%.1f , %.1f) \r\n", fX, fY); // diagnostica
00121                     }
00122                     else // dopo la Y e i numeri, mi attendo parentesi chiusa )
00123                     {
00124                         pc.printf("> Errore = %c invece di ) \r\n\n", cReadChar); // diagnostica
00125                     }
00126             }
00127             // +++++++++++++++++ FINE gestione Comando da Button +++++++++++++++++
00128         } // if(cReadChar == '(')
00129     }// chiude il while
00130 }
00131 
00132 
00133 
00134 
00135 /*********************************************************************************************************************************************/
00136 /* ogni DELTAT secondi scatta questo ticker.                                                                                                 */
00137 /* Tra due Tick viene contato il numero di mpulsi impulsi di encoder ricevuti con degli interrupt e contentuo nella variabile nCountRiseEdge */
00138 /*********************************************************************************************************************************************/
00139 
00140 /**********/
00141 /*  MAIN  */
00142 /**********/
00143 int main()
00144 {    
00145     // messaggio di benvenuto
00146     pc.printf("\r\n************  CLM ****************** \r\n");
00147     pc.printf("*** Campanella Amaldi ***\r\n");
00148     myBLE.printf("***W Campanella Amaldi ***\r\n");
00149     
00150     // inizializza variabili da BLE
00151     cCommandBLE = 0; // inizialmente nessun comando da BLE
00152     cOldCommandBLE = 0; // inizialmente nessun comando da BLE
00153     cParamBLE = 0;  // inizialmente nessun parametro da BLE
00154     nParamBLE=0;    // inizialmente nessun parametro da BLE
00155     nOldParamBLE=0; // inizialmente nessun parametro da BLE
00156     bReset = false; //bReset = true/false quando riceve un comando (R1)/(R0) dalla APP
00157     
00158     // inizializza array di caratteri ricevuti
00159     for(nIndex=0; nIndex < PACKETDIM; nIndex++)
00160      {caRxPacket[nIndex]=0;}
00161     nCharCount=0;                   
00162      
00163     //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
00164     //++++++++++++++ INIZIO Ciclo Principale +++++++++++++++++++    
00165     //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
00166         
00167     while(true)
00168     {
00169     
00170         //++++++++++++++++++++++++++ INIZIO Interpreta Comandi da Pulsanti della APP ++++++++++++++++++++++++++++++++++++++++++++
00171                
00172         if((cCommandBLE != cOldCommandBLE) || (nParamBLE != nOldParamBLE))
00173         {
00174             switch (cCommandBLE)
00175             { 
00176                 case 'A': // entrata
00177                 { 
00178                     if(nParamBLE==1)
00179                     {
00180                         myBLE.printf("Entrate\n\r"); 
00181                     }
00182                     else
00183                     {
00184                     }  
00185                 } break;
00186                 case 'B': // Cambio
00187                 {   
00188                     if(nParamBLE==1)
00189                     {
00190                         pc.printf("Cambio\n\r"); 
00191                     }
00192                     else
00193                     {
00194                     }  
00195                 } break;
00196                 case 'C': // Uscita
00197                 {    
00198                     if(nParamBLE==1)
00199                     {
00200                         pc.printf("Uscite\n\r"); 
00201                     }
00202                     else
00203                     {
00204                     }  
00205                 } break;
00206                 
00207                 default: break;
00208             }
00209             //pc.printf("Comando = %c, Parametro = %d \r\n", cCommandBLE, nParamBLE); // diagnostica
00210             cOldCommandBLE = cCommandBLE;
00211             nOldParamBLE = nParamBLE;
00212         }
00213         
00214         //++++++++++++++++++++++++++++++++++++++++++++ FINE Interpreta Comandi da Pulsanti della APP ++++++++++++++++++++++++++++++++++++++++++++++++++++++
00215     } //while (true) Ciclo principale
00216     
00217     //++++++++++++++++++++++++++++++++++++++++++++++++++++++++
00218     //++++++++++++++ FINE Ciclo Principale  +++++++++++++++++++    
00219     //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
00220     
00221 } // main()