- LiFePO4 Speicher Test         
Seite 5 von 7 ErsteErste ... 34567 LetzteLetzte
Ergebnis 41 bis 50 von 67

Thema: NIBObee Erweiterungen

  1. #41
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    Anzeige

    Powerstation Test
    Nachtrag:

    Ich habe die Räder gegen ASURO-Räder ausgetauscht, der Grip ist deutlich besser.

  2. #42
    Benutzer Stammmitglied
    Registriert seit
    18.12.2009
    Ort
    Halle (Saale)
    Alter
    68
    Beiträge
    30

    Re: NIBObee mit ATmega644

    Zitat Zitat von m.a.r.v.i.n
    Anbei sind die geänderten Files beigefügt, damit man die NIBObee Lib auch mit den ATmegaxx4 Prozessoren verwenden kann. Ausprobiert habe ich das ganze mit einem ATmega644.

    Zum Übersetzen der Lib oder eines Programmes kann man einfach ein anderes Device angeben:

    make DEVICE=atmega644
    Hallo m.a.r.v.i.n,
    den ATmega644 hatte ich gleich mit dem NIBObee mitbestellt, weil ich dachte, daß es nicht übel wäre, für 5€ 4x soviel Speicher zu haben wie das Original.
    Heute wollte ich nun auf den 644 umsteigen und hab es so gemacht, wie oben beschrieben: Deine Dateien in den /src - Zweig kopiert, die libs wie beschrieben neu gebaut, die Projekte auf den 644 angepasst genau wie den Aufruf von avrdude. Damit lassen sich die Programme auch übersetzen und auf den NIBObee laden.
    So weit - so gut. Dann gehen die Problem aber los: Die Programme laufen wesentlich laaaaaaaangsamer, als mit dem ATmega 16 - handgestoppt so um den Faktor 20. Die Liniensensoren funktionieren, lcd-Anzeige klappt, aber die linken Fühler funktionieren nicht mehr - die rechten Fühler dagegen schon. Alles wie gesagt wesentlich langsamer.
    Wenn ich den ATmega16 wieder einbaue und die entsprechenden Einstellung wiederherstelle, dann klappt alles normal.
    Hast Du eine Idee, was da falsch laufen könnte? Habe ich etwas vergessen? Ist der 644 defekt? Bin etwas ratlos...

  3. #43
    Benutzer Stammmitglied
    Registriert seit
    18.12.2009
    Ort
    Halle (Saale)
    Alter
    68
    Beiträge
    30
    Hallo pinsel,
    Zitat Zitat von pinsel120866
    1. Servo: http://www.conrad.de/goto.php?artikel=230500 auf X3 stecken (ACHTUNG vorher Plus-Minus vertauschen bzw. auf Polung achten)

    2.US-Modul SRF05: http://www.shop.robotikhardware.de/s...roducts_id=133 kommt auf X2 (Leitung vorher richtig anlöten, Bedienungsanleitung genau durchlesen)
    Prima - danke! Habe mir mal die SRF-Sensoren angesehen. Ich überlege, ob ich gleich den SRF10 nehme - den gibt es gleich mit passendem Montage-Winkel. Kleiner ist er auch noch und läßt sich wegen i2c-Ansteuerung leicht programmieren - der NIBObee hat ja alles, was man dafür braucht Spricht außer dem Preis etwas gegen dieses Teil?
    4. Testprogramm ist angehängt.
    Könnte man sich Deinen Quellcode mal ansehen?

  4. #44
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    Hi Tuxi,

    natürlich kannst du das SFH10 nehmen.

    Mein Testprogrammcode sieht so aus:
    Code:
    'Verwendeter Compiler Bascom V 1.11.9.3
    '
    'Aufgabe:
    'Entfernung wird gemessen und in Zentimetern über
    'RS232 ausgegeben
    'Autor: Pinsel120866
    '###################################################
    
    $regfile = "m16def.dat"
    $crystal = 15000000
    $baud = 9600
    $hwstack = 32
    $framesize = 32
    $swstack = 32
    Dim Zeitmessung As Word
    Dim Entfernung As Word
    Wait 1
    Print "**** SRF05 mit NIBOBee *****"
    Print "Entfernung in cm anzeigen"
    Print " "
    Config Pinc.2 = Output
    Do
    Portc.2 = 0
    Pulseout Portc , 2 , 40
    Pulsein Zeitmessung , Pinc , 2 , 1
    Zeitmessung = Zeitmessung * 10
    Entfernung = Zeitmessung / 58
    Print "Entfernung: " ; Entfernung ; " cm"
    Wait 1
    Loop

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

    Re: NIBObee mit ATmega644

    Zitat Zitat von Tuxi-Halle
    Hallo m.a.r.v.i.n,
    den ATmega644 hatte ich gleich mit dem NIBObee mitbestellt, weil ich dachte, daß es nicht übel wäre, für 5€ 4x soviel Speicher zu haben wie das Original.
    Heute wollte ich nun auf den 644 umsteigen und hab es so gemacht, wie oben beschrieben: Deine Dateien in den /src - Zweig kopiert, die libs wie beschrieben neu gebaut, die Projekte auf den 644 angepasst genau wie den Aufruf von avrdude. Damit lassen sich die Programme auch übersetzen und auf den NIBObee laden.
    So weit - so gut. Dann gehen die Problem aber los: Die Programme laufen wesentlich laaaaaaaangsamer, als mit dem ATmega 16 - handgestoppt so um den Faktor 20. Die Liniensensoren funktionieren, lcd-Anzeige klappt, aber die linken Fühler funktionieren nicht mehr - die rechten Fühler dagegen schon. Alles wie gesagt wesentlich langsamer.
    Wenn ich den ATmega16 wieder einbaue und die entsprechenden Einstellung wiederherstelle, dann klappt alles normal.
    Hast Du eine Idee, was da falsch laufen könnte? Habe ich etwas vergessen? Ist der 644 defekt? Bin etwas ratlos...
    Hallo Tuxi-Halle,

    der Prozessor ist sicher nicht defekt. Die Fuse Bits stimmen nur nicht. Ein fabrikfrischer Prozessor läuft mit internem Takt mit 1MHz.
    Hier sind 2 Screenshots zur Verwendung des myAVR Progtool mit der NIBObee.
    1. Zeigt die Einstellung der Programmer Hardware. Unter Sonstiges usbasp und als Schnittstelle USB auswählen.
    http://www.flickr.com/photos/hmblgrmpf/4224673867/

    2. Zeigt die Fuses Einstellungen des Original NIBObee Controller. In die Fuse & Lock-Bits Einstellung gelangt man unter Brennen, bearbeiten.
    http://www.flickr.com/photos/hmblgrmpf/4224673787/

  6. #46
    Benutzer Stammmitglied
    Registriert seit
    18.12.2009
    Ort
    Halle (Saale)
    Alter
    68
    Beiträge
    30
    Hallo pinsel,
    danke für die schnelle Antwort!
    Zitat Zitat von pinsel120866
    natürlich kannst du das SFH10 nehmen.
    Schon bestellt Leider ist das Ding samt Befestigungswinkel teurer als der ganze NIBObee Aber was solls...
    Mein Testprogrammcode sieht so aus:
    'Verwendeter Compiler Bascom V 1.11.9.3
    ...
    Bascom kenne ich zwar nicht, aber man versteht auch so, was gemacht wird
    Ich meinte aber eher die Ansteuerung des Servos, weil ich das noch nie gemacht habe. Die eigentliche Messerei muß ich mit dem SFH10 sowieso anders machen. Den Conrad-Servo hab ich mir angeschaut - wirklich schön klein und preiswert das Ding! Braucht man dafür extra Treiberschaltkreise oder wie geht das? Kannst Du dafür mal ein Code-Schnipsel posten?
    Danke!

  7. #47
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hier sind 2 Screenshots zur Verwendung des myAVR Progtool mit der NIBObee.
    Wiewas? So einfach ist das? Und funktioniert wunderbar. *dankedankedanke*
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #48
    Benutzer Stammmitglied
    Registriert seit
    18.12.2009
    Ort
    Halle (Saale)
    Alter
    68
    Beiträge
    30

    Re: NIBObee mit ATmega644

    Hallo m.a.r.v.i.n,
    Die Fuse Bits stimmen nur nicht. Ein fabrikfrischer Prozessor läuft mit internem Takt mit 1MHz.
    Danke! Daran wird es wohl liegen.
    Ich hab mal die fuses des ATmega16 ausgelesen:
    Bild hier  

    Und dann die des ATmega644:
    Bild hier  

    Wenn ich Dich recht verstanden habe, dann muß ich wohl die Werte des 16ers aus dem NIBObee in den 644er schreiben, also "hfuse=D1" und "lfuse=EF". Was ist aber mit den "efuse", die es offenbar beim 16er gar nicht gibt? Einfach so lassen ("FF")? Habe leider nix wirklich Erhellendes "ergoogeln" können

  9. #49
    Benutzer Stammmitglied
    Registriert seit
    18.12.2009
    Ort
    Halle (Saale)
    Alter
    68
    Beiträge
    30
    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"?

  10. #50
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    Hi tuxi,

    ich gebe dir mal den gesamten C-Code meines Greifer-Asuros:
    Den Ablauf siehst du unter http://www.youtube.com/watch?v=wQY2dqMZH3Y

    Code:
    /************************************************************************
    
    	Test Programm fuer den ASURO IR-Adapter mit 2 Sende-LEDs
    	
    	Der ASURO ermittelt ueber den nach vorne gerichteten 
    	Infrarot Empfänger und Sender über die Reflektion des
    	Lichtes an einem Objekt ungefaehr dessen Abstand.	
    
    	Es wird je nach Abstand der Rechten SendeLED die Status-LED in
    	verschiedenen Farben eingeschaltet. Wir der Abstand kleiner als 17 cm
    	werden die Motoren mit verschiedenen Geschwindigkeiten eingeschaltet. 
    
    	Zur Compilierung dieses Programmes wird asuro.c und asuro.h aus
    	der ASURO Lib 2.6.1 benötigt. Die ASURO Lib ist auf sourceforge 
    	zu finden.
    
    ************************************************************************
    
    	Hardware: ASURO Roboter
    	
    	prozessor:	ATMEGA32
    	clock:		16MHz Crystal
    
    ****************************************************************************
    
    	date	authors					version		comment
    	======	======================	=======		==============================
    	Jan.08	(ch) robo.fr			V1.0		First implemetation
    	Apr.08  (kk) pinsel				V1.1		Erweiterung auf 2 SendeLEDs
    	
    	Versions:
    
    	V1.0
    	- first version
    	V2.0
    	- Auf 2 SendeLEDs erweitert
    
    ***************************************************************************/
    /***************************************************************************
     *   
     *   (c) 2007 robo.fr , christoph(at)roboterclub-freiburg.de
     *
     ***************************************************************************
     *   This program is free software; you can redistribute it and/or modify  *
     *   it under the terms of the GNU General Public License as published by  *
     *   the Free Software Foundation version 2 of the License,                *
     *   If you extend the program please maintain the list of authors.        *
     *   If you want to use this software for commercial purposes and you      *
     *   don't want to make it open source, please contact the authors for     *
     *   licensing.                                                            *
     ***************************************************************************/
    
    #include "asuro.h"
    #include <stdlib.h>
    
    unsigned char i, servo_stellzeit;
    
    /*************************************************************************
    
    	uint8_t objekt_sichtbar(uint8_t abstand)
     
     	Ist ein Objekt in der Entfernung kleiner oder gleich
    	dem Eingangsparameter "abstand" erkennbar?
    
    	objekt_sichtbar(7) liefert TRUE zurück, falls überhaupt 
    	ein Object detektierbar.
    	
    	abstand:
    	0: 5cm
    	1: 7cm 
    	2: 13cm
    	3: 15cm
    	4: 16cm
    	5: 17cm
    	6: 18cm
    	7: 22cm
    
    	( Testobjekt: Joghurtecher, Umgebungsbeleuchtung: Zimmer )
    
    	return: TRUE falls Objekt gefunden
    			FALSE wenn nicht
    
    	Zeitbedarf: 5ms
    
    	author: robo.fr, christoph ( ät ) roboterclub-freiburg.de
    	date: 2008
    
    *************************************************************************/
    uint8_t objekt_sichtbar_rechts(uint8_t distance_r)
    {
    	uint16_t j,z;
    	
    	PORTB |= (1 << PB6);   // PB6 auf HIGH (LED ausschalten) 
       	DDRD |= (1 << DDD1);   // Port D1 als Ausgang
       	PORTD &= ~(1 << PD1);   // PD1 auf LOW
    
    	OCR2  = 254-distance_r;   // wenn OCR2=0xFE dann Objekt sehr nahe 
    	z=0;
    	for(j=0;j<30;j++) // loop time: 5ms
    	{
    		if (PIND & (1 << PD0))z++;
    		Sleep(6); // 6*Sleep(6)=1ms
    	}
    	if (z>=29) return FALSE; // Objekt nicht gefunden
    	else return TRUE;
    }
    
    uint8_t objekt_sichtbar_links(uint8_t distance_l)
    {
    	uint16_t i,y;
    
    	PORTD |= (1 << PD1);    // PD1 auf HIGH (LED ausschalten)
       	DDRB |= (1 << DDB6);   // Port B6 als Ausgang
       	PORTB &= ~(1 << PB6);   // PB6 auf LOW
    
    	OCR2  = 254-distance_l;   // wenn OCR2=0xFE dann Objekt sehr nahe 
    	y=0;
    	for(i=0;i<30;i++) // loop time: 5ms
    	{
    		if (PIND & (1 << PD0))y++;
    		Sleep(6); // 6*Sleep(6)=1ms
    	}
    	if (y>=29) return FALSE; // Objekt nicht gefunden
    	else return TRUE;
    }
    /*************************************************************************
    
    	uint8_t abstand()
     
     	Abstandsermittelung über IR-Sendiode / IR-Empfänger.
    	0:kleinster Abstand
    	7:größter Abstand
    	255: kein Objekt
    
    	Zeitbedarf: 5ms*9=45ms
    
    	author: robo.fr, christoph ( ät ) roboterclub-freiburg.de
    	date: 2008
    
    *************************************************************************/
    uint8_t abstand_rechts()
    {
    	uint8_t k,n;
    	
    	k=255;
    	for(n=0;n<4;n++)
    	{
    	  if (!objekt_sichtbar_rechts(n)) k=n; // solange kein Objekt, Distanz erhoehen
    	}  
    	return k;
    }
    
    uint8_t abstand_links()
    {
    	uint8_t l,m;
    	
    	l=255;
    	for(m=0;m<4;m++)
    	{
    	  if (!objekt_sichtbar_links(m)) l=m; // solange kein Objekt, Distanz erhoehen
    	}  
    	return l;
    }
    
    //************************************************************************
    void RaceStart(void)    // blink until any switch is pressed, 
    {                       // then wait until switch is released 
      uint8_t t1, t2; 
      unsigned int col=OFF;
     
    
      while (1)             // blinking StatusLED until any switch is pressed 
      { 
        t1 = PollSwitch(); 
        t2 = PollSwitch(); 
        if (t1==t2) 
        { 
          if (t1) 
          { 
            break; 
          } 
          else 
          { 
            col ^= GREEN; 
            StatusLED(col); 
          } 
        } 
        Msleep(50); 
      } 
    
      StatusLED(OFF);       // turn off StatusLED and ... 
      BackLED(ON,ON);       // ... turn on both BackLED's 
    
      while (1)             // wait until switch is released 
      { 
        t1 = PollSwitch(); 
        t2 = PollSwitch(); 
        if (t1==t2) 
        { 
          if (!t1) 
          { 
            break; 
          } 
        } 
        Msleep(50); 
      } 
    
      BackLED(OFF,OFF);     // turn off BackLED's indication start of race 
    } 
    
    //************************************************************************
    void servo(unsigned char winkel) 
    { 
       unsigned int count=0; 
       do
       { 
          count++; 
    
          if(winkel)
    	  { 
          PORTB |= (1 << PB0); 
          Sleep(winkel); 
          }
    	  PORTB &= ~(1 << PB0); 
    
          Sleep(255-winkel); 
       }
       while (count<servo_stellzeit); 
    } 
    
    
    /*************************************************************************
    
    	Hauptprogramm
    
    *************************************************************************/
    int main(void)
    {
       	uint8_t n,m;
    	float volt; 
        int proz;
    	unsigned int sensors[2];
        DDRB |= (1 << PB0);
    
       	Init();
    	initLcd();
    
    	volt=2.56/1024*Batterie()*22/10; 
        proz=(int)(((volt)/5)*100); //so ungefähr 
    		//	Output some strings to the LCD
    	writeStringToLCD("*ASURO  bereit*");
    	writeStringToLCD("Batterie:  ");
    	writeIntegerToLCD(proz);
    	writeStringToLCD("%");
    
    	RaceStart(); 
    
    	FrontLED(OFF);
       	while(1)
    	{
    	   	n=abstand_rechts();
    	   	m=abstand_links();
    	   		
    		if ((n!=255) || (m!=255))
    	   	{
    	   		if ((n<0) && (m<0))
    			{
    			 MotorDir(RWD,RWD);
    			 MotorSpeed(155,165);
    			 }
    			else if (m>n)
    			 {
    
    			 StatusLED(RED);
    			 BackLED(ON,ON);
    		 	  servo_stellzeit=12;				//Servogeschw. einstellen
    			  MotorSpeed(10,10);				//kurze Pause
    			  Msleep(1);
    			  MotorSpeed(BREAK,BREAK);
    			  Msleep(500);
    			  MotorSpeed(10,10);				//kurze Pause
    			  Msleep(1);
    		      MotorDir(FWD,FWD);				//Kleines Stück vor
    			  MotorSpeed(110,100);
    			  Msleep(1100);
    			  MotorSpeed(BREAK,BREAK);
    			  	clearLCD();
    		      	writeStringToLCD("Close Gripper");
    		      for (i=15; i<85; i+=2) servo(i);	//Greifer zumachen
    			  MotorSpeed(10,10);				//Kurze Pause
    			  Msleep(1); 
    			  MotorDir(RWD,RWD);				//Kleines Stück zurück
    			  MotorSpeed(120,120);
    			  Msleep(500); 
    			  MotorSpeed(BREAK,BREAK);
    			  	clearLCD();
    		      	writeStringToLCD("Turn left");
    			  MotorSpeed(135,0);				//Vierteldrehung nach links
    			  Msleep(1000);
    			  MotorSpeed(BREAK,BREAK);
    			  	clearLCD();
    		      	writeStringToLCD("Open Gripper");
    		      for (i=75; i>17; i-=2) servo(i);	//Greifer aufmachen
    			  MotorSpeed(10,10);				//Kurze Pause
    			  Msleep(1);
    			  MotorDir(RWD,RWD);				//Kleines Stück zurück
    			  MotorSpeed(120,120);
    			  Msleep(500); 
    			  MotorSpeed(BREAK,BREAK);
    			  	clearLCD();
    		      	writeStringToLCD("Turn right");
    			  MotorSpeed(0,135);				//Vierteldrehung nach rechts
    			  Msleep(1000);
    			  MotorSpeed(BREAK,BREAK);
    			  MotorSpeed(10,10);				//Kurze Pause
    			  Msleep(1);
    			  	clearLCD();
    		      	writeStringToLCD("That's it!");
    
    			 MotorSpeed(0,155);
    			 BackLED(ON,OFF);
    			 clearLCD();
    		     IRData(sensors);
    			 writeStringToLCD("**NACH  LINKS**");
          		 writeIntegerToLCD(sensors[0]);			 
          		 writeStringToLCD("*Wert*");
          		 writeIntegerToLCD(sensors[1]);
    			 }
    			else if (n>m)
    			 {
    
    			 StatusLED(RED);
    			 BackLED(ON,ON);
    		 	  servo_stellzeit=12;				//Servogeschw. einstellen
    			  MotorSpeed(10,10);				//kurze Pause
    			  Msleep(1); 
    			  MotorSpeed(BREAK,BREAK);
    			  Msleep(500);
    			  MotorSpeed(10,10);				//kurze Pause
    			  Msleep(1); 
    		      MotorDir(FWD,FWD);				//Kleines Stück vor
    			  MotorSpeed(95,120);
    			  Msleep(1100);
    			  MotorSpeed(BREAK,BREAK);
    			  	clearLCD();
    		      	writeStringToLCD("Close Gripper");
    		      for (i=15; i<85; i+=2) servo(i);	//Greifer zumachen
    			  MotorSpeed(10,10);				//Kurze Pause
    			  Msleep(1); 
    			  MotorDir(RWD,RWD);				//Kleines Stück zurück
    			  MotorSpeed(120,120);
    			  Msleep(500); 
    			  MotorSpeed(BREAK,BREAK);
    			  	clearLCD();
    		      	writeStringToLCD("Turn right");
    			  MotorSpeed(0,135);				//Vierteldrehung nach links
    			  Msleep(1000);
    			  MotorSpeed(BREAK,BREAK);
    			  	clearLCD();
    		      	writeStringToLCD("Open Gripper");
    		      for (i=75; i>17; i-=2) servo(i);	//Greifer aufmachen
    			  MotorSpeed(10,10);				//Kurze Pause
    			  Msleep(1);
    			  MotorDir(RWD,RWD);				//Kleines Stück zurück
    			  MotorSpeed(120,120);
    			  Msleep(500); 
    			  MotorSpeed(BREAK,BREAK);
    			  	clearLCD();
    		      	writeStringToLCD("Turn left");
    			  MotorSpeed(135,0);				//Vierteldrehung nach rechts
    			  Msleep(1000);
    			  MotorSpeed(BREAK,BREAK);
    			  MotorSpeed(10,10);				//Kurze Pause
    			  Msleep(1);
    			  	clearLCD();
    		      	writeStringToLCD("That's it!");
    
    			 MotorSpeed(155,0);
    			 BackLED(OFF,ON);
    			 clearLCD();
    		     IRData(sensors);
    			 writeStringToLCD("**NACH RECHTS**");
          		 writeIntegerToLCD(sensors[0]);			 
          		 writeStringToLCD("*Wert*");
          		 writeIntegerToLCD(sensors[1]);
    			 }
    			else
    			 {
    			 StatusLED(GREEN);
    			 BackLED(ON,ON);
    			 MotorDir(FWD,FWD);
    			 MotorSpeed(155,165);
    			 clearLCD();
    		     IRData(sensors);
    			 writeStringToLCD("***GERADEAUS***");
          		 writeIntegerToLCD(sensors[0]);			 
          		 writeStringToLCD("*Wert*");
          		 writeIntegerToLCD(sensors[1]);
    			 }
    		}
    	}
    
    }
    Du kannst dir sicher die Servoschnipsel rauspflücken.

Seite 5 von 7 ErsteErste ... 34567 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test