Hallo Roboterfans

Hier nun mein zweiter Versuch mit kleinen Omniwheels ein brauchbars Fahrwerk zu basteln. Basis ist diesmal eine Mischung meiner Omniwheels mit Legotechnik und Slotcar-Motoren. Um es gleich vorweg zu nehmen, es ist ein Reinfall. Obwohl das Teil optisch recht ansprechend ist und im Leerlauf auch gut funktioniert, versagt es mit Last kläglich. Ursache sind die Motoren die mit vier 1,2V-Akkus nicht richtig drehen und die Lego-Achsen die sich bei Belastung verbiegen. Hier die Pics:



Das eher peinliche Filmchen dazu:


http://www.youtube.com/watch?v=6Vmw0Ie9k3I

Das Positive dieses Versuches ist die dabei entstandenen Ansteuerung der Motoren. Mein erster Versuch einer H(?)-Brücke mit recht netten Eigenschaften. Drei Stränge der obrigen Schaltung (der 820 Ohm am E fehlt, 7,2V-Variante noch nicht getestet!), je einer an einem Pin meines tiny13 (E), die Motoren sind im Dreieck an den Ausgängen (A) angeschlossen.

An jedem Strang kann ich beide Transistoren sperren oder jeweils einen durchschalten. Beim Sperren wird der Pin des tiny13 auf Eingang geschaltet. Es sind dann die Basen der Transistoren und die LEDs in Reihe geschaltet, die Summe der Schwellspannungen (2*0,7V der Darlingtons, 4*1,7V-1,9V LEDs) ist so groß dass die Transistoren sperren.

Zum Schalten des NPN wird der Pin Ausgang/High, der (nicht eingezeichnete) 820Ohm-Widerstand steuert über zwei LEDs die Basis des Transitors an, A wird 0V. Für den PNP wird der Pin Ausgang/Low, dann liegen Vcc an A. Das Prinzip funktioniert prima und kann auch bei normalen H-Brücken verwendet werden, Motoren können damit mit nur einem Pin angesteuert werden, Schrittmotoren mit nur zwei Pins.

Ich bin ja nicht so sehr der Elektronik-Freak, aber ich glaube, das ist eine sehr geniale Funktion. *grins*

Noch der Code für einen tiny13, Software-PWM mit kleinem Demo:
Code:
// Ansteuerung des interrollers                                    14.3.2008 mic

// www.holonomicwheel.com geile omniwheels!

#include <avr/io.h>
#include <avr/interrupt.h>
//#define f_cpu 9,6 MHz

int8_t pwm_a, pwm_b, pwm_c;
volatile uint16_t time;

void delay(uint16_t d)                                // Warteschleife
{
	time=d; while(time);
}

int main(void)
{
	time=0;
	pwm_a=pwm_b=pwm_c=0;
	TCCR0A =  (0 << WGM00) | (1 << WGM01);					// CTC-Mode
	TCCR0A |= (0 << COM0A0) | (0 << COM0A1);				// ohne OCR-Pin
	TCCR0B = (0 << CS02)  | (0 << CS01) | (1 << CS00);	// prescaler /8
	TIMSK0 =  (1 << OCIE0A); 									// Interrupt ein
	OCR0A  = 120;  // nicht wissenschaftliche Frequenz!
	sei();

	delay(30);
while(1)
 	{
 	   pwm_b=pwm_c=-127;
		for(pwm_a=0; pwm_a<127; pwm_a++) delay(10);
		delay(2000);
 	   for(pwm_a=127; pwm_a>0; pwm_a--) delay(10);
 	   pwm_a=pwm_c=-127;
		for(pwm_b=0; pwm_b<127; pwm_b++) delay(10);
		delay(2000);
 	   for(pwm_b=127; pwm_b>0; pwm_b--) delay(10);
 	   pwm_a=pwm_b=-127;
		for(pwm_c=0; pwm_c<127; pwm_c++) delay(10);
		delay(2000);
 	   for(pwm_c=127; pwm_c>0; pwm_c--) delay(10);

		pwm_a=127; pwm_b=0; pwm_c=-127;
 	   delay(2000);
 	   pwm_a=-127; pwm_b=127; pwm_c=0;
 	   delay(2000);
 	   pwm_a=0; pwm_b=-127; pwm_c=127;
 	   delay(2000);
 	}
	return(0);
}
ISR(TIM0_COMPA_vect)
{
	static uint8_t pwm_count=0, servo_count=0;
	uint8_t pwm_temp;
	if(pwm_a) {
		if(pwm_a<0) pwm_temp=~pwm_a +1; else pwm_temp=pwm_a;
		if(pwm_count > pwm_temp) { DDRB &= ~1; PORTB &= ~1; }
			else { DDRB |= 1; if(pwm_a<0) PORTB |= 1; else  PORTB &= ~1; }
	} else { DDRB &= ~1; PORTB &= ~1; }
	
	if(pwm_b) {
		if(pwm_b<0) pwm_temp=~pwm_b +1; else pwm_temp=pwm_b;
		if(pwm_count > pwm_temp) { DDRB &= ~2; PORTB &= ~2; }
			else { DDRB |= 2; if(pwm_b<0) PORTB |= 2; else  PORTB &= ~2; }
	} else { DDRB &= ~2; PORTB &= ~2; }

	if(pwm_c) {
		if(pwm_c<0) pwm_temp=~pwm_c +1; else pwm_temp=pwm_c;
		if(pwm_count > pwm_temp) { DDRB &= ~4; PORTB &= ~4; }
			else { DDRB |= 4; if(pwm_c<0) PORTB |= 4; else  PORTB &= ~4; }
	} else { DDRB &= ~4; PORTB &= ~4; }


	if(pwm_count < 127) pwm_count++; else pwm_count=0;
	if (servo_count < 100) servo_count++;
		else { servo_count=0; if(time) time--; }
}
Das Programm belegt mit Demo 610 Bytes im tiny13, hätte also noch Platz für das Servo das den Sharp schwenkt. Aber erst muss das Fahrwerk funktionieren...

Gruß

mic