RC Futaba 40MHZ

kurzschuss

Administrator
Ich habe heute mal versucht meine Fernbedienung Futaba fc 16 40MHZ anzuschließen. Leider hat das nicht funktioniert. Muss ich da noch irgendwo Einstellungen vornehmen ?
Ich hatte die Probleme das er sich andauernd im Kreis dreht und nicht damit aufgehört hat. Nur über Notaus
Im Normalfall sollte es doch so sein das bei Mittelstellung des Sender Knüppel der Mower stehen bleibt.
Gibt es noch eine Möglichkeit die Mittelstellung zu kalibrieren ?
Das einzige was funktioniert hat ist der Mähmotor.

Gruß
Uwe
 
Hmm, bei mir hat alles 1A funktioniert. Ich habe nichts, aber auch wirklich nichts parametriert.

Bei Futaba sind doch einige Kanäle standardmäßig reversiert (entgegen allen anderen Anlagen auf dem Markt). Kann es daran liegen? Obwohl nein, es dürfte trotzdem nicht losfahren. Hat deine Anlage überall eine federrückgestellte Mittelstellung? Bei mir ist zum Beispiel links der Throttle-Hebel rastend, den muss ich immer erst in die Mittelstellung bringen, sonst fährt der Mower sofort los.

Hast du die richtigen Motorfunktionen? Laufen die alle richtig herum? Also die MC-Funktion und nicht die L298-Funktion, wenn du den MC benutzt.

Gruß,
Jem
 
Bei mir haben alle eine Federrückstellende Mittelstellung. Als Motortreiber verwende ich mittlerweile den Dual MC33926 Für den Antrieb und den Mähmotor. Vorher hatte ich die L298.
An der Software habe ich nicht geändert was den Motortreiber entspricht - muss ich da evl eine Änderung vornehmen ? wenn Ja wo und wie?
Ich habe mich eh schon immer gefragt woher die Software weiß wie sie was ansteuern muß.
Ich verwende zur Zeit die Rad und Mähmotoren aus dem Shop sowie 2 Dual MC33926 - natürlich an 24V

In der serielle Konsole funktioniert der Motortest Geschwindigkeit und Drehrichtungsumkehr.

Ausgehend von der Originalsoftware habe ich nur folgende Änderungen vorgenommen:
Mover.CCP
.
.

// bumper
bumperUse = 1; // has bumpers? Uwe geändert von 0 auf 1

// rain
rainUse = 0; // use rain sensor? Uwe geändert von 1 auf 0

// perimeter
perimeterUse = 0; // use perimeter? Uwe geändert von 1 auf 0
perimeterTriggerTimeout = 0; // perimeter trigger timeout (ms)
perimeterTrackRollTime = 3000; // perimter tracking roll time (ms)
perimeterTrackRevTime = 2000; // perimter tracking reverse time (ms)
perimeterPID.Kp = 60.0; // perimeter PID controller
perimeterPID.Ki = 6.0;
perimeterPID.Kd = 5.0;
..
.
.
.
// GPS
gpsUse = 0; // use GPS? Uwe geändert von 1 auf 0

.
.
.
// sonar
//case SEN_SONAR_CENTER: return(readURM37(pinSonarCenterTrigger, pinSonarCenterEcho)); break;
case SEN_SONAR_CENTER: return(readHCSR04(pinSonarCenterTrigger, pinSonarCenterEcho)); break;
case SEN_SONAR_LEFT: return(readHCSR04(pinSonarLeftTrigger, pinSonarLeftEcho)); break; // Uwe aktiviert
case SEN_SONAR_RIGHT: return(readHCSR04(pinSonarRightTrigger, pinSonarRightEcho)); break; // Uwe aktiviert
//case SEN_LAWN_FRONT: return(measureLawnCapacity(pinLawnFrontSend, pinLawnFrontRecv)); break;
//case SEN_LAWN_BACK: return(measureLawnCapacity(pinLawnBackSend, pinLawnBackRecv)); break;


Ich bin für jeden weiteren Tipp dankbar

Gruß
Uwe
 
Mower.cpp

Code:
void Mower::setActuator(char type, int value){
  switch (type){
    case ACT_MOTOR_MOW: setL298N(pinMotorMowDir, pinMotorMowPWM, value); break;
    // normal direction
    case ACT_MOTOR_LEFT: setMC33926(pinMotorLeftDir, pinMotorLeftPWM, value); break; 	// In Software ist der L298N Standard, 
											// obwohl ja hardwaremäßig der MC Standard ist
    case ACT_MOTOR_RIGHT: setMC33926(pinMotorRightDir, pinMotorRightPWM, value); break;     // In Software ist der L298N Standard, 
											    // obwohl ja hardwaremäßig der MC Standard ist
    // reverse direction
    //case ACT_MOTOR_LEFT: setL298N(pinMotorRightDir, pinMotorRightPWM, -value); break;
    //case ACT_MOTOR_RIGHT: setL298N(pinMotorLeftDir, pinMotorLeftPWM, -value); break;    
    ...
  }
}
 
Danke für den Tipp habe ich gleich geändert.
Den Mähmotor habe ich gleich mit geändert. Wäre mir vielleicht leichter aufgefallen wenn ein Beispiel ausgeklammert gewesen wäre.
Oder vielleicht noch einfacher oben ins Einstellungsmenü zu übernehmen z.B z.B Motortreiber =1 // 1=LN298 , 2=MC33926.

Jetzt drehen sich die Räder vorwärts und rückwärts reagieren aber sehr Träge mit einer hohen zeitlichen Verzögerung.
Drehrichtungsumkehr ist nur möglich wenn ich voll in die Gegenrichtung lenke. Mittelstellung funktioniert nicht. Das heißt Motoren laufen immer weiter und ich kann nicht stehen bleiben.
Das einzige was einwandfrei funktioniert ist der Mähmotor.

Vielleicht liegt es an der Erkennung. Ich weiß ja nicht auf was für eine Signalverarbeitung der Arduino programmiert ist? 2,4GHZ, PCM, PMM.

Kann man darauf Einfluss nehmen über eine Konfiguration.

Was für eine Fernsteuerung verwendet du den 2,4GHZ?

Gruß
Uwe
 
Ja, eine 2,4GHz Spectrum DX6i, aber schau dir doch mal deinen Output (also die Länge deines Signals) am Empfänger an. Normalerweise ist ein Signal 20ms lang, davon die ersten 1-2ms auf HIGH, dann die restlichen ms auf LOW. Der High-Teil gibt dann dein Signal exakt an: 1000 mikrosekunden = -100%, 1500 mikrosekunden = 0% und 2000 mikrosekunden = +100%.

Beim linken und rechten Motor muss das Signal 1500 mikrosekunden betragen, wenn die nicht drehen sollen.

Der entsprechende Programmteil ist in der robot.cpp zu finden:


Code:
// ---- RC (interrupt) --------------------------------------------------------------
// RC remote control helper
int Robot::rcValue(int ppmTime){
  int value = (int) (((double)((ppmTime) - 1500)) / 3.4);
  if ((value < 5) && (value > -5)) value = 0;
  return value;
}


Hier sieht man die Mittelstellung bei 1500 mikrosekunden. Und dann die Umrechnung auf -147 bis +147. @Alex: Warum das ? Müsste das nicht -100 bis +100 sein ?




Code:
// RC remote control driver
void Robot::setRemotePPMState(unsigned long timeMicros, boolean remoteSpeedState, boolean remoteSteerState, 
  boolean remoteMowState, boolean remoteSwitchState){
  if (remoteSpeedState != remoteSpeedLastState) {    
    remoteSpeedLastState = remoteSpeedState;
    if (remoteSpeedState) remoteSpeedLastTime = timeMicros; else remoteSpeed = rcValue(timeMicros - remoteSpeedLastTime);
  }
  if (remoteSteerState != remoteSteerLastState) {    
    remoteSteerLastState = remoteSteerState;
    if (remoteSteerState) remoteSteerLastTime = timeMicros; else remoteSteer = rcValue(timeMicros - remoteSteerLastTime);
  }
  if (remoteMowState != remoteMowLastState) {    
    remoteMowLastState = remoteMowState;
    if (remoteMowState) remoteMowLastTime = timeMicros; else remoteMow = max(0, (rcValue(timeMicros - remoteMowLastTime)+100)/2);
  }  
  if (remoteSwitchState != remoteSwitchLastState) {    
    remoteSwitchLastState = remoteSwitchState;
    if (remoteSwitchState) remoteSwitchLastTime = timeMicros; else remoteSwitch = rcValue(timeMicros - remoteSwitchLastTime);
  }  
}


Der Mähmotor hat nur eine Drehrichtung, dementsprechend wird hier von -100% bis +100% auf 0% bis 100% umgerechnet.

Wenn hier alles stimmt, müssen wir die Suche ausweiten :)

Edit: Ach, wenn die Motoren zu langsam anlaufen und stehenbleiben, dann muss du die Acceleration höher setzen. Ich habe motorAccel (in der mower.cpp) auf 0.01 gesetzt. Damit ist es ein guter Kompromiss bei mir, da die Motoren sonst bei der Beschleunigung zu viel Strom ziehen und der Nachlauf bei Befehl "Motor aus" gerade noch akzeptabel ist.
 
Danke für die Info, jetzt weiß ich auch für was die Acceleration ist. (Englisch ist einfach nicht mein Ding)

Wie ich mir die Länge des Signales am Empfänger anschaue weiß ich leider nicht.

Vielleicht ist das euch eine Hilfe

Ich habe mir nach etwas suchen folgendes Programm erstellt:


void setup()
{
Serial.begin(57600);
pinMode(10, INPUT);
pinMode(11, INPUT);
pinMode(12, INPUT);
}
void loop()
{

Serial.print("(10) ");
Serial.print(pulseIn(10, LOW));
Serial.print(" (11) ");
Serial.print(pulseIn(11, LOW));
Serial.print(" (12) ");
Serial.println(pulseIn(12, LOW));
}

und direkt auf mein Mega Board aufgespielt.
Alle 3 Kanäle verändern ihre Werte je nach Ausschlag meines Steuerknüppels.

Kanal -- Max -- Mitte -- Min
10 ---- 21217 --- 20800 --- 20336
11 ---- 21216 --- 20806 --- 20339
12 ---- 21333 --- 20790 --- 20245

Bei Sendeausfall ändern sich die Werte unter 20000 und über 21500


Bei meinen Testergebnis müsste ich eigentlich Anschlussfehler ausgeschlossen haben und bestätigt haben das das Mega Bord vom RC Empfänger die entsprechenden Signale bekommt. Oder sehe ich das verkehrt?

Gruß
Uwe
 
Änder mal das LOW im pulseIn auf HIGH und du hast direkt dein PPM-Signal. Das müsste Werte zwischen 1000 für die eine Richtung Vollausschlag, 1500 für Mitte und 2000 für andere Richtung Vollauschlag geben ...
 
Das kommt hin mit den Werten ca 50 + - Unterschied

Ich habe dann mal etwas weiter probiert.
Ich füge mal als Datei den seriellen Log mit an.

Ich habe festgestellt das laut log die Fernsteuerimpulse ankommen und laut Log sich die Geschwindigkeit auch ändert auf 33.
Wenn ich den Fernsteuerknüppel loslasse ( Mittelstellung) geht laut Log die Geschwindigkeit runter auf 0.
Das passiert aber in Real nicht sondern die Räder laufen einfach weiter.
Wenn ich den Steuerknüppel in die Gegenrichtung drücke ändert sich laut Log die Geschwindigkeit auf -33.
In Real verlangsamt sich langsam die Geschwindigkeit und schaltet in Gegenrichtung um und läuft dann voll weiter.
Wenn ich wiederum den Steuerknüppel loslasse verändert sich laut log die Geschwindigkeit auf 0 aber die Räder laufen trotzdem weiter. Ich habe somit keine Möglichkeit den Mover anzuhalten.


Ardumowerlog.txt


Gruß
Uwe
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/1259/Ardumowerlog.txt/
 
Zuletzt bearbeitet von einem Moderator:
Ich musste die Acceleration deutlich hichsetzten, damit die RC vernünftig finktioniert. Leider kann ich jetzt nicht nachshen, auf welchen Wert.

Noch ein Tip mit der pfodapp kann man den Wert besser Einstellen, als mit der Ardumower App.

Stefan
 
Habe ich probiert leider ohne Erfolg bis 0.1 und kurz 0.9.
Drehrichtungsumkehr nur wen ich sehr lange in Gegenrichtung gehalten habe. In Mittelstellung sind die Motoren immer weitergelaufen.

Habe jetzt mal testweise mal ein Servotester angeschlossen. Genau das selbe Bild. Der Mähmotor lässt sich einwandfrei regeln. Die Antriebsräder lassen sich nicht stoppen wenn sie einmal laufen. Geht nur über Notaus.

Bei der Gelegenheit mal eine Frage wie ich den Betriebsmodi wechseln kann. Ist mir beim Testen aufgefallen.
Bei 3 mal Piepsen komme ich in den RC Modus. Den kann ich aber nur über Not Aus verlassen. Wäre es nicht sinnvoll das wenn einmal ein Betriebsmodi ausgewählt ist jeder erneuter Tastendruck den Modi beenden tut und der Mover auf eine Neueingabe wartet ? So könnte man über die Handy App noch die Daten einsehen.

Ich habe ebenfalls in der robot.ccp Datei folgenden Eintrag testweise geändert:
if ((value < 15) && (value > -15)) value = 0;// geändert von 5 auf 15 bzw 20

Ich bin bin davon ausgegangen das dieser Wert für die Mittelstellung verantwortlich ist und wollte mit der Erhöhung den Bereich der Neutralstellung vergrößern und verhindern das kurzzeitige höhere Werte dazu führen das der Mover denkt er hätte die Mittelstellung verlassen.
Hat leider auch nicht funktioniert.

Außerdem habe ich festgestellt das der Mover wenn ich die Fernbedienung ausschalte nicht stehenbleibt. Ich habe gedacht das er zumindest bei Signalverlust stoppen tut. - Macht er auch nicht

Ebenfalls habe ich mir die aktuelle 240 Version neu herunter geladen und aufgespielt. Die geänderten Werte von mir habe ich neu von Hand eingegeben. Hat auch nichts gebracht.

Jetzt bin ich ratlos. Es muss doch irgendwie möglich sein den Mover im RC Modus zu stoppen ?

Gruß
Uwe
 
@Jem

ich sehe in den Listnings von dir nur berechnungen der RC Signale.
An welcher stelle steuern die den Motortreiber ?

Auch im Code finde ich nirgens eine Änderung der PWM Werte bzw der ACT_MOTOR_LEFT / RIGHT ?

@Alex ? Ist bei der Umstellung auf die Klassenbibliothek die RC verloren gegangen ?


Ich werde morgen mal meine RC ranhängen und sehen was passiert.

Stefan
 
Weiter oben hinter der Spalte SPD Wertebereich -33 bis 33. Ob das der direkte Wertebereich ist weiß ich nicht.
Da ich die Antriebsmotore aus dem Shop verwende ist mir der Wert gleich ins Auge gesprungen weil in der Motor.ccp Datei
der Eintrag:
motorSpeedMax = 33; // motor wheel max RPM
vorhanden ist.
Dieser Wert ändert sich abhängig von der Knüppelstellung von -33 bis 33 und geht bei Mittelstellung auch auf 0 zurück.
Nur die Motore machen das nicht mit und wechseln höchstens die Drehrichtung bei Knüppelendanschlag und stoppen nicht bei Mittelstellung bzw wenn dort 0 angezeigt wird.

Uwe
 
RC 0,5,0,0
t 160 l 73 v0 RC odo 0 0 spd 0 0 0 sen 0 0 0 bum 0 0 son 0 yaw 114 pit 8 rol 0 bat 0.2 chg -5.0 0.0 imu 73 adc 64 Ardumower
RC 0,0,0,0
t 161 l 73 v0 RC odo 0 0 spd -6 -8 0 sen 0 0 0 bum 0 0 son 0 yaw 114 pit 8 rol 0 bat 0.2 chg -5.0 0.0 imu 74 adc 61 Ardumower
RC 0,30,-29,0
t 162 l 74 v0 RC odo 0 0 spd -33 -33 0 sen 0 0 0 bum 0 0 son 0 yaw 114 pit 8 rol 0 bat 0.2 chg -5.0 0.0 imu 73 adc 65 Ardumower
RC 0,18,-123,0
t 163 l 73 v0 RC odo 0 0 spd -33 -33 0 sen 0 0 0 bum 0 0 son 0 yaw 114 pit 8 rol 0 bat 0.2 chg -5.0 0.0 imu 73 adc 64 Ardumower

Ob das Soll oder Ist Werte sind weiß ich nicht ich vermute aber Sollwerte da diese Werte sich auch auf 0 verändern die Antriebsmotore aber munter weiterlaufen.

Uwe
 
Leider stecke ich da auch nicht so tief drin. Alex Programmiert auf einem Niveau das ich froh bin überhaupt was zu verstehen ;)

Aber die pfod stezt diereckt die motorLeftSpeed motorightSpeed und bei der RC sehe das nirgens auch nur ansatzweise.

Sollte Alex sich nicht melden werde ich mal in den alten SVN Versionen suchen. Aber erstmal werde ich das mit meiner RC testen.

Gute Nacht

Stefan
 
Ich als Anfänger tue mich da noch schwerer. Wie gesagt die Steuerung von den Mähmotor funktioniert komischerweise.

Welche Software Version verwendest du? Dann teste ich die mal.

Gute Nacht

Uwe
 
ich hab es gefunden in der robot.cpp

Ab Zeile 1571


Code:
case STATE_REMOTE:
      // remote control mode (RC)
      //if (remoteSwitch > 50) setNextState(STATE_FORWARD, 0);
      steer = ((double)motorSpeedMax/2) * (((double)remoteSteer)/100.0);
      if (remoteSpeed < 0) steer *= -1;
      motorLeftSpeed  = ((double)motorSpeedMax) * (((double)remoteSpeed)/100.0) - steer; 
      motorRightSpeed = ((double)motorSpeedMax) * (((double)remoteSpeed)/100.0) + steer; 
      motorLeftSpeed = max(-motorSpeedMax, min(motorSpeedMax, motorLeftSpeed));
      motorRightSpeed = max(-motorSpeedMax, min(motorSpeedMax, motorRightSpeed));
      motorMowSpeed = ((double)motorMowSpeedMax) * (((double)remoteMow)/100.0);      
      break;


jetzt müssen wir nur noch rausfinden warum er nicht stoppt :)
 
Also bei mir funktioniert alles ... ich bin gestern abend fleissig im Garten rumgefahren, als ich den GPS-Empfänger austesten wollte.

Sehr seltsam ...
 
Oben