It is currently Wed May 22, 2013 8:13 pm
       


All times are UTC + 1 hour




Post new topic Reply to topic  [ 15 posts ] 
Author Message
 Post subject: RP6 über mITX Board steuern
PostPosted: Tue Dec 20, 2011 10:16 am 
Offline
arexx.com user

Joined: Tue Dec 20, 2011 9:52 am
Posts: 7
Moin moin,

wir (eine kleine Gruppe von 4 TI-Studenten) haben uns als Projektarbeit das Ziel gesetzt, den RP6 via Kinect zu steuern.
Wir stehen noch relativ weit am Anfang, mittlerweile steht der Hardwareaufbau und wir planen gerade unsere Software.
Soweit ich das bisher lese und mir die freie Software angeschaut habe, sollte es doch möglich sein, den RP6 über das mitgelieferte USB Interface zu steuern, oder? Oder muss ich wirklich, die PINs für den I²C Bus über eine serielle Schnittstelle verfügbar machen? Ich meine ja gelesen zu haben, dass das USB Interface ja quasi eine serielle Schnittstelle (UART) ist, oder bin ich nun total durcheinander?
Hier mal ein kleines Schmankerl wie er im Moment aussieht:

Image

Also, wenn ich mir die RP6I2CmasterTWI.c anschaue sind dort ja alle Funktionen zum Übertragen von Daten vorhanden. Allerdings soll der Microcontroller eher als Slave des mini ITX-Boards fungieren, also warten bis Daten kommen und dann dementsprechend reagieren.
Oder muss dann auf dem mITX Board quasi der "RP6I2Cmaster" laufen und auf der RP6 dann quasi als "RP6I2Cslave" ?
Macht doch eigentlich keinen Sinn, da diese sich gegenseitig ausschließen...

Soviele Fragen hoffen auf baldige Antworten =)

greetZ
Retnu


Top
 Profile E-mail  
 
 Post subject: Re: RP6 über mITX Board steuern
PostPosted: Tue Dec 20, 2011 11:31 am 
Offline
Administrator
User avatar

Joined: Fri Mar 25, 2005 6:19 pm
Posts: 1378
Location: NRW
Hallo,

sehr hübsch :gear_grin:
(allerdings auch ziemlich groß im Vergleich zum RP6 :mrgreen: )


> Ich meine ja gelesen zu haben, dass das USB Interface ja quasi eine serielle Schnittstelle (UART) ist,

Über den Treiber wird ein virtueller Serieller Port bereitgestellt.
Unter Windows ganz normal irgendein COMx und unter Linux /dev/ttyUSBx
(x = jeweils irgendeine Nummer die noch frei war)

Das kann mit den ganz normalen APIs für serielle Schnittstellen angesteuert werden.

Auf dem RP6 braucht man dann nur noch einen Interpreter der die Kommandos parst. Beispiel: Das Selftest Programm!
Und natürlich auch die anderen Beispiele zur seriellen Schnittstelle (Frage Antwort Spielchen... )


> Oder muss dann auf dem mITX Board quasi der "RP6I2Cmaster" laufen und
> auf der RP6 dann quasi als "RP6I2Cslave" ?
> Macht doch eigentlich keinen Sinn, da diese sich gegenseitig ausschließen...

Warum?
Schau Dir die Beispiele zum RP6-M32 Modul an, da sieht man wie das funktioniert.
(der RP6 ist da auch Slave und das M32 Modul der Master... )

MfG,
SlyD


Top
 Profile E-mail  
 
 Post subject: Re: RP6 über mITX Board steuern
PostPosted: Mon Jan 16, 2012 10:50 am 
Offline
arexx.com user

Joined: Tue Dec 20, 2011 9:52 am
Posts: 7
Moin moin,

so Kommunikation klappt soweit und die ersten Tests laufen.
Leider tut sich uns ein Problem auf, das zu lösen wir anscheinend nicht fähig sind.
Wir haben ein Slave Programm geschrieben, das nur auf Befehle wartet,
um sich dann auf eine bestimmte Position zu drehen mit der Funktion rotate().
Leider steigt der RP6 genau dabei aus. In dem Moment wo wir den Befehl rotate() ausführen,
startet der RP6 zwar in die richtige Richtung zu drehen, allerdings beschleunigt er hoch,
anstatt mit der vorgegebenen Geschwindigkeit zu drehen.
Nach kurzer Beschleunigungsphase stoppt er dann mit einer encoder malfunction.

Selbstverständlich haben wir daraufhin nochmal den Encoder Test drüberlaufen lassen und festgestellt,
dass die Codierscheibe wellig ist,
nach erneutem ankleben dieser auf das Zahnrad und das erneute justieren des Encoders stellen wir gleiches Verhalten fest.
So sieht der rotate() aufruf aus:

Code:
   
[...]
if(dir == 0)
   {
      rotate(SPEED, LEFT, diff, true);
   }
   else
   {
      rotate(SPEED, RIGHT, diff, true);
   }
[...]


SPEED ist in der Header per #define definiert auf 50.
RIGHT LEFT sind ja vorgegeben, diff ist vom typ uint16_t
und beinhaltet den Winkel, um den sich der RP6 drehen soll.

Wenn irgendwer noch eine Idee hat wonach man schauen kann, bitte melden.
Wir wollen nicht schon wieder einen neuen RP6 bestellen >.<
Das wäre der dritte...

s0 l0ng
Retnu


Edit:

Hab es nach intensiveren Suchen dann doch gefunden, nachdem ich jetzt mal Zeit dazu hatte :-)


Top
 Profile E-mail  
 
 Post subject: Re: RP6 über mITX Board steuern
PostPosted: Mon Jan 16, 2012 7:06 pm 
Offline
Administrator
User avatar

Joined: Fri Mar 25, 2005 6:19 pm
Posts: 1378
Location: NRW
Hallo,

funktionieren die normalen Demo Programme und läuft der Motortest normal durch?

Falls ja, dann fehlt vermutlich einfach nur das powerOn() !
(die Gelbe LED muss leuchten sonst sind die Drehgeber deaktiviert!)


> Das wäre der dritte...

Nächstes mal kontaktiert mich bitte *vorher* per Mail, die meisten Problemchen
kann man ohne Umtausch lösen.

Quote:
Edit:

Hab es nach intensiveren Suchen dann doch gefunden, nachdem ich jetzt mal Zeit dazu hatte :-)


Was gefunden?

MfG,
SlyD


Top
 Profile E-mail  
 
 Post subject: Re: RP6 über mITX Board steuern
PostPosted: Thu Jan 19, 2012 10:48 am 
Offline
arexx.com user

Joined: Tue Dec 20, 2011 9:52 am
Posts: 7
Moin SlyD,

Quote:
powerOn()
aaaaaaight :wink:

Passiert, bin da noch nicht so drin im RP6 Programmieren :)

Im Moment haben wir ein kleines Buffer Problem,
iwie kommen die Sachen die von dem ITX-Board geschickt werden nicht richtig aufm RP6 an,
bin aber noch nicht soweit das detailliert zu beschreiben.

Einen zusätzlichen RP6 schaffen wir uns so oder so an, einfach um felxibler zu sein :-)

Danke für Deine Hilfe

greetZ
Retnu


Edit:

Wir machen gerade einen Belastungstest mit dem RP6 + Gewicht,
leider fährt er aus diesem Beispiel nicht die eingestellten 180°...
Code:
setLEDs(0b100100);
move(60, FWD, DIST_MM(300), true); // 30cm Vorwärts fahren
setLEDs(0b100000);
rotate(50, LEFT, 180, true); // um 180° nach links drehen
setLEDs(0b100100);
move(60, FWD, DIST_MM(300), true); // 30cm Vorwärts fahren
setLEDs(0b000100);
rotate(50, RIGHT, 180, true); // um 180° nach rechts drehen

Liegt das an dem Gewicht + Reibung der Ketten ??

Edit2:
Längere Beobachtungen zeigen, dass die Formschlüssige Verbindung von Kette zu Antriebsrad manchmal nicht greift.
Hat da jemand Erfahrungen mit gemacht? Und das vielleicht optimiert?


Top
 Profile E-mail  
 
 Post subject: Re: RP6 über mITX Board steuern
PostPosted: Thu Jan 19, 2012 2:24 pm 
Offline
Administrator
User avatar

Joined: Fri Mar 25, 2005 6:19 pm
Posts: 1378
Location: NRW
Hallo,

Quote:
Im Moment haben wir ein kleines Buffer Problem,


Wieviele Daten sollen denn zum Mikrocontroller gesendet werden?
Es gibt fertige Routinen um z.B. eine Textzeile mit X Bytes zu empfangen (s. Selftest Programmcode)
Die Buffergröße ist einstellbar - der Empfang läuft über einen Interrupt gesteuerten Ringpuffer.


Quote:
Wir machen gerade einen Belastungstest mit dem RP6 + Gewicht,
leider fährt er aus diesem Beispiel nicht die eingestellten 180°...


Das ist wegen der Kettenreibung normal, die Encoder können ja schlecht wissen wie stark die Reibung auf dem jeweiligen Untergrund ist (Fliesen, Teppich, Parkett - verhält sich alles unterschiedlich). Die zählen nur wie weit der Motor dreht - was aber nichts damit zu tun hat wie weit der Roboter dadurch voran kommt wenn die Reibung entsprechend hoch ist.
Ist allgemein bei ALLEN Kettenfahrzeugen so und allgemein auch bei vielen anderen Roboterbauformen ein übliches Problem.

Bei hohem Gewicht ist das natürlich noch problematischer.
Das steht detaillierter in der RP6 Anleitung beschrieben.

Grobe Lösung: Man muss testen wie weit er tatsächlich dreht und dann die Software entsprechend anpassen (es gibt da eine Config Datei... s. Anleitung).
100% genau wird das allerdings nicht gehen. Da müsst ihr besser eure Kinect benutzten!
(irgendeinen Sinn muss das hohe zusätzliche Gewicht ja haben ;) )

MfG,
SlyD


Top
 Profile E-mail  
 
 Post subject: Re: RP6 über mITX Board steuern
PostPosted: Thu Jan 19, 2012 3:12 pm 
Offline
arexx.com user
User avatar

Joined: Sun Jan 14, 2007 6:02 pm
Posts: 131
Location: Stuttgart
Hallo

Ein schickes Projekt.

Da ich bei meinem aktuellen Projekt nur Kommandostrings übertrage, verwende ich keinen Ringpuffer sondern lösche den Puffer nach der Interpretation des Kommandos. USART-Setup wie beim RP6 mit aktivem Empfangsinterrupt:
Code:
   /************************ UART-Setup für cat16 *******************************/
   #define BAUD_LOW      38400  //Low speed - 38.4 kBaud
   #define UBRR_BAUD_LOW   ((F_CPU/(16*BAUD_LOW))-1)

   UBRRH = UBRR_BAUD_LOW >> 8;   // Baudrate is Low Speed
   UBRRL = (uint8_t) UBRR_BAUD_LOW;
   UCSRA = 0x00;
   UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
   UCSRB = (1 << TXEN) | (1 << RXEN) | (1 << RXCIE); // Senden, Empfangen und Empfang-ISR einschalten
   /***************************************************************************/


ISR mit Puffer:
Code:
/************************* Ausgabe an Terminal ********************************/
void writeChar(char ch) {while (!(UCSRA & (1<<UDRE))); UDR = (uint8_t)ch;}
void writeString(char *string) {while(*string) writeChar(*string++);}
void writeInteger(int16_t number, uint8_t base)
   {char buffer[17]; itoa(number, &buffer[0], base); writeString(&buffer[0]);}
/******************************************************************************/

volatile uint8_t usart_puffer[25], usart_write=0, usart_read=0, eingabe=0;

SIGNAL (SIG_UART_RECV)
{
    usart_puffer[usart_write]=UDR;
    if(usart_puffer[usart_write++] == 13) eingabe=1; // CR empfangen
    if(usart_write > 24) {usart_write=24; eingabe=2;} // Pufferüberlauf!
}


Auswertung:
Code:
   while(1)
   {
      if(eingabe)
      {
         leds(green);
/*
         for(temp8=usart_read; temp8<usart_write; temp8++)
         {
            writeChar(usart_puffer[temp8]);
         }
         writeChar('\n');
*/
         if(usart_puffer[0] == 'a')
         {
            if(usart_puffer[2] == ',') // Komma richtig gesetzt?
            {
               servonr=(usart_puffer[1]-'0');
               servo_pos_a[servonr]=(usart_puffer[3]-'0')*100+(usart_puffer[4]-'0')*10+usart_puffer[5]-'0';
               writeString("Servo: A");
               writeInteger(servonr, 10);
               writeString(" = ");
               writeInteger(servo_pos_a[servonr],10);
               writeChar('\n');
            }
            else writeString("Fehler: Komma im Datensatz!\n");
         }
         else if(usart_puffer[0] == 'b')
         {
            if(usart_puffer[2] == ',')
            {
               servonr=(usart_puffer[1]-'0');
               servo_pos_b[servonr]=(usart_puffer[3]-'0')*100+(usart_puffer[4]-'0')*10+usart_puffer[5]-'0';
               writeString("Servo: B");
               writeInteger(servonr, 10);
               writeString(" = ");
               writeInteger(servo_pos_b[servonr],10);
               writeChar('\n');
            }
            else writeString("Fehler: Komma im Datensatz!\n");
         }
         else if(usart_puffer[0] == 'c')
         {
            // DB,aaa,bbb,ccc
            // 01234567890123
            if((usart_puffer[2]+usart_puffer[6]+usart_puffer[10]) == (3*',')) // alle Kommas richtig gesetzt?
            {
            beinnr=usart_puffer[1]-'0';
            posa=(usart_puffer[3]-'0')*100+(usart_puffer[4]-'0')*10+usart_puffer[5]-'0';
            posb=(usart_puffer[7]-'0')*100+(usart_puffer[8]-'0')*10+usart_puffer[9]-'0';
            posc=(usart_puffer[11]-'0')*100+(usart_puffer[12]-'0')*10+usart_puffer[13]-'0';

            writeString("Bein: ");
            writeInteger(beinnr, 10);
            writeString(" = ");
            writeInteger(posa,10);
            writeChar(' ');
            writeInteger(posb,10);
            writeChar(' ');
            writeInteger(posc,10);
            writeChar('\n');
            kommando_c(beinnr, posa, posb, posc);
            }
            else writeString("Fehler: Kommas im Datensatz!\n");
         }
         else if(usart_puffer[0] == 'd')
         {
            // DB,aaa,bbb,ccc
            // 01234567890123
            if((usart_puffer[2]+usart_puffer[6]+usart_puffer[10]) == (3*',')) // alle Kommas richtig gesetzt?
            {
            beinnr=usart_puffer[1]-'0';
            posa=(usart_puffer[3]-'0')*100+(usart_puffer[4]-'0')*10+usart_puffer[5]-'0';
            posb=(usart_puffer[7]-'0')*100+(usart_puffer[8]-'0')*10+usart_puffer[9]-'0';
            posc=(usart_puffer[11]-'0')*100+(usart_puffer[12]-'0')*10+usart_puffer[13]-'0';

            writeString("Alle Beine: ");
            writeInteger(beinnr, 10);
            writeString(" = ");
            writeInteger(posa,10);
            writeChar(' ');
            writeInteger(posb,10);
            writeChar(' ');
            writeInteger(posc,10);
            writeChar('\n');
            kommando_d(beinnr, posa, posb, posc);
            }
            else writeString("Fehler: Kommas im Datensatz!\n");
         }
         else writeString("Fehler: Unbekanntes Kommando!\n");
         
         usart_read=0;
         usart_write=0;
         eingabe=0;
         leds(red);
      }
   }


Gruß

mic


Top
 Profile  
 
 Post subject: Re: RP6 über mITX Board steuern
PostPosted: Sun Jan 22, 2012 11:12 am 
Offline
arexx.com user

Joined: Tue Dec 20, 2011 9:52 am
Posts: 7
Moin,

das Problem mit dem mit dem Gewicht und den 180° liegt vor allem dadran,
dass die Formschlüssige Verbindung von Kette zu Antriebsrad einfach schlecht ist.
Die Kette nimmt die Kraft manchmal einfach nicht auf, was dazu führt,
dass das Antriebsrad zwar treibt, aber die Kette "stillsteht".
Eigentlich müsste man es irgendwie hinkriegen die Haftung der Gummikette auf dem Plastikrad zu erhöhen.
Ja genau Gummi auf Plastik, eh schon nicht die beste Idee ;-) aber es muss ja auch bezahlbar bleiben das Konzept.

Das "Buffer - Problem" hab ich mehr oder weniger einfach gelöst, lag an dem "PC-Programm", hatte nix mit dem RP6 zu tun.
Die Daten die wir übertragen sind alles nur einfache chars und davon immer nur 1 pro Befehl.
Alles nix wildes.

Weiter geht die super Fahrt und danke für die ganzen Rückmeldungen :-)

Vielleicht stellen wir unser Projekt mal vor wenn es fertig wird hier im Forum

greetZ
Retnu


Top
 Profile E-mail  
 
 Post subject: Re: RP6 über mITX Board steuern
PostPosted: Sun Jan 22, 2012 11:56 am 
Offline
arexx.com user
User avatar

Joined: Sun Jan 14, 2007 6:02 pm
Posts: 131
Location: Stuttgart
Quote:
Eigentlich müsste man es irgendwie hinkriegen die Haftung der Gummikette auf dem Plastikrad zu erhöhen.

Vielleicht könnte man die Räder mit Schleifpapier aufrauhen oder bekleben? Vermutlich würde es den Verschleiss erhöhen, das wäre aber zu verkraften: http://www.conrad.de/ce/de/product/191333/

Man könnte auch ein zweites Fahrwerk kaufen und dessen Antriebe zusätzlich in den RP6 einbauen. Wenn ich mich recht erinnere sollte der Motortreiber auch zwei parallel geschaltete Antriebsmotore verkraften können.

http://www.roboternetz.de/community/thr ... post496583

Aha, Dauerstrom 2,4A, 10Sek.-Spitze 3,5A
Datenblatt des IRF7309PBF: http://arexx.com/rp6/downloads/RP6_Datasheets.zip


Top
 Profile  
 
 Post subject: Re: RP6 über mITX Board steuern
PostPosted: Sun Jan 22, 2012 3:14 pm 
Offline
Administrator
User avatar

Joined: Fri Mar 25, 2005 6:19 pm
Posts: 1378
Location: NRW
@Retnu:
> aber es muss ja auch bezahlbar bleiben das Konzept.

Genau - der RP6 ist ein low cost Roboter.
Das er für eure Zuladung eigentlich nicht ausgelegt ist, sollte schon allein durch die Größe eures Aufbaus im Vergleich zum RP6 klar sein. Bei normalen Zuladungen funktioniert das natürlich besser.
Wieviel wiegt der Aufbau denn insgesamt? Ich schätze mal mehr als doppelt soviel für was der RP6 eigentlich ausgelegt ist.

Und wie ich schon schrieb - schau Dir das in Anhang B der Anleitung verlinkte umbmark.pdf an.
Abweichungen gibts auch bei viel viel teureren und größeren Kettenfahrzeugen das liegt eben daran das die Ketten beim rotieren über den Boden REIBEN - geht ja prinzipbedingt auch nicht anders.

@mic:
Auf allen RP6 seit 2010 sind es SP8M3 von ROHM. Die sind noch etwas besser.

MfG,
SlyD


Top
 Profile E-mail  
 
 Post subject: Re: RP6 über mITX Board steuern
PostPosted: Tue Jan 24, 2012 10:19 am 
Offline
arexx.com user

Joined: Tue Dec 20, 2011 9:52 am
Posts: 7
Moin moin,

soooo es ist mal wieder soweit, ich verstehe nicht warum der RP6 das tut was er tut :hmm:

Also, folgender Quelltext:

main
Code:
// Main loop:   
while(true)               
{

//task_motionControl();      //always call this every cycle (or faster) for moving
task_RP6System();

   #ifdef DEBUG               //Debugmode
   setLEDs(0b000000);             //All LEDs off
   #endif
   
   emergency_stop = read_buffer(&receivedData[0], &emergency_stop);//read incomming data
   if(emergency_stop == 1)         //everything is ok, work with data
   {
      rotate_command(receivedData);
      if(isMovementComplete())
      {
         changeDirection(FWD);
         moveAtSpeed(speed,speed);
         mSleep(500);
         writeString_P("ich bin im fertig move mode");
      }
   }
   if(emergency_stop == -1)   //emergency stop
   {
      writeString_P("!!!EMERGENCY STOP DETECTED!!!");
      moveAtSpeed(0 , 0);
      stop();
      powerOFF();            //turn motors + encoders off
   }
   if(emergency_stop == 0)      //reset emergency stop
   {
      writeString_P("Emergency Stop resetted!");
      powerON();            //power on encoder and motors
   }
}
// End of main loop
/*****************************************************************************/ 
return 0;
}


Problem ist nun, dass der RP6 beim Aufruf von "rotate_command()" nicht 100% das tut was er soll.
Die Funktion rotate_command() ist eine einfache switch case Zuordnung der emfangenen Daten.
Von ihr wird die Funktion "set_angle()" aufgerufen.

Code:
void set_angle(uint16_t des_angle)
{
uint16_t diff=0;         //difference between act_angle and des_angle
uint16_t dir=2;            // turn left(1) or turn right(0)?

#ifdef DEBUG                 //Debugmode
writeChar('\t');            //some Data Output
writeInteger(diff, DEC);
writeChar('\t');
writeInteger(act_angle, DEC);
writeChar('\t');
writeInteger(des_angle, DEC);
writeChar('\t');
#endif

if(act_angle > des_angle)
{
   diff = act_angle - des_angle;
   if(diff > 180)
   {
      diff = 360 - diff;
      dir = 1;
   }
   else
   {
      dir = 0;         //direction left
   }
}
else if(act_angle < des_angle)
{
   diff = des_angle - act_angle;
   if(diff > 180)
   {
      diff = 360 - diff;
      dir = 0;
   }
   else
   {
      dir = 1;         //direction right
   }
}
else
{
   return;
}
if(dir == 0)
{
   rotate(speed, LEFT, diff, true);
}
else
{
   rotate(speed, RIGHT, diff, true);
}

act_angle = des_angle;      //set actual angle

#ifdef DEBUG            //Debugmode
writeInteger(diff, DEC);
writeChar('\t');         //some Dataoutput
writeInteger(act_angle, DEC);
#endif

changeDirection(FWD);
mSleep(500);
}


So, also, das rotieren funktioniert. Ohne Probleme.
Eigentlich ist es aber angedacht, dass der Roboter nach jedem Rotieren weiter gerade aus fährt mit speed (50).
{Übrigens nimmt der bei mir moveAtSpeed() keine defines an....}
Folgendes Szenario:

Ich starte das Programm, der RP6 fährt nicht, was auch so gewollt ist.
Jetzt schicke ich den Befehl das er einfach gerade aus fahren soll, was er macht,
(a)aber manchmal dreht er nur den linken Motor, mit geringerer Geschwindigkeit und der recht steht.
(b)Oder er dreht den linken Motor schneller als den rechten Motor.
Wenn ich den Befehl wiederholt sende, stellt er die Geschwindigkeit ein und beide Motoren fahren mit gleicher Geschwindigkeit.
Jetzt sage ich dem RP6 er soll einen Winkel einstellen,
er stoppt, stellt den Winkel ein und hat selbes Phänomen,
entweder a) oder b).
Bei wiederholtem Senden fährt er dann richtig....

Ich habs mit Sleeps versucht, wiederholtes taskmotioncontrol aufrufen etc...
Ich verstehe es nicht.
Hoffe jemand hat noch eine Idee.

greetZ
Retnu


Top
 Profile E-mail  
 
 Post subject: Re: RP6 über mITX Board steuern
PostPosted: Thu Jan 26, 2012 7:46 pm 
Offline
Administrator
User avatar

Joined: Fri Mar 25, 2005 6:19 pm
Posts: 1378
Location: NRW
Hallo,

...
changeDirection(FWD);
mSleep(500);
...

Kann nicht gut funktionieren.
ALLES was das task System des RP6 verwendet, darf NICHT mit mSleep kombiniert werden (jedenfalls keine 500ms Pausen).

Es muss ständig in einer Schleife task_RP6System(); aufgerufen werden - und zwar ohne lange Verzögerungen - nirgendwo im Programm.
Für Verzögerungen die Stopwatches oder sonstiges verwenden.

Du hast es ja schon selbst daneben geschrieben:
//always call this every cycle (or faster) for moving

MfG,
SlyD


Top
 Profile E-mail  
 
 Post subject: Re: RP6 über mITX Board steuern
PostPosted: Sun Jan 29, 2012 8:52 pm 
Offline
arexx.com user

Joined: Tue Dec 20, 2011 9:52 am
Posts: 7
Hi,

es geht nicht dadrum das es nicht gut funktioniert, sondern gar nicht.
Quote:
wiederholtes taskmotioncontrol aufrufen

Schrieb ich auch, das Verhalten ändert sich nicht.
Er stellt die geforderte Geschwindigkeit erst nach 3 maligem Senden des Befehls ein.
Bezeichnend ist auch, dass er anscheinend genau die Hälfte der gewünschten Geschwindigkeit einstellt,
bis man den Befehl mehrmals sendet.


Top
 Profile E-mail  
 
 Post subject: Re: RP6 über mITX Board steuern
PostPosted: Mon Feb 06, 2012 8:05 pm 
Offline
arexx.com user

Joined: Tue Dec 20, 2011 9:52 am
Posts: 7
Moin moin,

ich komm da nicht weiter und so geht es nicht weiter im projekt...
Ich hab den Programmcode mittlerweile mal runtergebrachen auf das Kernproblem:

Code:
int main(void)
{
initRobotBase();    // Mikrocontroller initialisieren
powerON();          // Encoder und Motorstromsensoren anschalten!
uint8_t speed = 0;
char receivedData[charsToReceive];      //Array for incoming data
int  emergency_stop = 1;

   while(true)
   {
   task_RP6System();   //always call this every cycle (or faster) for moving
   
   read_buffer(receivedData, &emergency_stop);
   if(receivedData[0] == '0')speed = 20;
   else if(receivedData[0] == '1')speed = 40;
   else if(receivedData[0] == '2')speed = 60;
   moveAtSpeed(speed,speed);   // Geschwindigkeit einstellen
   }
}


Also folgender Ablauf:

Wir spielen den ganzen Senf auf den RP6, starten es und ich starte meine externe PC-GUI mit der ich die 0 1 2 usw. sende.

Ich sende das 1. Mal die Null, RP6 reagiert nicht.
Ich sende das 2. Mal die Null, der RP6 fährt entweder mit der linken Kette nicht mit der eingestellten Geschwindigkeit (ungefähr die Hälte so pi mal Auge), oder er fährt mit beiden auf ungefähr halber Geschwindigkeit.
Ich sende das 3. Mal die Null, der RP6 fährt mit der eingestellten Geschwindigkeit.
Danach arbeitet das Programm wie es soll, also bei jedem Senden der verschiedenen Befehle stellt der RP6 sofort die Geschwindigkeit ein.

Die read_Buffer Funktion is zum Großteil übernommen aus irgendeinem Beispiel.

Ich habe für das Verhalten leider absolut keine Erklärung und bin auch mit den Ideen am Ende.
Wenn also jemand noch was loswerden will, was ich mal ausprobieren könnte, immer her damit.

Der Vollständigkeit halber häng ich mal das C-File dran, damit ihr auch die read_buffer Funktion sehen könnt, auch wenn ich nicht denke das es dadran liegt.


Attachments:
RP6_Slave.c [2.82 KiB]
Downloaded 46 times
Top
 Profile E-mail  
 
 Post subject: Re: RP6 über mITX Board steuern
PostPosted: Mon Feb 06, 2012 10:59 pm 
Offline
Administrator
User avatar

Joined: Fri Mar 25, 2005 6:19 pm
Posts: 1378
Location: NRW
Hallo,

erstmal den Quellcode vom Selftest Programm anschauen - da ist es noch
etwas verfeinert im Vergleich zu dem UART Beispielprogramm.
Du kannst auch ganze Zeilen mit \n am Ende verarbeiten - nicht nur einzelne Zeichen.
(die paar Routinen ganz am Anfang - weiter unten dann nach "strcmp" suchen - ich hatte das auch mal irgendwo hier im Forum oder im RN erklärt)


Zu Deinem Programm:

clearReceptionBuffer();
muss einmal direkt vor der Hauptschleife ausgeführt werden.

Wo wird charsToReceive definiert?
Dein Buffer ist eigentlich um 1 zu klein d.h. der Pointer schiesst übers Ziel hinaus und überschreibt irgendwas dahinter mit 0.

... das nur nach einmal kurz drüberschauen kann natürlich noch irgendwas anderes sein aber schau Dir das erstmal an.

MfG,
SlyD


Top
 Profile E-mail  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 15 posts ] 

All times are UTC + 1 hour


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group