Rover skid steer without rc remote

Hello i am marc from germany :wink:

I want to build a rover with 2 DC Motors ( no brushless controlled motors)!

The motors controlled with dc motor controller like this:

-> ferretrobotics.blogspot.de/2011/ … epper.html

But i dont understand how the apm skid steer works?

I think apm works like this:

Left motor is on output 1 and right motor on output 3 is that right?

The motors set over PWM signals ?

PWM = 0 motor off , PWM = 255 Motor running on max speed value?

To turn right : motor left PWM = 255 and motor right PWM = 0 is that possible?

But i always see in mission planer setup list values from 800 - 2000?
What about this values?

////////

I want to use arduino like a remote controll:

How many channels i need to connect for skid steer mode?

What signal must arduino sent to the apm?

PWM signals 0-255?

Or high or low ttl signals?

I hope anybody can help me :slight_smile:

Ps. Sorry for my bad english :wink:

Regards from germany

@Marc2014,
Your steering theory is correct for directional control, however PWM is measured in microseconds and not hex values.
The 800 to 2000 values are in microseconds.
Regards,
TCIII GM

Thank you for the fast answer :wink:

I dont understand what you mean ?

Is it possible to control the steering with the pwm 0-255 for each motor?

Or arduino must convert value 2000 from apm to 255 for my dc motors and 800 from apm to 0 for arduino?

I also read that steering is only on channel 1 and channel 3 is for speed controll or is that only in normal car mode and in skid_steer mode channel 1 for left and 2 for right motor?

I have test arduino with the apm but my motors only running for a couple of microseconds i see in the arduino terminal both pwm values like this:

( coming from APM to arduino )

Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 960 Pwm 3 = 960
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 0 / Pwm 3 = 0
Pwm 1 = 960 Pwm 3 = 960

and this repeat !

Is that normally?

second question:

Apm rover supports backward driving? I mean reverse motor direction? Or is it only forward and right or left for turning? If it support backwards driving how is the pwm valu?

Regards from germany

Marc Rudorfer

@Marc2014,
The link that you have provided in your first post is for a Stepper Motor Driver and not a DC Motor Controller as you need to use to control your dc motors.
You need an Electronic Speed Control (ESC) that converts PWM signals to a proportional DC voltage to control the speed of your dc motor.
Regards,
TCIII GM

Hi,

no thats wrong.

The L293 can drive stepper motors and dc motors i used this microchip for my robots.

The chip need a pwm signal from 0-255 for the speed controll and one digital pin for the motor direction.

My solution is:

I used arduino to read the values from the apm coming on ch 1 & 3 and set the output for my dc motors…

I only want to pick up the pwm value comming from the apm for controlling the speed of my 2 dc motors.

But my only problem :

I dont understand how to convert the values from apm (800/1500/2000) to my range for speed 0-255 PWM.

Can anybody tell me what is the action for:

Output : 800 / 1500 / 2000 ??

I cant use brushless motors with bec for my projekt because all brushless motors are to small for my projekt.

Regards from germany

[quote=“Marc2014”]Hi,
I dont understand how to convert the values from apm (800/1500/2000) to my range for speed 0-255 PWM.
[/quote]

Hi Mark,

ich bin mal so frei und antworte in deutsch.

Ich denke arduinos map( Funktion ist dein Freund :slight_smile:

Ein ziemlich gutes Tutorial was mir mal geholfen hat findest Du bei sparkfun.com:

sparkfun.com/tutorials/348

Die Doku zur Funktion ist sicherlich auch hilfreich:

arduino.cc/en/Reference/Map

Viele Grüße,
Linus

Hey Linus :slight_smile:

Danke für deine Antwort ( wenigstens verstehst du mich :slight_smile: ) ich bin vor kurzem auch auf diesen Link den du mir netter Weise gegeben hast gestoßen und habe den code für mein Vorhaben etwas umgebaut.

Aber irgendetwas stimmte nicht… um auszuschließen das dieses Problem an meinem code und meiner nennen wir es mal “zwischen hardware” liegt habe ich 2 Standard Brushless Motoren mit ESC direkt an Output Ch 1 und 3 der APM 2.6 angeschlossen um das verhalten zu testen.

Ich bin wirklich erschrocken nachdem ich den LiPo angesteckt hatte dauerte es ca 3-8 Sekunden dann gaben beide Motoren Vollgas :open_mouth: ich habe Glück das ich mich nicht verletzt habe.

Auf jeden Fall ist jetzt sicher das die APM bei mir zumindest total falsch eingestellt ist.

Ich habe versucht die Geschwindigkeit zu reduzieren ( oder muss das Teil so dermaßen losrasen ? ) über die Einstellungen im Mission planner bei ( Full Parameter Tree) allerdings ohne erfolg. Auch die drehrichtung also CH3 Servo REV auf -1 gestellt ( wurde auch gespeichert ) aber der Motor läuft trotzdem falsch. :question:

Hast du auch einen Rover gebaut? wenn ja könntest du mir evtl ein paar Tipps und Anregungen geben?

Ps. Hier der code für den späteren Aufbau mit DC Motoren un 293L Regler.


// RC-Empfänger Signale umwandeln für DC 293L Motor Controller. 
// Test 1.2


int CH1;                                        
const int pwmrechts = 3;                        // Motoren "rechts" Geschwindigkeit ( PWM ) AUSGANG.

int CH3;           
const int pwmlinks  = 5;                        // Motoren "links"  Geschwindigkeit ( PWM ) AUSGANG.


const int motorenrechts_rechtslauf  = 4;        // Motoren "rechts" ( rechtslauf ).
const int motorenrechts_linkslauf   = 9;        // Motoren "rechts"  ( linkslauf ).                                     

const int motorenlinks_rechtslauf   = 7;        // Motoren "links"  ( rechtslauf ).
const int motorenlinks_linkslauf    = 8;        // Motoren "links"   ( linkslauf ).

int links;
int rechts;

void setup() {
  
  Serial.begin(9600);
  
  pinMode(10, INPUT);                            // CH1 Eingang
  pinMode(11, INPUT);                            // CH3 Eingang


  
 pinMode(motorenrechts_rechtslauf, OUTPUT);      
 pinMode(motorenrechts_linkslauf , OUTPUT);
 pinMode(motorenlinks_rechtslauf , OUTPUT);
 pinMode(motorenlinks_linkslauf  , OUTPUT);
 
 pinMode(pwmrechts, OUTPUT);
 pinMode(pwmlinks , OUTPUT);

    
  }

void loop() {
  
    CH1 = pulseIn(10, HIGH, 25000); 
    CH3 = pulseIn(11, HIGH, 25000); 

  
links  = map(CH1, 1000, 2000, -255, 255);     // Motoren auf der linken  Seite / Geschwindigkeit linke  Seite. ! 

rechts = map(CH3, 1000, 2000, -255, 255);     // Motoren auf der rechten Seite / Geschwindigkeit rechte Seite. 

 
//#######################################################################      <<<<         MOTOREN LINKE SEITE        >>>>     ##############################################################################################


 if (CH1 != 0) {
   
                  Serial.println(links);

 
        if (links > 0 ) {
          
          Serial.println("LR");
  
        digitalWrite(motorenlinks_linkslauf  , LOW);
        digitalWrite(motorenlinks_rechtslauf , HIGH);
  
        analogWrite(pwmlinks, links);
  
      }

        if (links < 0 ) {
  
          Serial.println("LL");

        digitalWrite(motorenlinks_rechtslauf , LOW);
        digitalWrite(motorenlinks_linkslauf  , HIGH);

  
        analogWrite(pwmlinks, links * -1);  
  
      }
      
       if (links == 0 ) {
  
          Serial.println("LS");

        digitalWrite(motorenlinks_rechtslauf , LOW);
        digitalWrite(motorenlinks_linkslauf  , LOW);

  
        analogWrite(pwmlinks, 0);  
  
      }

}
//#######################################################################      <<<<         MOTOREN RECHTE SEITE        >>>>     ##############################################################################################


 if (CH3 != 0) {
   
             Serial.println(rechts);


        if (rechts > 0) {
          
          Serial.println("RR");

   
        digitalWrite(motorenrechts_linkslauf , LOW);
        digitalWrite(motorenrechts_rechtslauf , HIGH);
  
        analogWrite(pwmrechts, rechts);

  
        }


        if (rechts < 0) {
  
           Serial.println("RL");

        digitalWrite(motorenrechts_linkslauf , HIGH);
        digitalWrite(motorenrechts_rechtslauf , LOW);
  
        analogWrite(pwmrechts, rechts * -1);

  
        }

        if (rechts == 0) {
  
            Serial.println("RS");

        digitalWrite(motorenrechts_linkslauf , LOW);
        digitalWrite(motorenrechts_rechtslauf , LOW);
  
        analogWrite(pwmrechts, 0);

  
        }


   }
  
}

Gruß Marc :slight_smile:

Hi Mark,

erstmal ein paar Fragen zu deinem Setup:

Welche Software Version benutzt Du ?
Ich frage weil es in der letzten ein paar bekannte ungefixte kleinigkeiten gibt die wir hoffentlich bald behoben haben werden.

Ich würde empfehlen die 2.45 zu benutzen für dein Vorhaben vorerst.

Meinen Wild Thumper habe ich derzeit mit 2.44 funktionstüchtig bekommen in skid steer Konfiguration.

Dann wäre da noch der Umstand das derzeit keine autonomen Fahrten in Rückwärtsfahrt implementiert sind, das wird wohl auch noch etwas auf sich warten lassen.

Hintergrund ist das das Rover developer team etwas schwach besetzt ist und Tridge (unser Haupt-Entwickler und Brain) chronisch knapp mit Zeit ist aufgrund der diversen Aufgaben die er noch für das Projekt (Plane, Rover, …) schultert.

Ich selbst bi nur ein bastler und nicht so tief in der Materie das ich selbst hand an den Code legen könnte.

Am besten Du hängst ein Parameter-File an deine Antwort dann kann ich einen Blick darauf werfen um evtl weiter helfen zu können.

Empfehlen würde ich auch deinen Rover auf Blöcke zu setzen für weiteres testen damit kein Unglück passiert und alle Finger drann bleiben.

Ich schau mir deinen Code morgen an, jetzt gerade fehlt mir leider die Zeit leider.

Besten Gruß aus Hamburg
Linus

Hey Linus :slight_smile:

Ich habe jetzt mal ein paar Bilder und den Parameter File angehängt.

Ja gute Idee ich muss den Rover auf jeden Fall festschnallen. :stuck_out_tongue:

Kein Problem der code für den arduino sollte normal ja auch passen.

Das größte Problem ist momentan den Rover mit APM 2.6 überhaupt mal zum “richtig” laufen zu bekommen.
( also erstmal mit 2 ESC’s und Brushless Motoren ).

Die normale Version mit Antrieb + Servo zur Lenkung ist deswegen nichts für mich weil ich je nachdem das ganze läuft ( Gps Genauigkeit usw. ), evtl einen Rasenmäher mit der APM steuern wollte.
Und einen Rasenmäher wird wohl nur ein MEGA SERVO Lenken können :smiley: und wenn ich diesen Skid_Steer Modus verwenden könnte wär das ja dann kein Problem.

1.) Also du hast gesagt die Skid_steer Methode ist noch nicht funktionsfähig? Das heist da kann ich lange testen aber der macht eh nur Wirre Sachen? Oder hab ich das falsch verstanden?
Das würde ja bedeuten ich brauch eigentlich garnichts damit täten solange keine funktionsfähige FW vorhanden ist ( also für skid_steer ). ?
Wenn überhaupt dann mit 2 Motoren und 1 Servo zur Lenkung um überhaupt mal ein Gefühl für die APM zu bekommen bis die ( skid_steer ) FW verfügbar ist.

2.) Die FW Version von mir ist : 2.46 , ich sollte also eine ältere Version verwenden ?

3.) Die Motoren ( Brushless über ESC ) laufen echt nur Vollgas, kann man nicht zum testen mal einen zb maximalen speed von 25% festlegen ? Wenn ja wo?

4.) Kannst du dir vorstellen warum bei CH3 im skid_steer modus das reverse ( -1 ) nicht funktioniert obwohl der wert akzeptiert und gespeichert wurde?

5.) Wie genau fährt der APM Wegpunkte an? auf CM ? Meter ?

6.) Wenn ich in diesem Full Parameter Tree rechts Rover auswähle ist das sogarnachdem speichern wieder weg und es steht copter oder plane drin ? Einfach ignorieren?

7.) Da ich ja nur den autonomen Modus brauche könnte ich doch als RC fernsteuerungsersatz 2-4 PWM Ausgänge des Arduinos nehmen und dann mit der Servo Library und ein Paar Poti’s eine Rc simulieren.
Hab ich für einen Kanal schon versucht hab dann einfach: map(val, 0, 1023, 0, 179); gemacht damit ging das ganz gut ( abgesehen davon das ich nicht weis was die Apm da immer ansteuert und warum :stuck_out_tongue:
Aber im manuellen Modus wurden die Signale richtig erkannt und auch angezeigt ( im Mission Planner ) RC remote…

8.) Die Funktion Kickstart bedeutet doch nach dem booten startet er sofort die ( Mission ) ? Oder brauche ich trotzdem einen Eingang zum aktivieren?

9.) Noch eine Frage zu den Eingängen der APM, kann ich die einfach einmal Signal gegen GND für zb off und einmal vcc gegen Signal für on schalten oder brauche ich auch nen PWM Ausgang des arduinos?

10.) Wenn ich im Mission Planner Terminal bin dann auf connect und dann auf “zeige Einstellungen” gehe dann kommt erst version usw alles korrekt und dann wirre Zeichen ohne ende… passt dass?

Ich hoffe ich stresse dich nicht mit meinen 100000000 Fragen, Wenn die geklärt sind sollte ich auch alleine klar kommen :smiley: du bist der einigste der sich bei APM super auskennt und mich auch richtig versteht.

Ich habe noch ein paar Bilder angehängt und den Parameter file.

Gruß Marc :wink:

Ps. Heist das du hast die APM mit entwickelt? :wink: coole Sache !

Ich kann leider nichts hochladen -.-

Kommt dauernd:

Das hat er auch bei der richtigen parameter Datei gesagt dann hab ich die dateiendung auf .txt geändert und jetzt sagt er wieder
das die Endung nicht erlaubt ist.

The extension txt is not allowed.

Gruß Marc

Gut die .zip nimmt er :wink:

Da sind jetzt auch die Bilder drin :wink:

Gruß Marc

Hi Mark,

sorry das es etwas länger gedauert hat.

Kannst Du der Dokumentation auf rover.ardupilot.com in englisch folgen ?

Das soll auf keine Fall obelehrerhaft klingen aber ich denke viele deiner Fragen klären sich wenn Du dir diese nocheinmal durchliest.
Auch ein kleiner Blick in die anderen Kategorien (Plane/Copter) hilft oft da die Dokumentation dort oft viel besser und ausführlicher ist als im rover-wiki (Wir arbeiten daran ;))

http://rover.ardupilot.com/

Zu deinen Fragen:

Man kann die Geschwindigkeit einstellen und wieviel der Rover initial “gas gibt”.
Die Parameter CRUISE_SPEED und CRUISE_THROTTLE sind die entsprechenden.

Ich denke es ist besser erstmal im manuellen Modus zu testen um die grundlegende Funktionalität sicherzustellen.

Der Rover navigiert nur so genau wie das GPS ist also eher in der Größenordnung 3-5 Meter jenachdem was Du für ein Modul verwendest.

Tridge unser Code-Guru hat gerade eine neue Version (2.47beta1) released und ich denke Du kannst diese verwenden um fortzufahren.

Am besten Du besorgst dir einen Sender bei Ebay, ganz ohne Kontrolle würde ich keine Rasenmäher testen und betreiben aus sicherheits Aspekten!

Ich benutze zum Konfigurieren immer die Full-Parameter Liste.
Du musst geänderte Parameter natürlich immer an deinen APM übermitteln mittels “Parameter Speichern”.

Die AUTO_KICKSTART Funktion ist im Wiki beschrieben und bedeutet das Du dem Rover einen Tritt oder Klapps geben kannst um keinen Button verwenden zu müssen.
In Kombination mit der INITIAL_MODE Funktion könnte man einen Rover aber auch ohne Sender betreiben, ist aber nicht sehr ratsam vorallem wie gesagt nicht für deinem Anwendungsfall “Rasenmäher”.

Denke daran das Du beim testen sicherlich auch mal eine Mission abbrechen willst ohne gleich nachbars Blumenbeet platt zu walzen ohne Eingriffsmöglichkeit.
Das Gefährt sicher zu betreiben sollte oberste Prio haben!

Kein Problem der Fragen wegen, dafür gibt es die Community und ich kann sagen das der Rover sozusagen sowas wie mein Ziehkind ist, bin seit Anfang an dabei habe allerdings leider wegen anderen Projekten zeitweilig nicht so viel Zeit für den Rover.

Viel Glück und gutes vorrankommen, bis die Tage!
Linus