Project Lawnstyler, Matrix Mow 800

SefanH

Well-known member
Teensy 4.1, original Bumper, 1 Perimeterspule, Notaus mit 5v Relais in Selbsthaltung. Erste Testfahrt war ein voller Erfolg. Ein paar kleine Sachen waren auffällig: Beim mähen in Bahnen wackelt das Gehäuse beim Drehen ein bisschen zu doll, dann löst der Bumper aus. Die Ladestation ist auch noch nicht fertig.
 

Attachments

  • VID_20221003_123039.mp4
    75.3 MB
  • VID_20221003_131911.mp4
    89.7 MB
Sehr schön,
welche Softwareversion benutzt du jetzt?
Wenn die Bumper zu weich sind, kannst du die Gummis mit Panzertape oder ähnlich ein paar mal umwickeln oder etwas härteren Schaumstoff zwischen Gehäuse und Abdeckung machen.
 
Die Version, die ich von dir bekommen habe. Wo steht eigentlich die Versionsnummer?
 
Erste kurze Versuche (mir fehlt momentan ein wenig die Zeit) mit dem Firmwarestand 1.33 funktionieren gut.
Der aktuelle Stand (1.417) funktioniert nicht ohne weiteres:
  • Das Perimetersignal ist im Inneren der Schleife positiv.
  • Im Stillstand auf dem Rasen misst der Mäher eine Spannung an den Ladekontakten und schaltet auf charge. Es ist jedoch nichts angeschlossen.
  • Starte ich den Mäher aus dieser Situation heraus, fährt er vorwärts und dreht sich dann, als ob er aus der Station startet. Danach kommt dann ein Fehler wegen dem positiven Perimetersignal. Die Vorwärtsfahrt ist ja schon falsch.
Das sind meine ersten Eindrücke.
 
Die Drehrichtung der Motoren habe ich in der Mower.cpp geändert, vielleicht habe ich die Motoren nach der Revision vor dem Einbau vertauscht?!?

Die Coil-Polarität kann ich nicht in der PFOD-App ändern... Rechts funktioniert das, links jedoch nicht?!? - Wo kann ich das ändern? Die Drähte der Perimeterschleife möchte ich nicht tauschen, da mein anderer Mäher auch noch fährt!

In der robot.cpp habe ich die geforderte Spannung, die anliegen muss um in den Status "charge" zu wechseln, von 5V auf 25V angehoben.
Code:
    case STATE_STATION:
      // waiting until auto-start by user or timer triggered
      if (batMonitor) {

        //if (chgVoltage > 5.0) {
       if (chgVoltage > 25.0) {
              
  if (batVoltage < startChargingIfBelow) { //read the battery voltage immediatly before it increase
            setNextState(STATE_STATION_CHARGING, 0);
            return;
          }
          else
          {
            if (millis() - stateStartTime > 10000) checkTimer(); //only check timer after 10 second to avoid restart before charging and check non stop after but real only 60 sec
          }
        }
        else
        {
          ShowMessageln("We are in station but ChargeVoltage is lost ??? ");
          setNextState(STATE_OFF, 0);
          return;
        }
      }
      else {
        if (millis() - stateStartTime > 10000) checkTimer(); //only check timer after 10 second to avoid restart before charging
      }

      break;


Mangels Zeit muss der Test leider noch warten!!!
 
Last edited:
Kein Problem, freue mich trotzdem über Rückmeldungen. Ich weiß nur nicht warum Bernard anscheinen keine Probleme mit der aktuellen Version hat, bei ihm scheint ja alles soweit zu funktionieren.
Leider ist der Code nicht besonders pflegeleicht, was es nicht einfach macht.
 
Ich habe den factory reset noch nicht versucht. Vielleicht gibt es Probleme mit irgend welchen Einstellungen im eeprom??
 
Den musst du auf jeden Fall machen, wenn du die Software änderst, sonst passt das mit den Einstellungen nicht. Deshalb die Einstellungen in der mower.cpp (?) so genau wie möglich anpassen, wenn du die Settings über die App angepasst hast.
 
Hi
A factory setting is needed each time i change the eeprom arrangement.
It's line 1124 to 1126 ,i think i have added the swapCoilPolarityLeft boolean variable to help you define correctly your perimeter setting into arduremote.But if the memory is not initialised at least one time the swapCoilPolarityLeft can have value 5 or 1520 or something else and it's not a boolean OK , so nothing work well.
Factory setting solve the issue because the eeprom is not read and initial value are the mower.cpp one

To help and avoid to redo all after a factory setting i also added the platform define option for 4 platforms into mower.h and mower.cpp:

//**************************************************************
// ------- select one platform type -------------------
//**************************************************************
#define MI632
//#define YARDFORCE
//#define RL2000
//#define MOW800

So in your case ,you need to uncomment
//#define MOW800
and comment
#define MI632

But you also need to tell me the correct value for you line 91 to 115 in mower.h
And same for mower.cpp line 283 to 288. Line 253 to 280 for example you can see the factory value for the MI632


By this way when you compile the software correct value are used according to your platform.
 
This is how it looks with my settings: (not tested)



Code:
//**************************************************************
//****************** SETTING FOR MOW800 ************************
//**************************************************************

#if defined (MOW800)  // here all setting for YARDFORCE   <-- :unsure:
    //*****************possible list of motor driver set to :****************
  // 1 for brushless ZS-X11H v1 Driver
  // 2 for DC L298N Driver
  // 3 for DC BTS7960 Driver
  #define LEFT_MOTOR_DRIVER 1  //never mix BL and DC on drive motor
  #define RIGHT_MOTOR_DRIVER 1
  #define MOW_MOTOR_DRIVER 1
 
  #define BUMPER_IS_SWITCH false  // set to true if the bumper is a single ON/OFF switch
  #define BUMPER_REAR_EXIST false  // set to true to manage the rear bumper connected on CAN3 J20 connector
  #define BUMPER_ARE_NORMALY_CLOSED true  // set to true if the bumper contact is closed when nothing is hit

  #define START_BUTTON_IS_NC true //if button is normaly closed

  // mower can have a cover that stop the mowing cycle but power still on the PCB,mower only start after closing the cover
  // start button is under cover , so after push the start button you have 10 seconde to close cover and mower start
  // openning the cover stop mowing cycle
  #define MOWER_HAVE_SECURITY_COVER false // mower can have a cover that stop the mowing cycle but power still on the PCB,mower only start after closing the cover

  #define INA226_MOW2_PRESENT false
  #define INA226_MOW3_PRESENT false

  #define ODOMETRY_ONLY_RISING false
#endif
 
Ok tell me when you are OK ,so i can add this in the github.
You can add also data into mower.cpp line 283 to .... and give me the value according mow800 PLATFORM .
 
I've made some changings. The first testrun is in progress.


The changings:

in robot.cpp i've set the lines "if (chgVoltage > 5.0)" to "if (chgVoltage > 25.0)" that may work better.

The actual Mower.h is here:

Code:
#if defined (MOW800)  // here all setting for MOW 800
    //*****************possible list of motor driver set to :****************
  // 1 for brushless ZS-X11H v1 Driver
  // 2 for DC L298N Driver
  // 3 for DC BTS7960 Driver
  #define LEFT_MOTOR_DRIVER 1  //never mix BL and DC on drive motor
  #define RIGHT_MOTOR_DRIVER 1
  #define MOW_MOTOR_DRIVER 1
 
  #define BUMPER_IS_SWITCH false  // set to true if the bumper is a single ON/OFF switch
  #define BUMPER_REAR_EXIST false  // set to true to manage the rear bumper connected on CAN3 J20 connector
  #define BUMPER_ARE_NORMALY_CLOSED true  // set to true if the bumper contact is closed when nothing is hit

  #define START_BUTTON_IS_NC false //if button is normaly closed

  // mower can have a cover that stop the mowing cycle but power still on the PCB,mower only start after closing the cover
  // start button is under cover , so after push the start button you have 10 seconde to close cover and mower start
  // openning the cover stop mowing cycle
  #define MOWER_HAVE_SECURITY_COVER false // mower can have a cover that stop the mowing cycle but power still on the PCB,mower only start after closing the cover

  #define INA226_MOW2_PRESENT false
  #define INA226_MOW3_PRESENT false

  #define ODOMETRY_ONLY_RISING false
#endif

and the actual Mower.cpp is here:

Code:
#if defined (MOW800)
  name = "MOW800"; //Set the Name of platform
  // ------- wheel motors -----------------------------
  motorRightSwapDir     = true;    // inverse right motor direction?
  motorLeftSwapDir      = false;    // inverse left motor direction?
#endif

I hope that's all you need.
 
in robot.cpp i've set the lines "if (chgVoltage > 5.0)" to "if (chgVoltage > 25.0)" that may work better.
It's not normal.
Into arduremote setting battery you can see the charge Voltage and sense.
You need to see Charge 0.00V 0.00A when mower is not in the station and Charge 29.4V 0.00A when mower is in the station and not charging.
Try to swap the 2 INA226 from MOW and Station : U1 and U4 or U5 to see if you have a defective INA226 module.

For a correct DOCKING into setting station check the bumper pressed on dock and set to NO if the charging contact don't press the bumper.

For the setting in mower.cpp you can add the typical value of the MOW800 inside the #if defined (MOW800) , here value for MI632.
or simply send me a copy of the read setting using arduino IDE.
By this way other member can have a working mower after a factory setting.

Code:
motorSpeedMaxRpm       = 34;   // motor wheel max RPM (WARNING: do not set too high, so there's still speed control when battery is low!)
  motorSpeedMaxPwm    = 97;  // motor wheel max Pwm  (8-bit PWM=255, 10-bit PWM=1023)
  motorRollDegMax    = 149;  // max. roll Deg
  motorRollDegMin    = 20; //min. roll Deg
  SpeedOdoMin = 2;
  SpeedOdoMax = 100;
  motorTickPerSecond = 1200; // use to compute the maxodostate duration and computed on the calibration motor
  useMotorDriveBrake = true;   //for ZS-X11H BL motor driver it's possible to use the brake option for slope management

  motorMowSpeedMaxPwm   = 115;    // motor mower max PWM
  motorMowSpeedMinPwm = 100;   // motor mower minimum PWM (only for cutter modulation)
  motorMowPowerMax = 65.0;     // motor mower max power (Watt)
  highGrassSpeedCoeff = 0.7;  //drive speed coeff when detect high grass in by lane mode

  perimeterTriggerMinSmag = 800;
  MaxSpeedperiPwm = 85; // speed max in PWM while perimeter tracking
  perimeterMagMaxValue = 5000; // Maximum value return when near the perimeter wire (use for tracking and slowing when near wire

  odometryTicksPerRevolution = 2070;   // encoder ticks per one full resolution
  odometryTicksPerCm = 29.6;  // encoder ticks per cm
  odometryWheelBaseCm = 43;    // wheel-to-wheel distance (cm)
 
Ich kann die Spannung messen... Woher die Spannung kommt kann ich nicht sagen, aber es liegt eine Spannung an! Diese steigt nach dem Einschalten auf ca 8V an! Ich denke die Module sind in Ordnung, vielleicht sind andere Komponenten defekt?
 
War deine PowerPCB nicht Mal irgendwie defekt oder habe ich das falsch in Erinnerung? Vielleicht ist irgendwo eine Leiterbahn defekt?
 
Back
Top