Hallo
Ein kleines Update der Steuerplatine:
Externes Bild anzeigen
- 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":
Externes Bild anzeigen Externes Bild anzeigen Externes Bild anzeigen Externes Bild anzeigen
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:
Externes Bild anzeigen
http://www.youtube.com/watch?v=5ZSN3rLdAOM
Hier noch der Code (mit EEProm-Routinen zum Debugen 534Bytes):
Gruß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); }
mic







Zitieren
Lesezeichen