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
Lesezeichen