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