Probleme bei Motor- und Servoansteuerung

Hallo Experten,

es ist mal wieder soweit und ich wende mich im meiner Verzweiflung an Euch. Bitte verzeiht mir, wenn ich kein Coding poste. Das Problem liegt für mein Verständnis eher in einem theoretischen Sachverhalt.

In einem Nebenprojekt habe ich mir einen kleinen Panzer zusammengebaut. Kein fertiger Bausatz, sondern alles selbst gewerkelt und programmiert. Ich will ja auch etwas lernen und nicht nur fertige Module zusammen stecken.

Alle meine Prototypen haben funktioniert. Dann im fertigen Modell ging es nicht mehr. Als Motortreiber hatte ich den L298N genommen. Dann habe ich festgestellt, dass ich die Geschwindigkeit immer nur an einem Motor regeln kann. Der zweite Motor geht zwar, aber immer nur bei voller Geschwindigkeit. Nun dachte ich, es liegt am Motortreiber (diverse unschöne Dinge sind in unterschiedlichen Quellen zu lesen). Daraufhin habe ich das Motorshield L298P probiert und daraufhin TB6612FNG. Letzteres funktionierte super im Prototyp. Somit alles in meinen Panzer überführt um final festzustellen, dass auch damit das Problem besteht.

Nun konnte ich das ganze eingrenzen (hätte ich schon früher tun sollen, aber auf die Idee bin ich leider erst heute gekommen) denn es liegt an den angesteuerten Servos für den Pan Tilt Mount für die Kamera. Diese sind an Pin 5 und Pin 6 angeschlossen.

Sobald ich servo.attach aufrufe (Standardlibrary von Arduino <Servo.h>) funktioniert es nicht mehr. Kommentiere ich diese Zeile (inaktiv) geht alles anstandslos. Ich vermute, dass die Bibliothek über die Timer das PWM Signal kaputt macht.

Bzgl. der Timer habe ich mich auch belesen. Aber scheinbar verstehe ich da etwas nicht vollständig. Ich wäre für eine Erklärung dankbar. Am liebsten natürlich, wenn man mir einen Tipp geben könnte, wie ich die Pins verschalten muss (siehe unten), damit beides funktioniert (Speed für beide Motoren und die beiden Servos für den PT Mount). in den fertigen Bausätzen bekommen die das ja scheinbar auch hin.

Ich verwende einen Arduino NANO.

Danke und Grüße

// motor standby
const uint8_t pinSTBY = 2;  // standby

//motor A
const uint8_t pinLPWM = 3;  // Speed control
const uint8_t pinLIN1 = 9;  // Direction
const uint8_t pinLIN2 = 8;  // Direction

//motor B
const uint8_t pinRPWM = 10;  // Speed control
const uint8_t pinRIN1 = 11;  // Direction
const uint8_t pinRIN2 = 12;  // Direction

// servo
const uint8_t pinServoH = 5;
const uint8_t pinServoV = 6;

Ich habe gerade folgendes gefunden (hatte ich irgendwo mal gelesen und lokal in eine Textdatei gesichert). Ich probiere es am Wochenende aus und lege die PWM Signale für die Motoren auf Pin 3 und 11...

Yes, there is an authoritative description that indicates which timers are used for PWM on the Arduino Nano.

In general, the Arduino Nano uses three timers: Timer0, Timer1, and Timer2. Timer0 is used for the delay() function, so it should not be used for anything else. Timer1 is used for the Servo library, so it should not be used for PWM unless you don't plan to use Servo.

Timer2 is used for the Tone() function and for the PWM output on pins 3 and 11. The other PWM outputs on the Nano (pins 5, 6, 9, and 10) are controlled by Timer0 and Timer1, so you can use those timers for PWM if you're not using the Servo library.

If you want to use Timer2 for your own timing functions, you can still use PWM on pins 3 and 11 by using the analogWrite() function. However, you should not use Timer2 for any other purpose while using PWM on those pins.

Overall, it's a good idea to carefully plan your use of timers on the Nano to avoid conflicts between different functions. You can refer to the datasheet for the ATmega328P microcontroller used in the Nano for more detailed information on timer usage.

So ist es. Die Servo-Lib benutzt Timer 1, und der ist auch für PWM an den Pins 9 und 10 zuständig. Beides zusammen geht also nicht.

Danke für Ihre Rückmeldung. Ich habe es nicht ausgehalten und den Rechner nochmal hochgefahren und es probiert. Es funktioniert alles wie gewünscht wenn ich Pin 3 und 11 verwende. Musste glücklicherweise nicht viel umbauen. Verdammt ärgerlich, dass ich da nicht früher drauf gekommen bin denn ich hatte die Lösung ja parat aber leider nicht auf dem "Schirm". Naja... wenigsten werde ich diese Nacht zufrieden schlafen können :wink: Wieder etwas leidvoll eine wichtige Lektion gelernt!

Ich würde den L298 nicht verwenden, da dieser einen sehr hohen Spannungsabfall an den Ausgangstransistoren hat (ca 3V bei 2A) und da die Motorspannung 2V größer (größer als 7V) als die Logikspannung (5V) sein muß.
Da ist der TB6612 besser.
Ohne genaue Angabe der Motordaten kann ich aber aber nichts gutes raten.
Grüße Uwe

Hättest halt früher fragen müssen .... :wink: :innocent: :wink: :innocent:
Grüße Uwe

Danke für die Rückmeldung. Ich verwende den L298 auch nicht mehr. Aber das eigentliche Problem war die falsche Verwendung der Pins siehe oben.

Naja... wie gesagt: ich versuche es halt selbst erst mal. Ist nicht meine Art wenn mal was nicht funktioniert gleich die halbe Welt verrückt zu machen. Kann ich im Beruf auch nicht. Eigentlich habe ich mir die Antwort ja sogar selbst gegeben. Diese wurde dann durch @MicroBahner bestätigt. Normalerweise gehe ich bei sowas auch systematisch ran und mir hätte das auffallen müssen, vor allem weil ich die Lösung vor der Nase hatte. Ich hatte nur irgendwo (bei den vielen Lesestunde in diversen Foren) gelesen, dass die Pins 5 und 6 für die Servos sind. Vorhin habe ich mir dann noch eine andere Servo-Lib auf GitHub angeschaut und feststellen müssen, dass dort auch überall der Pin 10 (unter anderen) eine Rolle spielt. Das in Verbindung mit der Aussage zu den Timern (die ich wieder aus meinen Notizen ausgekramt habe) war dann die Lösung. Es musst ja irgend sowas sein, denn die Prototypen liefen halt. Aber die hatten auch nicht den vollen Umfang (also ohne Servos) denn ich dachte das Problem sind die Motoren. Zig Stunden für die Katz, meine eigene Logik umsonst mehrfach umgeschrieben, unnötige Treiber gekauft etc. Aber wie gesagt: ich nehme es sportlich als Lektion :slight_smile:

So hast Du mehr gelernt als wie wenn wir Dir nur abgeraten hätten.
Grüße Uwe

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.