Hallo

Es freut mich sehr, dass euch mein kleines Projekt so viel Freude bereitet. Eigentlich sollte es nur dazu dienen, Servos für einen Roboterarm zu beherrschen. Aber es verselbständigt sich zunehmend. Hier nun der neuste Stand des Projekts.

Nachdem ich lange genug gejammert hatte, wurde mir von der besten Ehefrau von allen ein USB-ISP-Interface genehmigt. *juhu* Das Teil (ein mysmartusb für 30€) wurde gestern geliefert. Hier nun die ersten Videos und Pics nach dem Abnabeln vom RP6:

Bild hier   Bild hier   Bild hier  
http://www.youtube.com/watch?v=6ZNNRiDPIao
http://www.youtube.com/watch?v=dHDhgpYCXm0
http://www.youtube.com/watch?v=Z7gb-9V5KY4
Orginalvideos: 1 2 3 4


Nach meinem heutigen ISP- und ATtiny-Marathon steuert nun ein ATtiny13 den Roboter. Bei 1,2MHz CPU-Taktfrequenz werden die Servos mit einer Counter-ISR angesteuert. Der Code hat im Moment 516 Bytes:

Code:
#include <avr/io.h>
#include <avr/interrupt.h>

#define x_mitte 17
#define y_mitte 17
#define z_mitte 17

unsigned int x, y, z, demo;

void delay(uint16_t d)                                // Warteschleife
{
	uint16_t d1, dummy;
	for (d1=d; d1>0; d1--) dummy^=d1;
}
ISR(TIM0_COMPA_vect)                                  // Servoansteuerung
{
static uint16_t count=0;
	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;
}

int main(void)
{
	x=x_mitte;                                         // Servos Basisposition
	y=y_mitte;
	z=z_mitte;
	demo=5;                                            // 5 Einzelschritte
	
	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(1)
	{
		y=y_mitte+4; delay(400);                        // Schritt
		if (demo) while(PINB & (1<<PB3)); // warten auf Taste
		for (; x>x_mitte-12; x--)
		{
		   if (x==5) y=y_mitte+7;
		   if (x==0) y=y_mitte+5;
		   if (x==-11) y=y_mitte+3;
			delay(120+x);
		}
		x=x_mitte-15; y=y_mitte+4; delay(100);
		y=y_mitte; delay(300);
		x=x_mitte+5; delay(1000);
		if (demo) demo--;
	}
	return(0);
}
Lager für die Gelenke sind übrigens Reiszwecken:

Bild hier  
Bild hier   Bild hier   Bild hier   Bild hier  

Gruß

mic