PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Soft-PWM erstellen



SimLock
23.11.2007, 06:02
Hi @ll,

wie erstelle ich eine Soft-PWM?
Habe was gelesen über Timer... aber ich verstehe es nicht :-(

Normales PWM habe/benutze ich schon an 2 PB0 und PB1 für 2 Servos.
Was ich suche, ist jetzt eine Soft-PWM für ansteuerung meines IC L293 D(2 Getriebemotoren).

Danke!

Hubert.G
23.11.2007, 11:13
www.mino-elektronik.de/soft-pwm/pwm_software.htm
www.mikrocontroller.net/articles/Soft-PWM
Diese beiden Links vielleicht als Ansatz.

SimLock
28.11.2007, 11:22
Hi,

habe mir mal die links angeschaut.
Zum 2 Link eine frage:

// PWM einstellen

PWM_DDR = 0xFF; // Port als Ausgang

// Timer 1 OCRA1, als variablem Timer nutzen

TCCR1B = 1; // Timer läuft mit vollem Systemtakt
TIMSK |= (1<<OCIE1A); // Interrupt freischalten

OCRA1 benutze ich doch schon, also klappt das damit nicht oder verstehe ich das jetzt falsch (man kann doch OCRA1 nur 1 mal benutzen)?

Hubert.G
28.11.2007, 11:53
Du kannst jeden freien Timer benutzen.
Welche PWM-Frequenz möchtest du haben( bei den Servos ist es 50Hz), in wie vielen Stufen möchtest du die Geschwindigkeit einstellen.

SimLock
28.11.2007, 16:53
Ich möchte nur 2 Stufen haben 100% und 50%.
Mehr soll die 2 Ausgänge nicht machen.

Hubert.G
28.11.2007, 20:22
Dann lässt du den Timer laufen, der toggled bei jedem Überlauf ein Bit, damit hast du deine 50%.

SimLock
29.11.2007, 06:57
Mh,
ich habe das leider nicht so genau verstanden :-(
z.B. PWM_DDR = 0xFF; was für ein Ausgangpin an D ist das (Ich brauche z.B. PC4)?
Hier mal mein Code wie ich mir das vorstelle. Fehlt aber das mit 50% und 100%:


#define F_CPU 8000000L // Systemtakt in Hz
#define F_PWM 100 // PWM-Frequenz in Hz
#define PWM_STEPS 256 // PWM-Schritte pro Zyklus(1..256)
#define PWM_PORT PORTD // Port für PWM
#define PWM_DDR DDRD // Datenrichtungsregister für PWM
#define T_PWM (F_CPU/(F_PWM*PWM_STEPS)) // Systemtakte pro PWM-Takt

#if (T_PWM<(152+5))
#error T_PWM zu klein, F_CPU muss vergrösst werden oder F_PWM oder PWM_STEPS verkleinert werden
#endif

#include <stdint.h>
#include <string.h>
#include <avr/io.h>
#include <avr/interrupt.h>

// globale Variablen
volatile uint8_t pwm_setting[8];

// Timer 1 Output COMPARE A Interrupt
ISR(TIMER1_COMPA_vect) {

static uint8_t pwm_cnt=0;
uint8_t tmp=0, i=0, j=1;
OCR1A += (uint16_t)T_PWM;

for (; i<8; i++) {
if (pwm_setting[i] > pwm_cnt) tmp |= j;
j<<=1;
}

PWM_PORT = tmp; // PWMs aktualisieren

if (pwm_cnt==(uint8_t)(PWM_STEPS-1))
pwm_cnt=0;
else
pwm_cnt++;
}

int main(void) {

// PWM einstellen

PWM_DDR = 0xFF; // Port als Ausgang
DDRD &= (~ (1<<PD2)|(1<<PD3)); /* Pin D2,D3,als Eingang */
PORTD |= (1<<PD2)|(1<<PD3); /* Pull Up von PIN D2,D3 aktivieren */

// Timer 1 OCRA1, als variablem Timer nutzen

TCCR1B = 1; // Timer läuft mit vollem Systemtakt
TIMSK |= (1<<OCIE1A); // Interrupt freischalten
sei(); // Interrupts gloabl einschalten

if (!( PIND & (1<<PIND2))) { /* mache was wenn PinD2 low ist */
// Hier: der Getriebemotor an L293D soll mit 100% laufen
}

if (!( PIND & (1<<PIND3))) { /* mache was wenn PinD3 low ist */
//Hier: der Getriebemotor an L293D soll mit 50% laufen
}

return 0;
}

Hubert.G
29.11.2007, 09:38
volatile uint8_t takt;

ISR(TIMER0_OVF_vect){
takt++;
}

int main(void) {
TCCR0=(1<<CS00); //kein Prescaler
TIMSK|=(1<<TOIE0); // Overflow Interrupt en
DDRD=(1<<PD3);// PortD3 wird Ausgang

if(takt>=10){ //Takt bis 10 zählen
PORTD^=(1<<PD3); //PortD3 toggelt 50% PWM
}



Dieses Port-togglen kannst du natürlich weiter verknüpfen.

Du machst am Ende deines Code ein return0, damit beginnst du aber wieder am Anfang bei main. Damit wird immer alles neu initialisiert. Ich mache nach den Einstellungen im main ein for(;;){ und hier kommt mein sich wiederholender Code hinein} ohne return0 am Ende. Der Compiler sollte da auch ein Warning ausgeben.

thewulf00
29.11.2007, 09:57
Cool @hubert:
Code im Zitatfenster und Text im Codefenster :-)

Hubert.G
29.11.2007, 10:52
Tja, kann auch mal passieren, sieht doch gut aus :-b

thewulf00
29.11.2007, 12:33
Tja, kann auch mal passieren, sieht doch gut aus :-b

Ja, schon krass. :D Hatte erst gedacht, Du zitierst aus einem anderen Thread, ohne was zu sagen.

SimLock
30.11.2007, 06:04
So, hab ab heute wieder Zeit...

so ganz verstehe ich das auch noch nicht :-(
Auch wenn ich dein Teil Code benutze, muss ich noch 2 variable declarieren. Bekomme diese Fehlermeldung.


main.c: In function 'main':
main.c:54: error: static declaration of '__vector_9' follows non-static declaration
main.c:54: error: previous declaration of '__vector_9' was here
make.exe: *** [main.o] Error 1


2. was bedeutet bei: PORTD^=(1<<PD3); //PortD3 toggelt 50% PWM
das ^ ?

Hubert.G
30.11.2007, 09:16
Das ^ist ein exclusiv-oder, jedesmal wenn die Zeile angesprungen wird ändert sich der Wert von 0 auf 1 oder umgekehrt.
Zu den Fehlern kann ich so nichts sagen, da müsste ich den ganzen Code sehen.

SimLock
30.11.2007, 11:54
Hi,

das ist der aktuelle Code (funktioniert noch nicht, fehlt ja nach was bei der if PD2 abfrage, was ich noch nicht weißt):



#define F_CPU 8000000L // Systemtakt in Hz

#include <stdint.h>
#include <string.h>
#include <avr/io.h>
#include <avr/interrupt.h>


int main(void) {

DDRD &= (~ (1<<PD2)); /* Pin D2 als Eingang */
PORTD |= (1<<PD2); /* Pull Up von PIN D2 aktivieren */


volatile uint8_t takt;

ISR(TIMER0_OVF_vect){
takt++;
}


TCCR0=(1<<CS00); //kein Prescaler
TIMSK|=(1<<TOIE0); // Overflow Interrupt en
DDRD=(1<<PD3);// PortD3 wird Ausgang

if(takt>=10){ //Takt bis 10 zählen
PORTD^=(1<<PD3); //PortD3 toggelt 50% PWM
}


if (!( PIND & (1<<PIND2))) { /* mache was wenn PinD2 low ist */
// Hier: der Getriebemotor an L293D soll mit 50% laufen
}

return 0;
}

vajk
30.11.2007, 12:58
So sollte es aussehen ...
.. obs funktioniert hab ich nicht geprüft, nur lesbar geordnet und syntax korrigiert ...



#define F_CPU 8000000L // Systemtakt in Hz

#include <stdint.h>
#include <string.h>
#include <avr/io.h>
#include <avr/interrupt.h>

volatile uint8_t takt = 0; // Grundinitinalisierung nie vergessen

void AVRinit(void)
{
// DDRD &= (~ (1<<PD2)); // Pin D2 als Eingang -- unnötig
// wenn schon, dann:
DDRD = 0;
PORTD |= (1<<PD2); // Pull Up von PIN D2 aktivieren
DDRD |= (1<<PD3); // PortD3 wird Ausgang

TCCR0 = 0 | (1<<CS00); //kein Prescaler
TIMSK |= (1<<TOIE0); // Overflow Interrupt en
}

SIGNAL(TIMER0_OVF_vect)
{
takt++;
}

int main(void)
{
AVRinit();

// wo war denn die MainLoop ?
for(;;)
{
if(takt >= 10)
{ //Takt bis 10 zählen
PORTD ^= (1<<PD3); //PortD3 toggelt 50% PWM

// ist das absicht, hier takt nicht wieder auf 0
// zu setzen ?
// ohne das, ist fortan true für die restlichen 244 schritte
}

if (!( PIND & (1 << PIND2)))
{ // mache was wenn PinD2 low ist
// Hier: der Getriebemotor an L293D soll mit 50% laufen
}
}

return(0); // damit der compiler keine Warnungen ausgibt ...
}


Jetzt dürfte der compiler jedenfalls keinen Fehler mehr melden ...

Hubert.G
30.11.2007, 14:04
#define F_CPU 8000000L // Systemtakt in Hz

#include <stdint.h>
#include <string.h>
#include <avr/io.h>
#include <avr/interrupt.h>

volatile uint8_t takt;

ISR(TIMER0_OVF_vect){
takt++;
}

int main(void) {

DDRD &= (~ (1<<PD2)); /* Pin D2 als Eingang */
PORTD |= (1<<PD2); /* Pull Up von PIN D2 aktivieren */
DDRD=(1<<PD3);// PortD3 wird Ausgang

TCCR0=(1<<CS00); //kein Prescaler
TIMSK|=(1<<TOIE0); // Overflow Interrupt en

sei();
for(;;){
if (!( PIND & (1<<PIND2))) { /* mache was wenn PinD2 low ist */
// Hier: der Getriebemotor an L293D soll mit 50% laufen
if(takt>=10){ //Takt bis 10 zählen
takt=0;
PORTD^=(1<<PD3); //PortD3 toggelt 50% PWM
}

}
else{
PORTD|=(1<<PD3); // Motor läuft mit 100%
}
}
}


Diese Code läuft zumindest im Simulator. takt gehört natürlich auf 0 gestellt.
Wenn man die Endlosschleife mit for(;; ){ beginnt, dann braucht man kein return0.

SimLock
30.11.2007, 14:24
Danke für deinen Code +Zeit!

Ich verstehe es nicht, wie ich deinen Code einbinden kann!
Also beim normalen PWM kann ich durch (OCR1A) sagen;
solange ich Taster PD2 drucke, soll der Servo sich nach einer Richtung drehen:


if (!( PIND & (1<<PIND2))) // mache was wenn PinD2 low ist

{ OCR1A--;
_delay_ms(10);} /* Servo dreht nach rechts */
}

Aber wie mache ich das, mit deinen Beispiel; solange ich Taster drücke sich der Getriebemotor 50% dreht?

SimLock
30.11.2007, 16:20
Danke!
Ich kann erst Montag dazu was schreiben ob es funktioniert hat oder nicht.
Wünsches allen ein schönes WE!

Hubert.G
30.11.2007, 16:35
Das tut mein Code ja auch, oder soll Servo drehen und Motor 50% gleichzeitig sein.

if (!( PIND & (1<<PIND2))) { /* mache was wenn PinD2 low ist */
// Hier: der Getriebemotor an L293D soll mit 50% laufen
if(takt>=10){ //Takt bis 10 zählen
takt=0;
PORTD^=(1<<PD3); //PortD3 toggelt 50% PWM
OCR1A--;
_delay_ms(10); /* Servo dreht nach rechts */
}

}
else{
PORTD|=(1<<PD3); //Motor 100%
}

Zusammengefügt würde das so aussehen, wird aber wegen dem _delay nicht richtig funktionieren. Delay und Timerinterrupt vertragen sich nicht richtig.

SimLock
03.12.2007, 08:26
Hi Hubert.

Hab dein Code grade getestet und es Funktioniert!
1000 Danke!

Frag noch dazu:
Kann ich denn Ausgangpin für mein Getriebemotor auch z.B Pin PC1 nehmen oder darf ich nur PD3 (wegen INT1) nehmen?

Hubert.G
03.12.2007, 08:50
Du kannst jeden freien Pin nehmen, es besteht kein Zusammenhang mit einer Sonderfunktion.

SimLock
03.12.2007, 11:21
Mein Danke an alle, vor allen an Hubert!

Diese Thema ist nun erledigt.

Weiter gehts... was noch fehlt ist; Daten zwischen PC - µC per Funk zu senden.
Aber erstmal, Platine zusammen bauen und in Forum weiter lesen.

SimLock
05.12.2007, 07:06
Hi,

ich muss noch einmal Stören 8-[

Also habe jetzt 2 Motoren (PC0 bis PC5) an den L293D angeschlossen.
Links/Rechts -drehung
1 Motor 100% / 50%
2 Motor 100% / 100%

Der 2 Motor dreht Rechts nicht mit 50%.

Jetzt habe ich mal die Anschlüsse von 2 Motor (PC3 bis PC5) und 1 Motor (PC0 bis PC3) vertauscht.
Jetzt bekomme ich diese % raus.
Links/Rechts -drehung
2 Motor 100% / 100%
1 Motor 100% / 100%

Das ist doch nicht normal oder?

So sieht der Code aus:


void Getriebe100(void){
if(takt>=10){ //Takt bis 10 zählen
takt=0;
PORTC|=(1<<PC1)|(1<<PC4); // Motor läuft mit 100%
}
}

void Getriebe50(void){
if(takt>=10){ //Takt bis 10 zählen
takt=0;
PORTC^=(1<<PC1)^(1<<PC4); //PortD3 toggelt 50%
}
}


switch(rxwert){
case 0x32 :
Getriebe50();
PORTC|=(1<<PC0); // GLRückwärts 50%
PORTC|=(1<<PC3); // GRRückwärts 50%
break;
case 0x33 :
PORTC&= ~(1<<PC0); // GLRückwärts Stop
PORTC&= ~(1<<PC3); // GRRückwärts Stop
break;
case 0x38 :
Getriebe100();
PORTC|=(1<<PC2); // GLVorwärts 100%
PORTC|=(1<<PC5); // GRVorwärts 100%
break;
case 0x39 :
PORTC&= ~(1<<PC2); // GLVorwärts Stop
PORTC&= ~(1<<PC5); // GRVorwärts Stop
break;
}
}

Hubert.G
05.12.2007, 08:41
Alle PortC auf Ausgang gestellt.

void Getriebe100(void){
if(takt>=10){ //Takt bis 10 zählen
takt=0;
PORTC|=(1<<PC1)|(1<<PC4); // Motor läuft mit 100%
}
}
Hier kannst du dir die Abfrage sparen und gleich so schreiben

void Getriebe100(void){
PORTC|=(1<<PC1)|(1<<PC4); // Motor läuft mit 100%
}
Die beiden Motoren wirst du ja schon mal untereinander vertauscht haben um eiinen Fehler dort auszuschließen. Sonst mal mit einem Oszi auf die PWM-Leitungen schauen ob auch wirklich PWM kommt und alles richtig verkablet ist.

SimLock
05.12.2007, 09:01
Hi,
danke für den Hinweiß.

Problem 1 hat sich erledigt, du hattest recht, hatte nicht alle PortC als Ausgang deklariert! Zum Test, Motor 1 an Pin PC3 bis PC5 angeschlossen.

Problem 2 besteht immer noch.
Ich kann auch leider nicht mit einen Oszi nachschauen :-(
Leitung sind ok, auch wenn ich die 3 Leitungen von 2 Motor (A,B, Enable) vertausche, dreht der Motor immer schnell. An 2 Motor liegen dann 3,3V beiden Richtungen an.

Der 1 Motor hat 3,0V Links und 1,0V Rechts.

Hört sich an, ob der IC ein weg hat oder?

Hubert.G
05.12.2007, 09:45
Du müsstest eingentlich auch den Spannungsunterschied auf der PWM-Leitung vom µC her messen können. Kontrolliere auch noch ob die Leitungen auch wirklich richtig drauf sind, es ist mit auch schon passiert das ich etwas dreimal kontrolliert und jedesmal wieder falsch gemacht habe.

SimLock
05.12.2007, 10:03
Hi,

also folgende Werte habe ich beim µC gemessen gegen Masse:
an PC1 und PC4 (PWM)
3,2 V bei 100%
0,6 V leer lauf
1,9 V bei 50%

Aus den µC kommt dann alles richtig raus oder?.
Die verdrahtung auf der Platine ist ok.
Ich denke mal, das beim löten der IC zuviel wärme abbekommen hat und dadurch der 2 Motor kaputt ist.

Am IC Pin´s 3,6 und 11,14 ohne Last (Motoren) messe ich:
100% 50%
Pin 3,6 -5,52V +5,35V
Pin 11,14 -5,52V +5,52V

beim 2 Motoranschluss Pin 11,14 sind bei 50% 0,2V mehr...

Hubert.G
05.12.2007, 10:44
Sieht schon nach IC aus.
Nur die Spannungen, 3,2V an PC1 und PC4, arbeitest du nicht mit 5V, dann sollten auf den Pins auch annähernd 5V sein. Du hast doch einen Mega8, sind AVCC und AGND richtig versorgt, dort auch die Spannung messen.

SimLock
05.12.2007, 12:19
Jo,

ich habe ja vorher einen Spannungsteiler und habe von dort aus gemessen. Mein Fehler. Ich messe auf Board

Neue Werte:
z.B. PC1 am µC
2,6V und 1,3V - 100% und 50%

Ich bestelle mal einen neuen IC dann wissen wir es

SimLock
20.12.2007, 08:56
So wieder da :-)

Ich habe jetzt 2 IC. Aber geht trotzdem nicht :-(
Ich habe das Programm umgeschrieben und fahre jetzt nur mit 100%

z.B. wenn ich den Befehl dafür geben vor/zurück/links/rechts zu drehen, drehen sich die 2 Getriebemotoren aber bleiben nicht stehen, muss paar mal drücken dann erst…
Manchmal klappt die Funktion! <- Dachte zu erst Probleme mit Kommunikation (Max232)

Aber:
Die 2 Servos (Werden auch gesteuert) drehen sich ohne Probleme!
Also ist die Kommunikation zwischen PC und µC in Ordnung.

Was ich auch Bemerkt habe:
Wenn ich den Befehl gebe vor/zurück/links/rechts zum drehen, werden die 2 Servos kurz mit bewegt.

Hier der aktuelle Code:


#include <stdint.h>
#include <string.h>
#include <avr/io.h>
#include <stdbool.h>
#include <stdlib.h>
#include <avr/io.h>
#include <AVR/iom8.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define F_CPU 8000000 // clock
#define BAUD 9600
#define bauddivider (unsigned int)(F_CPU / BAUD / 16 - 0.5)
volatile unsigned char rxwert=0x30;
volatile uint8_t takt;

// Timer1 initialisieren
void timer1_init(void)
{
TCCR1A = (1<<WGM11)|(1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0); // initalize mega8 Timer1
TCCR1B = (1<<CS12);

OCR1A =490; // Servo1 auf Mittelposition vorstellen (477-502)
OCR1B =478; // Servo1 auf Mittelposition vorstellen (477-502)
}

// Timer0 initialisieren
ISR(TIMER0_OVF_vect){
takt++;
}

// UART initialisieren
ISR(USART_RXC_vect){
rxwert= UDR;
}

// COM1 initialisieren
void usart_init(void){
UBRRL = bauddivider; //set baud rate
UBRRH = bauddivider >> 8;
UCSRB = (1<<RXCIE)|(1<<RXEN);
UCSRC = (1<<URSEL)|(3<<UCSZ0);
}

// Servo1 initialisieren
void Servo1_init(void){
switch(rxwert){
case 0x51 :
if(OCR1A > 477){ /* Servo1 dreht bis min 477 dann stop */
OCR1A--; /* Pulsbreite verkürzen */
_delay_ms(250);} /* 250ms warten */
UDR = 'H';

break;
case 0x52 :
/* Servo1 nichht drehen */
break;

case 0x57 :
OCR1A =490; // Servo1 auf Mittelposition
break;
case 0x58 :
/* Servo1 nichht drehen */
break;

case 0x45 :
if(OCR1A < 502){ /* Servo dreht bis min 502 dann stop */
OCR1A++; /* Pulsbreite verlängern */
_delay_ms(250);} /* 250ms warten */
break;
case 0x46 :
/* Servo1 nichht drehen */
break;
}

}

// Servo2 initialisieren
void Servo2_init(void){
switch(rxwert){
case 0x41 :
if(OCR1B > 472){ /* Servo2 dreht bis min 472 dann stop */
OCR1B--; /* Pulsbreite verkürzen */
_delay_ms(250);} /* 250ms warten */
break;
case 0x42 :
/* Servo2 nichht drehen */
break;

case 0x53 :
OCR1B =478; // Servo2 auf Mittelposition
break;
case 0x54 :
/* Servo2 nichht drehen */
break;

case 0x44 :
if(OCR1B < 490){ /* Servo dreht bis 490 dann stop */
OCR1B++; /* Pulsbreite verlängern */
_delay_ms(250);} /* 250ms warten */
break;
case 0x43 :
/* Servo2 nichht drehen */
break;
}

}

// Getriebe 100% drehzahl initialisieren
void Getriebe100(void){
PORTC|=(1<<PC2)|(1<<PC5); // Motor läuft mit 100%
}

// Getriebe 50% drehzahl initialisieren
void Getriebe50(void){
if(takt>=10){ //Takt bis 10 zählen
takt=0;
PORTC^=(1<<PC2)^(1<<PC5); //PortD3 toggelt 50%
}
}

// Getriebemotoren initialisieren
void Getriebe(void){
switch(rxwert){
case 0x32 :
Getriebe100(); //Geändert auf 100%
PORTC|=(1<<PC0); // GLRückwärts 50%
PORTC|=(1<<PC3); // GRRückwärts 50%
break;
case 0x33 :
PORTC&= ~(1<<PC0); // GLRückwärts Stop
PORTC&= ~(1<<PC3); // GRRückwärts Stop
break;

case 0x34 :
Getriebe100();
PORTC|=(1<<PC4); // GRVorwärtsRechts 100%
break;
case 0x35 :
PORTC&= ~(1<<PC4); // GRVorwärtsRechts Stop
break;

case 0x36 :
Getriebe100();
PORTC|=(1<<PC1); // GLVorwärtsLinks 100%
break;
case 0x37 :
PORTC&= ~(1<<PC1); // GLVorwärtsLinks Stop
break;

case 0x38 :
Getriebe100();
PORTC|=(1<<PC1); // GLVorwärts 100%
PORTC|=(1<<PC4); // GRVorwärts 100%
break;
case 0x39 :
PORTC&= ~(1<<PC1); // GLVorwärts Stop
PORTC&= ~(1<<PC4); // GRVorwärts Stop
break;
}
}


int main(void) {

usart_init();

DDRB = (1<<PB1)|(1<<PB2); // Pin PB1 und PB2 als Ausgang für Servo1/2
DDRC=(1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5);// PC0=M2Z,PC3=M1Z, PC2=Getriebe1, PC5=Getriebe2, PC1=M2V,PC4=M1V
TCCR0=(1<<CS00); //kein Prescaler
TIMSK|=(1<<TOIE0); // Overflow Interrupt en

timer1_init();
sei();

for(;;){

Getriebe();
Servo1_init();
Servo2_init();

}
}

Hubert.G
20.12.2007, 11:01
Ich werde mir das heute mal ansehen aber bist du dir sicher das du kein Problem mit der Stromversorgung hast. Dieses Servo bewegen deutet auf einen kurzen Spannungseinbruch hin wenn du die Motoren drehen lässt.

Hubert.G
20.12.2007, 16:47
Also abgesehen das ich mit der Zuordnung Vor- Rück und Links- Rechts nicht ganz zurecht komme, funktioniert es bei mir einwandfrei. Kannst du einmal die Motoren weggeben und probieren ob sich die Servos immer noch bewegen wenn du die Motoren ansteuerst. Bei mir tut sich da nichts.

SimLock
22.12.2007, 14:47
Hi,

danke das du dir die Zeit genommen hast!!!
Ich bin grade es an testen, wenn ich die 2 Getriebemotoren nicht angeschlossen habe und ich die Taste drücke vor/zurück/links/rechts werden auch die Servos nicht mit (kurz) bewegt.

Ich denke das die Baterie von 8V und 2300mA vielleicht zu schwach ist?
Denn ich habe auch eine LED zur Stromanzeige angeschlossen und die flakert etwas auf wenn ich die 2 Getriebemotoren bewege lasse.