Stap 5: Test het hele spul
De servo opgenomen met deze sensor kan het verplaatsen van 180 graden. Omdat ik wil dat de slimme tank om te voorkomen dat iets aan de voorkant, zou het te gevoelig zijn als het vermijdt obstakels op 180 graden. Ik wil dat de servo gaat in zekere mate voor de tank, niet in de volledige omvang van de servo. De servo moet worden gekalibreerd en controleer of 90 graden naar voren wijst. Kunt u de servo tegenwijzerzin totdat het vast komt te zitten. Sluit vervolgens de sensor en op opnieuw wijzend op 9. Na dat u de servo wijst 90 graden rechtsom totdat het naar de voorkant.
Voor de bedrading van de servo, bruin die Arduino GND, rood naar 5V en geel naar pin 7.
Er is een voorbeeld in de Arduino library voor onze referentie: voorbeelden > Servo > sweep. Zoals ik al eerder zei, wil ik niet dat de servo houdt 180 graden, draaien, zodat ik de hoek om voorziet in de behoeften aan te passen. Ik gebruik hier 0 tot 100 graden. Ik heb ook het aanpassen van de servo om ervoor te zorgen dat het beweegt naar voren wijzen. Ik denk dat het antwoord van de servo is nogal traag als het voorbeeld blijven gebruiken, dus ik verwijder het tweede deel van de lus.
#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"); }}
Één probleem: het moet de lus volledig uitgevoerd voordat een andere lus begint. De sensor detecteert een keer alleen wanneer de servo verplaatsen van 0 graden tot 100 graden. Ik wil de sensor detecteren de afstand zonder te wachten de servo beweegt. Met andere woorden wil ik dat de sensor detecteert meerdere keren in één servo rotatie. Hoe dat te doen?