- Labornetzteil AliExpress         
Seite 3 von 7 ErsteErste 12345 ... LetzteLetzte
Ergebnis 21 bis 30 von 67

Thema: NIBObee Erweiterungen

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

    E-Bike
    Hallo Zusammen,

    ich möchte ans Bee-Port X3 einen Miniservo anschliessen, um ein Front-Sonar mit meinem SRF05 zu machen.

    Dazu müsste es doch möglich sein, den Servostecker direkt anzustecken, natürlich muss ich vorher plus und minus beim Servostecker vertauschen - was meint ihr?

    Bitte kurz um Hilfe ob das geht, ich will meinen einzigen Miniservo nicht schrotten...

  2. #22
    Erfahrener Benutzer Roboter Experte Avatar von Virus
    Registriert seit
    15.09.2009
    Ort
    Duisburg
    Alter
    29
    Beiträge
    527
    welchen stecker hat der miniservo? JR oder FUTABA?

    für experimente gibst beim großen C einen miniservo für 5euro oder so. Da ist der Verlust verschmerzbar :^)
    Mit hochohmigen Grüßen
    Virus

    Es lebe der Digitalkäse !

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

    Wirklich zufällig hängt das Servo das meinen Sharp schwenkt auch an X3 :)

    Code:
    // Nibobee Motor- und Odometrytest                                    18.11.09 mic
    
    #include <nibobee/iodefs.h>
    #include <nibobee/delay.h>
    #include <nibobee/analog.h>
    #include <nibobee/odometry.h>
    #include <nibobee/led.h>
    #include <nibobee/sens.h>
    #include <stdlib.h>			// C standard functions (e.g. itoa...)
    uint16_t nibobee_initialization; // ???
    
    #define LineLEDs_on		PORTB &=~(1<<PB4)
    #define LineLEDs_off		PORTB |= (1<<PB4)
    #define DIR_R 7
    #define DIR_L 6
    #define PWM_L 5
    #define PWM_R 4
    
    void ir_init(void);
    void writeChar(uint8_t data );
    void writeString(char *string);
    void writeInteger(int16_t number, uint8_t base);
    void motorDir(uint8_t dir_left, uint8_t dir_right);
    void motorSpeed(uint8_t speed_left, uint8_t speed_right);
    
    uint8_t p=0, servo=0;
    
    int main(void) {
    
    	uint8_t c;
    	uint16_t echo[16];
    	uint8_t servopos=0;
    	int8_t schwenk=1;
    	
    
    	led_init();
    	sens_init();
    	analog_init();
    	odometry_init();
    	odometry_reset();
    	ir_init();
    	led_set(LED_L_YE,1);
    
    
    	PORTD |=(1<<PWM_L)|(1<<PWM_R); // Pullups einschalten damit der Pegel high bleibt
    	DDRD |=(1<<DIR_L)|(1<<DIR_R)|(1<<PWM_L)|(1<<PWM_R);
    
    	writeString("\n\n\r");
    	writeString("Sharp-Test mit Schwenkservo\n\r");
    	writeString("21.11.09 mic\n\n\r");
    	delay(2000);
    	servo=108;
    
    	while(1)
    	{
    	   servo=35+servopos*10;
    	   delay(100);
    	   echo[14-servopos]=analog_getValue(ANALOG_EXT3);
    	   if((servopos==0) || (servopos==14))
    		{
    			for(c=0; c<15; c++)
    			{
    				writeInteger(echo[c], 10);
    			   writeString("-");
    			}
    			writeString("\n\r");
    	   }
    	   servopos+=schwenk;
    	   if(!servopos) schwenk=1; else if(servopos==14) schwenk=-1;
    	}
    	return 0;
    }
    
    // Die ISR erzeugt die 36kHz-Trägerfrequenz und "lauscht" gleichzeitig am TXD-Pin
    // um die seriellen Daten auf die Trägerfrequenz zu mischen. Zusätzlich erzeugt
    // sie die Impulse für das Servo an PC3. Letztlich dekrementiert sie p solange
    // bis es 0 ist
    
    ISR (TIMER2_COMP_vect)
    {
    	static uint8_t status=0;
       if(PIND & 2) // Der TSOP invertiert die empfangenen Daten!
    	   LineLEDs_off;
    	else
    		if(status) {LineLEDs_on; status=0;} else {LineLEDs_off; status=1;}
    
    	static uint16_t count=1;
    	if(count>servo) PORTC &= ~(1<<PC3); else PORTC |= (1<<PC3);
    	if(count<1440) count++; else {count=1; if(p) p--;};
    }
    void ir_init(void)
    {
     	#define UBRR_BAUD_2400 390       // Baudrate auf 2400 setzen
       UBRRH = UBRR_BAUD_2400 >> 8;
    	UBRRL = (uint8_t) UBRR_BAUD_2400;
    
    	UCSRC = (1<<URSEL)|(0<<USBS)|(3<<UCSZ0); // 8, none, 1
      	UCSRB |= (1<<TXEN); // Senden enablen
    
    	TCCR2 = (1 << WGM21) | (1 << CS20); // CTC-Mode, no prescaling, no OC2-PIN!
    	OCR2  = 208; // 36kHz @15MHz
    	TIMSK |= (1 << OCIE2);
    
    	DDRB |= (1<<PB4); // LineLED ist ein Ausgang
    	LineLEDs_on; 		// LineLED schaltet gegen GND!
    	DDRD |= 2;  	 	// TXD Ausgang und low
    	PORTD &= ~2;
    	sei();
    }
    void writeChar(uint8_t data ) // Code aus ATMega16-Datenblatt
    {
    	while ( !( UCSRA & (1<<UDRE)) );
    	UDR = data;
    }
    void writeString(char *string)
    {
    	while(*string)
    		writeChar(*string++);
    }
    void writeInteger(int16_t number, uint8_t base)
    {
    	char buffer[17];
    	itoa(number, &buffer[0], base);
    	writeString(&buffer[0]);
    }
    void motorDir(uint8_t dir_left, uint8_t dir_right)
    {
    	if(dir_left)  PORTD |= (1<<DIR_L); else PORTD &= ~(1<<DIR_L);
    	if(dir_right) PORTD &= ~(1<<DIR_R); else PORTD |= (1<<DIR_R);
    }
    void motorSpeed(uint8_t speed_left, uint8_t speed_right)
    {
    	if(speed_left)  PORTD &= ~(1<<PWM_L); else PORTD |= (1<<PWM_L);
    	if(speed_right) PORTD &= ~(1<<PWM_R); else PORTD |= (1<<PWM_R);
    }
    (ungeputzer Arbeitscode)

    Ein 36kHz-Takt wird mit Timer2 erzeugt:
    Code:
    	TCCR2 = (1 << WGM21) | (1 << CS20); // CTC-Mode, no prescaling, no OC2-PIN!
    	OCR2  = 208; // 36kHz @15MHz
    	TIMSK |= (1 << OCIE2);
    In der ISR wird dann das Signal ausgegeben:
    Code:
    ISR (TIMER2_COMP_vect)
    {
    ...
    	static uint16_t count=1;
    	if(count>servo) PORTC &= ~(1<<PC3); else PORTC |= (1<<PC3);
    	if(count<1440) count++; else {count=1; if(p) p--;};
    }
    Und schließlich kann man dann die Servoposition in der Variablen servo übergeben. Mitte ist ca. 108, 0 bedeutet kein Impuls senden. Das sollte direkt so funktionieren, mein Sharp hängt auch an X3 ;)

    Bild hier  
    http://www.youtube.com/watch?v=G836SWiYA_c

    Servostecker mußte man für ADC0/1 beim RP6 auch "Umbauen".
    Warum die Hersteller das Servopinout nicht übernehmen ist mir schleierhaft:
    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!

  4. #24
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    @Virus: Es ist genau so ein Billigservo vom C, ein Modelcraft ES-05 JR

    @mic: Demnach hast du die PINS2 (=PC3), PIN3 (GND) und PIN4(VCC) verwendet, wenn ich das richtig im Code gelesen habe. Poste bitte mal ein Foto oder Video deiner Erweiterung, sieht sicher cool aus.

    EDIT: Habe mir gerade das Video angesehen - du hast sicher mittlerweile ein Monopol auf die gelben Zahnräder vom C?

  5. #25
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Es sind immer die selben gelben Zahnräder ;)

    Das Miniservo und der Sharp stecken bei meiner bee direkt im X3:
    Bild hier   Bild hier   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!

  6. #26
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    Könntet ihr euch bitte mal meinen Servocode ansehen?

    Code:
    #include <nibobee/iodefs.h>
    #include <nibobee/delay.h>
    #include <nibobee/analog.h>
    #include <stdlib.h>  
    
    unsigned char i, servo_stellzeit;
    
    void servo(unsigned char winkel) 
    { 
       unsigned int count=0; 
       do
       { 
          count++; 
    
          if(winkel)
    	  { 
          PORTC |= (1 << PC3); 
          delay(winkel); 
          }
    	  PORTC &= ~(1 << PC3); 
    
          delay(255-winkel); 
       }
       while (count<servo_stellzeit); 
    } 
    
    int main(void) 	
    {
    
    	analog_init();
    	
    	    while(1)
    		{
    		servo_stellzeit=150;
    		delay(100);
    		for (i=15; i<85; i+=2) servo(i);
    		delay(100);
    		for (i=75; i>17; i-=2) servo(i);
    		delay(100);
    		}
       return 0;
    }
    Der Servo zuckt bei diesem Programm in 1 Grad-Schritten, sollte aber zwischen zwei Positionen hin- und herdrehen...

  7. #27
    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

    Ein delay() dauert ca. 1 ms und ist damit zu grob für eine vernünftige Servoansteuerung:
    Code:
    #include <nibobee/iodefs.h>
    #include <nibobee/delay.h>
    #include <nibobee/analog.h>
    #include <stdlib.h>
    
    unsigned int winkel, nibobee_initialization;
    unsigned char i;
    
    int main(void)
    {
    
    	analog_init(); // wollen wir später wirklich alle ADC-Kanäle einlesen?
    	delay(3000); 	// wait4programmer ;)
    
    	while(1)
    	{
    		for(i=0; i<50; i++) 			// ein Zyklus dauert ca. 20 ms
    		{
    			PORTC |= (1 << PC3);    // Implus senden
    			delay(1);
    			PORTC &= ~(1 << PC3);   // Pause senden
    			delay(19);
    		}
    		for(i=0; i<50; i++)
    		{
    			PORTC |= (1 << PC3);
    			delay(2);
    			PORTC &= ~(1 << PC3);
    			delay(19);
    		}
    		for(i=0; i<100; i++)
    		{
    			winkel=1000;
    			while(winkel--) PORTC |= (1 << PC3); // Impulslänge als Zählschleife
    			PORTC &= ~(1 << PC3);
    			delay(19);
    		}
    	}
    	return 0;
    }
    Wenn es blockierend sein darf, würden Zählschleifen funktionieren :)

    gruß

    mic

  8. #28
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    Wenn ich deine Code flashe, passiert gar nichts...

    Unter Bascom wäre es viel einfacher:
    Code:
    'Verwendeter Compiler Bascom V 1.11.9.3
    '
    'Aufgabe:
    'Extremwerte Modelcraft Top Line Mini Servo ES-05 JR
    'Autor: Pinsel120866
    '###################################################
    
    $regfile = "m16def.dat"
    $crystal = 15000000
    $baud = 9600
    $hwstack = 32
    $framesize = 32
    $swstack = 32
    
    Config Servos = 1 , Servo1 = Portc.3 , Reload = 10
    Config Portc = Output
    Enable Interrupts
    
    
    Do
    Servo(1) = 44
    Waitms 1000
    Servo(1) = 113
    Waitms 1000
    Servo(1) = 182
    Waitms 1000
    
    Loop
    End
    Warum bringe ich dies unter "Zäh" nicht her?

  9. #29
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Mein Servo steuert mit dem Programm drei Positionen an. Das Programm startet mit einer langen Pause (ca. 3 Sek.):
    Angehängte Dateien Angehängte Dateien

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

    meine nächste Erweiterung ist ein Sonar, also im meinem Fall das SRF05 auf einem Servo montiert.

    Ein Video dazu gibt es auch: http://www.youtube.com/watch?v=jQpR5Hr82Vk

Seite 3 von 7 ErsteErste 12345 ... LetzteLetzte

Berechtigungen

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

12V Akku bauen