Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
MicRobot-Rev07_FUNZIONA.cpp@10:e38bc98718cc, 2020-02-07 (annotated)
- Committer:
- francesco01
- Date:
- Fri Feb 07 17:47:15 2020 +0000
- Revision:
- 10:e38bc98718cc
- Parent:
- 9:2199376bbdd9
- Child:
- 11:da53d3e94a41
robot funziona
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| pinofal | 8:30ff29b4542e | 1 | // pilotaggio carrello tramite BLE. | 
| pinofal | 8:30ff29b4542e | 2 | // testato su L476RG e F401RE | 
| pinofal | 8:30ff29b4542e | 3 | |
| pinofal | 8:30ff29b4542e | 4 | #include "mbed.h" | 
| pinofal | 8:30ff29b4542e | 5 | #include<stdlib.h> | 
| pinofal | 8:30ff29b4542e | 6 | |
| francesco01 | 9:2199376bbdd9 | 7 | |
| pinofal | 8:30ff29b4542e | 8 | // attivare questa #define quando si vuole simulare l'arrivo di un segnale di encoder dai motori in movimento | 
| pinofal | 8:30ff29b4542e | 9 | //#define ENCODERSIMULATE | 
| pinofal | 8:30ff29b4542e | 10 | |
| pinofal | 8:30ff29b4542e | 11 | // pi greco | 
| pinofal | 8:30ff29b4542e | 12 | #define PI 3.14159265358979323846 | 
| pinofal | 8:30ff29b4542e | 13 | |
| pinofal | 8:30ff29b4542e | 14 | // dimensione massima del pacchetto ricevuto su seriale | 
| pinofal | 8:30ff29b4542e | 15 | #define PACKETDIM 8 | 
| pinofal | 8:30ff29b4542e | 16 | |
| pinofal | 8:30ff29b4542e | 17 | // diametro della ruota in [metri] | 
| pinofal | 8:30ff29b4542e | 18 | #define DIAMETRORUOTA (0.1) | 
| pinofal | 8:30ff29b4542e | 19 | |
| pinofal | 8:30ff29b4542e | 20 | // numero di impulsi per giro generati dall'encoder | 
| pinofal | 8:30ff29b4542e | 21 | #define IMPULSIPERGIRO 4 | 
| pinofal | 8:30ff29b4542e | 22 | |
| pinofal | 8:30ff29b4542e | 23 | // numero di cifre con cui si vuole rappresentare la distanza percorsa in [m]. NUMCIFREDISTANZAPERCORSA = 5, significa che la distanza è rappresentata come xxx.xx [m] | 
| pinofal | 8:30ff29b4542e | 24 | #define NUMCIFREDISTANZAPERCORSA 7 | 
| pinofal | 8:30ff29b4542e | 25 | |
| pinofal | 8:30ff29b4542e | 26 | // numero di cifre con cui si vuole rappresentare la velocità in [m/s]. NUMCIFRESPEED = 5, significa che la velocità è rappresentata come xxx.xx [m/s] | 
| pinofal | 8:30ff29b4542e | 27 | #define NUMCIFRESPEED 7 | 
| pinofal | 8:30ff29b4542e | 28 | |
| pinofal | 8:30ff29b4542e | 29 | // intervallo di tempo in [sec], in cui vengono contati gli impulsi di encoder per il calcolo della velocità | 
| pinofal | 8:30ff29b4542e | 30 | #define DELTAT (0.5) | 
| pinofal | 8:30ff29b4542e | 31 | |
| pinofal | 8:30ff29b4542e | 32 | |
| pinofal | 8:30ff29b4542e | 33 | // Parametri moltiplicativi. Queste operazioni vengono fatte una sola volta, evitando di farle ad ogni ciclo | 
| pinofal | 8:30ff29b4542e | 34 | #define fDistanzaPerStep (PI*DIAMETRORUOTA/IMPULSIPERGIRO) | 
| pinofal | 8:30ff29b4542e | 35 | |
| pinofal | 8:30ff29b4542e | 36 | |
| pinofal | 8:30ff29b4542e | 37 | // Ogni Ticker viene calcolata la velocità. Se il ticker viene richiamato ogni DELTAT sec, la velocità potrà essere calcolata come v = spazio/DELTAT | 
| pinofal | 8:30ff29b4542e | 38 | Ticker SpeedCalculateTicker; | 
| pinofal | 8:30ff29b4542e | 39 | |
| pinofal | 8:30ff29b4542e | 40 | //!!!!!!!!!!!!!!!!!!! INIZIO COMMENTARE QUESTA FUNZIONE DURANTE IL NORMALE FUNZIONAMENTO CON ROBOT IN MOVIMENTO. UTILIZZO PER DIAGNOSTICA !!!!!!!!!!!!!!!! | 
| pinofal | 8:30ff29b4542e | 41 | #ifdef ENCODERSIMULATE | 
| pinofal | 8:30ff29b4542e | 42 | Ticker EncoderSimulateTicker; // Ticker per simulare un segnale proveniente da encoder sul motore | 
| pinofal | 8:30ff29b4542e | 43 | #endif | 
| pinofal | 8:30ff29b4542e | 44 | //!!!!!!!!!!!!!!!!!!! FINE COMMENTARE QUESTA FUNZIONE DURANTE IL NORMALE FUNZIONAMENTO CON ROBOT IN MOVIMENTO. UTILIZZO PER DIAGNOSTICA !!!!!!!!!!!!!!!! | 
| pinofal | 8:30ff29b4542e | 45 | |
| pinofal | 8:30ff29b4542e | 46 | // Definizione periferica USB seriale del PC | 
| pinofal | 8:30ff29b4542e | 47 | Serial pc(USBTX, USBRX, 921600); // seriale di comunicazione con il PC. Associati a PA_11 e PA_12 | 
| pinofal | 8:30ff29b4542e | 48 | |
| pinofal | 8:30ff29b4542e | 49 | // Definizione periferica seriale del Modulo BLE ELETT114A | 
| pinofal | 8:30ff29b4542e | 50 | Serial myBLE(PA_9, PA_10, 9600); //Tx, Rx, bps | 
| pinofal | 8:30ff29b4542e | 51 | |
| francesco01 | 10:e38bc98718cc | 52 | |
| pinofal | 8:30ff29b4542e | 53 | // Input di Reset per il Modulo BLE HC-05 | 
| pinofal | 8:30ff29b4542e | 54 | DigitalOut BleRst(PA_8); | 
| pinofal | 8:30ff29b4542e | 55 | |
| pinofal | 8:30ff29b4542e | 56 | // User Button, LED | 
| pinofal | 8:30ff29b4542e | 57 | DigitalIn myButton(USER_BUTTON); // pulsante Blu sulla scheda. Associato a PC_13 | 
| pinofal | 8:30ff29b4542e | 58 | DigitalOut myLed(LED2); // LED verde sulla scheda. Associato a PA_5 | 
| pinofal | 8:30ff29b4542e | 59 | |
| pinofal | 8:30ff29b4542e | 60 | // output digitale per pilotaggio illuminazione a LED | 
| pinofal | 8:30ff29b4542e | 61 | DigitalOut Light(PA_0); | 
| pinofal | 8:30ff29b4542e | 62 | //DigitalIn InDiag(PC_0,PullUp); // Di Default è a Vcc. Può essere collegato a GND con un ponticello su CN10 pin18-pin20 | 
| pinofal | 8:30ff29b4542e | 63 | InterruptIn InEncoderA(PC_0); // segnale di encoder di un motore. | 
| pinofal | 8:30ff29b4542e | 64 | |
| pinofal | 8:30ff29b4542e | 65 | // variabile che conta il numero di fronti si salita del segnale encoder di uno dei motori del robot | 
| pinofal | 8:30ff29b4542e | 66 | volatile int nCountRiseEdge; | 
| pinofal | 8:30ff29b4542e | 67 | volatile int nOldCountRiseEdge; | 
| pinofal | 8:30ff29b4542e | 68 | |
| pinofal | 8:30ff29b4542e | 69 | // Input/Output | 
| pinofal | 8:30ff29b4542e | 70 | DigitalOut PostOutBI1 (PA_6); // Output 1 per pilotaggio input BI1 del Motore B Posteriore | 
| pinofal | 8:30ff29b4542e | 71 | PwmOut PostOutPWB (PB_6); // Output per pilotaggio input PWM del motore B Posteriore | 
| pinofal | 8:30ff29b4542e | 72 | //DigitalOut PostOutPWB (PA_7); // Scopi Diagnostici: Output Digitale per pilotaggio PWM del motore B Posteriore | 
| pinofal | 8:30ff29b4542e | 73 | DigitalOut PostOutBI2 (PA_7); // Output 2 per pilotaggio input BI2 del Motore B Posteriore | 
| pinofal | 8:30ff29b4542e | 74 | DigitalIn PostInNE1 (PC_7); // Input per acquisire i segnali NET1 in output dall'encoder Posteriore | 
| pinofal | 8:30ff29b4542e | 75 | |
| francesco01 | 9:2199376bbdd9 | 76 | DigitalOut AntOutBI1 (PB_3); // Output 1 per pilotaggio input BI1 del Motore B Anteriore | 
| pinofal | 8:30ff29b4542e | 77 | PwmOut AntOutPWB (PB_5); // Output per pilotaggio input PWM del motore B Anteriore | 
| pinofal | 8:30ff29b4542e | 78 | //DigitalOut AntOutPWB (PB_5); // Scopi diagnostici: Output Digitalte per pilotaggio PWM del motore B Anteriore | 
| francesco01 | 9:2199376bbdd9 | 79 | DigitalOut AntOutBI2 (PB_4); // Output 2 per pilotaggio input BI2 del Motore B Posteriore | 
| pinofal | 8:30ff29b4542e | 80 | DigitalIn AntInNE1 (PB_10); // Input per acquisire i segnali NET1 in output dall'encoder Anteriore | 
| pinofal | 8:30ff29b4542e | 81 | |
| francesco01 | 9:2199376bbdd9 | 82 | PwmOut MotoreCoda (PB_8); // Output movimento coda | 
| pinofal | 8:30ff29b4542e | 83 | |
| pinofal | 8:30ff29b4542e | 84 | //carattere di comando ricevuto dal BLE e relativo parametro | 
| pinofal | 8:30ff29b4542e | 85 | volatile char cCommandBLE; // cambia nella routine di interrupt | 
| pinofal | 8:30ff29b4542e | 86 | volatile char cParamBLE; // cambia nella routine di interrupt | 
| pinofal | 8:30ff29b4542e | 87 | volatile int nParamBLE; // corrispondente valore numerico di cParamBLE | 
| pinofal | 8:30ff29b4542e | 88 | |
| pinofal | 8:30ff29b4542e | 89 | // memorizza l'ultimo comando ricevuto e relativo parametro. Ci saranno delle azioni solo se il comando ricevuto o il parametro è cambiato rispetto al precedente | 
| pinofal | 8:30ff29b4542e | 90 | char cOldCommandBLE; | 
| pinofal | 8:30ff29b4542e | 91 | int nOldParamBLE; | 
| pinofal | 8:30ff29b4542e | 92 | |
| pinofal | 8:30ff29b4542e | 93 | // coordinate polari del joystick sulla APP, fornite dalla routine di interrupt | 
| pinofal | 8:30ff29b4542e | 94 | volatile double fTeta; | 
| pinofal | 8:30ff29b4542e | 95 | volatile double fRo; | 
| pinofal | 8:30ff29b4542e | 96 | volatile int nRo; | 
| pinofal | 8:30ff29b4542e | 97 | volatile int nTeta; | 
| pinofal | 8:30ff29b4542e | 98 | |
| pinofal | 8:30ff29b4542e | 99 | // coordinate cartesiane della posizione joystick sulla APP, fornite dalla routine di Interrupt | 
| pinofal | 8:30ff29b4542e | 100 | volatile double fX, fY; | 
| pinofal | 8:30ff29b4542e | 101 | // memorizza ultimi valori delle coordinate del Joystick | 
| pinofal | 8:30ff29b4542e | 102 | double fOldX, fOldY; | 
| pinofal | 8:30ff29b4542e | 103 | |
| pinofal | 8:30ff29b4542e | 104 | // variabili ausiliarie per l'algoritmo di posizionamento | 
| pinofal | 8:30ff29b4542e | 105 | double fV, fW; | 
| pinofal | 8:30ff29b4542e | 106 | |
| pinofal | 8:30ff29b4542e | 107 | // velocità della ruota sinistra e della ruota destra. La Sinistra coincide con la ruota Anteriore, la destra con la Posteriore | 
| pinofal | 8:30ff29b4542e | 108 | double fR, fL; | 
| pinofal | 8:30ff29b4542e | 109 | |
| pinofal | 8:30ff29b4542e | 110 | // distanza percorsa in [m], calcolata utilizzando gli impulsi dell'encoder sul motore | 
| pinofal | 8:30ff29b4542e | 111 | volatile double fDistanzaPercorsa; // calcolata nel main, utilizzata nelle IRQ | 
| pinofal | 8:30ff29b4542e | 112 | |
| pinofal | 8:30ff29b4542e | 113 | // velocità calcolata gli impulsi contati in un intervallo DELTAT msec | 
| pinofal | 8:30ff29b4542e | 114 | volatile double fSpeed; // calcolata nel main, utilizzata nelle IRQ | 
| pinofal | 8:30ff29b4542e | 115 | |
| pinofal | 8:30ff29b4542e | 116 | // Scopi diagnostici: Ogni fDeltaTick viene simulata la generazione di un impulso di encoder. | 
| pinofal | 8:30ff29b4542e | 117 | // velocità = ( (DIAMETRO*PI) / IMPULSIPERGIRO )/ fDeltaTick [m/s] | 
| pinofal | 8:30ff29b4542e | 118 | double fDeltaTick; | 
| pinofal | 8:30ff29b4542e | 119 | |
| pinofal | 8:30ff29b4542e | 120 | // distanza percorsa e relativo indice, calcolata in [m] e trasformata in caratteri | centinaia di [m] | decine di [m] | [m] | decimi di [m] | centesimi di [m] | 
| pinofal | 8:30ff29b4542e | 121 | //char caDistanzaPercorsa[NUMCIFREDISTANZAPERCORSA]; | 
| pinofal | 8:30ff29b4542e | 122 | //int nIndexDistanzaPercorsa; | 
| pinofal | 8:30ff29b4542e | 123 | |
| pinofal | 8:30ff29b4542e | 124 | |
| pinofal | 8:30ff29b4542e | 125 | |
| pinofal | 8:30ff29b4542e | 126 | // arrayA e arrayB per la ricezione dei messaggi da BLE e per l'elaborazione nel Main | 
| pinofal | 8:30ff29b4542e | 127 | char volatile caRxPacketA[PACKETDIM]; // variabile che viene modificata e aggiornata nella IRQ della BLE | 
| pinofal | 8:30ff29b4542e | 128 | char volatile caRxPacketB[PACKETDIM]; // variabile che viene modificata e aggiornata nella IRQ della BLE | 
| pinofal | 8:30ff29b4542e | 129 | |
| pinofal | 8:30ff29b4542e | 130 | |
| pinofal | 8:30ff29b4542e | 131 | //indice e contatore di caratteri ricevuti da BLE | 
| pinofal | 8:30ff29b4542e | 132 | volatile int nCharCountA; // variabile che viene modificata e aggiornata nella IRQ della BLE | 
| pinofal | 8:30ff29b4542e | 133 | |
| pinofal | 8:30ff29b4542e | 134 | volatile int nCharCountB; // variabile che viene modificata e aggiornata nella IRQ della BLE | 
| pinofal | 8:30ff29b4542e | 135 | |
| pinofal | 8:30ff29b4542e | 136 | |
| pinofal | 8:30ff29b4542e | 137 | // cTrafficLight = 'A' -> IRQ acquisisce pacchetto joystick su arrayA e MAIN elabora su arrayB | 
| pinofal | 8:30ff29b4542e | 138 | // cTrafficLight = 'B' -> IRQ acquisisce pacchetto joystick su arrayB e MAIN elabora su arrayA | 
| pinofal | 8:30ff29b4542e | 139 | // ASSUNZIONE: Main elabora un pacchetto in tempo minore alla ricezione del pacchetto successivo | 
| pinofal | 8:30ff29b4542e | 140 | volatile char cTrafficLight; // IRQ decide se passare su un array o l'altro in base ai delimitatori di pacchetto. | 
| pinofal | 8:30ff29b4542e | 141 | char cOldTrafficLight; // variabile che viene utilizzata e aggiornata nel MAIN | 
| pinofal | 8:30ff29b4542e | 142 | |
| pinofal | 8:30ff29b4542e | 143 | |
| pinofal | 8:30ff29b4542e | 144 | // indice per i cicli | 
| pinofal | 8:30ff29b4542e | 145 | int nIndex; | 
| pinofal | 8:30ff29b4542e | 146 | |
| pinofal | 8:30ff29b4542e | 147 | |
| pinofal | 8:30ff29b4542e | 148 | // esponente della base 10, per cui bisognerà moltiplicare i caratteri per trasformarli in numeri | 
| pinofal | 8:30ff29b4542e | 149 | double fEsponente; | 
| pinofal | 8:30ff29b4542e | 150 | |
| pinofal | 8:30ff29b4542e | 151 | // variabile per estrarre le cifre della distanza percorsa. La distanza Percorsa viene calcolata nel MAIN con la varibile fDistanzaPercorsa | 
| pinofal | 8:30ff29b4542e | 152 | //int nDistanzaPercorsa; | 
| pinofal | 8:30ff29b4542e | 153 | // distanza percorsa in [m], divisa in caratteri in caratteri e relativo indice | centinaia di [m] | decine di [m] | [m] | decimi di [m] | centesimi di [m] | 
| pinofal | 8:30ff29b4542e | 154 | //char caDistanzaPercorsa[NUMCIFREDISTANZAPERCORSA]; | 
| pinofal | 8:30ff29b4542e | 155 | //int nIndexDistanzaPercorsa; | 
| pinofal | 8:30ff29b4542e | 156 | |
| pinofal | 8:30ff29b4542e | 157 | // variabile per estrarre le cifre della velocità di percorrenza. La velocità viene calcolata nel MAIN con la varibile fSpeed | 
| pinofal | 8:30ff29b4542e | 158 | //int nSpeed; | 
| pinofal | 8:30ff29b4542e | 159 | // distanza percorsa in [m], divisa in caratteri in caratteri e relativo indice | centinaia di [m] | decine di [m] | [m] | decimi di [m] | centesimi di [m] | 
| pinofal | 8:30ff29b4542e | 160 | //char caSpeed[NUMCIFRESPEED]; | 
| pinofal | 8:30ff29b4542e | 161 | //int nIndexSpeed; | 
| pinofal | 8:30ff29b4542e | 162 | |
| pinofal | 8:30ff29b4542e | 163 | // variabili di calcolo. Vengono calcolate una sola volta per evitare di fare operazioni in ogni ciclo | 
| pinofal | 8:30ff29b4542e | 164 | //float fDistanzaPerStep_mm; // distanza in millimetri, per ogni step del motore | 
| pinofal | 8:30ff29b4542e | 165 | //float fDistanzaPerStep_m; // distanza in metri, per ogni step del motore | 
| pinofal | 8:30ff29b4542e | 166 | |
| pinofal | 8:30ff29b4542e | 167 | |
| pinofal | 8:30ff29b4542e | 168 | // array per la ricezione dei messaggi da BLE | 
| pinofal | 8:30ff29b4542e | 169 | volatile char caRxPacket[PACKETDIM]; | 
| pinofal | 8:30ff29b4542e | 170 | // contatore di caratteri ricevuti daBLE | 
| pinofal | 8:30ff29b4542e | 171 | volatile int nCharCount; | 
| pinofal | 8:30ff29b4542e | 172 | |
| pinofal | 8:30ff29b4542e | 173 | /**************************************************************************************/ | 
| pinofal | 8:30ff29b4542e | 174 | /* Routine di gestione Interrupt associata al fronte di salita del segnale di encoder */ | 
| pinofal | 8:30ff29b4542e | 175 | /**************************************************************************************/ | 
| pinofal | 8:30ff29b4542e | 176 | void riseEncoderIRQ() | 
| pinofal | 8:30ff29b4542e | 177 | { | 
| pinofal | 8:30ff29b4542e | 178 | // incrementa il contatore di impulsi contati | 
| pinofal | 8:30ff29b4542e | 179 | nCountRiseEdge++; | 
| pinofal | 8:30ff29b4542e | 180 | } | 
| pinofal | 8:30ff29b4542e | 181 | |
| pinofal | 8:30ff29b4542e | 182 | |
| pinofal | 8:30ff29b4542e | 183 | /****************************************************************************************/ | 
| pinofal | 8:30ff29b4542e | 184 | /* Diagnostica: */ | 
| pinofal | 8:30ff29b4542e | 185 | /* COMMENTARE QUESTA FUNZIONE DURANTE IL NORMALE FUNZIONAMENTO CON ROBOT IN MOVIMENTO */ | 
| pinofal | 8:30ff29b4542e | 186 | /* Routine di gestione del ticker per simulare encoder */ | 
| pinofal | 8:30ff29b4542e | 187 | /* Simula il segnale di encoder ricevuto con un determinato DELTAT */ | 
| pinofal | 8:30ff29b4542e | 188 | /* A robot fermo, il segnale di encoder non genera interrupt. */ | 
| pinofal | 8:30ff29b4542e | 189 | /* Questo Ticker simula l'arrivo del segnale da encoder */ | 
| pinofal | 8:30ff29b4542e | 190 | /****************************************************************************************/ | 
| pinofal | 8:30ff29b4542e | 191 | void EncoderSimulate() | 
| pinofal | 8:30ff29b4542e | 192 | { | 
| pinofal | 8:30ff29b4542e | 193 | // ad ogni tick viene simulata la ricezione di un impulso da encoder. | 
| pinofal | 8:30ff29b4542e | 194 | // Esempio: | 
| pinofal | 8:30ff29b4542e | 195 | // fDeltaTick = 0.05 sec | 
| pinofal | 8:30ff29b4542e | 196 | // diametro ruota, DIAMETRORUOTA = 0.1 metri | 
| pinofal | 8:30ff29b4542e | 197 | // circonferenza ruota = 0.1*3.14= 0.314 metri | 
| pinofal | 8:30ff29b4542e | 198 | // impulsi per giro dall'encoder, IMPULSIPERGIRO = 4 | 
| pinofal | 8:30ff29b4542e | 199 | // un tick simula l'arrivo di un impulso da encoder e quindi simula la percorrenza di 1/4 di circonferenza | 
| pinofal | 8:30ff29b4542e | 200 | // ogni volta che arriva un tick simulato da encoder, si presume di aver percorso circonferenza/4 = 0.314/4 = 0.0785 metri | 
| pinofal | 8:30ff29b4542e | 201 | // il tick arriva ogni fDeltaTick secondi e a ogni tick percorro 0.0785 metri -> velocità = 0.0785/0.05 = 1.57 [m/s] | 
| pinofal | 8:30ff29b4542e | 202 | // spostamento = (Spazio per ogni tick)/(tempo per ogni tick) | 
| pinofal | 8:30ff29b4542e | 203 | // velocità = ( (DIAMTERO*PI) / IMPULSIPERGIRO )/ fDeltaTick [m/s] | 
| pinofal | 8:30ff29b4542e | 204 | |
| pinofal | 8:30ff29b4542e | 205 | // simula impulso inviato dall'encoder | 
| pinofal | 8:30ff29b4542e | 206 | nCountRiseEdge++; | 
| pinofal | 8:30ff29b4542e | 207 | } | 
| pinofal | 8:30ff29b4542e | 208 | |
| pinofal | 8:30ff29b4542e | 209 | /*********************************************************************************************************************************************/ | 
| pinofal | 8:30ff29b4542e | 210 | /* ogni DELTAT secondi scatta questo ticker. */ | 
| pinofal | 8:30ff29b4542e | 211 | /* Tra due Tick viene contato il numero di mpulsi impulsi di encoder ricevuti con degli interrupt e contentuo nella variabile nCountRiseEdge */ | 
| pinofal | 8:30ff29b4542e | 212 | /*********************************************************************************************************************************************/ | 
| pinofal | 8:30ff29b4542e | 213 | void SpeedCalculate() | 
| pinofal | 8:30ff29b4542e | 214 | { | 
| pinofal | 8:30ff29b4542e | 215 | //+++++++++++++++++++++++++ INIZIO Calcola spostamento odometrico e velocità +++++++++++++++++++++++++++++++++++++++++++ | 
| pinofal | 8:30ff29b4542e | 216 | //nCountRiseEdge++; //----diagnostica | 
| pinofal | 8:30ff29b4542e | 217 | // se nella IRQ, durante il periodo di calcolo della velocità, sono stati contati fronti di salita dell'encoder, il robot si sta muovendo | 
| pinofal | 8:30ff29b4542e | 218 | if(nCountRiseEdge != nOldCountRiseEdge) // se c'è stata una variazione di conteggio impulsi, il robot si sta muovendo | 
| pinofal | 8:30ff29b4542e | 219 | { | 
| pinofal | 8:30ff29b4542e | 220 | // Distanza Persorsa[metri] = ( (circonferenza ruota)/(numero impulsi per giro) ) * (Numero di Impulsi contati) | 
| pinofal | 8:30ff29b4542e | 221 | fDistanzaPercorsa = fDistanzaPerStep*nCountRiseEdge; | 
| pinofal | 8:30ff29b4542e | 222 | |
| pinofal | 8:30ff29b4542e | 223 | // calcola la velocità in [m/sec]. DELTAT è in [sec] lo spostamento è in [m] | 
| pinofal | 8:30ff29b4542e | 224 | //fSpeed = float((PI*DIAMETRORUOTA/IMPULSIPERGIRO)*(nCountRiseEdge-nOldCountRiseEdge))/DELTAT); | 
| pinofal | 8:30ff29b4542e | 225 | fSpeed = (fDistanzaPerStep*(nCountRiseEdge-nOldCountRiseEdge))/DELTAT; | 
| pinofal | 8:30ff29b4542e | 226 | |
| pinofal | 8:30ff29b4542e | 227 | // ricorda lo spostamento | 
| pinofal | 8:30ff29b4542e | 228 | nOldCountRiseEdge = nCountRiseEdge; | 
| pinofal | 8:30ff29b4542e | 229 | |
| pinofal | 8:30ff29b4542e | 230 | // comunica al cellulare vleocità e spostamento mentre si sta spostando | 
| pinofal | 8:30ff29b4542e | 231 | myBLE.printf("Speed= %.2f [m/s]; Trip= %.2f [m]\n\r",fSpeed, fDistanzaPercorsa ); | 
| pinofal | 8:30ff29b4542e | 232 | |
| pinofal | 8:30ff29b4542e | 233 | } | 
| pinofal | 8:30ff29b4542e | 234 | //myBLE.printf("Speed= %.2f [m/s]; Trip= %.2f [m]\n\r",fSpeed, fDistanzaPercorsa ); // diagnostica | 
| pinofal | 8:30ff29b4542e | 235 | |
| pinofal | 8:30ff29b4542e | 236 | //++++++++++++++++++++++++++ FINE Calcola spostamento odometrico e velocità +++++++++++++++++++++++++++++++++++++++++++++ | 
| pinofal | 8:30ff29b4542e | 237 | } | 
| pinofal | 8:30ff29b4542e | 238 | |
| pinofal | 8:30ff29b4542e | 239 | /**********************************************/ | 
| pinofal | 8:30ff29b4542e | 240 | // IRQ associata a Rx da PC | 
| pinofal | 8:30ff29b4542e | 241 | //**********************************************/ | 
| pinofal | 8:30ff29b4542e | 242 | void pcRxInterrupt(void) | 
| pinofal | 8:30ff29b4542e | 243 | { | 
| pinofal | 8:30ff29b4542e | 244 | // array per la ricezione dei messaggi da seriale | 
| pinofal | 8:30ff29b4542e | 245 | char cReadChar; | 
| pinofal | 8:30ff29b4542e | 246 | |
| pinofal | 8:30ff29b4542e | 247 | // ricevi caratteri su seriale, se disponibili | 
| pinofal | 8:30ff29b4542e | 248 | while((pc.readable())) | 
| pinofal | 8:30ff29b4542e | 249 | { | 
| pinofal | 8:30ff29b4542e | 250 | // acquisice stringa in input e relativa dimensione | 
| pinofal | 8:30ff29b4542e | 251 | cReadChar = pc.getc(); // read character from PC | 
| pinofal | 8:30ff29b4542e | 252 | //myBLE.putc(cReadChar); // Diagnostica: write char to BLE | 
| pinofal | 8:30ff29b4542e | 253 | //pc.putc(cReadChar); // Diagnostica: write char to PC | 
| pinofal | 8:30ff29b4542e | 254 | |
| pinofal | 8:30ff29b4542e | 255 | //pc.printf("W>: 0x%02x\n\r",cReadChar); // diagnostica | 
| pinofal | 8:30ff29b4542e | 256 | if(cReadChar == '0') // se scrivo '0', invia questa stringa | 
| pinofal | 8:30ff29b4542e | 257 | { | 
| pinofal | 8:30ff29b4542e | 258 | // DIAGNOSTICA: | 
| pinofal | 8:30ff29b4542e | 259 | // Invia Stringa di comando al Robot | 
| pinofal | 8:30ff29b4542e | 260 | myBLE.printf("\r\n> PROVA \r\n"); | 
| pinofal | 8:30ff29b4542e | 261 | } | 
| pinofal | 8:30ff29b4542e | 262 | } | 
| pinofal | 8:30ff29b4542e | 263 | } | 
| pinofal | 8:30ff29b4542e | 264 | |
| pinofal | 8:30ff29b4542e | 265 | //**********************************************/ | 
| pinofal | 8:30ff29b4542e | 266 | // IRQ associata a Rx da BLE | 
| pinofal | 8:30ff29b4542e | 267 | //**********************************************/ | 
| pinofal | 8:30ff29b4542e | 268 | void BLERxInterrupt(void) | 
| pinofal | 8:30ff29b4542e | 269 | { | 
| pinofal | 8:30ff29b4542e | 270 | |
| pinofal | 8:30ff29b4542e | 271 | // carattere ricevuto da BLE | 
| pinofal | 8:30ff29b4542e | 272 | char cReadChar; | 
| pinofal | 8:30ff29b4542e | 273 | |
| pinofal | 8:30ff29b4542e | 274 | // indice per l'array di caratteri ricevuti | 
| pinofal | 8:30ff29b4542e | 275 | int nCharIndex; | 
| pinofal | 8:30ff29b4542e | 276 | |
| pinofal | 8:30ff29b4542e | 277 | |
| pinofal | 8:30ff29b4542e | 278 | |
| pinofal | 8:30ff29b4542e | 279 | while((myBLE.readable())) | 
| pinofal | 8:30ff29b4542e | 280 | { | 
| pinofal | 8:30ff29b4542e | 281 | // acquisice stringa in input e memorizza in array | 
| pinofal | 8:30ff29b4542e | 282 | cReadChar = myBLE.getc(); // Read character | 
| pinofal | 8:30ff29b4542e | 283 | caRxPacket[nCharCount]=cReadChar; | 
| pinofal | 8:30ff29b4542e | 284 | nCharCount++; | 
| pinofal | 8:30ff29b4542e | 285 | //pc.printf("%c", cReadChar); // diagnostica | 
| pinofal | 8:30ff29b4542e | 286 | |
| pinofal | 8:30ff29b4542e | 287 | if(cReadChar==')') | 
| pinofal | 8:30ff29b4542e | 288 | { | 
| pinofal | 8:30ff29b4542e | 289 | //pc.printf("\r\n"); // diagnostica | 
| pinofal | 8:30ff29b4542e | 290 | |
| pinofal | 8:30ff29b4542e | 291 | // +++++++++++++++++ INIZIO gestione Comando da Button +++++++++++++++++ | 
| pinofal | 8:30ff29b4542e | 292 | // Ho ricevuto il comando da un Button se il carattere numero 0, è una lettera maiuscola | 
| pinofal | 8:30ff29b4542e | 293 | if((caRxPacket[1] > 0x40) && (caRxPacket[1] < 0x5B)) // caratteri alfabetici | 
| pinofal | 8:30ff29b4542e | 294 | { | 
| pinofal | 8:30ff29b4542e | 295 | cCommandBLE = caRxPacket[1]; // legge e memorizza il primo carattere | 
| pinofal | 8:30ff29b4542e | 296 | nParamBLE = caRxPacket[2]-0x30; | 
| pinofal | 8:30ff29b4542e | 297 | // visualizza comando e parametro inviato da BLE | 
| pinofal | 8:30ff29b4542e | 298 | pc.printf("> %c%d \r\n\r",cCommandBLE, nParamBLE); // diagnostica | 
| pinofal | 8:30ff29b4542e | 299 | |
| pinofal | 8:30ff29b4542e | 300 | } | 
| pinofal | 8:30ff29b4542e | 301 | // +++++++++++++++++ FINE gestione Comando da Button +++++++++++++++++ | 
| pinofal | 8:30ff29b4542e | 302 | |
| pinofal | 8:30ff29b4542e | 303 | // ++++++++++++++++++ INIZIO Estrai coordinate polari del joystick +++++++++++++++++++++ | 
| pinofal | 8:30ff29b4542e | 304 | // esponente della base 10, per cui bisognerà moltiplicare i caratteri per trasformarli in numeri | 
| pinofal | 8:30ff29b4542e | 305 | fEsponente = 1.0; | 
| pinofal | 8:30ff29b4542e | 306 | if(caRxPacket[1] == '~') // ricevuta 0x7E = '~', cioè ricevuto fase dal joystick | 
| pinofal | 8:30ff29b4542e | 307 | { | 
| pinofal | 8:30ff29b4542e | 308 | // stampa carattere ricevuto | 
| pinofal | 8:30ff29b4542e | 309 | //pc.printf("Fase: '~' \n\r"); // diagnostica | 
| pinofal | 8:30ff29b4542e | 310 | // trasforma in numero i caratteri della fase | 
| pinofal | 8:30ff29b4542e | 311 | nTeta=0; | 
| pinofal | 8:30ff29b4542e | 312 | for(nCharIndex = (nCharCount-2); nCharIndex > 1; nCharIndex--) // I primi due caratteri sono i delimitatori " (~ " e l'ultimo è un delimitatore ')' | 
| pinofal | 8:30ff29b4542e | 313 | { | 
| pinofal | 8:30ff29b4542e | 314 | nTeta = nTeta + (caRxPacket[nCharIndex]-0x30)*fEsponente; // l'ultimo carattere ricevuto è un delimitatore | 
| pinofal | 8:30ff29b4542e | 315 | fEsponente*=10.0; | 
| pinofal | 8:30ff29b4542e | 316 | //pc.printf("cReadCharacter: %c\n\r", caRxPacket[nCharIndex]); // diagnostica | 
| pinofal | 8:30ff29b4542e | 317 | } | 
| pinofal | 8:30ff29b4542e | 318 | // visualizza valore di angolo ricevuto da BLE | 
| pinofal | 8:30ff29b4542e | 319 | //pc.printf("> nTeta = %d \n\r",nTeta); // diagnostica | 
| pinofal | 8:30ff29b4542e | 320 | // visualizza gli ultimi valori di modulo e fase ricevuti da BLE | 
| pinofal | 8:30ff29b4542e | 321 | //pc.printf("> (nRo,nTeta) = (%d,%d) \n\r\n\r",nRo, nTeta); // diagnostica | 
| pinofal | 8:30ff29b4542e | 322 | } | 
| pinofal | 8:30ff29b4542e | 323 | // esponente della base 10, per cui bisognerà moltiplicare i caratteri per trasformarli in numeri | 
| pinofal | 8:30ff29b4542e | 324 | fEsponente = 1.0; | 
| pinofal | 8:30ff29b4542e | 325 | if (caRxPacket[1] == '^') // ricevuta 0x7E = '^', cioè ricevuto modulo dal josystick | 
| pinofal | 8:30ff29b4542e | 326 | { | 
| pinofal | 8:30ff29b4542e | 327 | // stampa carattere ricevuto | 
| pinofal | 8:30ff29b4542e | 328 | //pc.printf("Modulo: '^' \n\r"); // diagnostica | 
| pinofal | 8:30ff29b4542e | 329 | // trasforma in numero i caratteri del modulo | 
| pinofal | 8:30ff29b4542e | 330 | nRo=0; | 
| pinofal | 8:30ff29b4542e | 331 | for(nCharIndex = (nCharCount-2); nCharIndex > 1; nCharIndex--) // I primi due caratteri sono i delimitatori " (^ " e l'ultimo è un delimitatore ')' | 
| pinofal | 8:30ff29b4542e | 332 | { | 
| pinofal | 8:30ff29b4542e | 333 | nRo = nRo + (caRxPacket[nCharIndex]-0x30)*fEsponente; // l'ultimo carattere ricevuto è un delimitatore | 
| pinofal | 8:30ff29b4542e | 334 | fEsponente*=10.0; //pc.printf("nRo provvisorio: %d\n\r", nRo); // diagnostica | 
| pinofal | 8:30ff29b4542e | 335 | //pc.printf("cReadCharacter: %c\n\r", caRxPacket[nCharIndex]); // diagnostica | 
| pinofal | 8:30ff29b4542e | 336 | } | 
| pinofal | 8:30ff29b4542e | 337 | // visualizza il valore di modulo ricevuto da BLE | 
| pinofal | 8:30ff29b4542e | 338 | //pc.printf("> nRo = %d \n\r",nRo); // diagnostica | 
| pinofal | 8:30ff29b4542e | 339 | // visualizza gli ultimi valori di modulo e fase ricevuti da BLE | 
| pinofal | 8:30ff29b4542e | 340 | //pc.printf("> (nRo,nTeta) = (%d,%d) \n\r\n\r",nRo, nTeta); // diagnostica | 
| pinofal | 8:30ff29b4542e | 341 | } | 
| pinofal | 8:30ff29b4542e | 342 | // posizione di comodo: il joystick mantiene Teta diverso da 0 abche quando il Ro =0. Fisicamente quest non ha senso. | 
| pinofal | 8:30ff29b4542e | 343 | if(nRo==0) | 
| pinofal | 8:30ff29b4542e | 344 | { | 
| pinofal | 8:30ff29b4542e | 345 | nTeta=0; // Se il vettore polare si trova nell'origine, l'angolo è zero | 
| pinofal | 8:30ff29b4542e | 346 | } | 
| pinofal | 8:30ff29b4542e | 347 | |
| pinofal | 8:30ff29b4542e | 348 | // ++++++++++++++++++ FINE Estrai coordinate polari del joystick +++++++++++++++++++++ | 
| pinofal | 8:30ff29b4542e | 349 | |
| pinofal | 8:30ff29b4542e | 350 | //+++++++++++++++++++ INIZIO converte le coordinate polari del joystick in coordinate cartesiane ++++++++++++++++ | 
| pinofal | 8:30ff29b4542e | 351 | |
| pinofal | 8:30ff29b4542e | 352 | fX = double(nRo)*cos((double)nTeta*((double)PI/180.0)); | 
| pinofal | 8:30ff29b4542e | 353 | fY = double(nRo)*sin((double)nTeta*((double)PI/180.0)); | 
| pinofal | 8:30ff29b4542e | 354 | //pc.printf("> (fX,fY) = (%.2f,%.2f) \n\r\n\r",fX, fY); // diagnostica | 
| pinofal | 8:30ff29b4542e | 355 | |
| pinofal | 8:30ff29b4542e | 356 | //+++++++++++++++++++ FINE converte le coordinate polari del joystick in coordinate cartesiane ++++++++++++++++ | 
| pinofal | 8:30ff29b4542e | 357 | |
| pinofal | 8:30ff29b4542e | 358 | // reinizializza contatore di caratteri ricevuti | 
| pinofal | 8:30ff29b4542e | 359 | nCharCount = 0; | 
| pinofal | 8:30ff29b4542e | 360 | |
| pinofal | 8:30ff29b4542e | 361 | // comunica al cellulare vleocità e spostamento mentre si sta spostando | 
| pinofal | 8:30ff29b4542e | 362 | //myBLE.printf(" Speed= %d [m/s]; Trip= d [m]\n\r",nRo, nTeta ); | 
| pinofal | 8:30ff29b4542e | 363 | |
| pinofal | 8:30ff29b4542e | 364 | |
| pinofal | 8:30ff29b4542e | 365 | // visualizza gli ultimi valori di modulo e fase ricevuti da BLE | 
| pinofal | 8:30ff29b4542e | 366 | pc.printf("> (nRo,nTeta) = (%d,%d) \n\r\n\r",nRo, nTeta); // diagnostica | 
| pinofal | 8:30ff29b4542e | 367 | |
| pinofal | 8:30ff29b4542e | 368 | } // if(cReadChar == ')') | 
| pinofal | 8:30ff29b4542e | 369 | } | 
| pinofal | 8:30ff29b4542e | 370 | } | 
| pinofal | 8:30ff29b4542e | 371 | |
| pinofal | 8:30ff29b4542e | 372 | /**********/ | 
| pinofal | 8:30ff29b4542e | 373 | /* MAIN */ | 
| pinofal | 8:30ff29b4542e | 374 | /**********/ | 
| pinofal | 8:30ff29b4542e | 375 | int main() | 
| francesco01 | 10:e38bc98718cc | 376 | { | 
| francesco01 | 10:e38bc98718cc | 377 | MotoreCoda.period_ms(50); // periodo PWM | 
| francesco01 | 10:e38bc98718cc | 378 | |
| pinofal | 8:30ff29b4542e | 379 | // messaggio di benvenuto | 
| pinofal | 8:30ff29b4542e | 380 | pc.printf("\r\n************ Hallo ****************** \r\n"); | 
| pinofal | 8:30ff29b4542e | 381 | pc.printf("*** Modulo di Ispezione Condutture ***\r\n"); | 
| pinofal | 8:30ff29b4542e | 382 | |
| pinofal | 8:30ff29b4542e | 383 | // inizializza variabili da BLE | 
| pinofal | 8:30ff29b4542e | 384 | cCommandBLE = 0; // inizialmente nessun comando da BLE | 
| pinofal | 8:30ff29b4542e | 385 | cOldCommandBLE = 0; // inizialmente nessun comando da BLE | 
| pinofal | 8:30ff29b4542e | 386 | cParamBLE = 0; // inizialmente nessun parametro da BLE | 
| pinofal | 8:30ff29b4542e | 387 | nParamBLE=0; // inizialmente nessun parametro da BLE | 
| pinofal | 8:30ff29b4542e | 388 | nOldParamBLE=0; // inizialmente nessun parametro da BLE | 
| pinofal | 8:30ff29b4542e | 389 | fX = 0; // Joystick inizialmente nell'origine (X , Y) = (0 , 0) | 
| pinofal | 8:30ff29b4542e | 390 | fOldX = 0; // Joystick inizialmente nell'origine (X , Y) = (0 , 0) | 
| pinofal | 8:30ff29b4542e | 391 | fY = 0; // Joystick inizialmente nell'origine (X , Y) = (0 , 0) | 
| pinofal | 8:30ff29b4542e | 392 | fOldY = 0; // Joystick inizialmente nell'origine (X , Y) = (0 , 0) | 
| pinofal | 8:30ff29b4542e | 393 | |
| pinofal | 8:30ff29b4542e | 394 | // inizializza variabili | 
| pinofal | 8:30ff29b4542e | 395 | fDistanzaPercorsa = 0.0; | 
| pinofal | 8:30ff29b4542e | 396 | fSpeed = 0.0; | 
| pinofal | 8:30ff29b4542e | 397 | |
| pinofal | 8:30ff29b4542e | 398 | // Inizialmente Main è fermo fino a quando IRQ non riempie ArrayA. Main vede cTrafficLight su 'Z' e quindi non fa niente | 
| pinofal | 8:30ff29b4542e | 399 | cTrafficLight = 'Z'; | 
| pinofal | 8:30ff29b4542e | 400 | cOldTrafficLight = 'Z'; | 
| pinofal | 8:30ff29b4542e | 401 | |
| pinofal | 8:30ff29b4542e | 402 | // inizializza contatore di caratteri ricevuti | 
| pinofal | 8:30ff29b4542e | 403 | nCharCountA = 0; | 
| pinofal | 8:30ff29b4542e | 404 | nCharCountB = 0; | 
| pinofal | 8:30ff29b4542e | 405 | |
| pinofal | 8:30ff29b4542e | 406 | // inizializza array di caratteri ricevuti | 
| pinofal | 8:30ff29b4542e | 407 | for(nIndex=0; nIndex<PACKETDIM; nIndex++) | 
| pinofal | 8:30ff29b4542e | 408 | {caRxPacket[nIndex]=0;} | 
| pinofal | 8:30ff29b4542e | 409 | nCharCount=0; | 
| pinofal | 8:30ff29b4542e | 410 | |
| pinofal | 8:30ff29b4542e | 411 | |
| pinofal | 8:30ff29b4542e | 412 | // inizializza i valori di modulo e fase ricevuti dal joystick | 
| pinofal | 8:30ff29b4542e | 413 | nRo = 0; | 
| pinofal | 8:30ff29b4542e | 414 | nTeta = 0; | 
| pinofal | 8:30ff29b4542e | 415 | |
| pinofal | 8:30ff29b4542e | 416 | |
| pinofal | 8:30ff29b4542e | 417 | |
| pinofal | 8:30ff29b4542e | 418 | |
| pinofal | 8:30ff29b4542e | 419 | //+++++++++++++++++ INIZIO Attivazione Interrupt per segnale di Encoder +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | 
| pinofal | 8:30ff29b4542e | 420 | // conta il numero di impulsi del segnale di encoder che si verificano in DELTAT millisecondi | 
| pinofal | 8:30ff29b4542e | 421 | // gli impulsi di encoder vengono contati da una IRQ collegata all'input da encoder | 
| pinofal | 8:30ff29b4542e | 422 | // ogni DELTAT secondi scatta un ticker che calcola la velocità | 
| pinofal | 8:30ff29b4542e | 423 | |
| pinofal | 8:30ff29b4542e | 424 | // definisci il mode del segnale digitale di EncoderA | 
| pinofal | 8:30ff29b4542e | 425 | InEncoderA.mode(PullUp); | 
| pinofal | 8:30ff29b4542e | 426 | |
| pinofal | 8:30ff29b4542e | 427 | // Associa routine di Interrup all'evento fronte di salita del segnale di encoder | 
| pinofal | 8:30ff29b4542e | 428 | InEncoderA.rise(&riseEncoderIRQ); | 
| pinofal | 8:30ff29b4542e | 429 | // azzera il contatore dei fronti di salita del segnale di encoder. Saranno contati nella IRQ legata a InEncoderA | 
| pinofal | 8:30ff29b4542e | 430 | nCountRiseEdge=0; | 
| pinofal | 8:30ff29b4542e | 431 | nOldCountRiseEdge=0; | 
| pinofal | 8:30ff29b4542e | 432 | |
| pinofal | 8:30ff29b4542e | 433 | InEncoderA.enable_irq(); | 
| pinofal | 8:30ff29b4542e | 434 | SpeedCalculateTicker.attach(&SpeedCalculate,DELTAT); | 
| pinofal | 8:30ff29b4542e | 435 | //+++++++++++++++++ FINE Attivazione Interrupt per segnale di Encoder +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | 
| pinofal | 8:30ff29b4542e | 436 | |
| pinofal | 8:30ff29b4542e | 437 | |
| pinofal | 8:30ff29b4542e | 438 | |
| pinofal | 8:30ff29b4542e | 439 | // Attiva la IRQ per la RX su seriale | 
| pinofal | 8:30ff29b4542e | 440 | myBLE.attach(&BLERxInterrupt,Serial::RxIrq); // // entra in questa routine quando riceve un carattere dalla seriale del BLE | 
| pinofal | 8:30ff29b4542e | 441 | pc.attach(&pcRxInterrupt,Serial::RxIrq); // entra in questa routine quando riceve un carattere dalla USB del PC | 
| pinofal | 8:30ff29b4542e | 442 | |
| pinofal | 8:30ff29b4542e | 443 | // attiva un ticker per simulare robot in movimento. | 
| pinofal | 8:30ff29b4542e | 444 | //!!!!!!!!!!!!!!!!!!! INIZIO COMMENTARE QUESTA FUNZIONE DURANTE IL NORMALE FUNZIONAMENTO CON ROBOT IN MOVIMENTO. UTILIZZO PER DIAGNOSTICA !!!!!!!!!!!!!!!! | 
| pinofal | 8:30ff29b4542e | 445 | #ifdef ENCODERSIMULATE | 
| pinofal | 8:30ff29b4542e | 446 | // attiva il Ticker per simulare il calcolo della velocità. Ogni fDeltaTick viene simulato l'arrivo di un impulso dall'encoder del motore | 
| pinofal | 8:30ff29b4542e | 447 | fDeltaTick = 0.05; // velocità = ( (DIAMETRO*PI) / IMPULSIPERGIRO )/ fDeltaTick [m/s] | 
| pinofal | 8:30ff29b4542e | 448 | EncoderSimulateTicker.attach(&EncoderSimulate,fDeltaTick); // Diagnostica | 
| pinofal | 8:30ff29b4542e | 449 | #endif | 
| pinofal | 8:30ff29b4542e | 450 | //!!!!!!!!!!!!!!!!!!! FINE COMMENTARE QUESTA FUNZIONE DURANTE IL NORMALE FUNZIONAMENTO CON ROBOT IN MOVIMENTO. UTILIZZO PER DIAGNOSTICA !!!!!!!!!!!!!!!!!!!! | 
| pinofal | 8:30ff29b4542e | 451 | |
| pinofal | 8:30ff29b4542e | 452 | |
| pinofal | 8:30ff29b4542e | 453 | |
| pinofal | 8:30ff29b4542e | 454 | |
| pinofal | 8:30ff29b4542e | 455 | //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | 
| pinofal | 8:30ff29b4542e | 456 | //++++++++++++++ INIZIO Ciclo Principale +++++++++++++++++++ | 
| pinofal | 8:30ff29b4542e | 457 | //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | 
| pinofal | 8:30ff29b4542e | 458 | |
| pinofal | 8:30ff29b4542e | 459 | |
| pinofal | 8:30ff29b4542e | 460 | while(true) | 
| pinofal | 8:30ff29b4542e | 461 | { | 
| pinofal | 8:30ff29b4542e | 462 | //++++++++++++++++++++++++++ INIZIO Interpreta Comandi da Pulsanti della APP ++++++++++++++++++++++++++++++++++++++++++++ | 
| pinofal | 8:30ff29b4542e | 463 | if((cCommandBLE != cOldCommandBLE) || (nParamBLE != nOldParamBLE)) | 
| pinofal | 8:30ff29b4542e | 464 | { | 
| pinofal | 8:30ff29b4542e | 465 | switch (cCommandBLE) | 
| pinofal | 8:30ff29b4542e | 466 | { | 
| pinofal | 8:30ff29b4542e | 467 | case 'T': // accendi/spegni LED su scheda | 
| pinofal | 8:30ff29b4542e | 468 | { | 
| pinofal | 8:30ff29b4542e | 469 | myLed = nParamBLE; | 
| pinofal | 8:30ff29b4542e | 470 | }; break; | 
| pinofal | 8:30ff29b4542e | 471 | case 'L': // Accendi/spegni illuminazione a LED | 
| pinofal | 8:30ff29b4542e | 472 | { | 
| pinofal | 8:30ff29b4542e | 473 | Light = nParamBLE; | 
| pinofal | 8:30ff29b4542e | 474 | }; break; | 
| pinofal | 8:30ff29b4542e | 475 | case 'R': // Reset odometria e illuminazione | 
| pinofal | 8:30ff29b4542e | 476 | { | 
| pinofal | 8:30ff29b4542e | 477 | if(nParamBLE==1) | 
| pinofal | 8:30ff29b4542e | 478 | { | 
| pinofal | 8:30ff29b4542e | 479 | nCountRiseEdge = 0; | 
| pinofal | 8:30ff29b4542e | 480 | nOldCountRiseEdge = 0; | 
| pinofal | 8:30ff29b4542e | 481 | Light = 0; | 
| pinofal | 8:30ff29b4542e | 482 | fDistanzaPercorsa = 0.0; | 
| pinofal | 8:30ff29b4542e | 483 | fSpeed = 0.0; | 
| pinofal | 8:30ff29b4542e | 484 | } | 
| pinofal | 8:30ff29b4542e | 485 | }; break; | 
| pinofal | 8:30ff29b4542e | 486 | |
| pinofal | 8:30ff29b4542e | 487 | default: break; | 
| pinofal | 8:30ff29b4542e | 488 | } | 
| pinofal | 8:30ff29b4542e | 489 | pc.printf("Comando = %c, Parametro = %d \r\n", cCommandBLE, nParamBLE); // diagnostica | 
| pinofal | 8:30ff29b4542e | 490 | cOldCommandBLE = cCommandBLE; | 
| pinofal | 8:30ff29b4542e | 491 | nOldParamBLE = nParamBLE; | 
| francesco01 | 10:e38bc98718cc | 492 | |
| pinofal | 8:30ff29b4542e | 493 | } | 
| pinofal | 8:30ff29b4542e | 494 | //++++++++++++++++++++++++++++++++++++++++++++ FINE Interpreta Comandi da Pulsanti della APP ++++++++++++++++++++++++++++++++++++++++++++++++++++++ | 
| pinofal | 8:30ff29b4542e | 495 | |
| pinofal | 8:30ff29b4542e | 496 | //+++++++++++++++++++++++++++++++ INIZIO Ottieni X e Y dal Joystick e trasformali in comandi per il motore Right e Left +++++++++++++++++++++++++++ | 
| pinofal | 8:30ff29b4542e | 497 | //Invert X | 
| pinofal | 8:30ff29b4542e | 498 | //Calcola R+L (Call it V): V =(100-ABS(X)) * (Y/100) + Y | 
| pinofal | 8:30ff29b4542e | 499 | //Calcola R-L (Call it W): W= (100-ABS(Y)) * (X/100) + X | 
| pinofal | 8:30ff29b4542e | 500 | //Calcola R: R = (V+W) /2 | 
| pinofal | 8:30ff29b4542e | 501 | //Calcola L: L= (V-W)/2 | 
| pinofal | 8:30ff29b4542e | 502 | //Scala i valori di L e R in base all'hardware. | 
| pinofal | 8:30ff29b4542e | 503 | //invia i valori al robot. | 
| pinofal | 8:30ff29b4542e | 504 | // se ci sono stati cambiamenti nella posizione del joystick, cambia i comandi di velocità delle ruote | 
| pinofal | 8:30ff29b4542e | 505 | if( (fX != fOldX) || (fY != fOldY)) | 
| pinofal | 8:30ff29b4542e | 506 | { | 
| pinofal | 8:30ff29b4542e | 507 | fOldX = fX; | 
| pinofal | 8:30ff29b4542e | 508 | fOldY = fY; | 
| pinofal | 8:30ff29b4542e | 509 | // algoritmo di conversione dalla posizione del Joystick (fX, fY) alla velocità delle ruote (fR, fL) | 
| pinofal | 8:30ff29b4542e | 510 | fV = (100.0 - fabs(fX)) * (fY/100.0) + fY; // calcolo intermedio | 
| pinofal | 8:30ff29b4542e | 511 | fW = (100.0 - fabs(fY)) * (fX/100.0) + fX; // calcolo intermedio | 
| pinofal | 8:30ff29b4542e | 512 | fR = (fV+fW)/2.0; // velocità della ruota destra (-100; +100) | 
| pinofal | 8:30ff29b4542e | 513 | fL = (fV-fW)/2.0; // velocità della ruota sinistra (-100; +100) | 
| pinofal | 8:30ff29b4542e | 514 | |
| pinofal | 8:30ff29b4542e | 515 | // diagnostica | 
| pinofal | 8:30ff29b4542e | 516 | //pc.printf("\r\n> (X,Y) = (%.2f , %.2f) \r\n", fX,fY); // diagnostica | 
| pinofal | 8:30ff29b4542e | 517 | //pc.printf("> V , W = %.2f , %.2f\r\n", fV, fW); // diagnostica | 
| pinofal | 8:30ff29b4542e | 518 | //pc.printf("> Velocita' Right R = %.2f\r\n", fR); // diagnostica | 
| pinofal | 8:30ff29b4542e | 519 | //pc.printf("> Velocita' Left L = %.2f\r\n\r\n", fL); // diagnostica | 
| pinofal | 8:30ff29b4542e | 520 | |
| pinofal | 8:30ff29b4542e | 521 | // algoritmo di movimentazione delle ruote. | 
| pinofal | 8:30ff29b4542e | 522 | if(fR < 0) //Ruota destra motorizzata coincide con quella posteriore | 
| pinofal | 8:30ff29b4542e | 523 | { | 
| pinofal | 8:30ff29b4542e | 524 | fR =-fR; | 
| pinofal | 8:30ff29b4542e | 525 | // Vai indietro | 
| pinofal | 8:30ff29b4542e | 526 | PostOutBI1 = 1; | 
| pinofal | 8:30ff29b4542e | 527 | PostOutBI2 = 0; | 
| pinofal | 8:30ff29b4542e | 528 | } | 
| pinofal | 8:30ff29b4542e | 529 | else | 
| pinofal | 8:30ff29b4542e | 530 | { | 
| pinofal | 8:30ff29b4542e | 531 | if(fR >0) | 
| pinofal | 8:30ff29b4542e | 532 | { | 
| pinofal | 8:30ff29b4542e | 533 | // Vai avanti | 
| pinofal | 8:30ff29b4542e | 534 | PostOutBI1 = 0; | 
| pinofal | 8:30ff29b4542e | 535 | PostOutBI2 = 1; | 
| pinofal | 8:30ff29b4542e | 536 | } | 
| pinofal | 8:30ff29b4542e | 537 | else | 
| pinofal | 8:30ff29b4542e | 538 | { | 
| pinofal | 8:30ff29b4542e | 539 | // spegni | 
| pinofal | 8:30ff29b4542e | 540 | PostOutBI1 = 0; | 
| pinofal | 8:30ff29b4542e | 541 | PostOutBI2 = 0; | 
| pinofal | 8:30ff29b4542e | 542 | } | 
| pinofal | 8:30ff29b4542e | 543 | } | 
| pinofal | 8:30ff29b4542e | 544 | PostOutPWB.write(float(fR/100.0)); // DutyCycle del PWM Destro (Posteriore) | 
| pinofal | 8:30ff29b4542e | 545 | if(fL < 0) //Ruota sinistra motorizzata coincide con quella Anteriore | 
| pinofal | 8:30ff29b4542e | 546 | { | 
| pinofal | 8:30ff29b4542e | 547 | fL =-fL; | 
| pinofal | 8:30ff29b4542e | 548 | // Vai indietro | 
| pinofal | 8:30ff29b4542e | 549 | AntOutBI1 = 1; | 
| pinofal | 8:30ff29b4542e | 550 | AntOutBI2 = 0; | 
| pinofal | 8:30ff29b4542e | 551 | } | 
| pinofal | 8:30ff29b4542e | 552 | else | 
| pinofal | 8:30ff29b4542e | 553 | { | 
| pinofal | 8:30ff29b4542e | 554 | if(fL >0) | 
| pinofal | 8:30ff29b4542e | 555 | { | 
| pinofal | 8:30ff29b4542e | 556 | // Vai avanti | 
| pinofal | 8:30ff29b4542e | 557 | AntOutBI1 = 0; | 
| pinofal | 8:30ff29b4542e | 558 | AntOutBI2 = 1; | 
| pinofal | 8:30ff29b4542e | 559 | |
| pinofal | 8:30ff29b4542e | 560 | } | 
| pinofal | 8:30ff29b4542e | 561 | else | 
| pinofal | 8:30ff29b4542e | 562 | { | 
| pinofal | 8:30ff29b4542e | 563 | // spegni | 
| pinofal | 8:30ff29b4542e | 564 | AntOutBI1 = 0; | 
| pinofal | 8:30ff29b4542e | 565 | AntOutBI2 = 0; | 
| pinofal | 8:30ff29b4542e | 566 | } | 
| pinofal | 8:30ff29b4542e | 567 | } | 
| pinofal | 8:30ff29b4542e | 568 | AntOutPWB.write(float(fL/100.0)); // DutyCycle del PWM Sinistro (Anteriore) | 
| pinofal | 8:30ff29b4542e | 569 | } | 
| francesco01 | 10:e38bc98718cc | 570 | if (nCountRiseEdge != nOldCountRiseEdge) //La coda si muove quando registra impulso | 
| francesco01 | 10:e38bc98718cc | 571 | { | 
| francesco01 | 10:e38bc98718cc | 572 | MotoreCoda.write (0.4); // velocità *** max 1.0 | 
| francesco01 | 10:e38bc98718cc | 573 | } | 
| francesco01 | 10:e38bc98718cc | 574 | else //La coda non si muove quando non registra impulso | 
| francesco01 | 10:e38bc98718cc | 575 | { | 
| francesco01 | 10:e38bc98718cc | 576 | MotoreCoda.write (0.0); // velocità *** max 1.0 | 
| francesco01 | 10:e38bc98718cc | 577 | } | 
| pinofal | 8:30ff29b4542e | 578 | //++++++++++++++++++++++ FINE Ottieni X e Y dal Joystick e trasformali in comandi per il motore Right e Left +++++++++++++++++++++++++++++ | 
| pinofal | 8:30ff29b4542e | 579 | } //while (true) Ciclo principale | 
| pinofal | 8:30ff29b4542e | 580 | |
| pinofal | 8:30ff29b4542e | 581 | //++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | 
| pinofal | 8:30ff29b4542e | 582 | //++++++++++++++ FINE Ciclo Principale +++++++++++++++++++ | 
| pinofal | 8:30ff29b4542e | 583 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | 
| pinofal | 8:30ff29b4542e | 584 | |
| pinofal | 8:30ff29b4542e | 585 | } // main() |