Verständniss der Software

redtop

Member
Hallo Al.ex,

da ich den anderen Threat nicht zerlabern möchte, mach mal hier weiter.

In deinem Test Sketch, ist schon einiges klarer.

Hier wird das Signal gelesen, wenn ich das richtig verstehe von der ppm Frquenz 1500(Nullstellung) abgezogen :



Code:
int rcValue(int ppmTime){
  int value = (int) (((double)((ppmTime) - 1500)) / 3.4);
  if ((value < 5) && (value > -5)) value = 0;
  return value;


aber wo kommt ppmTime her ?

Als Arduino Funktion konnte ich es nirgens finden.


Code:
int rcValue(int ppmTime){
  int value = (int) (((double)((ppmTime) - 1500)) / 3.4);
  int rcvalue = (((ppmTime) - 1500)) / 3.4);
  if ((value < 5) && (value > -5)) value = 0;
  return value;

müsste ich einen Wert > 1000 haben, solange ein RC Signal vorhanden ist ?



Stefan
 
@Stefan:

Seite 1: https://www.uni-ulm.de/fileadmin/website_uni_ulm/iui.inst.050/vorlesungen/sose09/lrob/servos.pdf
Die Dauer des RC-Signals (HIGH-Zeit) bestimmt die Auslenkung:
Nullstellung: 1,5 ms (1500 Mikrosekunden)
Auslenkung ganz rechts: 2 ms (2000 Mikrosekunden)
Auslenkung ganz links: 1 ms (1000 Mikrosekunden)

"ppmTime" ist ein Funktionsparameter der Funktion "rcValue" - der Wert des Parameters wird beim Aufrufen an die Funktion übergeben:
Beispiel: rcValue(timeMicros - remoteSpeedLastTime)

Es wurde also die HIGH-Zeit in Mikrosekunden an die Funktion übergeben.

In der Funktion selber wird dann mit dem Funktionsparameter "ppmTime" weiter gerechnet:
int value = (int) (((double)((ppmTime) - 1500)) / 3.4);

Zunächst wird die Mittelposition abgezogen (-1500 Mikrosekunden). Der Wertebereich ist nun -500 bis +500 Mikrosekunden. Dann wird durch 3,4 geteilt - der Wertebereich ist nun -147 bis +147 (frag mich nicht warum ich nicht /5.0 genommen habe, ich weiß es selber gerade nicht :))

Falls der Wert irgendwo um Null liegt (-5 bis +5), soll er Null werden (nur so schalten die Motoren vollständig ab):
if ((value < 5) && (value > -5)) value = 0;

Der so berechnete Wert wird an den "Aufrufer" zurückgegeben.
return value

Nun hat remoteSpeed also das Ergebnis der Berechnung übernommen:
remoteSpeed = rcValue(timeMicros - remoteSpeedLastTime);

Ich werde das gleich auch mal im SVN-Code kommentieren (musste gerade selber wieder drüber nachdenken :))
 
@Alex

Danke für die Ausführliche Erklärung, jetzt ist alles klar.

Ich bin. warum auch immer, davon ausgegangen das man den ppm Wert auslösen könnte aber wie soll das Funktionieren.
klar über die Zeitvariable, kurz berechnen und schon hat man den Wert.

Stefan
 
Um Deine Frage zu beantworten: man könnte evtl. überprüfen, ob die Zeit im zulässigen Bereich war, also z.B. zwischen 500 und 2500 uS. Falls ja, dann z.B. eine "bool" Variable setzen und diese im Hauptprogramm abfragen:

robot.h: boolean remoteActive;

robot.cpp: remnoteActive = true;

if (remoteActive) ...
 
Hallo,

ich bin neu im Forum und beschäftige mich seit einem Monat mit dem ArduMower, habe ein TestMower aufgebaut und die Software installiert.

Folgende Pins sind nicht verbunden:
pinMotorEnable
pinMotorLeftFault
pinMotorRightFault
pinMotorMowFault
pinMotorMowEnable

Welche Funktion haben sie? Alle "Fault"-Pins musste ich auf HIGH setzen, sonst gab es nur Fehler.

Gruß
Ingo
 
Hallo,
Welchen Motortreiber verwendest du den LM298N oder den MC33926

der MC ist Standard in der Software weil er über eine Strommessung verfügt und über eine Überlast Funktion zu Abschaltung
(pinMotorLeftFault , pinMotorRightFault , pinMotorMowFault)
Außerdem kann man den Motortreiber ein und ausschalten. ( pinMotorEnable , pinMotorMowEnable )

In der Software kann man einstellen welchen Motortreiber man verwendet. z.B den MC33926 oder den LM298N.
Wenn man das auf LM298 umstellt kann es noch zu Fehlern kommen, weil einige erwartete Pins nicht vorhanden sind.
Das sind Fehler die in der Software bei Verwendung von anderen Treibern als den MC Motortreiber noch nicht abgefangen sind.
( muss noch geändert werden )

pinMotorEnable
pinMotorLeftFault
pinMotorRightFault
pinMotorMowFault
pinMotorMowEnable

Ich gehe mal davon aus das du den MC nicht verwendest sondern einen anderen z.B LM298N.
Der hat diese Funktionen nicht und deshalb muss eine Anpassung vorgenommen werden.

Es wäre Hilfreich wenn du uns sagen könntest was für Komponenten du benutzt.
z.B eigene Platine, Motortreiber, Spannungsversorgung Motoren usw usw oder vorgefertigte Platinen aus dem Shop

Viele Grüße
Uwe
 
Hallo UweZ,

danke für deine schnelle Antwort.

Ich komme aus dem Flugmodellbau. Board ist ein Mega mit Sensorplatine. Als Motorregler verwende ich Regler von CTI-Modellbau (15A kurz 50A). Diese Regler werden nur über einen Pin mit einem PWM Signalg esteuert. PWM und Dir werden zu VAL -255 bis 255. Folgende Änderungen habe ich vorgenommen:
#include

#define ServoNull 45 // 1 ms
#define ServoMitte 95 // 1,5 ms
#define ServoNull 145 // 2 ms
..
MotorLeft.attach(pinMotorLftPWM);
MotorLeft.write(ServoMitte);
...
case ACT_MOTOR_LEFT: {int VAL = map (value, -255, 255, ServoNull, ServoMax); MotorLeft.write(VAL);} break;

Deine Antwort war für mich sehr hilfreich. Ich habe pinMotorEnable, pinMotorLeftFault, pinMotorRightFault, pinMotorMowFault und pinMotorMowEnable sowie checkMotorFault() und resetMotorFault() auskommentiert. Nun läuft alles ohne Fehler.

Gruß
Ingo
 
Oben