Étape 10 : code
#include
#include
Voici les constantes symboliques. Au lieu d’avoir à taper dans un non-sens NIP chaque fois que nous voulons faire quelque chose, nous pouvons écrire un facile de comprendre le nom, qui représente l’axe, le compilateur remplacera alors les noms avec les nombres
#define LeftMotorForward 8
#define LeftMotorBackward 9
#define RightMotorForward 10
#define RightMotorBackward 11
#define USTrigger 3
#define USEcho 2
#define MaxDistance 100
#define LED 13
Ici, nous avons créé deux « objets », un pour le servo et l’autre pour le capteur à ultrasons
Servo servo ;
NewPing sonar (USTrigger, USEcho, MaxDistance) ;
Ci-dessous nous créons des variables entières non signées que nous utiliserons plus tard dans le code. Ils sont pas signés car ils ont seulement des valeurs postive
unsigned int durée ;
unsigned int distance ;
unsigned int FrontDistance ;
unsigned int LeftDistance ;
unsigned int RightDistance ;
unsigned int temps ;
unsigned int CollisionCounter ;
void setup() //This bloc arrive une fois au démarrage
{
Serial.Begin(9600) ; J’ai inclus la série initialize mais commenté, si vous souhaitez déboguer et imprimer les informations sur le moniteur série simplement décommenter
Ici, nous mettons les modes de broche. Comme nous allons envoyer des signaux des pins nous définir comme sorties
pinMode (LeftMotorForward, sortie) ;
pinMode (LeftMotorBackward, sortie) ;
pinMode (RightMotorForward, sortie) ;
pinMode (RightMotorBackward, sortie) ;
pinMode (LED, sortie) ;
servo.Attach(6) ; Le servo est attaché à la borne 4
}
void loop() //This bloc se répète alors que l’Arduino est allumé
{
servo.Write(90) ; Faire pivoter le servo pour faire face à l’avant
Scan() ; Accéder à la fonction scan
FrontDistance = distance ; Affectez à la variable FrontDistance la valeur de la distance, retournée par la fonction scan
Serial.println ("Front distance =") ;
Serial.Print(distance) ;
Si (FrontDistance > 60 || FrontDistance == 0) //If il n’y a rien en face du robot au sein de 15 cm ou de la valeur de la distance est de 0 (ce qui, pour la bibliothèque de newping, signifie pas de ping a été retourné) puis...
{
moveForward() ; Accéder à la fonction moveForward
}
//Else autre (s’il y a quelque chose en face du robot moins de 40cm) puis...
{
CollisionCounter = CollisionCounter + 1 ;
moveStop() ; Accéder à la fonction moveStop
Navigate() ;
}
}
Sub moveForward() //This fonction indique au robot pour aller de l’avant
{
Serial.println("") ;
Serial.println ("aller de l’avant") ;
digitalWrite (LeftMotorBackward, basse) ;
digitalWrite (LeftMotorForward, élevé) ;
digitalWrite (RightMotorBackward, basse) ;
digitalWrite (RightMotorForward, élevé) ;
}
Sub moveBackward() //This fonction indique au robot de se déplacer vers l’arrière
{
Serial.println("") ;
Serial.println ("déplacement vers l’arrière") ;
digitalWrite (LeftMotorForward, basse) ;
digitalWrite (LeftMotorBackward, élevé) ;
digitalWrite (RightMotorForward, basse) ;
digitalWrite (RightMotorBackward, élevé) ;
}
Sub moveLeft() //This fonction indique au robot de tourner à gauche
{
Serial.println("") ;
Serial.println ("déplacement gauche") ;
digitalWrite (LeftMotorForward, basse) ;
digitalWrite (LeftMotorBackward, élevé) ;
digitalWrite (RightMotorBackward, basse) ;
digitalWrite (RightMotorForward, élevé) ;
}
Sub moveRight() //This fonction indique au robot de tourner à droite
{
Serial.println("") ;
Serial.println ("Moving droite") ;
digitalWrite (LeftMotorBackward, basse) ;
digitalWrite (LeftMotorForward, élevé) ;
digitalWrite (RightMotorForward, basse) ;
digitalWrite (RightMotorBackward, élevé) ;
}
Sub moveStop() //This fonction indique au robot pour arrêter de bouger
{
Serial.println("") ;
Serial.println("Stopping") ;
digitalWrite (LeftMotorBackward, basse) ;
digitalWrite (LeftMotorForward, basse) ;
digitalWrite (RightMotorForward, basse) ;
digitalWrite (RightMotorBackward, basse) ;
}
scan() Sub //This fonction détermine que les distance les choses sont loin du détecteur à ultrasons
{
Serial.println("") ;
Serial.println("Scanning") ;
Temps = sonar.ping() ;
distance = temps / US_ROUNDTRIP_CM ;
Delay(500) ;
}
Sub navigate()
{
Serial.println ("il existe un obstacle!") ;
servo.Write(167) ; Déplacer le servo vers la gauche (mon petit servos n’aiment pas va à 180, alors j’ai joué un peu avec la valeur jusqu'à ce que cela a fonctionné très bien)
Delay(1000) ; Attendre une demi-seconde pour le servo pour y arriver
Scan() ; Accéder à la fonction scan
LeftDistance = distance ; Affectez à la variable LeftDistance la distance sur la gauche
Serial.println ("distance à gauche =") ;
Serial.Print(distance) ;
servo.Write(0) ; Déplacer le servo vers la droite
Delay(1000) ; Attendre une demi-seconde pour le servo pour y arriver
Scan() ; Accéder à la fonction scan
RightDistance = distance ; Affectez à la variable RightDistance la distance sur la droite
Serial.println ("distance à droite =") ;
Serial.Print(distance) ;
Si (abs (RightDistance - LeftDistance) < 5)
{
moveBackward() ; Accéder à la fonction moveBackward
Delay(200) ; Mettre en pause le programme pendant 200 millisecondes laisser le robot inverser
moveRight() ; Accéder à la fonction moveRight
Delay(100) ; Mettre en pause le programme pendant 200 millisecondes laisser le robot tourner à droite
}
d’autre if(RightDistance < LeftDistance) //If la distance sur la droite est inférieure à celle sur la gauche puis...
{
moveLeft() ; Accéder à la fonction moveLeft
Delay(100) ; Mettre en pause le programme pendant une demi-seconde laisser le robot tourner
}
d’autre if(LeftDistance < RightDistance) //Else si la distance sur la gauche est inférieure à celle de droite puis...
{
moveRight() ; Accéder à la fonction moveRight
Delay(100) ; Mettre en pause le programme pendant une demi-seconde laisser le robot tourner
}