- Labornetzteil AliExpress         
Seite 6 von 7 ErsteErste ... 4567 LetzteLetzte
Ergebnis 51 bis 60 von 67

Thema: NIBObee Erweiterungen

  1. #51
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Zitat Zitat von Tuxi-Halle
    Hallo m.a.r.v.i.n,
    habs einfach mal so gemacht (efuse="FF", hfuse="D1", lfuse="EF") - funktioniert
    Nochmals vielen Dank!
    btw.:kennst Du ein vernünftiges Tutorial zum Thema "fuses"?
    Hallo Tuxi-Halle,
    Ein Tutorial gibt es im RN-Wissen.

    Ich habe es bei meiner NIBObee auch genauso gemacht. Die Fuses vom mega16 eingelesen und auf den mega644 übertragen.

  2. #52
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    Hallo,

    nachdem die IR-Abstandsmessung gut funktioniert, will ich die PINs der 4 Schalter verwenden. Ich habe vor die Schalter abzulöten und die Leitungen der IR-Erweiterung dort anzubringen.

    Ich habe nur bis jetzt nicht herausgefunden an welcher der 4 Lötpunkte pro Schalter ich die Leitung anlöten kann.

    Kann mir bitte jemand weiterhelfen?

  3. #53
    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

    Die Widerstände der Taster R46 bis R49 befinden sich direkt neben X1 bzw. X4. Da die Seiten der Widerstände, die an den X-Steckern liegen, auch die Anschlüsse zum Kontroller sind, habe ich einfach je zwei 2er-Stiftleisten an die Widerstände angelötet. Beim Löten hatte ich die neuen Stifte mit einem Sockel an X1/X4 angesteckt, so habe ich das Rastermass eingehalten und kann die zusätzlichen Pins jeweils zusammen mit X1/X4 verwenden.

    Das habe ich so bei meinem parallelen LCD angewendet, die Taster am LCD hängen dabei neben den D4-D7 am LCD auch parallel zu den orginalen Fühlertasten:
    Bild hier   Bild hier  
    Aus: https://www.roboternetz.de/phpBB2/vi...=477739#477739
    und https://www.roboternetz.de/phpBB2/ze...=476664#476664


    Die Tastenfunktion meiner LCD-Lib unterscheidet nicht zwischen den neuen LCD-Tasten und den orginalen Sens-Tastern:
    Code:
    uint8_t lcd_getkeys(void)
    {
       uint8_t keys=0;
       el;
       DDRC &= ~0b11110010;                     // LCD-Pins auf Eingang mit PullUp
       PORTC |= 0b11110010;
       delay(1);
    
       if(PINC & (1<<PC1)) keys |= 16;
       if(PINC & (1<<PC4)) keys |= 8;
       if(PINC & (1<<PC5)) keys |= 4;
       if(PINC & (1<<PC6)) keys |= 2;
       if(PINC & (1<<PC7)) keys |= 1;
    
       PORTC &= ~0b11110010;                // nanu ???
       DDRC |= 0b11110010;                     // LCD-Pins auf Ausgang und low
       return(~keys & 0b11111);
    }
    Meine bee hat nun AAs als Stromversorgung, weil die AAAs mit dem LCD zu schnell zusammenbrechen (unter 4,6V wird meine bee vom Programmer nicht mehr erkannt!). Die Ladefunktion hatte ich eh nie genutzt, deshalb habe ich die drei Jumper durch Brücken ersetzt. Leider fehlen ein paar Millimeter Platz zwischen den Radkästen:
    Bild hier  

    Gruß

    mic


    Edit: http://www.roboter.cc/index.php?opti...Itemid=20#1062
    Geändert von radbruch (01.05.2012 um 09:50 Uhr)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #54
    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

    Nun habe ich mich endlich auf die Odometry gestürzt und diese auch gleich etwas gepimpt. Mechanische Änderung sind je 4 zusätzliche Löcher in den Codescheibenritzeln, softwaremäßig habe ich odometry.c der Lib ersetzt.

    Durch die zusätzlichen Löcher sind die Abstände der Löcher in den Coderitzeln gleichmäßiger, deshalb werden die Odometryzähler nun bei erkanntem Pinchange des entsprechenden Eingangs erhöht. Das ergibt mit 16 Zählimpulsen pro Coderadumdrehung eine deutliche Verbesserung gegenüber den vier Impulsen der orginalen Odometry. Die Impulse werden nur aufsteigend und drehrichtungsunabhängig gezählt. Gleichzeitig wird die Differenz der Seiten seit dem letzen Zählerreset gebildet. Die neuen Funktionen dafür sind:

    int odometry_reset(void); // Zähler zurücksetzen
    int odometry_get_left(void); // linken Zähler auslesen
    int odometry_get_right(void); // rechten Zähler auslesen
    int odometry_get_difference(void); // Zählerdifferenz auslesen, positiv bedeutet links>rechts

    Desweiteren habe ich eine (in der Library nicht verwendete) Overflow-ISR am Timer1 eingeklinkt. Diese wird mit 15MHz/1022= ca. 15kHz aufgerufen und bildet die Basis für einfache Zeit- und Geschwindigkeitsfunktionen:

    void Sleep(uint8_t); // Pause in 1/15000 Sekunden
    void Msleep(uint16_t); // Pause in 1/1000 Sekunden
    void delay(uint16_t); // ohne delay.h, verwendet Msleep()
    uint32_t gettime(void); // Millisekunden seit dem Systemstart (als 32bit-Wert)
    int speed_get_left(void); // 1000 minus Anzahl der Overflow-Ticks zwischen zwei positiven Flanken links
    int speed_get_right(void); // dito rechts

    Maxwerte für die Geschwindigkeitsmessung mit Startwert 1000 sind bei meiner Bee ca. 900 (also 100 Ticks zwischen den Löchern), bei orginalen Coderitzeln muss man die Werte selbst ermitteln. Mein aktueller Arbeitscode dazu:

    Code:
    // nibobee Odometry- und Motorfunktionen                                     24.1.01 mic
    
    // Modifizierte Odometry mit 8 Löchern in den Ritzeln und Pinchange-Interrupt
    // ergibt 16 Flanken pro Umdrehung des Coderitzels.
    
    // Zusätzlich zur Library ist für den Timer1 eine Overflow-ISR eingeklingt die
    // mit ca. 15kHz die Zeitbasis für Sleep(), Msleep() und gettime() liefert.
    // Außerdem misst diese ISR die Anzahl der Timer1-Overflows zwischen zwei positiven
    // Flanken der Odometrysensoren als umgekehrtes Mass für die Geschwindigkeit.
    
    #include <nibobee/iodefs.h>
    #include <nibobee/led.h>
    #include <nibobee/motpwm.h>
    
    // Variblen
    volatile uint8_t count15kHz;
    volatile uint32_t count_ms; // 32bit-Zähler!
    volatile uint16_t odometry_left=0, odometry_right=0;
    volatile int16_t odometry_difference=0;
    volatile uint16_t speed_left=0, speed_right=0, speed_left_tmp=1000, speed_right_tmp=1000;
    int16_t motor_pwm_left, motor_pwm_right;
    uint32_t stopwatch1, stopwatch2;
    
    // Funktionen
    void Sleep(uint8_t pause);		// ca. 1/15000 Pause blockierend
    void Msleep(uint16_t pause);	// ca. 1/1000 Pause blockierend
    inline void delay(uint16_t pause) { Msleep(pause); }
    uint32_t gettime(void);			// Millisekunden seit Systemstart als 32bit-Wert
    void odometry_reset(void);    // Odometryzähler zurücksetzen
    int odometry_get_left(void);  // Odometryzähler auslesen
    int odometry_get_right(void);
    int odometry_get_difference(void); // Zählerunterschied seit dem letzten odo_reset
    int speed_get_left(void);     // Geschwindigkeit auslesen
    int speed_get_right(void);
    
    #include "lcd_lib.c"          // Hier muss man die eigene LCD-Lib einbinden
    int main(void)
    {
    	led_init();
    	motpwm_init();
    	TIMSK |= (1 << TOIE1); // Die Overflow-ISR misst die Geschwindigkeit der Antriebe
    	enable_interrupts();
     	lcd_init();
     	lcd_writeString("  Nibobee mit LCD");
    
      	led_set(0,1);
    	Msleep(2000); // wait4programmer
     	lcd_writeStringAt(0,3,"Bitte Taste druecken");
    	while(!lcd_getkeys()) {PORTB ^= (1<<PB0); Msleep(100);}
      	led_set(0,0);
    
    	// Odometry: enable int0 and int1 on pinchange
    	MCUCR = (1<<ISC10) | (1<<ISC00);	// Interrupt bei Pinchange
    	GICR |= (1<<INT1) | (1<<INT0);   // Int0 und Int1 freigeben
    
    	lcd_cls();
    	lcd_writeString("  Odometrywerte");
    	lcd_writeStringAt(0,2,"Sp/PWM Li:");
    	lcd_writeStringAt(0,3,"Sp/PWM Re:");
    
    	motor_pwm_left=motor_pwm_right=300;
    	stopwatch1=stopwatch2=gettime();
    
    while(1)
    {
    	odometry_reset();
    	while((odometry_get_left()+odometry_get_right()) < 998) // Sollposition 1000
    	{
       	motpwm_setLeft(motor_pwm_left); motpwm_setRight(motor_pwm_right);
    	   if((odometry_get_left()+odometry_get_right()) < 900) // Verzögerungspunkt
    		{
    			if(gettime() > stopwatch1)
    			{
    				stopwatch1=gettime()+20; // alle 20 Millisekunden ausführen
    				if(odometry_difference > 0)
    			   {
    			      motor_pwm_left--;
    			      motor_pwm_right++;
    				}
    				else
    			   {
    			      motor_pwm_left++;
    			      motor_pwm_right--;
    				}
    			}
    		}
    		else
    		{
    			motor_pwm_left=motor_pwm_right=200; // Einfahrgeschwindigkeit
    		}
    
    		if(gettime() > stopwatch2)
    		{
    		   stopwatch2=gettime()+300;
     			lcd_writeIntegerAt(11,2,speed_get_left(), 10);
     			lcd_writeString("/");
     			lcd_writeInteger(motor_pwm_left, 10);
     			lcd_writeString("  ");
     			lcd_writeIntegerAt(11,3,speed_get_right(), 10);
     			lcd_writeString("/");
     			lcd_writeInteger(motor_pwm_right, 10);
     			lcd_writeString("  ");
    		}
    	}
    	motpwm_stop();
    	Msleep(200);
     	lcd_writeStringAt(0,1,"L ");
     	lcd_writeInteger(odometry_get_left(), 10);
     	lcd_writeString(" R ");
     	lcd_writeInteger(odometry_get_right(), 10);
     	lcd_writeString(" S ");
     	lcd_writeInteger(odometry_get_difference(), 10);
     	lcd_writeString("  ");
    
    	motor_pwm_left=motor_pwm_right=300;
     	while(!lcd_getkeys()) {PORTB ^= (1<<PB0); Msleep(100);}
    }
       return(0);
    }
    ISR(INT0_vect)
    {
    	// static uint8_t flag=0; // nur jedes zweite Loch zählen für orginale bee
    	odometry_left++;
    	odometry_difference++;
    	if(PIND & (1<<PD2)) // if(flag++)
    	{
    		speed_left=(speed_left+speed_left_tmp)/2; // unterschiedliche Lochabstände ausgleichen
    		speed_left_tmp=1000;
    		// flag=0;
    	}
    	PORTB ^= (1<<PB0); // Kontrolle mit LED0
    }
    ISR(INT1_vect)
    {
    	//static uint8_t flag=0;
    	odometry_right++;
    	odometry_difference--;
    	if(PIND & (1<<PD3)) // if(flag++)
    	{
    		speed_right=(speed_right+speed_right_tmp)/2;
    		speed_right_tmp=1000;
    		// flag=0;
    	}
    	PORTB ^= (1<<PB3); // Kontrolle mit LED3
    }
    ISR(TIMER1_OVF_vect)
    {
       static uint8_t count_ms_temp=15;
       
       if(speed_left_tmp) speed_left_tmp--;
       if(speed_right_tmp) speed_right_tmp--;
       //PORTB ^= (1<<PB2); // Kontrolle mit LED2
    
    	if(count15kHz) count15kHz--;
       if(!count_ms_temp--) {count_ms++; count_ms_temp=15;}
    }
    void Sleep(uint8_t pause) // ca. 1/15000 Pause blockierend
    {
    	count15kHz=pause;
    	while(count15kHz);
    }
    void Msleep(uint16_t pause) // ca. 1/1000 Pause blockierend
    {
    	while(pause--) Sleep(15);
    }
    uint32_t gettime(void) // Millisekunden seit Systemstart als 32bit-Wert
    {
    	uint32_t temp32;
    	cli();
    	temp32=count_ms;
    	sei();
    	return(temp32);
    }
    void odometry_reset(void)
    {
    	cli();
    	odometry_left=odometry_right=odometry_difference=0;
    	sei();
    }
    int odometry_get_left(void)
    {
    	uint16_t temp16;
    	cli();
    	temp16=odometry_left;
    	sei();
    	return(temp16);
    }
    int odometry_get_right(void)
    {
    	uint16_t temp16;
    	cli();
    	temp16=odometry_right;
    	sei();
    	return(temp16);
    }
    int odometry_get_difference(void)
    {
    	uint16_t temp16;
    	cli();
    	temp16=odometry_difference;
    	sei();
    	return(temp16);
    }
    int speed_get_left(void)
    {
    	uint16_t temp16;
    	cli();
    	temp16=speed_left;
    	sei();
    	return(temp16);
    }
    int speed_get_right(void)
    {
    	uint16_t temp16;
    	cli();
    	temp16=speed_right;
    	sei();
    	return(temp16);
    }
    Soweit, so gut, das funktioniert alles zufriedenstellend. Aber wie kann ich nun die Geschwindigkeiten der Motoren regeln? Alle meine Anläufe die diversen Reglergrößen anzupassen scheiterten bisher kläglich. Selbst einen popeligen P-Regler kann ich nicht umsetzen, weil ich nicht weiß, wie ich die Abtastzeit und die Stellgröße (möglichst ohne float) an meine bee anpassen kann. Hier finde ich den Einstieg nicht, vielleicht kann mir das mal jemand erklären.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #55
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.11.2009
    Alter
    31
    Beiträge
    474
    Blog-Einträge
    4
    Hallo
    ich bin mal so dreist und hole diesen thread aus der Versenkung.

    Ich hab mit meinem Bienchen mittlerweile auch schon allerhand unsinn angestellt und möchte ihn jetzt auch Hardware seitig umbauen.
    Gut gefiel mir die idee die taster durch ir dioden zu ersetzen, aber mir ist nicht so ganz klar wie ich das machen muss.
    drum die frage ob mir das mal einer erklären kann?

    danch würd ich gerne ein kleinen arm auf meine bienchen bauen, dafür bräuchte ich drei so mini Servos kann ich die überhaupt alle ansteuern?
    und geht des einigermassen lkeicht? ich hab mich bisher nur mit den standard funktionen beschäftigt
    was haltet ihr von diesen Servos?
    mfg Sebastian

  6. #56
    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

    Das wurde hier mal vorgeschlagen, aber nie umgesetzt:
    https://www.roboternetz.de/phpBB2/ze...=476661#476661

    Daraus ist dann eine IR-Abstandmessung für die bee geworden die wir hier zusammengebastelt haben:
    https://www.roboternetz.de/phpBB2/ze...ag.php?t=52115

    Mehrere Servos anzuschliesen und anzusteuern ist kein Problem mit der bee. Als Basis könntest du diese Servo-ISR verwenden:
    https://www.roboternetz.de/phpBB2/ze...=474468#474468

    Für mehrere Servos sind die AAAs der Biene zu schwach. Mit AAs könnte sie den geplanten Arm auch besser ausbalancieren:
    Bild hier  

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #57
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.11.2009
    Alter
    31
    Beiträge
    474
    Blog-Einträge
    4
    vielen dank ich lese es mir gleich mal durch
    den thread mit der abstandsmessung hab ich bei meiner Suche gar nicht gefunden, muss ich wohl noch weng üben
    bei den Servos ist irgendwie der link verschwunden bzw wurde durch den link ins rn wissen ersetzt hier nochmal
    was meint ihr dazu
    http://cgi.ebay.de/ws/eBayISAPI.dll?...=STRK:MEWAX:IT

  8. #58
    Neuer Benutzer Öfters hier
    Registriert seit
    25.11.2010
    Beiträge
    5
    Hallo,

    ich möchte auch ein LCD über I²C betreiben. Nur leider klappts nicht so richtig und ich finde den Fehler einfach nicht. Die BGX1 Lib is eingefügt und dann hab ich den Code einfach kopiert. Trotzdem kommt diese Fehlermeldung.

    Code:
    ../lcdi2c.c: In function 'lcd_writePCF8574':
    ../lcdi2c.c:174: error: 'i2c_size' undeclared (first use in this function)
    ../lcdi2c.c:174: error: (Each undeclared identifier is reported only once
    ../lcdi2c.c:174: error: for each function it appears in.)
    ../lcdi2c.c: In function 'lcd_pushNibble':
    ../lcdi2c.c:186: error: 'i2c_size' undeclared (first use in this function)
    make: *** [lcdi2c.o] Error 1
    Build failed with 4 errors and 0 warnings...

    Dann hab ich "i2c_size" einfach mal auskommentiert um zu schauen ob noch mehrere Fehler kommen. Dann kam folgendes

    Code:
    D:\programme\nibobee\lib\libnibobee_bgx1.a(i2cmaster.o): In function `i2c_init':
    i2cmaster.c:(.text.i2c_init+0x16): undefined reference to `nibobee_initialization'
    i2cmaster.c:(.text.i2c_init+0x1c): undefined reference to `nibobee_initialization'
    make: *** [Elsy_NiBoBee.elf] Error 1
    Build failed with 2 errors and 0 warnings...
    Wäre dankbar für einen Tipp....
    Danke im Voraus

  9. #59
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.05.2007
    Ort
    Stolberg
    Beiträge
    111
    Die BGX1 Bibliothek (libnibobee_bgx1.a) muss noch dazugelikt werden!

    Linker-Option: -l nibobee_bgx1

  10. #60
    Neuer Benutzer Öfters hier
    Registriert seit
    25.11.2010
    Beiträge
    5
    Nach etwa einer 1 stündigen Suche bin ich noch immer nicht weiter. Wie linke ich die denn dazu?
    Und wieso hab ich mit den anderen Libs keine Probleme?

Seite 6 von 7 ErsteErste ... 4567 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test