PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] RP6 Linien folger mit vorhandenen Sensoren Problem mit dem Motor Regler



robotmafiosi
04.04.2013, 18:56
Hallo
Dies ist mein erstes richtiges Projekt am RP6, und zwar versuche ich einer schwarzen Linie auf hellem Untergrund zu folgen, und das nur über die mitgelieferten Sensoren des RP6 (denke das ich noch zu blöd bin um eigene anzuschließen).
Jetzt kommt das Problem:mad:, der Roboter erkennt den unterschied ziwischen Linie und Untergrund inzwischen recht souverän und fährt dann auch in die richtige Richtung an, doch nach einer geschätzten halben Sekunde bleibt er stehhen und stockt höchstens noch einmal. Dann kommt die Meldung über die Schnittstelle, dass etwas mit dem Motor Strom nicht in Ordnung ist und der RP6 deswegen resettet werden muss . Ich hatte das schon öfter und habe deswegen die üblichen Fehlerquellen wie fehlendes powerON(); oder fehlendes task_motionControl(); schon überprüft . Allerdings habe ich keine Fehler gefunden . Da ich noch nicht so bewandert im Programmieren binn frage ich jetzt euch was denn der Fehler sein könnte .
Denke dass es irgentetwas simples ist, dass ich übersehen habe und hoffe das auch kann aber nichts finden. Danke in voraus für die Mühen und die Antwort :)
VG Robotmafiosi

// kleines Programm zur linien folgung mti fhelerhafter motoransteuerung

#include "RP6RobotBaseLib.h"






//-------------------------------------------------------------------------------------------------------------------------------------------------
int main(void)
{

initRobotBase();
uint16_t untergrund;
uint16_t linie ;
uint16_t differenz ;
startStopwatch1();
powerON();
writeString_P(" \\| RP6 Robotmafiosi s SYSTEM |/\n");
writeString_P(" \\| programm zur linienerkennung |/\n");
task_motionControl();
startStopwatch3();
changeDirection(FWD);


setLEDs(0b100100);
mSleep(5000);
untergrund = readADC(ADC_LS_L);
mSleep(1000);
setLEDs(0b011011);
mSleep(5000);
linie = readADC(ADC_LS_L);
differenz = untergrund - linie;
writeInteger(untergrund,DEC); writeString_P("\n");
writeInteger(linie,DEC); writeString_P("\n");
writeInteger(differenz,DEC); writeString_P("\n");
setLEDs(0b000000);





while(true)
{







if(readADC(ADC_LS_L) < untergrund - (3/4*differenz)) {moveAtSpeed(10,30); setLEDs(0b000111);}

else if(readADC(ADC_LS_L) > linie + (3/4*differenz)) {moveAtSpeed(30,10); setLEDs(0b111000);}

else {moveAtSpeed(30,30); setLEDs(0b100100);}


task_motionControl();
task_RP6System();
task_ADC();

}

return 0;

}

SlyD
05.04.2013, 10:10
Hallo,

Du darfst readADC() nicht verwenden wenn Du task_ADC() oder task_RP6System() nutzt.
task_ADC übernimmt das Auslesen aller ADC Kanäle sequentiell hintereinander (da gibts Variablen wo die Werte drinstehen) - aber wenn Du da mit eigenen Lesevorgängen reinfunkst kommen falsche Messwerte dabei heraus.
task_ADC und task_MotionControl musst Du nicht aufrufen, die sind alle in task_RP6System enthalten.


MfG,
SlyD

robotmafiosi
05.04.2013, 11:51
ok danke werde das ändern
hab grad in der Anleitung zum RP6 nochmal nachgeschaut und das noch mal nachgelesen
VG
Robotmafiosi