Servo Feedback hacka (gratis) (7 / 8 steg)
Steg 7: Microcontroller Test
Anteckningar-kod: ServoWithFeedback_V1
Detta är det första försöket (Ja, inte först. Jag skulle inte lägga den oredan;) och syftet är att ta en en läsning av servo feedback position, lagra alla 180 poäng i en array och sedan jämföra matrisen till nya avläsningar som servo flyttar till dem. Testning för att jämna funktionalitet och sensor drift.
Anteckningar-kod: ServoWithFeedback_V2
Här jag förenkla inledande rad förvärv. Jag tar en hög och låg läser antingen extrem spänna, och oss map() för att korrelera det med gradersvinklar. Detta fungerar mycket bra. Jag har satt upp en sopa som jämför aktuella sensormätningar från feedback tråd att det förväntade värdet som returneras av map(). Förskjutningen är minimal (-1 till 1) på stigande loop. På de fallande loop är förskjutningen mer lik -4 till -6. Detta är ganska konsekvent och kan bearbetas runt i programvara. Jag fick möjlighet att tillämpa vissa lätt tryck på servo horn mot och motsatta riktningen av reser, och fick några fina värden som styrker min tillämpad kraft.
Varsågod, ha kul.
/ * > servo med Feedback_V1 <
Testa kod för servo med hackade feedback från inre potten.
Servo kontroll kabel ansluten till digital 2
Ståndpunkten Feedback kabel ansluten till analoga 0
Bygga en spänningsavdelare på ARef stift med två 10K motstånd.
Den resulterande analog referensen kommer att vara ~2.2V (se http://arduino.cc/en/Reference/AnalogReference)
Detta kommer att öka upplösningen på potentiometern läsning.
Använd följande kommandon till toggel mellan att läsa servo feedback
och läsa andra analoga stift som behöver se 5V som referens
analogReference(EXTERNAL); anger analoga 1023 till spänning på ARef stift
analogReference(DEFAULT); anger analoga 1023 till 5V eller 3.3V beroende på strömförsörjning
*/
#include //import servo bibliotek
Servo Servo1; declair servo!
int läsa [20].
int Feedback [181].
int servoPin1 = 2;
int-test. generella int
int offset = 0;
int buller = 50;
int menar;
int resultatet;
Boolean gjort;
void setup() {
Serial.BEGIN(9600); initiera serial output
analogReference(EXTERNAL);
pinMode (servoPin1, produktionen);
Servo1.attach(servoPin1,570,2400); slå på servo kontroll på digital pin 2
setRange(); gå testa och ange värden
}
void loop() {
Servo1.write(0);
Delay(2000);
för (int jag = 0; jag < = 180, jag += 10) {
Servo1.write(i);
fördröjning (50);
testa = 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("");
}
void setRange() {
Servo1.write(0); Skicka servo till 0 graders position
Delay(2000); ge servo tillräckligt med tid för att komma dit
för (int jag = 0; jag < = 180, i ++) {
Servo1.write(i); Skicka nästa grad puls till servo
Delay(50); låta saker bosätta
Feedback [i] = getFeedback(); Läs den servo feedbacken
Serial.Print(i);
Serial.Print ("=");
Serial.println(feedback[i]);
}
}
int getFeedback() {
för (int j = 0; j < 20; j ++) {
läsa [j] = analogRead(0); få rådata från servo potentiometer
Delay(3);
} / / sortera arrayen avläsningar låg till hög i
= false; Rensa sortering flagga
medan (gjort! = sant) {/ / enkel swap sorterar siffror från lägsta till högsta
= sant;
för (int j = 0; j < 20; j ++) {
om (läst [j] > läsa [j + 1]) {/ / sortering nummer här
testa = läsning [j + 1];
läsa [j + 1] = läsning [j];
läsa [j] = test;
= false;
}
}
}
för (int j = 0; j < 20; j ++) {//un-comment denna för-slinga för att se den råa beställde data
Serial.Print(i);
Serial.Print("");
Serial.println(Reading[j]);
// }
menar = 0;
för (int k = 6; k < 14; k ++) {//discard 6 högsta och lägsta 6 avläsningar
menar += läsning [k];
}
resultat = medelvärdet/8. genomsnittliga användbara mätvärden
returnera (resultat);
}
SLUTET AV SERVO_WITH_FEEDBACK_V1
/ * > servo med Feedback_V2 <
Testa kod för servo med hackade feedback från inre potten.
Servo kontroll kabel ansluten till digital 2
Ståndpunkten Feedback kabel ansluten till analoga 0
Bygga en spänningsavdelare på ARef stift med två 10K motstånd.
Den resulterande analog referensen kommer att vara ~2.2V (se http://arduino.cc/en/Reference/AnalogReference)
Detta kommer att öka upplösningen på potentiometern läsning.
Använd följande kommandon till toggel mellan att läsa servo feedback
och läsa andra analoga stift som behöver se 5V som referens
analogReference(EXTERNAL); anger analoga 1023 till spänning på ARef stift
analogReference(DEFAULT); anger analoga 1023 till 5V eller 3.3V beroende på strömförsörjning
*/
#include //import servo bibliotek
Servo Servo1; declair servo!
int feedBack; används för att hålla servo feedback värde
int mappedPulse; används för att hålla värdet mappas mellan servo och grad
int lowEnd; servo feedback vid 0 grader
int highEnd; servo feedback på 180 grader
int läsa [20].
int servoPin1 = 2;
int test1; generella int
int test2;
int offset = 0;
int buller = 50;
booleska rangeTest = false;
void setup() {
Serial.BEGIN(9600); initiera serial output
analogReference(EXTERNAL);
pinMode (servoPin1, produktionen);
Servo1.attach(servoPin1,570,2400); slå på servo kontroll på digital pin 2
setRange(); gå testa och ange värden
}
void loop() {
Servo1.write(0);
Delay(2000); vänta att få det
för (int jag = 0; jag < 181; i ++) {/ / loop genom grader går upp
Servo1.write(i);
Delay(50);
feedBack = getFeedback(); subrutin slätar data
mappedPulse = map(i,0,180,lowEnd,highEnd); karta grader till setRange() läsningar
offset = mappedPulse - feedBack; resolution av mappade V faktiska feedback
printData();
}
för (int jag = 180, jag > 0; i--) {/ / loop genom grader går ner
Servo1.write(i);
Delay(50);
feedBack = getFeedback();
mappedPulse = map(i,0,180,lowEnd,highEnd);
offset = mappedPulse - feedBack;
printData();
}
}
void printData() {
Serial.Print(i);
Serial.Print ("=");
Serial.Print(feedBack);
Serial.Print("");
Serial.Print(offset);
Serial.Print("");
Serial.println(mappedPulse);
}
void setRange() {
Servo1.write(0);
Delay(2000); vänta på servo att komma dit
lowEnd = getFeedback();
Servo1.write(180);
Delay(2000); vänta på servo att komma dit
highEnd = getFeedback();
rangeTest = sant;
Serial.Print ("0 =");
Serial.Print(lowEnd);
Serial.Print("");
Serial.Print ("180 =");
Serial.println(highEnd);
}
int getFeedback() {
int menar;
int resultatet;
int-test.
Boolean gjort;
för (int j = 0; j < 20; j ++) {
läsa [j] = analogRead(0); få rådata från servo potentiometer
Delay(3);
} / / sortera arrayen avläsningar låg till hög i
= false; Rensa sortering flagga
medan (gjort! = sant) {/ / enkel swap sortera, sorterar siffror från lägsta till högsta
= sant;
för (int j = 0; j < 20; j ++) {
om (läst [j] > läsa [j + 1]) {/ / sortering nummer här
testa = läsning [j + 1];
läsa [j + 1] = läsning [j];
läsa [j] = test;
= false;
}
}
}
menar = 0;
för (int k = 6; k < 14; k ++) {//discard 6 högsta och lägsta 6 avläsningar
menar += läsning [k];
}
resultat = medelvärdet/8. genomsnittliga användbara mätvärden
Return(Result);
}
SLUTET SERVO_WITH_FEEDBACK_V2