- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 19 von 19

Thema: RP6 fernsteuern

  1. #11
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    Anzeige

    Praxistest und DIY Projekte
    > und die roten status leds der base blinken

    Alle?
    Dann sind wahrscheinlich die Akkus zu schwach / leer.

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied Avatar von I♥ROBOTIC
    Registriert seit
    15.03.2010
    Ort
    Fürstenstein
    Alter
    27
    Beiträge
    112
    ja blinken alle, hab ich mir schon gedacht werd sie über nacht mal aufladen

  3. #13
    Erfahrener Benutzer Fleißiges Mitglied Avatar von I♥ROBOTIC
    Registriert seit
    15.03.2010
    Ort
    Fürstenstein
    Alter
    27
    Beiträge
    112
    also, nachdem ich die Batterien aufgeladen hab, hab ich das Programm nochmal getestet, und es lief (bis auf das Problem, dass ich die Encoder wieder mal einstellen muss) einwandfrei ! (sofern man das bei dermasen verstellten encodern sagen konnte) da ich zu faul war, den ganzen RP6 zu zerlegen, nur um die dinger einzustellen, hab ich mir gedacht, füge ich der RP6Control_I2CMasterLib.c die funktion setMotorPower hinzu. (die ist ja auf der base im slaveprogramm verfügbar, man kann sie nur nicht durch das M32 aufrufen. ich hab also in der der RP6Control_I2CMasterLib.c das hier hinzugefügt:

    Code:
    void setMotorPower(uint8_t PWR_left, uint8_t PWR_right)
    {
    	I2CTWI_transmit4Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_MOTOR_PWR, PWR_left, PWR_right );
    	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();
    }
    In der RP6Control_I2CMasterLib.h das hier:

    Code:
    #define CMD_SET_MOTOR_PWR	13
    und im slaveprog für die base hab ich natürlich in die task_commandProcessor() das hinzugefügt:

    Code:
    case CMD_SET_MOTOR_PWR: setMotorPower(param1,param2); break;
    und natürlich auch die definition von CMD_SET_MOTOR_PWR

    aber wenn ich mein Programm nun starte, bekomme ich nur Errors raus

    hat jemand ne idee was ich falsch gemacht, bzw. vergessen haben könnte ??

  4. #14
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @I&.......,

    beim Original Slave-Programm für die Base (RP6Base_I2CSlave.c) ist bei mir keine Funktion "setMotorPower" enthalten.

    Wie sieht die bei dir denn aus?
    Gruß
    Dirk

  5. #15
    Erfahrener Benutzer Fleißiges Mitglied Avatar von I♥ROBOTIC
    Registriert seit
    15.03.2010
    Ort
    Fürstenstein
    Alter
    27
    Beiträge
    112
    bei mir war sie auch nicht enthalten aber in dern RP6BaseLib gibt es sie und die wird ja im base slave prog verwendet.. naja mir ist jetzt aufgefallen dass ich das slave prog zwar geändert aber nicht neu compiliert hab !!(ich vergess oft die hälfte) das wollte ich jetzt machen, bekomme allerdings den fehler, dass IRCOMM nicht definiert wurde... was eig iwie nicht sein kann denn das habe ich nicht nachgetragen, das stand schon so drinnen....

    ach ja IRCOMM wird hier verwendet:
    Code:
    void task_MasterTimeout(void)
    {
    	if(status.watchDogTimer)
    	{
    		if( getStopwatch2() > 3000)  // 3 seconds timeout for the master to react on
    		{							// our interrupt events - if he does not react, we 
    									// stop all operations!
    			cli(); // clear global interrupt bit!
    			PORTD &= ~IRCOMM;
    			setACSPwrOff();
    			OCR1AL = 0;
    			OCR1BL = 0;
    			TCCR1A = 0;
    			powerOFF();
    			writeString_P("\n\n##### EMERGENCY SHUTDOWN #####\n");
    			writeString_P("##### ALL OPERATIONS STOPPED TO PREVENT ANY DAMAGE! #####\n\n");
    			writeString_P("The Master Controller did not respond to the interrupt requests\n");
    			writeString_P("within the defined timeout! Maybe he's locked up!\n");
    			writeString_P("\nThe Robot needs to be resetted now.\n\n");
    			while(true) // Rest In Peace
    			{
    				setLEDs(0b100010);
    				uint8_t dly;
    				for(dly = 10; dly; dly--)
    					delayCycles(32768);
    				setLEDs(0b010100);
    				for(dly = 10; dly; dly--)
    					delayCycles(32768);
    			}
    		}
    		else if(getStopwatch3() > 250)
    		{
    			status.wdtRequest = true;
    			signalInterrupt();
    			setStopwatch3(0);
    		}
    	}
    }
    weiß jemand wie man dieses problem lösen kann ?? denn dan glaube und hoffe ich, dürfte das programm laufen


    EDIT:

    könnte man die rot markierte zeile vll durch dies hier ersetzen:

    PORTD &= ~(1<<PIND7)

    so wirdn nämlich in der BaseLib der IRCOMM port abgeschaltet
    Geändert von I&amp;#9829;ROBOTIC (16.04.2011 um 20:10 Uhr)

  6. #16
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo


    Wegen eines übereifrigen RP6-Besitzers wurde die Definition von IRCOMM in RP6BaseLib.h geändert:
    Code:
    /*****************************************************************************/
    // IRCOMM pin:
    
    // ### WARNING! 
    // 
    // #define IRCOMM 	(1 << PIND7)	// Output
    //
    // ### DO NOT USE THIS PIN BY YOURSELF! 
    // ONLY LET THE INTERRUPT ROUTINE OF THE LIBRARY 
    // CONTROL THIS PIN! 
    // The IR LEDs must be controlled by a modulated
    // signal with minimal 5kHz or higher 
    // modulation frequency! 
    // Nominal modulation frequency is 36kHz! 
    // YOU MAY DAMAGE THE IRCOMM IF YOU USE IT 
    // IN ANY OTHER WAY! 
    
    // Only use this macro to make sure IRCOMM is
    // turned off:
    #define IRCOMM_OFF() PORTD &= ~(1 << PIND7);
    Besser als der direkte Zugriff ist deshalb IRCOMM_OFF();

    https://www.roboternetz.de/community...l=1#post280380

    Gruß

    mic
    Geändert von radbruch (16.04.2011 um 20:44 Uhr) Grund: Link eingefügt
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #17
    Erfahrener Benutzer Fleißiges Mitglied Avatar von I&amp;#9829;ROBOTIC
    Registriert seit
    15.03.2010
    Ort
    Fürstenstein
    Alter
    27
    Beiträge
    112
    ich hab jetzt and die stelle IRCOMM_OFF() eingetragen und nun ließ sich das Programm auch kompilieren und mein RP6 fährt auch, allerding nicht ganz so wie gewünscht:

    1. wen man gas gibt (egal ob vor- oder rückwärts) er fährt hin und wieder mal rückwärts, dann aber mal doch wieder vorwärts.....
    2. ich muss nach jeder drehung oder fahrt 2 oder 3 sekunden warten, weil der rp6 sonst die vorherige bewegung fortführt (also wenn ich nach rechts drehe, und dan plötzlich rückwärts gasgebe dreht er weiter...

    ich hab mir das ehrlich gesagt leichter vorgestellt -.-

    hier mein Programm bisher:
    Code:
    #include "RP6ControlLib.h"
    #include "RP6I2CmasterTWI.h"    
    #include "RP6Control_I2CMasterLib.h"
    
    uint8_t frequenz=0;
    uint8_t furz=0;
    
    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'); 
       
       if(getStopwatch1() > 1)
       {
    	if(frequenz == 255)
    	{
    		furz=1;
    	}
    	
    	else if(frequenz == 0)
    	{
    		furz=0;
    	}
       
    	if(furz){frequenz--;}
    	else{frequenz++;}
       
       setBeeperPitch(frequenz);
       setStopwatch1(0);
       }
    }
    
    volatile uint16_t speed=0;
    volatile uint16_t dir=0;
    volatile uint16_t speedcount=0;
    volatile uint16_t dircount=0;
    
    ISR(TIMER1_COMPA_vect)
    {
    	if (PINA & ADC5)
    	{
    		speedcount++;
    	}
    	else 
    	{
    		if (speedcount > 0)
    		{
    			speed=speedcount;
    		}
    		speedcount=0;
    	}
    	
    	
    	if (PINA & ADC3)
    	{
    		dircount++;
    	}
    	else 
    	{
    		if (dircount > 0)
    		{
    			dir=dircount;
    		}
    		dircount=0;
    	}
    }
    
    void initRC(void)
    {
    	TCCR1A = (0 << WGM11) | (0 << WGM10) | (0 << COM1A0) | (0 << COM1A1);	// CTC-Mode4, ohne OCR-Pin
    	TCCR1B = (0 << WGM13) | (1 << WGM12) | (0 << CS12)  | (1 << CS11) | (0 << CS10); // CTC und prescaler /8
    	TIMSK |= (1 << OCIE1A); 										// Interrupt ein
    	OCR1A  = 20; // 100kHz?
    	
    	DDRA &= ~ADC5;
    	PORTA &= ~ADC5; 
    	DDRA &= ~ADC3;
    	PORTA &= ~ADC3; 
    }
    	
    	
    
    int main(void)
    {
    	initRP6Control();
    	initLCD();
    	initRC();
    	
    	startStopwatch1();
    	
    	mSleep(1000);
    	
    	I2CTWI_initMaster(100);  
    	I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady); 
    	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
    
    	uint16_t speed1, dir1;
    	
    while(1)
    {
    	cli(); // Interrupts verbieten
    	speed1=speed;
    	dir1=dir;
    	sei(); // Interrupts wieder zulassen
    	
    	rc_pwr=0;
    	rc_dir=0;
    
    	if (dir1<140) { rc_dir=150; changeDirection(LEFT); writeInteger(dir1, DEC); writeString("\t\t");}
    	if (dir1>170) { rc_dir=150; changeDirection(RIGHT); writeInteger(dir1, DEC); writeString("\t\t");}
    	if (speed1<150) { rc_pwr=speed1+50; changeDirection(BWD); writeInteger(speed1, DEC); writeString("\n");}
    	if (speed1>160) { rc_pwr=speed1-50; changeDirection(FWD); writeInteger(speed1, DEC); writeString("\n");}
    	rc_pwr*=3;
       if (rc_pwr)
       {
    		if (dir1<150) setMotorPower(rc_pwr-rc_dir,rc_pwr+rc_dir);
    		else if (dir1>160) setMotorPower(rc_pwr+rc_dir,rc_pwr-rc_dir);
    		else setMotorPower(rc_pwr,rc_pwr);
       }
    	 else
    	{
    	   setMotorPower(rc_dir, rc_dir);
    	}
    	
    	task_checkINT0(); 
    	task_I2CTWI();
    }
    	return 0;
    }
    Geändert von I&amp;#9829;ROBOTIC (16.04.2011 um 21:25 Uhr)

  8. #18
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    Das der RP6 nicht zuverlässig zu steuern ist, liegt an der I2C Kommuniaktion.
    LG Rolf
    Sind Sie auch ambivalent?

  9. #19
    Erfahrener Benutzer Fleißiges Mitglied Avatar von I&amp;#9829;ROBOTIC
    Registriert seit
    15.03.2010
    Ort
    Fürstenstein
    Alter
    27
    Beiträge
    112
    mein programm läuft jetzt einwandfrei und ich kann auch ohne probleme herumfahren

    danke an alle die mir geholfen haben

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Herd fernsteuern
    Von Gast10 im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 13
    Letzter Beitrag: 10.09.2010, 15:04
  2. RP6 Fernsteuern
    Von phenom im Forum Robby RP6
    Antworten: 15
    Letzter Beitrag: 15.12.2009, 21:34
  3. Rn-Motorcotrol + Fernsteuern
    Von art01 im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 1
    Letzter Beitrag: 26.02.2007, 16:24
  4. Fernsteuern via PC
    Von sdz55 im Forum Elektronik
    Antworten: 27
    Letzter Beitrag: 21.12.2005, 17:53
  5. Fernsteuern?
    Von Dan89 im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 06.11.2005, 20:02

Stichworte

Berechtigungen

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

12V Akku bauen