- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 71

Thema: monoleg - Der einbeinige Roboter

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Ein kleines Update der Steuerplatine:
    Bild hier  
    - ein 100uF-Kondensator hilft bei schwachen Akkus die Anlaufströme der Servos zu verkraften.
    - 2,2k-Widerstände in den Servo-Impuls-Leitungen.
    - Zusätzlicher Jumper trennt GND der Servos um ein Zucken beim Flashen zu verhindern.
    - gedrehte hohe ISP-Buchsen.
    - Testanschluß für zwei weitere Pins.

    Diesen "Boxenstopp" nutzte ich noch für einen kleinen Versuch. Ich nenne ihn "Kippler":

    Bild hier   Bild hier   Bild hier   Bild hier  

    Das Teil besteht aus:

    - Der Steuerplatine mit ATtiny13
    - Zwei kleine und ein großer 5€-Servos
    - Vier Akkus(900mA) mit Halter
    - 9V-Batterieklipp
    - Servoanschlußadapter vom Einbein
    - Zwei Schraubdeckel
    - Heißkleber (und zwei Kabelbinder weil die Federn im Akkuhalter diesen auseinanderdrücken)

    Selbstverständlich gibt's auch wieder ein Video:

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

    Hier noch der Code (mit EEProm-Routinen zum Debugen 534Bytes):
    Code:
    // steuert den Wankenden, 1. Versuch
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    #define x_mitte 27
    #define y_mitte 27
    #define z_mitte 25
    #define schritt 15
    #define kipp 4
    
    unsigned char x, y, z, demo, count;
    unsigned char linie_links, linie_rechts;
    int eeprom_adr;
    
    void delay(uint16_t d)                                // Warteschleife
    {
    	uint16_t d1, dummy;
    	for (d1=d; d1>0; d1--) dummy^=d1;
    }
    
    ISR(TIM0_COMPA_vect)                                  // Servoansteuerung
    {
    	if (count>x) PORTB &= ~(1<<PB0); else PORTB |= (1<<PB0);
    	if (count>y) PORTB &= ~(1<<PB1); else PORTB |= (1<<PB1);
    	if (count>z) PORTB &= ~(1<<PB2); else PORTB |= (1<<PB2);
    	if (count < 200) count++; else count=0;
    }
    
    void EEPROM_write(unsigned char ucAddress, unsigned char ucData)
    {
    /* Wait for completion of previous write */
    while(EECR & (1<<EEPE));
    /* Set Programming mode */
    EECR = (0<<EEPM1)|(0>>EEPM0);
    /* Set up address and data registers */
    EEARL = ucAddress;
    EEDR = ucData;
    /* Write logical one to EEMPE */
    EECR |= (1<<EEMPE);
    /* Start eeprom write by setting EEPE */
    EECR |= (1<<EEPE);
    }
    
    unsigned char EEPROM_read(unsigned char ucAddress)
    {
    /* Wait for completion of previous write */
    while(EECR & (1<<EEPE));
    /* Set up address register */
    EEARL = ucAddress;
    /* Start eeprom read by writing EERE */
    EECR |= (1<<EERE);
    /* Return data from data register */
    return EEDR;
    }
    
    int main(void)
    {
    	x=x_mitte;                                       // Servos Basisposition
    	y=y_mitte;
    	z=z_mitte;
    	demo=3;                                          // 5 Einzelschritte
    	eeprom_adr=2;                                    // ersten Speicherstelle
    	
    	DDRB = (1<<PB2) | (1<<PB1) | (1<<PB0);          // Servoausgänge
    	PORTB= (1<<PB3);                                   // PullUp Taster ein
    
    	TCCR0A =  (0 << WGM00) | (1 << WGM01);					// CTC-Mode
    	TCCR0A |= (0 << COM0A0) | (0 << COM0A1);				// ohne OCR-Pin
    	TCCR0B = (0 << CS02)  | (0 << CS01) | (1 << CS00);	// no prescaler
    	TIMSK0 =  (1 << OCIE0A); 									// Interrupt ein
    	OCR0A  = 50;  // nicht wissenschaltliche Frequenz
    	sei();
    
    	while(PINB & (1<<PB3)); // warten auf Taste
    	while(1) {
       	while(z-- > z_mitte-kipp) delay(150);
    		delay(5000);
       	y=y_mitte+schritt;
    		while(x++ < x_mitte+schritt) delay(100);
    		delay(1000);
    		
       	while(z++ < z_mitte+kipp) delay(150);
    		delay(5000);
       	x=x_mitte-schritt;
    		while(y-- > y_mitte-schritt) delay(100);
    		delay(1000);
    		
    		if(demo) demo--; else
    		{
    		   while(z-- > z_mitte-kipp) delay(150);
    			delay(5000);
       		y=y_mitte+schritt;
    			delay(1000);
    
    			while(z++ < z_mitte+kipp) delay(150);
    			delay(5000);
       		x=x_mitte-schritt;
    			while(y-- > y_mitte-schritt) delay(100);
    			delay(1000);
    			demo=3;
    		}
    	}
    	return(0);
    }
    Gruß

    mic
    Geändert von radbruch (10.08.2014 um 10:53 Uhr) Grund: Bilder-URL geändert
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Berechtigungen

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

12V Akku bauen