- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 55

Thema: Anfänger braucht Hilfe

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Filou89
    Registriert seit
    24.12.2010
    Ort
    Thun, Switzerland
    Alter
    35
    Beiträge
    116
    Ganz viele Infos zum RP6 findest du auch im RN-Wissen.
    Wenn du die Led's am Sensorpanel Befestigen willst, findest du die Schemas auf der Arexx-RP6 Webseite
    Schau einfach mal genau auf dein Mainboard. Überall wo VDD steht, kannst du geregelte 5V "abzapfen".
    Wenn du aber die Leds gerne ein/und ausschalten willst (davon gehe ich ja mal aus), leg sie direkt an einen I/O. Wo die sind, siehst du auch hier!
    Wenn du im Schema des Mainboards (Seite 2/4) in den Feldern E2-4 nachsiehst, wirst du die I/O's auch sehen.
    Du kannst aber auch den ADC0 / 1 Port verwenden. Die ansteuerung ist aber etwas weniger simpel. (Kann dir auch nicht zu 100% sagen, wie das geht, aber es geht! (vergleiche Servos)
    MfG
    Filou

  2. #2
    Vielen Dank für die viele Information. Ihr seit echt SPITZE!! Ich werde das mir jetzt erstmal alles durchlesen, und dann sehe ich weiter. Evtl. schildere ich Euch dann noch wie ich es vor habe zu bewerkstelligen.

    Ich habe heute mal probiert, mein Programm zum Ausweichen von Hindernissen zu optimieren. (Das Video, welches ich weiter oben gepostet habe, war schon gut, jedoch war da einprogrammiert, dass er sich um 45° drehen soll usw.) Jetzt versuche ich es so zu basteln, dass er solange z.B. nach links fährt/rotiert, bis der Gegenstand nicht mehr im Wege ist. Das habe ich auch schon zum Teil recht gut gemacht, wie ich meine. Das Problem ist, dass wenn er in einer Ecke ist, bekommt er Probleme.. Er weiß einfach nicht wie er da raus kommen soll & ich weiß nicht, wie ich es ihm am besten beibringen kann.... Die Beispielcodes verstehe ich nicht ganz, somit hänge ich da gerade.

    Wenn Ihr Euch den Code evtl. mal anschauen wollt(?) Bei der Gelegenheit hätte ich noch eine Frage: Warum leuchten die LED´s (die Roten Standard) nicht auf, wenn er ein Hinderniss erkennt? - Habe ich doch ins Programm geschrieben... (Anders machen sie es ja auch nicht in den Beispielen)

    Hier der Code:

    Code:
    #include "RP6RobotBaseLib.h"
    void acsStateChanged(void) //ACS
    {
    	// Hindernis links
    	if(obstacle_left){
    	rotate(50, RIGHT, (obstacle_left = false), true); // dreht sich so lange bis der linke Sensor kein Hinderniss mehr hat
    	}
        // Hindernis rechts    
    	if(obstacle_right){
    	rotate(50, LEFT, (obstacle_right = false), true); // dreht sich so lange bis der rechte Sensor kein Hinderniss mehr hat
    	}
        // Mitte?
    	if(obstacle_left && obstacle_right ){
    	move(60, BWD, DIST_CM(10), true); //10 cm Rückwärts
        rotate(50, LEFT, 180, true); // um 180° nach links drehen
    	}
    	
    	//if(getDirection() == LEFT && getDirection() == RIGHT){
    	//startStopwatch1(); // Stopwatch1 starten
    	//}
    }
    //Bumpers
    void bumpersStateChanged(void) {
    	//if(bumper_left || bumper_right){        //Wenn ein Bumper berührt wurde, dann mal das machen, egal welcher.
    	//moveAtSpeed(0,0);                       //Nicht unbedingt nötig, aber ich würde die beiden Zeilen zur Sicherheit schreiben.
    	//mSleep(500);
    	//move(60, BWD, DIST_CM(25), true); //25 cm Rückwärts
    	//}
        if(bumper_left && bumper_right){
    		mSleep(500);
    		move(60, BWD, DIST_CM(10), true); //10 cm Rückwärts
            rotate(50, LEFT, 188, true); // um 180° nach links drehen  
    	}
        else if(bumper_left){
    		mSleep(500);
    		move(60, BWD, DIST_CM(5), true); //5 cm Rückwärts
            rotate(50, RIGHT, 49, true); // um 45° nach rechts drehen
    	}
        else if(bumper_right){
    		mSleep(500);
    		move(60, BWD, DIST_CM(5), true); //5 cm Rückwärts
            rotate(50, LEFT, 45, true); // um 45° nach links drehen
    	}
    }
    
    void fahrenFunction(void){
    	// Geschwindigkeit einstellen !!Richtung nicht vergessen!!
    	changeDirection(FWD);
    	moveAtSpeed(90,90);
    	if(getStopwatch1() > 3500) // Sind 3500ms (= 3,5s) vergangen?
    		{
    		// Bewegungsrichtung ändern:
    		if(getDirection() == FWD) // Fahren wir vorwärts...
    		changeDirection(BWD); // dann Rückwärts einstellen!
    		else if(getDirection() == BWD) //... oder Rückwärts?
    		changeDirection(FWD); // dann Vorwärts einstellen!
    		setStopwatch1(0); // Stopwatch1 auf 0 zurücksetzen
    	}
    }
    
    int main(void) {
    
        initRobotBase(); 
        setLEDs(0b111111);
        mSleep(2500);
        setLEDs(0b001001); 
    
        // ACS Event Handler registrieren:
        ACS_setStateChangedHandler(acsStateChanged);
        // Set Bumpers state changed event handler:
        BUMPERS_setStateChangedHandler(bumpersStateChanged);
        // ACS Empfänger einschalten (und Encoder etc.)
        powerON();
        // ACS auf mittlere Sendeleistung stellen.
        setACSPwrMed();
    
    
    	// Main loop
    	while(true){
            // Aus der Hauptschleife ständig die motionControl Funktion
            // aufrufen – sie regelt die Motorgeschwindigkeiten!
            task_motionControl();
            // ADC Wird wegen den Motorstromsensoren aufgerufen!
            task_ADC(); 
            // Bumper automatisch alle 50ms auswerten
            task_Bumpers();
            // ständig die task_ACS Funktion aufrufen!
    		// task_ACS();
            task_RP6System();
    		//Fahren
    		fahrenFunction();
    		/////////////////////////Bumper//////////////////////////
    		statusLEDs.LED6 = bumper_left; // Bumper links gedrückt
    		statusLEDs.LED4 = !bumper_left; // links nicht gedrückt
    		statusLEDs.LED3 = bumper_right; // Bumper rechts gedrückt
    		statusLEDs.LED1 = !bumper_right; // rechts nicht gedrückt
    		// Beide Bumper gedrückt:
    		statusLEDs.LED2 = (bumper_left && bumper_right);
    		statusLEDs.LED5 = statusLEDs.LED2;
    		updateStatusLEDs(); // LEDs aktualisieren...	
    		/////////////////////////Obstacle////////////////////////////
    		statusLEDs.LED6 = obstacle_left && obstacle_right; // Mitte?
    		statusLEDs.LED3 = statusLEDs.LED6;
    		statusLEDs.LED5 = obstacle_left; // Hindernis links
    		statusLEDs.LED4 = (!obstacle_left); // LED5 invertiert!
    		statusLEDs.LED2 = obstacle_right; // Hindernis rechts
    		statusLEDs.LED1 = (!obstacle_right); // LED2 invertiert!
    		updateStatusLEDs();
    	}
        return 0;
    }
    Ist der Code so einigermaßen in Ordnung? Ich hoffe, dass Ihr mir helfen könnt. Könnte mir jemand nochmal auf die Sprünge helfen, wie das mit den prioritäten war? Obwohl ich diese hier nicht beachtet habe, reagiert er trotzdem auf die "Bumper" & die "Obstacles"

    Beste Grüße

    Crystal Eye
    Wer braucht Fenster, um an einem Rechner zu arbeiten?

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Filou89
    Registriert seit
    24.12.2010
    Ort
    Thun, Switzerland
    Alter
    35
    Beiträge
    116
    Hallo Crystal Eye,
    Ich schaue gerade deinen Code an und möchte dir dazu ein Paar Worte sagen. Starten wir bei main():

    mit task_RP6System(); rufst du alle anderen Tasks auch auf. Du machst das also 2 mal.. (langsam)

    fahrenFunktion();
    if (GetStop...>3500) wirst du garnie haben, da sie nirgends im Programm gestartet wurde. (Hast du sicher aus der Anleitung kopiert

    setzen der statusLeds: Wenn du das Programm so laufen lässt, werden die Leds nur die Obstacle-Meldungen anzeigen, da die Bumper-meldungen gerade wieder überschrieben werden.
    Da müstest du ev eine art wechselblinker machen,der immer 1sec Bumper- und 1sec Obstacle-meldungen anzeigt.

    bumpersStateChanged(void) scheint gut.

    acsStateChanged(void)
    Auszug aus RP6RobotBaseLib.c
    Code:
    void rotate(uint8_t desired_speed, uint8_t dir, uint16_t angle, uint8_t blocking)
    {
        motion_status.move_L = true;
        motion_status.move_R = true;
        uint16_t distance = (uint16_t) (((uint32_t)(ROTATION_FACTOR) * (uint16_t)angle)/100);
        preDecelerate_L = distance - 100;
        preDecelerate_R = distance - 100;
        preStop_L = distance;
        preStop_R = distance;
        if(distance < 40) {
            distance = 40; 
            preStop_L = 20;
            preStop_R = 20;
            preDecelerate_L = 10;
            preDecelerate_R = 10;
        }
        moveAtSpeed(desired_speed,desired_speed);
        changeDirection(dir);
        
        mleft_dist = 0; 
        mright_dist = 0;
        distanceToMove_L = distance;
        distanceToMove_R = distance;
        
        motion_status_tmp = motion_status.byte;
        MOTIONCONTROL_stateChangedHandler();
        if(blocking)
            while(!isMovementComplete())
                task_RP6System();
    }
    Du siehst, das 3. Argument (uint16_t angle) ist eine Ganze Zahl,Integer.
    Deshalb kannst du nicht schreiben ....,(obstacle_left=false),.... (wäre ja sowieso eine Zuweisung, kein Vergleich)
    Da hast du wohl nur eine Lösung:
    Du willst solange Rotieren, bis das ACD freie Bahn meldet.
    Was heisst denn rotieren? Das hat garnichts mit dem Winkel zu tun, in unserem Fall.

    Wann rotiert der RP? Wenn eine Raupe Vorwärts und die andere rückwärts dreht.
    Das machst du mit:
    setMotorDir(uint8_t left_dir, uint8_t right_dir); --> überzeige dich selbst, steht in der RP6RobotBaseLib.c, sogar wie anwenden.
    [Edit]Oder changeDirection(LEFT/RIGHT); [/EDIT]

    Wenn du jetzt also die Richtungen unterschiedlich eingestellt hast, machst du nur noch:
    moveAtSpeed(uint8_t desired_speed_left, uint8_t desired_speed_right) bis die bahn frei ist, oder solange du noch ein Hindernis erkennst.

  4. #4
    Hallo Filou89,

    danke für die Hinweise!
    1.
    mit task_RP6System(); rufst du alle anderen Tasks auch auf. Du machst das also 2 mal.. (langsam)
    Das ist mir jetzt wirklich peinlich, das hatte ich schonmal richtig, das habe ich jetzt auch sofort verbessert/ausgebessert.

    2.
    fahrenFunktion();
    if (GetStop...>3500) wirst du garnie haben, da sie nirgends im Programm gestartet wurde. (Hast du sicher aus der Anleitung kopiert
    Stimmt Aber auch hier ist es nicht mehr aktuell. Ich hatte die zeit auf 500 gestellt, besser?
    3.
    setzen der statusLeds: Wenn du das Programm so laufen lässt, werden die Leds nur die Obstacle-Meldungen anzeigen, da die Bumper-meldungen gerade wieder überschrieben werden.
    Das Problem ist aber genau andersrum. Die LED´s blinken nicht auf wenn ein Hinderniss erkannt wird, nur wenn die Bumper aktiviert werden (ist glaube ich doch so "fest" einprogrammiert, oder?

    So, nun zu dem Teil, den ich noch immer nicht ganz kapiert habe.:

    Du siehst, das 3. Argument (uint16_t angle) ist eine Ganze Zahl,Integer.
    Deshalb kannst du nicht schreiben ....,(obstacle_left=false),.... (wäre ja sowieso eine Zuweisung, kein Vergleich)
    Ok, das leuchtet mir jetzt ein, thx!

    Das machst du mit:
    setMotorDir(uint8_t left_dir, uint8_t right_dir);
    Wann bzw. wo muss ich das einbauen? Hier:
    Code:
    // Hindernis links
    	if(obstacle_left){
    	setMotorDir(30,60);
    	//rotate(50, RIGHT, (obstacle_left = false), true); // dreht sich so lange bis der linke Sensor kein Hinderniss mehr hat
    	}
    Also, ich verstehe (eigentlich) ganz gut was du meinst, aber ich weiß noch nicht, wie bzw. wo ich die "setMotorDir(uint8_t left_dir, uint8_t right_dir);" Funktion und "moveAtSpeed(uint8_t desired_speed_left, uint8_t desired_speed_right)" einsetzten soll.
    Sorry, bin doch noch sehr im Anfangsstadium

    Beste Grüße

    Crystal Eye
    Wer braucht Fenster, um an einem Rechner zu arbeiten?

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Filou89
    Registriert seit
    24.12.2010
    Ort
    Thun, Switzerland
    Alter
    35
    Beiträge
    116
    Hallo Crystal Eye,
    zu 2.:
    das Problem ist jicht die Zeitdauer, sondern, dass du mit startStopwatch1() die Stoppuhr erstmal starten musst. Diese Zeile hast du auskommentiert.
    zu 3.:
    Richtig, das ist zwar nicht programmiert, sondern direkt auf der Platine angeschlossen.

    Zum Teil mit dem Rotieren: (eventuell erkläre ich hier sachen, die du schon lange kennst)
    bei der funktion rotate übergibst du vier Argumente:
    1. Gewünschte Geschwindigkeit
    2. Richtung (Rechts oder Links)
    3. Winkel
    4. blocking oder nicht

    da du ja solange rotieren willst, wie du ein Hindernis erkennst, kennst du ja den Winkel nicht, was du aber für rotate müsstest.
    Der RP dreht sich ja, wenn eine Raupe vorwärts, die andere rückwärts dreht.
    Mit setMotorDir(FWD,BWD); kannst du eine Rechtsdrehung einstellen. Der RP bewegt noch nicht.
    Anstelle setMotorDir() kannst du auch changeDirection(Right); schreiben.

    Damit der RP sich bewegt, befiehlst du: moveAtSpeed(60,60);
    Jetzt drehen beide Raupen mit 60, links vorwärts, rechts rückwärts. Das Gibt eine Rechts-Rotation an Ort.
    Sind die Geschwindigkeiten rechts und links nicht gleich, dreht er nicht mehr an Ort, sondern fährt ein Wenig.
    Mit einer while - Anweisung, lässt du den RP solange mit der gewünschten Geschwindigkeit drehen, bis du keine Obstacles mehr hast.
    Irgendwie sowas ähnliches:
    Code:
    if(obstacle_left){     //wollen wir rechts drehen
       stop();                   //mal anhalten
       setMotorDir(FWD,BWD); //Rechtsdrehung einstellen
    
       while (obstacle_left){     //solange wir das Hindernis haben
           moveAtSpeed(80,80);//Geschwindigkeit einstellen
           task_motionControl();//Motoren Starten
       }
       stop();               //dann wieder anhalten, sonst wird moveAtSpeed(); beibehalten, glaube ich zumindest =)
    
    } else if (obstacle_right){
    //......
    }
    Hoffe, du verstehst wie ich es meine. Nochmehr hoffe ich, dass meine Überlegungen aber auch richtig sind =)

    MfG
    Filou

  6. #6
    Halllo Filou89,
    zu2.:
    ok, verstehe = blöder Fehler, wieder einmal hehe
    Jup, die rotate-Funktion verstehe ich schon (ok, bis auf das blocking <= Wird hier die Schleife z.B. angehalten?)
    zum Hindernis-Teil:
    An Hand deines Beispiels verstehe ich es jetzt! - Ich hatte den zusammenhang nicht ganz verstanden , aber jetzt PERFEKT!
    Von Dir kann man sehr gut lernen. Du erklärst es richtig gut! Wird bestimmt mehreren hier helfen! DANKE dafür!
    Das Prinzip ist verstanden. Jetzt versuche ich es selbst mal, und werde gleich meine Ergebnisse/Erkenntnisse schildern.

    Beste Grüße

    Crystal Eye
    Wer braucht Fenster, um an einem Rechner zu arbeiten?

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Filou89
    Registriert seit
    24.12.2010
    Ort
    Thun, Switzerland
    Alter
    35
    Beiträge
    116
    Danke, danke
    Ich tu was ich kann.
    Das mit dem Blocking geht bei mir auch noch nicht so. Wollte mal während dem fahren immer ausgaben über die Schnittstelle zum PC machen. Hab ich aber nicht geschafft.
    eventuell hast du da ja etwas gelesen, das ich nicht gesehen habe.
    MfG
    Filou

  8. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Irgendetwas war mal mit dem Stop() nicht so einfach zu lösen:

    https://www.roboternetz.de/community...eAtSpee-Befehl
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #9
    Also ich habe es abgeändert. Der Robby erkennt das Hinderniss und rotiert schön, jedoch hört er nicht mehr auf. Dann hat ja radbruch den Link gepostet, mit dem Stop. Ich habe mir den Durchgelesen & nicht alles verstanden aber dann habe ich das mit der move - Funktion versucht.

    Der folgende Code beinhaltet die "Stop();" - Funktion:

    Code:
    if(obstacle_left){		//wollen wir rechts drehen
    	stop();					//mal anhalten
    	setMotorDir(FWD,BWD); 	//Rechtsdrehung einstellen
    
    	while (obstacle_left){	//solange wir das Hindernis haben
        moveAtSpeed(80,80);		//Geschwindigkeit einstellen
        task_motionControl();	//Motoren Starten
    	}
    	stop();               //dann wieder anhalten, sonst wird moveAtSpeed(); beibehalten, glaube ich zumindest =)
    	}
    Und dieser die move(); - Funktion:

    Code:
    if(obstacle_left){		//wollen wir rechts drehen
    	stop();					//mal anhalten
    	setMotorDir(FWD,BWD); 	//Rechtsdrehung einstellen
    
    	while (obstacle_left){	//solange wir das Hindernis haben
        moveAtSpeed(80,80);		//Geschwindigkeit einstellen
        task_motionControl();	//Motoren Starten
    	}
    	move(0,FWD,0,BLOCKING);                       //Stop
                mSleep(1500);               //dann wieder anhalten, sonst wird moveAtSpeed(); beibehalten, glaube ich zumindest =)
    	}
    Habe ich da ein fehler im Code, oder warum hört er nicht auf zu drehen... der dreht Kreise wie wild


    Beste Grüße

    Crystal Eye
    Wer braucht Fenster, um an einem Rechner zu arbeiten?

Ähnliche Themen

  1. Anfänger braucht Hilfe
    Von Tonyy im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 14.12.2010, 07:16
  2. hilfe Anfänger braucht hilfe beim start
    Von thomas3 im Forum Robby RP6
    Antworten: 26
    Letzter Beitrag: 20.09.2010, 21:07
  3. Anfänger braucht Hilfe
    Von vitja09 im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 8
    Letzter Beitrag: 07.10.2006, 13:31
  4. Anfänger braucht hilfe!!!!
    Von mathisdedial im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 22.12.2004, 13:02
  5. Anfänger braucht hilfe
    Von khazad im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 11
    Letzter Beitrag: 25.10.2004, 11:27

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test