Hallo
Hier nochmal der Quellcode für mein Video inkl. Erklärung:
Code:
// Servo-Sensor an einem Greifer 4.3.2010 Thund3r
static int reset,durch,durch2,stop,count; //Variablen die von verschiedenen Methoden verändert werden können
void gtest(void)
{
int c;
if(reset==0) // Wird nur einma zu Beginn des Programmes aufgerufen
{
for(c=0;c<=50;c++)
{
ServoG(12);
}
for(c=0;c<=50;c++)
{
ServoG(21);
if(durch>durch2) // Ermittelt den höchsten Schwellwert
{
durch2=durch; // Speichert diesen
}
mSleep(40);
}
reset=1; // Damit es nur einmal ausgeführt wird
}
for(c=0;c<=50;c++)
{
ServoG(12); //Greifarm öffnet sich
}
setLEDs(0b0000);
mSleep(200);
for(c=0;c<=50;c++)
{
if(stop==0) // Wenn alles ok Greif zu
{
ServoG(21);
mSleep(40);
}
else {mSleep(50);} // Wenn Widerstand erkannt (s.u.) halte Position
if(durch>durch2) //Wenn Belastung höher als ermittelter Grenzwert
{
count++; // Anzahl der Grenzwertüberschreitungen
}
else{count=0;} // Wenn Grenzwert nur einmalig erreicht wurde verwerfe den Entrag
if(count==2) //Wenn Grenzwert 2 mal Überschritten wird tritt Aktion in Kraft (Anzahl variabel)
{
setLEDs(0b1111);
count=0;
stop=1; // Greifvorgang wird abgebrochen und Position gehalten s.o.
}
}
stop=0;
mSleep(200);
}
void messG() // Messmethode
{
uint16_t adc5 = readADC(ADC_5); // Messwert einlesen
clearLCD();
durch=adc5; // Übergeben damit andere Methoden damit arbeiten können
setCursorPosLCD(0, 0);
writeStringLCD("Belastung: "); // Ausgabe auf LCD Display
writeIntegerLCD(adc5, DEC);
}
void ServoG(uint8_t pos) // Zur Ansteuerung des Servos
{
DDRC |= IO_PC7; // Pin auf Ausgang
PORTC |= IO_PC7; // High
sleep(pos); // Stellzeit
PORTC &= ~IO_PC7; // Low
DDRC &= ~IO_PC7; // Pin auf Eingang
sleep(5);
messG(); // messen
sleep(180);
}
Prakitsch zum schonen der Greifmechanik, wenn der Arm etwas nicht zu fest drücken darf, um zu überprüfen ob die gewünnschte Servo Position erreicht wurde oder ob der Servo noch in Bewegung ist etc.
Gruß Thund3r
Lesezeichen