........ /*Bumpers **************************************************************************** Controllo dei sensori di collisione */ void Bumpers(void) { const char maxDeadCorner = 5; // limite di urti alternativi if (FlagBumpers) // routine disattiva { /* disabilita i sensori per 1 Sec (debouncer), il timer è incrementato dall'interrupt ogni mSec */ if (TimerBumpers >= 1000) { FlagBumpers=0; // riabilita la routine } } else { if (BumperDx == 0) // controlla bumper destro { if (PrevBumper) // l'urto precedente era stato sul bumper sinistro ? { DeadCorner++; // se entra in un angolo morto gli urti si susseguono // alternativamente sui due bumpers } else { DeadCorner = 0; // reset della situazione di allarme } PrevBumper = 0; // Destro = 0, Sinistro = 1 FlagBumpers = 1; // disattiva bumpers TimerBumpers = 0; // per 1 Sec Space2RunFlag = 0; // reset di qualsiasi routine di movimento if (DeadCorner <= maxDeadCorner) // dopo n volte cambia drasticamente percorso { // evita l'ostacolo a SX PathSeq [0] = 2; // indietro 15 cm PathSeq [1] = 13; // gira 45°a SX PathSeq [2] = 255; // cammina avanti a velocità costante PathSeq [3] = 0; // fine sequenza PathSeqPointer = 0;// inizializza sequenza } else { // inverte la marcia PathSeq [0] = 2; // indietro 15 cm PathSeq [1] = 18; // gira 180° PathSeq [2] = 255; // cammina avanti a velocità costante PathSeq [3] = 0; // fine sequenza PathSeqPointer = 0;// inizializza sequenza DeadCorner = 0; // ricomincia il giro } } if (BumperSx == 0 && !FlagBumpers) // bumper sinistro ma non bumper destro { if (!PrevBumper) // l'urto precedente era stato sul bumper destro ? { DeadCorner++; // se entra in un angolo morto gli urti si susseguono // alternativamente sui due bumpers } else { DeadCorner = 0; // reset della situazione di allarme } PrevBumper = 1; // Destro = 0, Sinistro = 1 FlagBumpers = 1; // disattiva bumpers TimerBumpers = 0; // per 1Sec Space2RunFlag = 0; // reset di qualsiasi routine di movimento if (DeadCorner <= maxDeadCorner) // dopo n volte cambia drasticamente percorso { // evita l'ostacolo a DX PathSeq [0] = 2; // indietro 15 cm PathSeq [1] = 12; // gira 45°a DX PathSeq [2] = 255; // cammina avanti a velocità costante PathSeq [3] = 0; // fine sequenza PathSeqPointer = 0;// inizializza sequenza } else { // inverte la marcia PathSeq [0] = 2; // indietro 15 cm PathSeq [1] = 18; // gira 180° PathSeq [2] = 255; // cammina avanti a velocità costante PathSeq [3] = 0; // fine sequenza PathSeqPointer = 0;// inizializza sequenza DeadCorner = 0; // ricomincia il giro } } } } // Bumpers /**************************************************************************************/ ..........