Étape 5: Tester les choses ensemble
Le servo inclus avec ce capteur peut se déplacer à 180 degrés. Parce que je veux le réservoir intelligent pour éviter quoi que ce soit à l’avant, il serait trop sensible si il évite les obstacles à 180 degrés. Je veux que le servo se déplace dans certaine devant le réservoir, pas dans l’ampleur réelle du servo. Le servo doit être calibrer et vérifiez que 90 degrés est dirigé vers l’avant. Vous pouvez activer le servo dans le sens anti-horaire jusqu'à ce que ça coince. Puis branchez le capteur et sur nouveau pointant à 9. Après que tourner le servo 90 degrés dans le sens horaire jusqu'à ce qu’il pointe vers l’avant.
Pour le câblage de l’asservissement, l’une brune au Arduino GND, rouge à 5V et jaune à la broche 7.
Il y a un exemple dans la bibliothèque de l’Arduino pour notre référence : exemples > servos > coupe-bise. Comme je l’ai dit avant, je ne veux pas que le servo met à tourner à 180 degrés, donc j’ai régler l’angle de manière à s’adapter au besoin. J’utilise ici le degré de 0 à 100. J’ai également ajuster le servo pour s’assurer qu’il déplace pointant vers l’avant. Je pense que la réponse du servo est assez lente cas continuer à utiliser l’exemple, donc j’ai supprimer la deuxième partie de la boucle.
#include <Servo.h>#define trigPin 5#define echoPin 6Servo myservo; // create servo object to control a servo // a maximum of eight servo objects can be created int pos = 0; // variable to store the servo position int servoDirection = 100;int servoDelay = 20;int motorPin = 8; //right side to IB - forwardint motorPin2 = 9; //left side to IA - forwardint motorPin3 = 10; //right side to IA - backwardint motorPin4 = 11; //left side to IB - backwardvoid setup() { Serial.begin (9600); myservo.attach(7); // attaches the servo on pin 7 to the servo object myservo.write(pos); pinMode(motorPin, OUTPUT); pinMode(motorPin2, OUTPUT); pinMode(motorPin3, OUTPUT); pinMode(motorPin4, OUTPUT); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT);}void forward(){ digitalWrite(motorPin, HIGH); digitalWrite(motorPin2, HIGH); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW); } void backward() { digitalWrite(motorPin, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, HIGH); digitalWrite(motorPin4, HIGH); } void turnLeft() { digitalWrite(motorPin, HIGH); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, HIGH); } void turnRight() { digitalWrite(motorPin, LOW); digitalWrite(motorPin2, HIGH); digitalWrite(motorPin3, HIGH); digitalWrite(motorPin4, LOW); }int CheckDistance(){ long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29.1; return distance;}void sweepServo(){ for(pos = 0; pos < 100; pos += 1) // goes from 0 degrees to 100 degrees { // in steps of 1 degree myservo.write(pos); // tell servo to go to position in variable 'pos' delay(10); }}void loop() { sweepServo(); int testDistance = CheckDistance(); /// get object distance using ping /// if object is more than 30 cm away it is out of range if (testDistance >= 30 || testDistance <= 0) /// if object is more than 30 cm away it is out of range and goes forward { Serial.println("out of range"); forward(); } else /// object is closer than 30cm, turn right and print distance { turnRight(); Serial.print(testDistance); Serial.println("cm"); }}
Un problème se pose : il faut exécuter la boucle complètement avant une autre boucle commence. Le détecteur détecte une fois seulement quand le servo se déplacent de 0 degré à 100 degrés. Je veux que le capteur de détection de la distance sans attendre le servo se déplace. En d’autres termes, je veux que le capteur détecte plusieurs fois dans la rotation d’un servo. Comment faire cela ?