- 3D-Druck Einstieg und Tipps         
Seite 2 von 9 ErsteErste 1234 ... LetzteLetzte
Ergebnis 11 bis 20 von 85

Thema: NIBO2 - Test Bodensensoren

  1. #11
    Hero_123
    Gast
    Anzeige

    Praxistest und DIY Projekte
    Hi workwind

    nein, habe ich (noch) nicht. Um ehrlich zu sein - auf den Gedanken bin ich noch nicht gekommen; kann ich mal testen -> also anstatt den Befehl copro_stop() bei "Absturzerkennung" den Befehl copro_setSpeed(-20, -20) anwenden...der NIBO wird in diesem Fall dennoch ein Stück weiter fahren, denn der Integrator muß m.E. erst von positiv nach negativ integrieren, müßte er aber relativ schnell machen (kommt natürlich auf die Einstellungen des Reglers an - ki, kp, kd).

    Wie schon weiter oben erwähnt, bin ich der Meinung, bei copro_stop() müßte der NIBO2 unverzüglich stoppen, da m.E. die Motorbrücken hw-mäßig spannungsfrei geschaltet werden müßten -> damit ein sofortiger Stopp, denn bei meinem NIBO2 ist kein Nachlauf der Räder, die lassen sich nicht ohne Kraftaufwand drehen....

    Ich habe den Eindruck, daß manchmal dieser Befehl nicht abgearbeitet wird, ich muß mir erst noch eine Methode überlegen, wie ich dies sicher nachweisen kann.

    mfg

    Hero_123

  2. #12
    Benutzer Stammmitglied
    Registriert seit
    17.05.2010
    Beiträge
    37
    Hallo, ich habe eine Lösung für den Nibo (1), aber sie sollte relativ einfach auf den Nibo 2 adaptiert werden können. Sie benutzt den Timer2, der HOFFENTLICH (s. mangelhafte Dokumentation!!)verwendet werden kann. Wie kann man hier Code posten?
    Lisbeth

  3. #13
    Benutzer Stammmitglied
    Registriert seit
    17.05.2010
    Beiträge
    37
    Zitat Zitat von Lisbeth2010
    Hallo, ich habe eine Lösung für den Nibo (1), aber sie sollte relativ einfach auf den Nibo 2 adaptiert werden können. Sie benutzt den Timer2, der HOFFENTLICH (s. mangelhafte Dokumentation!!)verwendet werden kann. Wie kann man hier Code posten?
    Lisbeth
    Code:
    /* Linie einfachst. Erstmal Bodensensoren */
    
    #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>
    
    #include "utiliw.h"
    
    #define WHILE_1_TIME_GRID 20
    uint8_t counter_1ms;
    uint8_t speed_left = 40; // Ticks/Sekunde
    uint8_t speed_right = 40;	// Ticks/Sekunde
    
    
    // ------------------------------------------------------------
    // ---------- 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_1ms = 0;
    	TCCR2 |= 0x05;		// CS02 = 1; CS01 = 0; CS00 = 1  -> clk/128
    	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);//0x01;	// 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
    	TCNT2 = 0x83; //  131 bis 256 also 125 mal 8 us 
    	counter_1ms++;
    
    	if (counter_1ms >= WHILE_1_TIME_GRID) { 
    		stop_timer2(); // Zeitdauer unbekannt, deshalb stoppen
    		// Bodensensoren messen
    		floor_measure_iw();
    		//zahlausgabe(floor_mw[2]); // da kein Display!	
    
    		if (floor_mw[2] < 32) { // schwarz = 0, weiß = 1023
    			motco_stop();
    			motco_update();
    			leds_set_status(LEDS_RED,0);
    		} else {
    			leds_set_status(LEDS_GREEN,0);
    			// delta_motco ms nach vorn fahren		
    			motco_setSpeed(speed_left,speed_right);
    			motco_update(); // jetzt fährt er erst los!
    		} // end if floor
    		counter_1ms = 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();
    	
    	delay(2000); // damit er nicht gleich losrast!
    
    	motco_setSpeedParameters(5,4,6); // Empfehlung vom "Chef"
    
    	start_timer2();
    
    	while (1) {
    		// tu was
    		delay(10000);
    	}
    	return 0;
    }

  4. #14
    Benutzer Stammmitglied
    Registriert seit
    17.05.2010
    Beiträge
    37
    Hoffentlich verständlich! Wenn nicht: FRAGEN!
    Lisbethh

  5. #15
    Hero_123
    Gast
    Hi Lisbeth2010

    Den Code kann man problemlos auf den NIBO2 portieren, Timer2 und Timer0 sind soweit ich gesehen habe, frei. Außerdem ist er sehr gut kommentiert - eine Seltenheit!!

    In Deiner ISR fragst Du alle 20ms (+xms wg Einlesen Bodensensoren) ab, ob "Absturzgefahr" besteht, wenn ja, soll der NIBO stehen bleiben,wenn nein, soll er weiterfahren; d.h. bei Dir läuft die stop-routine in einer ISR.

    Bei mir läuft bzw lief sie in der "normalen" while-schleife. Mein Problem ist ja, daß er NACH dem Befehl copro_stop() (beim NIBO1 ist das ja der Befehl motco_stop()) NOCH einige cm weiterfährt, abhängig von der Geschwindigkeit (ist manchmal ÜBERHAUPT nicht stehen geblieben). Ich habe derzeit leider wenig Zeit, das mit der ISR bei mir testen, aber ich befürchte, daß die ISR mein Problem auch nicht löst...werde es aber noch testen und Dir Bescheid geben!

    Stoppt bei Dir Dein NIBO1 UNVERZÜGLICH, wenn motco_stop() aufgerufen wird oder fährt er auch noch etwas weiter (ein paar cm)?

    mfg

    Hero_123

  6. #16
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    11.08.2009
    Ort
    Berlin
    Alter
    69
    Beiträge
    348

    Nibo 2

    Hallo
    Du hast es so gewollt. Fragen !
    Hab da wohl bei einigen Sachen in der Schule gefehlt. Was ist ISP ? Wie viel Timer hat der Nibo? und was ist TCCR und TIMSK? Danke

  7. #17
    Benutzer Stammmitglied
    Registriert seit
    17.05.2010
    Beiträge
    37
    @Hero_123: Ja, der Nibo stoppt unverzüglich, d.h. innerhalb von 20 ms. In der "normalen" while-Schleife kann sonst was passieren, auch wenn es nur ein delay von 20 s ist (zum Beispiel). Die Motorregelung wird alle 10 ms aktualisiert. Es wäre schön, wenn Du mal einen Test durchführen könntest!
    @Achim S.: Deine Fragen beantwortet das Datenblatt des ATmega128 (das Gehirn) und das avrgcc Tutorial. ISR = Interrupt Service Routine. Der Nibo hat 4 Timer. Timer 1 wird für die PWM der "Headlights" verwendet. Hier kann man sehr schön das "Dimmen" der LEDs testen.
    Viele Grüße
    Lisbeth

  8. #18
    Hero_123
    Gast
    Hi Lisbeth2010

    Ich habe es soeben nochmal mit meinem NIBO2 probiert:

    - die Bodensensoren nochmal neu kalibriert gemäß Tutorial
    - meine timer2 ISR entsprechend Deinem Vorschlag modifiziert

    Fazit: bei 40 Ticks fährt der NIBO2 trotz geänderter ISR immer zu weit (stoppt ca 3mm vor ENDE des Teflon-Randes) -> Verhalten wie gehabt (siehe hier weiter oben), der Aufruf in der ISR bringt (zumindest bei mir) leider nicht den gewünschten Erfolg...

    wenn er bei Dir innerhalb der 20ms stoppt = STEHT (20ms = Strecke von ca 3mm bei 40 Ticks, da 40 Ticks = 14cm/sek), dann verhält sich bei Dir die Reglung der Motoren anders als bei mir; ich habe ja den Atmega88 als Mot-Regler...

    naja, ich kann dann eben die "Absturzerkennung" nicht verwenden. Dumm ist auch, daß ich den Atmega88 (der die Mot-Regelung macht) nicht programmieren kann, da keine ISP Schnittstelle auf dem Bord dafür vorhanden ist.

    mfg

    Hero_123

  9. #19
    Benutzer Stammmitglied
    Registriert seit
    17.05.2010
    Beiträge
    37
    Hallo,
    ich hab nochmal einiges probiert:
    Der AD-Wert des rechten Bodensensors unterscheidet sich signifikant von den Werten der anderen. Da das der 1.Wert ist (0!) wird dieser Wert nicht korrekt gemessen (hatte ich schon mal, muß allerdings die Lösung suchen). Versuch es mal nur mit dem linken (1!) Sensor oder aber auch mal testweise mit den Liniensensoren.
    Jetzt habe ich aber mal eine Frage: wenn der Raddurchmesser 35 mm ist, dann sollte doch 1 Umdrehung = 20 Ticks = 100 mm sein, oder?
    Grüße
    Lisbeth

  10. #20
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.686
    Hallo Hero_123,

    Zitat Zitat von Hero_123
    ... Dumm ... Atmega88 ... nicht programmieren kann, da keine ISP Schnittstelle ...
    Das macht ja eigentlich nix. Dafür gibt es zum Beispiel diese Lösung, die ich bei kleinen THT-Controllern habe (klick hier).

    ........Bild hier  ....Bild hier  ........Bild hier  
    ........Hier ist das Zielsystem(chen) - ...... - und hier - ...... - aufgeklippte ISP-Anschlüsse

    Viel Erfolg.
    Ciao sagt der JoeamBerg

Seite 2 von 9 ErsteErste 1234 ... LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress