Stap 7: Microcontroller Test
Notities-code: ServoWithFeedback_V1
Dit is de eerste poging (Nou, niet de eerste. Ik zou niet post die puinhoop;) en zij beoogt te nemen een één op één lezing van servo feedback positie, slaan alle 180 punten in een array en vervolgens vergelijken de array nieuwe lezingen naarmate de servo aan hen. Testen voor het vloeiend maken van functionaliteit en sensor drift.
Notities-code: ServoWithFeedback_V2
Hier ben ik het vereenvoudigen van de verwerving van het eerste bereik. Ik neem een hoge en lage lezen op beide uiteinde van het bereik, en ons map() om te correleren met graden. Dit werkt erg goed. Mij zijn troep opwaarts een sweep die vergelijkt de huidige sensor lezingen van de feedback-draad aan de verwachte waarde geretourneerd door map(). De offset is minimale (-1 op 1) op de stijgende lijn. Op de dalende lijn is de offset meer als -4 tot -6. Dit is redelijk consistent en kan worden gewerkt rond in software. Ik was in staat om sommige lichte druk uitoefenen op de Hoorn van de servo naar en het verzetten van de reisrichting, en kreeg enkele mooie waarden waaruit blijkt dat mijn toegepaste kracht.
Hier gaat u, veel plezier.
/ * > servo met Feedback_V1 <
Het testen van code voor servo met gehackte feedback van interne pot.
Servo kabel aangesloten op digital 2
Positie Feedback kabel aangesloten op analoge 0
Een spanning divider voortbouwen ARef pin met twee 10K weerstanden.
De resulterende analoge verwijzing zal worden ~2.2V (Zie http://arduino.cc/en/Reference/AnalogReference)
Dit zal het verhogen van de resolutie van de potentiometer lezen.
Gebruik de volgende opdrachten op de Toggle tussen het lezen van de servo-feedback
en het lezen van elke andere analoge pin die moet zien 5V als referentie
analogReference(EXTERNAL); analoge 1023 ingesteld voltage dat op de ARef pin
analogReference(DEFAULT); Hiermee stelt u analoge 1023 op 5V of 3.3V afhankelijk van voeding
*/
#include //import servo bibliotheek
Servo Servo1; declair de servo!
int lezen [20];
int Feedback [181];
int servoPin1 = 2;
int test; General-Purpose int
int offset = 0;
int lawaai = 50;
int de gemiddelde;
int resultaat;
Boolean gedaan;
VOID Setup {}
Serial.begin(9600); uitgang voor seriële initialiseren
analogReference(EXTERNAL);
pinMode (servoPin1, OUTPUT);
Servo1.attach(servoPin1,570,2400); servo controle op digitale pin 2 inschakelen
setRange(); Ga test het bereik en de waarden instellen
}
void loop {}
Servo1.write(0);
delay(2000);
for (int i = 0; ik < = 180; ik += 10) {}
Servo1.write(i);
vertraging (50);
testen = getFeedback();
offset = test - Feedback [i];
Serial.Print(i);
Serial.Print ("=");
Serial.Print(test);
Serial.Print("");
Serial.Print(offset);
Serial.Print("");
Serial.println(feedback[i]);
}
Serial.println("");
}
ongeldig setRange() {}
Servo1.write(0); Stuur servo naar 0 graden positie
delay(2000); servo genoeg tijd geeft om er te komen
for (int i = 0; ik < = 180; i ++) {}
Servo1.write(i); volgende graad pulse verzenden servo
delay(50); laten dingen regelen naar beneden
Feedback [i] = getFeedback(); Lees de servo-feedback
Serial.Print(i);
Serial.Print ("=");
Serial.println(feedback[i]);
}
}
int getFeedback() {}
for (int j = 0; j < 20; j ++) {}
lezen van [j] = analogRead(0); ruwe gegevens ophalen uit servo potentiometer
delay(3);
} / / Sorteer de laag naar hoog in array van lezingen
= false; duidelijke vlag sorteren
terwijl (gedaan! = true) {/ / eenvoudige swap worden de getallen van de laagste tot hoogste gesorteerd
= true;
for (int j = 0; j < 20; j ++) {}
Als ([j] lezen > lezen [j + 1]) {/ / hier nummers sorteren
testen = lezen [j + 1];
lezen van [j + 1] = lezen van [j];
lezen van [j] = test;
= false;
}
}
}
for (int j = 0; j < 20; j ++) {//un-comment deze for-lus om te zien de raw besteld gegevens
Serial.Print(i);
Serial.Print("");
Serial.println(Reading[j]);
// }
betekenen = 0;
voor (int k = 6; k < 14; k ++) {//discard de hoogste 6 en 6 laagste lezingen
bedoel += lezen [k];
}
resultaat = gemiddelde/8; gemiddelde nuttige lezingen
(resultaat);
}
EINDE VAN SERVO_WITH_FEEDBACK_V1
/ * > servo met Feedback_V2 <
Het testen van code voor servo met gehackte feedback van interne pot.
Servo kabel aangesloten op digital 2
Positie Feedback kabel aangesloten op analoge 0
Een spanning divider voortbouwen ARef pin met twee 10K weerstanden.
De resulterende analoge verwijzing zal worden ~2.2V (Zie http://arduino.cc/en/Reference/AnalogReference)
Dit zal het verhogen van de resolutie van de potentiometer lezen.
Gebruik de volgende opdrachten op de Toggle tussen het lezen van de servo-feedback
en het lezen van elke andere analoge pin die moet zien 5V als referentie
analogReference(EXTERNAL); analoge 1023 ingesteld voltage dat op de ARef pin
analogReference(DEFAULT); Hiermee stelt u analoge 1023 op 5V of 3.3V afhankelijk van voeding
*/
#include //import servo bibliotheek
Servo Servo1; declair de servo!
int feedBack; gebruikt om servo feedback waarde te houden
int mappedPulse; gebruikt om de waarde toegewezen tussen servo bereik en graad bereik te houden
int lowEnd; Servo feedback op 0 graden
int highEnd; Servo feedback op 180 graden
int lezen [20];
int servoPin1 = 2;
int test1; General-Purpose int
int test2;
int offset = 0;
int lawaai = 50;
Boole rangeTest = false;
VOID Setup {}
Serial.begin(9600); uitgang voor seriële initialiseren
analogReference(EXTERNAL);
pinMode (servoPin1, OUTPUT);
Servo1.attach(servoPin1,570,2400); servo controle op digitale pin 2 inschakelen
setRange(); Ga test het bereik en de waarden instellen
}
void loop {}
Servo1.write(0);
delay(2000); wachten om er te komen
voor (int i = 0; ik < 181; i ++) {/ / doorlopen van graden omhoog
Servo1.write(i);
delay(50);
feedBack = getFeedback(); subroutine glad gegevens
mappedPulse = map(i,0,180,lowEnd,highEnd); kaart graden setRange() lezingen
offset = mappedPulse - feedBack; resolutie van toegewezen V werkelijke feedback
printData();
}
voor (int i = 180; ik > 0; ik--) {/ / graden naar beneden doorlopen
Servo1.write(i);
delay(50);
feedBack = getFeedback();
mappedPulse = map(i,0,180,lowEnd,highEnd);
offset = mappedPulse - feedBack;
printData();
}
}
ongeldig printData() {}
Serial.Print(i);
Serial.Print ("=");
Serial.Print(feedBack);
Serial.Print("");
Serial.Print(offset);
Serial.Print("");
Serial.println(mappedPulse);
}
ongeldig setRange() {}
Servo1.write(0);
delay(2000); wachten voor servo om er te komen
lowEnd = getFeedback();
Servo1.write(180);
delay(2000); wachten voor servo om er te komen
highEnd = getFeedback();
rangeTest = true;
Serial.Print ("0 =");
Serial.Print(lowEnd);
Serial.Print("");
Serial.Print ("180 =");
Serial.println(highEnd);
}
int getFeedback() {}
int de gemiddelde;
int resultaat;
int test;
Boolean gedaan;
for (int j = 0; j < 20; j ++) {}
lezen van [j] = analogRead(0); ruwe gegevens ophalen uit servo potentiometer
delay(3);
} / / Sorteer de laag naar hoog in array van lezingen
= false; duidelijke vlag sorteren
terwijl (gedaan! = true) {/ / eenvoudige swap sorteren, worden de getallen van de laagste tot hoogste gesorteerd
= true;
for (int j = 0; j < 20; j ++) {}
Als ([j] lezen > lezen [j + 1]) {/ / hier nummers sorteren
testen = lezen [j + 1];
lezen van [j + 1] = lezen van [j];
lezen van [j] = test;
= false;
}
}
}
betekenen = 0;
voor (int k = 6; k < 14; k ++) {//discard de hoogste 6 en 6 laagste lezingen
bedoel += lezen [k];
}
resultaat = gemiddelde/8; gemiddelde nuttige lezingen
Return(result);
}
EINDE SERVO_WITH_FEEDBACK_V2