-         

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 33

Thema: RP6 mit m32 steuern

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    26.12.2010
    Beiträge
    14

    RP6 mit m32 steuern

    Anzeige

    ich habe den rp6 zu weihnachten bekommen und das m32 und das lcd display dazu. es hat alles super gefunzt, bis ich das m32 draufgebaut habe. seitedem weiß ich nich wie ich die motoren richtig ansteuere. hier is meine arbeit (is vieles aus beispielen kopiert):

    Code:
    #include "RP6ControlLib.h" 	
    #include "RP6I2CmasterTWI.h"	
    #include "RP6Control_I2CMasterLib.h"
    
    
    void I2C_requestedDataReady(uint8_t dataRequestID)
    {
    	checkRP6Status(dataRequestID);
    }
    
    
    void I2C_transmissionError(uint8_t errorState)
    {
    	writeString_P("\nI2C ERROR - TWI STATE: 0x");
    	writeInteger(errorState, HEX);
    	writeChar('\n');
    }
    
    
    void Bumpers(void)
    {
    	if (bumper_left || bumper_right)
    	{
    		moveAtSpeed(0,0);
    		
    		if (bumper_left)
    		{
    		changeDirection(BWD);
    		moveAtSpeed(150,150);
    		}
    	
    		else if (bumper_right)
    		{
    		move(60,BWD,1000,1);
    		changeDirection(FWD);
    		moveAtSpeed(150,150);
    		}
    	
    		else if (bumper_left && bumper_right)
    		{
    		move(60,BWD,500,1);
    		rotate(60,LEFT,90,1);
    		changeDirection(FWD);
    		moveAtSpeed(60,60);
    		}
    	
    	}
    	
    	
    }
    
    
    
    void ACS (void)
    {
    	if(obstacle_left)
    	{
    		setCursorPosLCD(1, 12);
    		writeStringLCD_P("LEFT");
    		rotate(50, RIGHT, 180, 1);
    	}
    	
    	else
    	{
    		clearPosLCD(1, 12, 4);
    	}
    	
    	if(obstacle_right)
    	{
    		setCursorPosLCD(1, 0);
    		writeStringLCD_P("RIGHT");
    		moveAtSpeed(90,40);
    	}
    	else
    	{
    		clearPosLCD(1, 0, 5);
    	}
    	
    	if(obstacle_left && obstacle_right)
    	{
    		setLEDs(0b0110);
    		setCursorPosLCD(1, 7);
    		writeStringLCD_P("MID");
    		moveAtSpeed(0,0);
    		changeDirection(FWD);
    		moveAtSpeed(50,50);
    	}
    	else
    	{
    		setLEDs(0b0000);
    		clearPosLCD(1, 7, 3);
    	}
    	
    	
    	
    	if(obstacle_left)
    	{
    		setLEDs(0b0001);
    	}
    	if(obstacle_right)
    	{
    		setLEDs(0b1000);
    	}
    	
    	if(obstacle_left && obstacle_right)
    	{
    		sound(140,10,0);
    	}
    	else
    	{
    		if(obstacle_left)
    			sound(100,5,0);
    		if(obstacle_right)
    			sound(120,5,0);
    	}
    }
    
    
    
    
    
    int main(void)
    {
    	initRP6Control();  
    	initLCD();
    	
    
    	ACS_setStateChangedHandler(ACS);
    	BUMPERS_setStateChangedHandler(Bumpers);
    	
    	
    
    	I2CTWI_initMaster(100);  
    	I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady);
    	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
    
    	sound(180,80,25);
    	sound(220,80,25);
    
    	setLEDs(0b1111);
    
    	showScreenLCD("ATTENTION", "");
    	mSleep(1000);
    	setLEDs(0b0000);
    	
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_ACS_POWER, ACS_PWR_MED);
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT, true);
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT_RQ, true);
    	
    	startStopwatch1();
    	
    	
    	changeDirection(FWD);
    	
    	moveAtSpeed(80,80);
    	
    	while(true) 
    	{ 
    	    task_I2CTWI();
    		task_LCDHeartbeat();
    	}
    	return 0;
    }
    wenn ich moveAtSpeed(x,x) schreibe, dann fährt er auch, aber wenn ich rotate benutze, dann macht er das zwar auch, aber danach passiert nichts mehr
    ich bitte um hilfe, bin noch absoluter neuling
    lg mo
    thx

  2. #2
    RN-Premium User Roboter-Spezialist
    Registriert seit
    21.04.2009
    Beiträge
    522
    Naja wenn er rotiert ist doch alles super? Warum sollte er danach was machen? Du musst danach wieder moveAtSpeed aufrufen...

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    26.12.2010
    Beiträge
    14
    also ich hab des so gedacht, dass wenn halt was im weg is, dass er dann stehen bleibt und rotiert. danach soll er wieder weiter fahren. und des tut er aber nicht, auch nicht mit nem neuen move befehl.

    ich hab das alles schon erstellt ohne m32 und display, das schaut bei mir so aus:

    Code:
    #include "RP6RobotBaseLib.h" 
    
    void Crash (void)
    {
    	if (bumper_left || bumper_right)
    	{
    		moveAtSpeed(0,0);
    	}
    	
    	if (bumper_left)
    	{
    		move(60,BWD,500,1);
    		mSleep(500);
    		rotate(60,RIGHT,90,1);
    		changeDirection(FWD);
    		moveAtSpeed(60,60);
    	}
    	
    	else if (bumper_right)
    	{
    		move(60,BWD,500,1);
    		mSleep(500);
    		rotate(60,LEFT,90,1);
    		changeDirection(FWD);
    		moveAtSpeed(60,60);
    	}
    	
    	else if (bumper_left && bumper_right)
    	{
    		move(60,BWD,500,1);
    		rotate(60,LEFT,90,1);
    		changeDirection(FWD);
    		moveAtSpeed(60,60);
    	}
    }
    
    
    void Achtung (void)
    {
    	if (obstacle_left)
    	{
    		rotate(60,RIGHT, 45,1);
    		changeDirection(FWD);
    		moveAtSpeed(60,60);
    	}
    	
    	else if (obstacle_right)
    	{
    		rotate(60,LEFT, 45,1);
    		changeDirection(FWD);
    		moveAtSpeed(60,60);
    	}
    }
    
    
    
    int main (void)
    {
    	initRobotBase();
    	
    	setLEDs(0b111111);
    	mSleep(500);
    	setLEDs(0b011111);
    	mSleep(500);
    	setLEDs(0b001111);
    	mSleep(500);
    	setLEDs(0b000111);
    	mSleep(500);
    	setLEDs(0b000011);
    	mSleep(500);
    	setLEDs(0b000001);
    	mSleep(500);
    	setLEDs(0b000000);
    	mSleep(1000);
    	
    	BUMPERS_setStateChangedHandler(Crash);
    	
    	ACS_setStateChangedHandler(Achtung);
    	
    	powerON();
    	
    	setACSPwrMed();
    	
    	changeDirection(FWD);
    	
    	moveAtSpeed(60,60);
    	
    	
    	while(true)
    	{
    		task_RP6System();
    		
    		
    		
    	}
    		
    	return 0;
    }
    und wenn ich das auf die base auflade, dann funzt es einwandfrei. und des alles hätt ich halt jetz gern mit m32...

  4. #4
    RN-Premium User Roboter-Spezialist
    Registriert seit
    21.04.2009
    Beiträge
    522
    Guck dir dazu doch mal die Beispiele an, da wird ja ziemlich genau das gemacht, was du willst.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.265
    Hallo Willkommen im Forum
    nur mal zwei Anmerkungen für den Anfang:
    Bitte Suche dir für weitere Threads aussagekräftigere Namen und verwende für Code die dafür vorgesehenen Codetags.
    (Änderungen eingefügt von radbruch ;)

    Wenn du deine Motoren über die m32 Erweiterung steuern willst, wirst du dies mithilfe des I2C Buses des RP6 machen müssen. (Die Anleitung wird dir dabei weiterhelfen)

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    26.12.2010
    Beiträge
    14
    @ fabian: hab ich ja, darauf hab ich ja vieles kopiert, damit ichs dann umschreiben kann. im beispiel control move wird da rotate benutzt, ich hab alles aus move kopiert, einschließlich makefile usw und trotzdem geht bei mir rotate zwar noch, aber dann macht der robot nix mehr. ein evtl vorhandener heartbeat hört auf... ich bin am verzweifeln

    @shedepe: ich werde es mir merken. ich bin am verzweifeln, ich versuch das schon zwei tage zum laufen zu kriegen, aber es klappt nicht.
    die anleitung hab ich schon angeschaut. ich frage mich ja nur, warum moveAtSpeed funzt und rotate nicht. die gehen doch beide zum motor???

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.265
    Also das letzte von dir gepostete Programm führt ja nur einmal den Befehl moveAtSpeed aus und geht dann in die Endlosschleife. Deine weiteroben im Code definierten Funktionen musst du aus der MainFunktion natürlich auch aufrufen

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    26.12.2010
    Beiträge
    14
    also das hier wie es jetzt is:
    ACS_setStateChangedHandler(ACS);
    BUMPERS_setStateChangedHandler(Bumpers);

    und dann in der main funktion auch nochmal
    task_ACS();
    task_Bumpers();

    hab ich des richtig verstanden?

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    26.12.2010
    Beiträge
    14
    aber jetzt nochmal was anderes: selbes problem wieder...

    Code:
    #include "RP6ControlLib.h" 
    #include "RP6I2CmasterTWI.h"
    #include "RP6Control_I2CMasterLib.h"
    
    
    void Bumpers(void)
    {
    	if (bumper_left || bumper_right)
    	{
    		moveAtSpeed(0,0);
    		
    		if (bumper_left)
    		{
    		move(60,BWD,500,1);
    		rotate(60, RIGHT, 45, BLOCKING);
    		changeDirection(BWD);
    		moveAtSpeed(70,70);
    		}
    	
    		else if (bumper_right)
    		{
    		move(60,BWD,500,1);
    		rotate(60, LEFT, 45, BLOCKING);
    		changeDirection(FWD);
    		moveAtSpeed(70,70);
    		}
    	
    		else if (bumper_left && bumper_right)
    		{
    		move(60,BWD,500,1);
    		rotate(60, RIGHT, 180, BLOCKING);
    		changeDirection(FWD);
    		moveAtSpeed(70,70);
    		}
    	
    	}
    	
    	
    }
    
    
    
    void watchDogRequest(void)
    {
    	static uint8_t heartbeat2 = false;
    	if(heartbeat2)
    	{
    		clearPosLCD(0, 14, 1);
    		heartbeat2 = false;
    	}
    	else
    	{
    		setCursorPosLCD(0, 14);
    		writeStringLCD_P("#"); 
    		heartbeat2 = true;
    	}
    }
    
    void I2C_requestedDataReady(uint8_t dataRequestID)
    {
    	checkRP6Status(dataRequestID);
    }
    
    
    void I2C_transmissionError(uint8_t errorState)
    {
    	writeString_P("\nI2C ERROR - TWI STATE: 0x");
    	writeInteger(errorState, HEX);
    	writeChar('\n');
    }
    
    
    int main(void)
    {
    	initRP6Control();  
    	initLCD();
        
    	//ACS_setStateChangedHandler(ACS);
    	BUMPERS_setStateChangedHandler(Bumpers);
    	WDT_setRequestHandler(watchDogRequest); 
    	
    
    	I2CTWI_initMaster(100);  
    	I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady);
    	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
    
    	sound(180,80,25);
    	sound(220,80,25);
    
    	setLEDs(0b1111);
    
    	showScreenLCD("################", "################");
    	mSleep(500);
    	showScreenLCD("I2C-Master", "Movement...");
    	mSleep(1000);
    	setLEDs(0b0000);
    	
    	
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_ACS_POWER, ACS_PWR_MED);
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT, true);
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT_RQ, true);
    	
    
    	moveAtSpeed(70,70);
    
    	while(true) 
    	{
    		task_checkINT0();
    		task_I2CTWI();
    	}
    	return 0;
    }
    er fährt vorwärts wie er soll, wenn ich nen bumper drücke hält er an und fährt n stück zurück. so und jetz kommt rotate und des macht er nicht. dann passiert nichts mehr

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    26.12.2010
    Beiträge
    14
    kann mir denn keiner helfen?

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

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