Demandez à votre robot de suivre un mur!

Articles Liés

Comment construire un robot:

Partie 1: Conception et schéma

Partie 2: conception de PCB

Partie 3: Test du matériel

Partie 4: Séquences de lignes

Partie 5: Évitez les obstacles

Aperçu

Ceci est la partie 6 d’une série d’articles sur mes expériences de construction d’un robot capable de faire différentes choses. J’ai pensé que ce serait bien de créer un robot facile à assembler avec un seul fer à souder et qui était également abordable. J’ai fait les demandes suivantes à mon robot:

  • De nombreux ensembles sont chers, ils doivent donc être relativement peu coûteux.
  • Il doit être facilement assemblé sans équipement spécial.
  • Il doit être facile à programmer sans IDE ou programmeur compliqué.
  • Il doit être suffisamment puissant pour se développer.
  • Il devrait manquer d’une simple source d’alimentation.
  • Il doit pouvoir suivre une ligne ou un mur et éviter les obstacles.

Dans cet article, je vais parler de la façon de programmer le robot pour suivre les murs.

Les murs suivants

Pour suivre les murs, vous avez besoin d’au moins deux capteurs (informations sur 2 bits) pour gérer les quatre situations potentielles dans lesquelles le robot pourrait se trouver. Un capteur doit être devant et l’autre peut être à gauche ou à droite du robot. Plus vous utilisez de capteurs, plus vous disposez d’informations pour mieux juger de ce qui se passe. Pour cet exemple, j’en ai utilisé seulement deux. Le robot ne peut pas trouver le mur, vous devez donc placer le robot à côté du mur. Si vous le placiez au milieu de la pièce, il tournerait simplement en rond.

Table de vérité

Capteur avant Capteur droit Situation action
De De Le robot s’enfuit du mur. Revenez au mur, tournez à droite.
Sur De Le robot est loin du mur, mais se dirige vers un mur ou un obstacle. Tournez fort à gauche pour revenir parallèlement au mur.
De Sur Le robot suit le mur. Avancez.
Sur Sur Le robot est dans un coin. Tournez à gauche.

Pour travailler, j’ai dû ajouter du code pour tourner à gauche. Hard gauche signifie simplement que je ne tourne que sur la roue droite pour que le robot tourne essentiellement sur place au lieu de continuer à avancer en tournant. Je ne pourrais pas simplement tourner lentement comme le suiveur de ligne parce que vous n’avez aucune idée de la proximité du robot par rapport au mur. C’est une limitation du capteur que j’ai choisi car le capteur réfléchit différemment en fonction de la surface. De plus, la logique est définie pour être binaire uniquement parce qu’il n’y a aucun moyen de dire la distance en fonction du capteur. Si vous connaissiez la distance, vous pouvez ajouter une logique supplémentaire pour faire varier la vitesse en fonction de la distance afin que le robot se déplace plus rapidement dans la pièce. En fait, je ne pouvais pas du tout faire réfléchir le capteur sur une surface noire, donc dans la vidéo, vous pouvez voir que je devais mettre une surface blanche devant le lave-vaisselle. Un capteur basé sur l’audio n’aurait pas ce problème.

Programmation

L’esquisse suivante exécute la logique:

  • Démarrez le pilote du robot et attendez 5 secondes. Cela vous donne le temps de placer le robot à côté du mur avant qu’il ne commence à bouger.
  • Lire le capteur
  • Implémentez la table de vérité ci-dessus en utilisant des instructions if.
  • Chaque instruction exécute l’action associée à la configuration du capteur.
  • J’ai fait tourner le robot vers la droite plus rapidement que d’habitude pour que le robot puisse tourner davantage dans les coins. La plupart des coins des murs sont à 90 degrés, il est donc logique de tourner plus vite.
robot_væggefolger
#include "robot.h"

void setup()
{
  Serial.begin(38400);
  Serial.println("Boot");
  rbt_init();  
  delay(5000);
  rbt_move(FWD,100);
}

uint16_t lleft,lmid,lright;
boolean wleft,wmid,wright;
uint16_t avoid_count=0;
void loop()                     
{
  rbt_sns(&lleft,&lmid,&lright,&wleft,&wmid,&wright);
  /*if the wall is sensed, go forward
  * the wall is sensed if the right sensor is on but the mid
  * sensor is off.
  */
  if(wright && !wmid)
  {
    rbt_move(FWD,100);
  }
  /*likely going towards the wall
  * not sure how close so turn as fast
  * as we can
  */
  if(wright && wmid)
  {
    rbt_move(HARD_LEFT,100);
  }
  /*going away from the wall
  * slowly turn back towards the wall
  */
  if(!wright && !wmid)
  {
    rbt_move(RIGHT,130);
  }
  /*likely at a corner or coming in at an angle to the wall*/
  if(!wright && wmid)
  {
    rbt_move(HARD_LEFT,100);
  }
}

Les changements requis sont trop durs pour robot.h et robot.

robot.h

Ajoutez HARD_LEFT à l’énumération pour la direction.

/*robot interface*/
typedef enum{
  LEFT,
  RIGHT,
  FWD,
  REV,
  BRAKE,
  HARD_LEFT,
}direction_t;
robot.ino

Ajoutez un cas à HARD_LEFT dans rbt_move ().

case HARD_LEFT:
   digitalWrite(BPHASE,MOTOR_FWD);
   digitalWrite(APHASE,MOTOR_FWD);
   analogWrite(AEN,speed);
   analogWrite(BEN,0);
   break;

En suivant les murs de ma cuisine:

Conclusion

Dans cet article, je vous ai montré comment utiliser les capteurs de proximité pour suivre les murs et naviguer dans une pièce. Ceci conclut la série d’articles sur la fabrication d’un robot! Le robot est capable de suivre une ligne, un mur et d’éviter les obstacles. Pouvez-vous les combiner en un seul robot qui fait tout? Vous pouvez également prendre le contrôle en ajoutant un module BLE et en contrôlant le robot depuis votre téléphone!

robot_wall_follower.zip

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *