- SF800 Solar Speicher Tutorial         
Seite 6 von 9 ErsteErste ... 45678 ... LetzteLetzte
Ergebnis 51 bis 60 von 85

Thema: NIBO2 - Test Bodensensoren

  1. #51
    Hero_123
    Gast
    Anzeige

    E-Bike
    Hi

    Funktion zum "aktiven Bremsen" - sie muß NICHT ZWINGEND (!!) in einer timergesteuerten ISR aufgerufen werden, es reicht doch schon, wenn der Aufruf DIREKT nach Erkennen des Absturzes geschieht! Die ISR ist doch NUR EIN PFLASTER!!!

    Interrupt-Verarbeitung - bei (derzeit) nahezu allen Fkt des copro wird die Interruptbehandlung während der Befehlsausführung abgeschaltet...


    @workwind - entspricht dein Vorschlag des "aktiven Bremsens" nicht in etwa dem, daß man beim Erkennen des Absturzes negative Drehzahl als neuen Sollwert vorgeben soll?

    mfg

    Hero_123

  2. #52
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    11.08.2009
    Ort
    Berlin
    Alter
    70
    Beiträge
    348

    Nibo 2

    Hallo
    hätte da auch noch einen Vorschlag zu machen. Das mit dem negativen lauf finde ich richtig gut. Falls ein neuer Befehl verwendet wird ist es vielleicht besser diesen zu teilen. Wenn ich aus anderen Gründen das zählen der Ticks nich verwende, muss trotzdem ein stoppen erfolgen. Dazu könnte ich bei auslösen des stoppens eine bestimmte Zeitspanne, vielleicht 5 mS negativen strom geben. Man kann auch diese Zeit einstellbar machen, so von... bis. Man könnte dei Rückgabe der Ticks nach Stop auch als Wert zurückgeben. Damit könnte eine Längenmessung nach Stop erfolgen. Es währe auch nicht schlecht mal ein bisschen besser Beispiel oder Kommentare zu geben. Wenn die Befehle immer komplexer werden, dann beherschen nur noch wenige den genauen Programmablauf. Eigentlich soll der Nibo 2 doch was für Anfänger und Könner wein.
    Achim

  3. #53
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.694
    Das hatte ich in diesem Thread bereits angeregt:
    Zitat Zitat von oberallgeier am 01 Dez 2010, 0:20
    ... - und als Powerbremse mit bester Bremswirkung: Gegengas ... Die Diagramme sind über den eben genannten Link erreichbar ...
    Zitat Zitat von workwind am 04 Dez um 18:17
    ... "aktiven" Bremsen ... Strom ... entgegengesetzter Richtung ... sollte der Roboter nahezu direkt anhalten ...
    Nein. Oder ganz präzise: jedenfalls nicht bei mir.
    Zitat Zitat von Hero_123
    ... Vorschlag des "aktiven Bremsens" nicht in etwa dem, daß man beim Erkennen des Absturzes negative Drehzahl als neuen Sollwert vorgeben soll ...
    Das kommt auf die Regelung an. Also darauf, wie die Regelung im Einzelnen aufgebaut ist. Aber eine gute Regelung sollte ja nicht brutal und abrupt reagieren, wie das mit der von mir vorgeschlagenen Schubumkehr der Fall ist von der jetzt auch workwind spricht.
    Ciao sagt der JoeamBerg

  4. #54
    Benutzer Stammmitglied
    Registriert seit
    17.05.2010
    Beiträge
    37
    Hallo @All,
    kann mir jemand bei der Verwendung der copro (motco) Funktionen helfen? copro_setTargetAbs(l,r,s) oder motco_setPosition(l,r,s).

    Ich habe ein freeRTOS Beispiel für den Nibo. Läßt 2 LEDs in 2 verschiedenen Tasks mit unterschiedlicher Dauer blinken. Ist das vielleicht auch für andere User interessant?
    Kann unter AVR Studio 4 auch in der Simulation laufen. Da sieht man dann auf PORTE mal schwarze und mal weiße Kästchen.

    Mit den anderen Themen bin ich noch nicht weitergekommen, bleibe aber dran.

    Lisbeth2010

  5. #55
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    11.08.2009
    Ort
    Berlin
    Alter
    70
    Beiträge
    348

    Nibo 2

    Hallo Lisbeth
    Komme mit deiner Frage nicht so klar. Du gibst den Befehle

    copro_setTargetAbs(l,r,s) oder motco_setPosition(l,r,s).

    an. Habe in meine Befehlsliste gesehen und im Internet nachgeschaut, da stehen die aber nicht drin. Sind mir nicht bekannt oder habe sie bisher übersehen.
    An deinem Prg habe ich auf jeden Fall Interesse. Kannst es mir direkt mailen oder reinstellen.
    Achim

  6. #56
    Benutzer Stammmitglied
    Registriert seit
    17.05.2010
    Beiträge
    37
    Hallo Achim S.,
    schau mal hier:
    http://nibo.svn.sourceforge.net/viewvc/nibo/trunk/src/
    Viele Grüße
    Lisbeth2010

  7. #57
    Erfahrener Benutzer Fleißiges Mitglied Avatar von elektrolutz
    Registriert seit
    20.04.2010
    Ort
    Werl
    Alter
    67
    Beiträge
    139
    Hallo Lisbeth2010,

    hier die Befehlsbeschreibung entsprechend Lib2.8:
    uint8_t copro_setTargetAbs ( int16_t left, int16_t right, uint16_t speed )

    Zielposition für Räder setzen. Die Werte werden in Ticks angegeben. 40 Ticks entsprechen einer Radumdrehung.

    Parameter:
    left absoluter Sollwert für linkes Rad
    right absoluter Sollwert für rechets Rad
    speed Wert für maximale Geschwindigkeit

    Wird benutzt von nibocc::Copro::set_target_abs().
    Wo ist das Problem? Für "left" und "right" werden die gewünschen Zielwerte eingegeben und für "speed" die max. Geschwindigkeit. "Absolut" bedeutet, dass die Räder ihr Ziel von der derzeit aktuellen Zählerposition aus anfahren. Ist das Ziel kleiner der aktuellen Position, dann fährt das Rad also rückwärts.

    Beim "...Rel..."-Befehl erfolgt die Positionierung um den angegebenen Wert bezogen auf die aktuelle Position.

    Ob die Funktion beim Nibo1 "Abs" oder "Rel" ist, leider keine Ahnung. Müsste man ausprobieren, beim Nibo1 müsste dann aber vor dem Befehl noch eine entsprechende Bearbeitung des Zählers erfolgen, die bei Programmübertragung auf den Nibo2 entfallen sollte.

    Das mit dem freeRTOS schaue ich mir mal an.
    Gruß aus Werl
    elektrolutz

    Theorie ist, wenn man weiß, wie alles funktioniert. Praxis ist, wenn alles klappt und keiner weiß warum!

  8. #58
    Benutzer Stammmitglied
    Registriert seit
    17.05.2010
    Beiträge
    37
    freeRTOS: ziemlich viele Dateien. Wie kann man das am Besten "posten"?
    Viele Grüße
    Lisbeth2010

  9. #59
    Hero_123
    Gast
    @Lisbeth2010

    bin doch etwas erstaunt - die Verwendung der Befehle steht doch in den doc-files der jeweiligen lib... "wer des Lesens mächtig..."

    freeRTOS - da sind wohl nicht nur die files, sondern doch etwas MEHR nötig
    - eine Installationsbeschreibung
    - eine Beschreibung der Befehle
    - eine Einbindung in die NIBOLIB
    - usw....

    - oder bist Du da anderer Meinung?

    woher hast du das freeRTOS (weblink etc)?

    poste doch mal deinen Code!

    mfg

    Hero_123

  10. #60
    Benutzer Stammmitglied
    Registriert seit
    17.05.2010
    Beiträge
    37
    Hallo!
    Lesen kann ich, was soll das also?

    Hier mal ein Video:

    http://www.youtube.com/watch?v=SjmQ5mHueG8

    1. Durchdrehen
    2. Stoppen an einem Isolierband

    Falls es jemand interessiert, der Code
    Code:
    /*	Laufstall 04.12.2010 -    IW 
    		Boden: Fliese hellgrau
    		Umrandung: schwarzes Isolierband 15 mm breit
    		nur innerhalb der Umrandung rumfahren
    */
    
    #include <avr/interrupt.h>
    
    #include <nibo/niboconfig.h>
    #include <nibo/iodefs.h>
    
    #include <nibo/bot.h>
    #include <nibo/i2cmaster.h>
    #include <nibo/leds.h>
    #include <nibo/delay.h>
    #include <nibo/motco.h>
    #include <nibo/irco.h>
    #include <nibo/floor.h>
    #include <nibo/adc.h>
    
    /* eigene Funktion Zahlausgabe binär 0..63 */
    int16_t wert;
    void zahlausgabe(int16_t wert) {
    	if ((wert - 32) > 0) {
    		leds_set_status(LEDS_GREEN, 5);
    		wert = wert - 32;
    	} else {
    		leds_set_status(LEDS_OFF, 5);
    	}
    	if ((wert - 16) > 0) {
    		leds_set_status(LEDS_GREEN, 4);
    		wert = wert - 16;
    	} else {
    		leds_set_status(LEDS_OFF, 4);
    	}
    	if ((wert - 8) > 0) {
    		leds_set_status(LEDS_GREEN,3);
    		wert = wert - 8;
    	} else {
    		leds_set_status(LEDS_OFF,3);
    	}
    	if ((wert - 4)> 0) {
    		leds_set_status(LEDS_GREEN,2);
    		wert = wert - 4;
    	} else {
    		leds_set_status(LEDS_OFF,2);
    	}
    	if ((wert - 2)> 0) {
    		leds_set_status(LEDS_GREEN,1);
    		wert = wert - 2;
    	} else {
    		leds_set_status(LEDS_OFF,1);
    	}
    	if ((wert - 1)> 0) {
    		leds_set_status(LEDS_GREEN,0);
    	} else {
    		leds_set_status(LEDS_OFF,0);
    	}
    } // end Zahlausgabe
    
    /* eigene Funktion floor_measure() 2x wg. erster AD-Wandlung */
    int16_t floor_mw[4]; 
    void floor_measure_iw() {
    	floor_enable_ir();
    	floor_mw[0] = 1023-adc_read(0); // Bodensensor von oben in Fahrtrichtung rechts
      floor_mw[1] = 1023-adc_read(1);	// Bodensensor von oben in Fahrtrichtung links
      floor_mw[2] = 1023-adc_read(2);	// Liniensensor von oben in Fahrtrichtung links
      floor_mw[3] = 1023-adc_read(3);	// Liniensensor von oben in Fahrtrichtung rechts
    	//nochmal, wir haben ja Zeit...
    	floor_mw[0] = 1023-adc_read(0); // Bodensensor von oben in Fahrtrichtung rechts
      floor_mw[1] = 1023-adc_read(1);	// Bodensensor von oben in Fahrtrichtung links
      floor_mw[2] = 1023-adc_read(2);	// Liniensensor von oben in Fahrtrichtung links
      floor_mw[3] = 1023-adc_read(3);	// Liniensensor von oben in Fahrtrichtung rechts
    	floor_disable_ir();
    }
    
    /*-----------*/
    /* Laufstall */
    /*-----------*/
    
    uint8_t		speed_left	= 100;	// Ticks/Sekunde Testwert
    uint8_t		speed_right	= 100;	// Ticks/Sekunde Testwert
    
    uint16_t	floor_left;
    uint16_t	floor_right;
    
    void laufstall() {
    	floor_left = floor_mw[1]/16;
    	floor_right = floor_mw[0]/16;
    	//zahlausgabe(floor_right); // da kein Display! keine negativen Werte!	
    	// floor_left  auf gelb: 7, auf schwarz: 0, auf Fliese 6, auf Fuge 3 
    	// floor_right auf gelb: 8, auf schwarz: 0, auf Fliese 6, auf Fuge 3  
    	if ((floor_left < 2) || (floor_right < 2)) { //ABGRUND: STOP
    		leds_set_status(LEDS_ORANGE,0);
    		leds_set_status(LEDS_ORANGE,5);
    		motco_stop();
    		motco_update();
    		delay(1000);
    		motco_setSpeed(-50, -50);
    		motco_update();
    		delay(1000);
    		motco_stop();
    		motco_update();
    	} else {
    		leds_set_status(LEDS_GREEN,0);
    		leds_set_status(LEDS_GREEN,5);
    		motco_setSpeed(speed_left,speed_right);
    		motco_update();
    	}
    } // end laufstall
    
    
    #define WHILE_1_TIME_GRID 10
    uint8_t		counter_2ms;
    
    // ------------------------------------------------------------
    // ---------- init timer2 -------------------------------------
    // ------------------------------------------------------------
    
    void init_timer2(void) {
    	TCCR2 = 0x00;	// normal port operation
    	TCNT2  = 0x83;	// set count value (131)
    }
    
    // ------------------------------------------------------------
    // ---------- start timer2 ------------------------------------
    // ------------------------------------------------------------
    
    void start_timer2(void) {
    	cli();						// disable global interrupts
    	counter_2ms = 0;
    	// Datenblatt falsch!! S. 106 Table 56
    	TCCR2 |= 0x04;		// CS02 = 1; CS01 = 0; CS00 = 1  -> clk/256
    	TIMSK |= (1<<TOIE2); //0x01;		// enable timer overflow interrupt
    	sei();						// enable global interrupts
    }
    
    // ------------------------------------------------------------
    // ---------- stop timer2 -------------------------------------
    // ------------------------------------------------------------
    
    void stop_timer2(void) {
    	cli();								// disable global interrupts
    	TCCR2 &= ~0x05;				// stop timer
    	TIMSK &= ~(1<<TOIE2);	// disable timer overflow interrupt
    	sei();								// enable global interrupts
    }
    
    // ------------------------------------------------------------
    // ---------- timer2 ISR --------------------------------------
    // ------------------------------------------------------------
    
    ISR(TIMER2_OVF_vect) {	// timer2 overflow
    
    	// reload counter value high byte; 0x83 corresponds to 1ms
    	// clk/128 entspricht 125 kHz entspricht 8 us
    	// Datenblatt falsch! clk/256 = 0x04 0 => 2ms
    	TCNT2 = 0x83; //  131 bis 256 also 125 mal 16 us 
    	counter_2ms++;
    
    	if (counter_2ms >= WHILE_1_TIME_GRID) { 
    		stop_timer2(); // Zeitdauer unbekannt, deshalb stoppen
    		// Bodensensoren messen (2 mal)
    		floor_measure_iw(); // schwarz = 0, weiß = 1023 bzw. 63=1023/16 Integer!
    		laufstall();
    		counter_2ms = 0;
    		start_timer2(); // alles abgearbeitet
    	} // end if counter
    } // end ISR
    
    
    /* die main */
    int main() {
    
    	sei();
    	bot_init();
    	i2c_init();
    	leds_init();
    	floor_init();
    	init_timer2();
    	
    	leds_set_status(LEDS_GREEN,5);
    	delay(2000); // damit er nicht gleich losrast!
    	leds_set_status(LEDS_OFF,5);
    
    	motco_setSpeedParameters(5,4,6); // Empfehlung vom "Chef"
    
    	start_timer2();
    	
    	while (1) {
    		// tu was.. oder nix
    		delay(10000);
    	}
    	return 0;
    }
    Viele Grüße Lisbeth2010

Seite 6 von 9 ErsteErste ... 45678 ... LetzteLetzte

Berechtigungen

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

12V Akku bauen