Intersection detecteTypeIntersection() { Intersection intersectionType = inter_none; if ( isCenter() && ( isLeft() || isRight() )) { // Permettra un meilleur redressement par la suit enregistrerDernierCapteurActif( dernierCapteurActif, dernierCapteurCoteActif ); // Teste si une ligne est détectée à gauche // cas possibles: cross, tBase, tRight, lLeft. if( isLeft() ) { trouverTypeIntersectionPourUnCote( intersectionType, capteur_gauche, capteur_droit ); } // Teste si une ligne est détectée à droite // cas possibles: cross, tBase, tLeft, lRight. else if( isRight() ) { trouverTypeIntersectionPourUnCote( intersectionType, capteur_droit, capteur_gauche ); } } return intersectionType; }
bool balayer(uint8_t vitesse , uint16_t tempsBalayage, Direction dir) { bool ligneDetectee = (isLeft() || isCenter() || isRight()) ; while (!ligneDetectee && tempsBalayage > 0) { if (dir == direction_left) pivoterAntiHoraire(vitesse); else pivoterHoraire(vitesse); _delay_ms(1); ligneDetectee = (isLeft() || isCenter() || isRight()) ; tempsBalayage -- ; } arreterRobot(); enregistrerDernierCapteurActif(dernierCapteurActif, dernierCapteurCoteActif); return ligneDetectee ; }
void enregistrerDernierCapteurActif( Capteur &m_capteur = dernierCapteurActif, Capteur &m_capteurCote = dernierCapteurCoteActif ) { if(isRight() && !isLeft() && !isCenter()) { m_capteur = capteur_droit ; m_capteurCote = capteur_droit; } else if(!isRight() && isLeft() && !isCenter()) { m_capteur = capteur_gauche ; m_capteurCote = capteur_gauche; } else if(!isRight() && !isLeft() && isCenter()) { //m_capteurCote ne change pas m_capteur = capteur_centre ; } else if (isRight() && !isLeft() && isCenter()) { //droite et centre: on ne peut pas avoir gauche if (m_capteur == capteur_gauche || m_capteur == capteur_aucun) m_capteur = capteur_centre; m_capteurCote = capteur_droit; } else if (!isRight() && isLeft() && isCenter()) { //gauche et centre: on ne peut pas avoir droite if (m_capteur == capteur_droit || m_capteur == capteur_aucun) m_capteur = capteur_centre; m_capteurCote = capteur_gauche; } else if (!isRight() && !isLeft() && !isCenter()) { //aucun changement à l'état si on est dans l'état perdu //m_capteur = m_capteur; } else if (isRight() && isLeft() && isCenter()){ //les trois sont allumés: on change seulement si "aucun" if (m_capteur == capteur_aucun) m_capteur = capteur_centre; } else { //les deux extrémités sont allumés, mais pas le centre -- cas très rare, possible lorsqu'on tourne // et que les capteurs sont trop proches de l'intersection //m_capteur = m_capteur } }
bool balayerZone(uint8_t vitesseMoteurDroit , uint8_t vitesseMoteurGauche , uint16_t rayonDeBalayage ) { bool ligneTrouvee = ( isLeft() || isRight() || isCenter() ); if (!ligneTrouvee) ligneTrouvee = balayer(vitesseMoteurDroit , rayonDeBalayage/2, direction_left); if (!ligneTrouvee) ligneTrouvee = balayer(vitesseMoteurGauche , rayonDeBalayage, direction_right); /* if (!ligneTrouvee) { while(!isCenter() && !isLeft() && !isRight()) reculerRobot(vitesseMoteurDroit , vitesseMoteurGauche); //ligneTrouvee demeure false arreterRobot(); } */ enregistrerDernierCapteurActif(dernierCapteurActif, dernierCapteurCoteActif); return ligneTrouvee ; }
void tournerAtNextIntersection(uint8_t vitesse, Direction dir) { // on vérifie si on est présentement sur une ligne-trajet, // comme dans un cross, ou tTight ou tLeft switch (dir) { //on fait avancer le robot un peu pour que le pivot se fasse au bon endroit if (isLeft() || isRight() || isCenter()) { for (uint8_t i = 0; (i < 50) && (isLeft() || isRight() || isCenter()); i++) { suivreTrajet(); _delay_ms(1); } } else { avancerRobot(VITESSEINTERSECTIONDROITE, VITESSEINTERSECTIONGAUCHE); _delay_ms(50); } case direction_left: // on vérifie si le capteur de gauche est déjà sur la ligne trajet. // Si oui, il faut tourner while il sort de la ligne, entre dans la zone blanche // puis arrête quand la ligne transversale est au milieu. // Sinon, on est déjà dans la zone blanche et on saute la première étape. tournerAGauche(vitesse); if (isLeft()) while (isLeft()); while (!isLeft()); while(!isCenter()); break; case direction_right: //même chose que direction_left, mais à l'inverse tournerADroite(vitesse); if (isRight()) while (isRight()); while (!isRight()); while (!isCenter()); break; case direction_reculer: //on recule tant qu'on n'est pas sur une ligne reculerRobot(vitesse, vitesse); while (!isRight() || !isLeft() || !isCenter()) ; case direction_continue: //nobreak default: break; } //on arrête le robot dans tous les cas. //arreterRobot(); }
void suivreTrajet() { enregistrerDernierCapteurActif(dernierCapteurActif, dernierCapteurCoteActif); if(isRight() && !isLeft() && !isCenter()) { ajusterDroite(VITESSEMOTEURDROITE , VITESSEMOTEURGAUCHE , PENTEPOURTOURNER ); } else if(!isRight() && isLeft() && !isCenter()) { ajusterGauche(VITESSEMOTEURDROITE , VITESSEMOTEURGAUCHE , PENTEPOURTOURNER ); } else if(!isRight() && !isLeft() && isCenter()) { avancerRobot(VITESSEMOTEURDROITE , VITESSEMOTEURGAUCHE ); } // Dans le cas ou le robot se trouve dans un etat perdu else if(!isRight() && !isLeft() && !isCenter()) { if(dernierCapteurActif == capteur_centre) { //Si on vient de la droite et qu'on vient de dépasser le centre, on compense en retournant vers la droite if (dernierCapteurCoteActif == capteur_droit) ajusterGauche(VITESSEMOTEURDROITE , VITESSEMOTEURGAUCHE, MOYENNE_PENTEPOURTOURNER ); //vice-versa else if (dernierCapteurCoteActif == capteur_gauche) ajusterDroite(VITESSEMOTEURDROITE , VITESSEMOTEURGAUCHE, MOYENNE_PENTEPOURTOURNER ); //si on connait pas le dernier côté, on continue tout droit else avancerRobot(VITESSEMOTEURDROITE , VITESSEMOTEURGAUCHE ); } if(dernierCapteurActif == capteur_centre) { ///@todo Fonction d'ajustement précise à décommenter si tout va bien // // // Sert à ajuster la direction du robot avant même d'actionner les senseurs de côté // // en se basant sur la direction d'où vient le robot. // // // // Si on vient de la droite et qu'on vient de dépasser le centre, on compense en retournant vers la droite // if (dernierCapteurCoteActif == capteur_droit) // ajusterGauche(VITESSEMOTEURDROITE , VITESSEMOTEURGAUCHE, MOYENNE_PENTEPOURTOURNER ); // //vice-versa // else if (dernierCapteurCoteActif == capteur_gauche) // ajusterDroite(VITESSEMOTEURDROITE , VITESSEMOTEURGAUCHE, MOYENNE_PENTEPOURTOURNER ); // //si on connait pas le dernier côté, on continue tout droit // else avancerRobot(VITESSEMOTEURDROITE , VITESSEMOTEURGAUCHE ); } else if(dernierCapteurActif == capteur_droit) { ajusterDroite(VITESSEMOTEURDROITE , VITESSEMOTEURGAUCHE, PENTEPOURTOURNER ); } else if(dernierCapteurActif == capteur_gauche) { ajusterGauche(VITESSEMOTEURDROITE , VITESSEMOTEURGAUCHE, PENTEPOURTOURNER ); } else //dernierCapteurActif == aucun { //pour détectage d'erreur ou bogue seulement. Ce cas ne devrait jamais se produire, sauf si on démarre le circuit sans voir la ligne reculerRobot(VITESSEMOTEURDROITE , VITESSEMOTEURGAUCHE ); } } enregistrerDernierCapteurActif(dernierCapteurActif, dernierCapteurCoteActif); }
void JoystickShield::processCallbacks() { processEvents(); // Joystick Callbacks if (isCenter() && centerCallback != NULL) { centerCallback(); } if (isUp() && upCallback != NULL) { upCallback(); } if (isRightUp() && rightUpCallback != NULL) { rightUpCallback(); } if (isRight() && rightCallback != NULL) { rightCallback(); } if (isRightDown() && rightDownCallback != NULL) { rightDownCallback(); } if (isDown() && downCallback != NULL) { downCallback(); } if (isLeftDown() && leftDownCallback != NULL) { leftDownCallback(); } if (isLeft() && leftCallback != NULL) { leftCallback(); } if (isLeftUp() && leftUpCallback != NULL) { leftUpCallback(); } // Button Callbacks if (isJoystickButton() && jsButtonCallback != NULL) { jsButtonCallback(); } if (isUpButton() && upButtonCallback != NULL) { upButtonCallback(); } if (isRightButton() && rightButtonCallback != NULL) { rightButtonCallback(); } if (isDownButton() && downButtonCallback != NULL) { downButtonCallback(); } if (isLeftButton() && leftButtonCallback != NULL) { leftButtonCallback(); } }