Software-Modellierung, UML-Klassendiagramme usw.

@stephan
You need to use "Odometry support for "1 way" encoder" that i have share in issue 7 if you have only one way encoder. That will fix your odometry problem. https://code.google.com/p/ardumower/issues/detail?id=7 You also need to use setMC33926 that i have share in issue 2 if you use MC33926. without this mod, the speed in reverse direction is not set correctly. https://code.google.com/p/ardumower/issues/detail?id=2
@alexander
Problems with motor control occur since r35.
For testMotors(), you need to use motorSpeedMaxPwm instead of motorSpeedMax. testMotors() directly use setMotorSpeed() to apply a PWM value. Using motorSpeedMax (value is in RPM) set the PWM to 33. this is why the motors don't turn and make noise.

motorControl() set PWM to 0 when stateCurr == STATE_OFF and odometryUse=1. This interferes with testMotors.
 
@Alexander,
ich habe heute morgen den Mower mal mit abgeschalteter Odometrie über die leider noch nasse Wiese geschickt. Und beim erkennen der der Schleife wurde immer richtig gegengesteuert. Auch das einstellen des perimeter trigger timeout geht hervorragend.
Hier noch ein kurzes Video mit ausgeschalteter Odometrie:

[video width=425 height=344 type=youtube]kJzb55a7U5Q[/video]

@Max,
thank you for your help.
In the robot.cpp I just replace the entry for odometry against your code. OK?
But where exactly you added the line in the mower.cpp one?
Can I add with Config in the odometry area the line easy?
Code:
Mower::Mower(){
  name = "Ardumower";
  // ------- wheel motors -----------------------------
  motorAccel       = 0.002;  // motor wheel acceleration (warning: do not set too high)
  motorSpeedMax       = 33;   // motor wheel max RPM
  motorSpeedMaxPwm    = 255;  // motor wheel max Pwm  (8-bit PWM=255, 10-bit PWM=1023)
  motorPowerMax     = 23.8;    // motor wheel max power (Watt)
  motorSenseRightScale = 15.3; // motor right sense scale (mA=(ADC-zero)/scale)
  motorSenseLeftScale = 15.3; // motor left sense scale  (mA=(ADC-zero)/scale)
  motorRollTimeMax    = 3000;  // max. roll time (ms)
  motorReverseTime    = 2500;  // max. reverse time (ms)
  motorForwTimeMax   = 60000; // max. forward time (ms) / timeout
  motorBiDirSpeedRatio1 = 0.3;   // bidir mow pattern speed ratio 1
  motorBiDirSpeedRatio2 = 0.92;   // bidir mow pattern speed ratio 2
  // ------ mower motor -------------------------------
  motorMowAccel       = 0.001;  // motor mower acceleration (warning: do not set too high)
  motorMowSpeedMax   = 255;    // motor mower max PWM
  motorMowPowerMax = 50.0;     // motor mower max power (Watt)
  motorMowModulate  = 0;      // motor mower cutter modulation?
  motorMowRPM        = 3300;   // motor mower RPM (only for cutter modulation)
  motorMowSenseScale = 15.3; // motor mower sense scale (mA=(ADC-zero)/scale)
  motorMowPID.Kp = 0.005;    // motor mower RPM PID controller
  motorMowPID.Ki = 0.01;
  motorMowPID.Kd = 0.01;
  //  ------ bumper -----------------------------------
  bumperUse         = 0;      // has bumpers? 
  // ------ rain ------------------------------------
  rainUse          = 1;      // use rain sensor?
  // ------ sonar ------------------------------------
  sonarUse          = 1;      // use ultra sonic sensor? (WARNING: robot will slow down, if enabled but not connected!)
  sonarTriggerBelow = 900;    // ultrasonic sensor trigger distance
  // ------ perimeter ---------------------------------
  perimeterUse       = 1;      // use perimeter?    
  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    = 10.0;
  perimeterPID.Kd    = 10.0;
  // ------ lawn sensor --------------------------------
  lawnSensorUse     = 0;       // use capacitive Sensor
  // ------  IMU (compass/accel/gyro) ----------------------
  imuUse            = 0;       // use IMU? 
  imuCorrectDir     = 0;       // correct direction by compass?
  imuDirPID.Kp      = 5.0;     // direction PID controller
  imuDirPID.Ki      = 1.0;
  imuDirPID.Kd      = 1.0;    
  imuRollPID.Kp     = 0.8;   // roll PID controller
  imuRollPID.Ki     = 21;
  imuRollPID.Kd     = 0;  
  // ------ model R/C ------------------------------------
  remoteUse         = 1;       // use model remote control (R/C)?
  // ------ battery -------------------------------------
  batMonitor = 1;              // monitor battery and charge voltage?
  batGoHomeIfBelow = 23.7;     // drive home voltage (Volt)
  batSwitchOffIfBelow = 21.7;  // switch off if below voltage (Volt)
  batFactor       = 0.0658;     // battery conversion factor
  batSenseZero       =77;        // battery volt sense zero point
  batFull          =29.4;      // battery reference Voltage (fully charged)
  chgSenseZero      = 0;       // charge current sense zero point
  chgFactor       = 2.7;     // charge current conversion factor
  // ------  charging station ---------------------------
  stationRevTime     = 4000;    // charge station reverse time (ms)
  stationRollTime    = 2000;    // charge station roll time (ms)
  stationForwTime    = 2000;    // charge station forward time (ms)
  // ------ odometry ------------------------------------
  odometryUse       = 1;       // use odometry?
  char twoWayOdometrySensorUse = 0;  // use optional two-wire odometry sensor?
  odometryTicksPerRevolution = 1060;   // encoder ticks per one full resolution
  odometryTicksPerCm = 13.49;  // encoder ticks per cm
  odometryWheelBaseCm = 36;    // wheel-to-wheel distance (cm)
  // ----- GPS -------------------------------------------
  gpsUse            = 0;       // use GPS?
  // ----- other -----------------------------------------
  buttonUse         = 1;       // has digital ON/OFF button?
  // ----- user-defined switch ---------------------------
  userSwitch1       = 0;       // user-defined switch 1 (default value)
  userSwitch2       = 0;       // user-defined switch 2 (default value)
  userSwitch3       = 0;       // user-defined switch 3 (default value)
  // ----- timer -----------------------------------------
  timerUse          = 0;       // use timer?  
  // ------ configuration end -------------------------------------------   
}

Gruß
Stephan
 
@Stephan
in robot.h add this line
Code:
// -------- odometry state --------------------------
    char odometryUse       ;       // use odometry?
    char twoWayOdometrySensorUse;  // use optional two-wire odometry sensor?[/colomower.cpp add this line
in mower.cpp add this line
Code:
/ ------ odometry ------------------------------------
  odometryUse       = 1;       // use odometry?
  twoWayOdometrySensorUse = 0; // use optional two-wire odometry sensor?
in robot.cpp repace the entire function.
Code:
// ---- odometry (interrupt) --------------------------------------------------------
// odometryState:  1st left and right odometry signal
// odometryState2: 2nd left and right odometry signal (optional two-wire encoders)
void Robot::setOdometryState(unsigned long timeMicros, boolean odometryLeftState, boolean odometryRightState, boolean odometryLeftState2, boolean odometryRightState2){
  if (odometryLeftState != odometryLeftLastState){    
    if (odometryLeftState){
      if (twoWayOdometrySensorUse) {
        if (!odometryLeftState2) odometryLeft++; else odometryLeft--;
      } 
      else { 
         if (motorLeftPWM >0) odometryLeft++; else odometryLeft--;
      }
    }
    odometryLeftLastState = odometryLeftState;
  } 

  if (odometryRightState != odometryRightLastState){
    if (odometryRightState){
      if (twoWayOdometrySensorUse) {
        if (!odometryRightState2) odometryRight++; else odometryRight--;
      }     
      else {
         if (motorRightPWM >0) odometryRight++; else odometryRight--;    
      }
    }
    odometryRightLastState = odometryRightState;
  }  
  if (twoWayOdometrySensorUse) {
    if (odometryRightState2 != odometryRightLastState2){
      odometryRightLastState2 = odometryRightState2;    
    }  
    if (odometryLeftState2 != odometryLeftLastState2){
      odometryLeftLastState2 = odometryLeftState2;    
    }
  }    
}

Edit: set twoWayOdometrySensorUse = 0 in your case
 
Hallo,
ich habe heute mal die r140 mit dem Patch von Max aufgespielt. Nun läuft bei mir der Mower auch mit Odometrie klasse. Danke nochmals dafür an Max. Auch das der Mower nun auf Störung geht wenn er zu lange sich im Schleifen-Out befindet ist eine sehr gute und nützliche Idee/Funktion. Eine kleine Verbesserung/Wunsch hätte ich dafür aber noch. Mir ist aufgefallen das die Zeit in manchen Situationen bei mir zu kurz eingestellt ist. Also ging der Mower heute etliche male auf error da er es nicht geschafft hatte sich in diesem Zeitraum wieder ins Schleifen-In zu drehen. Könnte man dafür evtl. Noch eine Zeiteinstellung in der Pfod einbauen?
Z.b. in Settings->Perimeter->Outside-Timeout
Dann ist mir heute noch aufgefallen das mein Sonar nicht mehr geht. Ist dies bei sonst noch jemanden so?
Nach einer kompletten Akkuladungen ist mein Eindruck von dem aktuellen Stand echt Top. Und am Ende ist er seit länger Zeit mal wieder über das halbe Grundstück entlang der Schleife bis in die Ladestation gefahren, wo er jetzt für die nächsten Tests Kraft tankt.
Gruß
Stephan
 
@Stephan: der "Timeout" ist in Wirklichkeit eine "Entfernung" von der Schleife (für den Fall dass der Roboter außerhalb ist) - diese darf nicht zu groß sein, aber auch nicht zu klein. Ich werde das mit dem "nicht zu klein" einbauen...
 
Hi,

bin im Moment noch auf Vesion r135, hatte aber auch gelegentlich das Problem, das etwas länger gedauert hat wieder in die Schleife zu kommen und der Mäher auf Error geschaltet hat.
Das mit den Sonar treibt mich noch in den Wahnsinn. Unter "Laborbedingungen" klappt alles super, aber sobald es auf die Wiese geht, fährt er nur noch rückwärts, weil einer meiner beiden Sensoren trotz freier Bahn Werte unter 400 misst. Das Problem hatte ich so ähnlich aber auch schon mit der alten Software 9.3.0.
siehe hier: http://www.ardumower.de/index.php/de/forum/software/340-probleme-mit-ultraschall-sensor]
Ich werde aber nochmal meine Hardware checken. Wenn da alles in Ordnung ist werde ich mich dazu nochmal melden.

Michael
 
Hi Michael,

das mit den US Sensoren hab ich auch gehabt. Du musst schauen, dass das runde Blechgehäuse des Sensors frei ist und keinen Kontakt mit dem Roboter hat. Ansonsten kommt es zu falschen Messwerten beim fahren.


Greez Chrisser
 
Hallo,

habe jetzt nochmals ausführlich meine Ultraschall-Sensor geprüft. Hardware mäßig ist alles einwandfrei.
Dann habe ich mit der aktuellen r142 einen "Trockentest" gemacht.
Ergebnis:

Bei deaktiviertem Perimeter läuft alles wunderbar. Wenn der Perimeter im Mäher via Pfodfi aktiviert wird,
fangen meine Sonarwerte an zu spinnen. Man sehe und staune:

[video width=425 height=344 type=youtube]Yg6aYdU7Yo8[/video]

Ich hoffe Stephan kann den Fehler reproduzieren und bestätigen.
Jetzt ist wohl Alexander gefragt ;)
 
Hallo Michael,
heute ist bei uns leider kein Wetter zum testen. Dauerregen!!!
Sobald das Wetter es zulässt werde ich es umgehend ausprobieren. Aber ich denke bei mir liegt es noch an der mechanischen Befestigung der US-Module. Ich habe sie leider nur mit Heißkleber an das Metallgehäuse geklebt.
Melde mich nach den Tests aber direkt hier.
Gruß
Stephan
 
@Michael,
Ich konnte es nicht lassen. Ich habe gestern Abend mir den Mower mal in die Werkstatt geholt und die r142 eingespielt.
Bei einem Probelauf auf der Werkbank, also aufgebockt und nicht im inneren der Schleife, konnte ich deinen Fehler nicht reproduzieren. Bei mir gibt es keinen Unterschied zwischen Perimeter an oder aus. Was mir aber aufgefallen ist, Alexander oder Sven hat irgendwas am Code so verändert, das die Ultraschallsensoren ab einer bestimmten Distanz wieder 0 in der App anzeigen.
Zumindest ist das bei mir so.
Tests auf der Wiese folgen sobald das Wetter es zulässt.
Gruß
Stephan
 
@Alex,

so wieder zu Hause und bin dabei mir den Code anzusehen. Dabei ist mir aufgefallen das in der mower.cpp zwei mall den Abschnitt:

Mower robot;


Mower::Mower(){
name = "Ardumower";

gibt. Einmal ab Zeile 100 und ab Zeile 560 und auch die Pins werden zwei mal definiert ? Hat das einen besonderen Grund ?
Ab Zeile 473 ist alles doppelt !

Revision: 179

Gruss Stefan
 
@Stefan: SVN versucht Deine geänderte Version mit der im SVN-Repository zu synchronisieren ... und hat es nicht geschafft. Demnach müsste es bei Dir ungefähr so ausssehen?


Code:
-------r179--------
...r179 Code...
------local--------
...Dein geänderter Code...


Abhilfe: Per Hand synchronisieren oder betroffene Datei löschen und nochmal ein SVN-Update durchführen.
 
Ah alle klar werde ich am besten mal löschen und komplett neu runterladen.

Ich hatte eine Diff erstellt und hochgeladen. Da hatte ich noch eine zusätzliche Änderung gemacht.

Ich hab in Serielle Menü einen Punkt zu löschen der gespeicherten config Daten gemacht. Damit hatte ich schon öfter ärger , wenn ich eine neue Version aufgespielt habe.



Stefan
 
Mir ist beim testen Aufgefallen, das wenn nur der rechte und Linke US Sensor angeschlossen sind, wir die Entfernung nicht ausgewertet.

Center Sonar hab ich auskommentiert und rechts und links aktiviert.


Code:
// sonar
//  pinMode(pinSonarCenterTrigger, OUTPUT); 
//  pinMode(pinSonarCenterEcho, INPUT); 
  pinMode(pinSonarLeftTrigger, OUTPUT); 
  pinMode(pinSonarLeftEcho, INPUT); 
  pinMode(pinSonarRightTrigger, OUTPUT); 
  pinMode(pinSonarRightEcho, INPUT);



Code:
//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; 
    case SEN_SONAR_RIGHT: return(readHCSR04(pinSonarRightTrigger, pinSonarRightEcho)); break;


Trigger hab ich auf 900 gelassen

Gruss Stefan
 
Im SVN-Code ist nun die Kompaß-Kalibrierung (GY-80) weiter vereinfacht umgesetzt worden. Vielleicht hat ja der ein- oder andere Interesse es mal auszuprobieren:
http://www.ardumower.de/index.php/d...-23-19-50-19/kompass-beschleunigung-gyro#imu2
Das GY-80 kann ggf. auch einzeln ausprobiert werden (ohne Ardumower-Code): https://code.google.com/p/ardumower/source/browse/#svn/trunk/tests/imuahrs
Zur Sensor-Fusion wird nun ein Komplementärfilter eingesetzt welcher schnell ist und gute Ergebnisse zeigt.
 
Super,
ich werde das gerne heute Abend nach der Arbeit mal aufspielen und testen. Melde mich dann hier nochmal und schreibe meine Erfahrungen dazu.
Gruß
Stephan
 
Hallo Alexander,
noch eine kurze Frage zur IMU-Kalibrierung (SVN-Version).
Sollte man das Modul nicht besser im Mower kalibrieren oder ist das egal?
Gruß
Stephan
 
@Stephan: Das wäre dann der nächste Schritt (incl. Starten derselben Kalibrierungsfunktionen via pfodApp) - zunächst möchte ich aber sicherstellen dass das Verfahren an sich funktioniert, daher die Veröffentlichung für interessierte Entwickler und Tester.
 
Oben