TC-158N Umbau

paddy

Active member
Hallo zusammen,

nach vielen Monaten des mitlesen, basteln und ausprobieren wird es Zeit, mein bescheidenes Werk zu präsentieren. Als Basis für den Ardumower habe ich einen defekten Tianchen TC-158N aus der Bucht genommen. Mir gefällt das kompakte Maß des Mower (habe einen kleinen Rasen mit unzähligen Winkeln und Hindernissen) sowie die abgedeckten Räder (kein Aufsteigen an Bordsteinkanten, Trockenmauer usw.)

Als erstes habe ich das Chassis natürlich leer geräumt und einen USB Anschluss sowie einen zweiten Not-Aus angebracht. Im Original gibt es nur einen kleinen Not-Aus am Heck, den man echt suchen muss. Der bleibt aber drin, damit ich einen Not-Aus habe, wenn ich den Mower beim Testen offen fahre. So sieht das gute Stück aus.

20160619_192956.jpg


Als Platine kam zunächst ein Eigenbau auf Lochraster zum Einsatz. Im Betrieb hatte ich aber diverse Probleme, Störungen und vor allem unzählige Kabel, von denen einige in die Getriebe zwischen Motoren und Räder geraten sind. Letztlich bin ich auf die PCB 1.2 Platine umgestiegen. Der Vollständigkeit halber hier meine Platinen

20160412_151529.jpg


20160412_151539.jpg

Power Board

20160412_151553.jpg


20160412_151601.jpg


Aktuell sieht es im Mäher so aus:

20160619_193008.jpg


20160619_193018.jpg


20160619_193025.jpg


Wie man sieht, verwende ich die L298N Motortreiber, Die MC sind mir zu teuer und die ACS Stronsensoren hatte ich noch von einem anderen Projekt übrig. Den Treiber für die beiden Mähmotoren habe ich mit einem Mosfet und einem Schaltplan aus dem Forum gebaut.

Gegenwärtig ist verbaut:
- 2X L298N
- 1X Mosfet
- Bumper
- Bluetooth HC-05
- Regensensor (2 Messingkontakte in der Gehäuseoberschale)
- Perimeter (Spule mittig)

Nächste Schritte
- Garage mit Ladeanschluss
- Hebesensor um Anheben zu erkennen (Pin35 Tilt)
- Ultraschall
- Odometrie (noch keine Idee wie)
- ggf. Remote über original Fernbedienung

Zur Zeit kommt als Software die Version 1.04 Azurit mit einigen Modifikationen (Bug Fix, Anpassung manueller Modus)zum Einsatz. Die Änderungen werden jetzt, soweit erforderlich, in der 1.05 nachgezogen und hier dokumentiert.

Besten Dank an allen Mitwirkenden, die in unzähligen Stunden eine wirklich tolle Arbeit an allen Ecken und Enden geleistet haben. Die Software und die Platinen sind der Wahnsinn. Das Forum ist voller Enthusiasten, die schnell mit Rat und Tat zur Seite stehen. Wirklich Klasse.
 
So wie versprochen hier die Anpassungen an der Software (1.0a5Azurit)

In der mower.cpp habe ich kleine Anpasungen vorgenommen.

motorAccel auf 500 reduziert. Mir hat es viel zu lange gedauert, bis der Mäher stillsteht.
Hierzu gibt es noch eine Anpassung in der pfod.cpp

Code:
Mower::Mower(){
  name = "Ardumower";
  // ------- wheel motors -----------------------------
  motorAccel       = 500;  // motor wheel acceleration - only functional when odometry is not in use (warning: do not set too low)
  motorSpeedMaxRpm       = 25;   // motor wheel max RPM (WARNING: do not set too high, so there's still speed control when battery is low!)


Zudem habe ich die motorZeroSettleTime von 3000 auf 1000 geändert. Damit steht der Mäher schnell still und schiebt keine Hindernisse vor sich her, nachdem der Bumper aktiviert wurde (mower.cpp, Zeile 140)

Code:
motorZeroSettleTime   = 1000 ; // how long (ms) to wait for motors to settle at zero speed


Der verbaute Regensensor besteht aus zwei Messingkontakten. Durch Wasser werden diese leitend verbunden. Im Code musste ich den Pullup Widerstand des Pins aktivieren (mower.cpp, Zeile 387)

Code:
// rain
  pinMode(pinRain, INPUT);
  pinMode(pinRain, INPUT_PULLUP);


Anpassungen robot.cpp
In der Methode checkBumpers wird geprüft, ob ein Bumper ausgelöst wurde. Wenn der Bumper ausgelöst hat, wird zunächst die Geschwindigkeit langsam reduziert (motorAccel und motorZeroSettleTime) und dann zurück gesetzt. Dadurch werden Hindernisse weiter geschoben bzw. der Mower schiebt sich auf das Hindernis auf. Durch die zwei eingefügten Zeilen steht der Mower sofort still

Code:
// check bumpers
void Robot::checkBumpers(){
  if ((mowPatternCurr == MOW_BIDIR) && (millis() < stateStartTime + 4000)) return;

  if ((bumperLeft || bumperRight)) {   
    motorLeftRpmCurr = motorRightRpmCurr = 0 ;  // eingefügt zum direkten Stop
    setMotorPWM( 0, 0, false );                 // eingefügt zum direkten Stop
      if (bumperLeft) {
        reverseOrBidir(RIGHT);          
      } else {
        reverseOrBidir(LEFT);
      }    
  }  
}


Ich bewege den Mower oft im Manuellen Modus per BT (Schleife ist noch nicht verlegt). Wenn man manuell fährt und an ein Hindernis stößt, schiebt der Mower einfach weiter. Mir ist der Mäher dabei einmal an einem Hindernis hoch gestiegen und umgestürzt, die Messer liefen natürlich weiter. Durch diese kleine Anpasung steht der Mower auch bei manueller Fahrt still (robot.cpp, Zeile 2733)

Code:
case STATE_MANUAL:
      if ((bumperLeft || bumperRight)) {    
         motorLeftRpmCurr = motorRightRpmCurr = 0;   
         motorLeftSpeedRpmSet = motorRightSpeedRpmSet = 0;
         setMotorPWM(0 ,0, false); 
      }
      break;


Anpassungen pfod.cpp
Wie in der mower.cpp zu sehen, habe ich motorAccel auf 500 reduziert. Daher ist es auch nötig, in der pfod.cpp die Untergrenze des Sliders anzupassen (pfod.cpp, Zeile 300). Ich habe diese auf 100 gesetzt.

Code:
sendSlider("a11", F("Accel"), robot->motorAccel, "", 1, 2000, 100);


Wie erwähnt fahre ich oft manuell. Dabei hat mich immer gestört, dass der Mäher stets mit voller Geschwindigkeit unterwegs ist (mein Garten ist klein und verwinkelt). Zudem finde ich es störend, dass die "Stop" Funktion abwechselnd bei dem Forward bzw Reverse Button erscheint, je nachdem wie schnell sich die Räder drehen. "Stop" muss aus meiner Sicht immer möglich sein, egal wie schnell sich die Räder drehen. Durch meine Anpassungen an den Methoden sendManualMenu und processManualMenu ist der STOP Button jetzt nach unten gewandert und immer erreichbar.
Zudem kann man vorwärts wie rückwärts in zwei Geschwindigkeiten fahren:
- steht der Mäher still und man drückt Forward, geht es zunächst mit halber Geschwindigkeit los
- drückt man nochmal Forward, erhöht sich die Geschwindigkeit auf Max
- drückt man jetzt Reverse, reduziert sich die Geschwindigkeit wieder auf halbe Kraft.
- erneutes drücken auf Reverse verursacht einen Stop.

Rückwärts das gleiche Spiel. Wenn man eine Kurve gefahren ist und dann Forward oder Reverse drückt, geht es wieder mit halber Geschwindigkeit in die gewünschte Richtung


Code:
void RemoteControl::sendManualMenu(boolean update){
//  if (update) serialPort->print("{:"); else serialPort->println(F("{^Manual navigation`1000"));
//  serialPort->print(F("|nl~Left|nr~Right|nf~Forward"));
//  if (   ((robot->motorLeftSpeedRpmSet  < 5)  && (robot->motorLeftSpeedRpmSet  > -5))
//     &&  ((robot->motorRightSpeedRpmSet < 5)  && (robot->motorRightSpeedRpmSet > -5))  ){
//    serialPort->print(F("|nb~Reverse"));
//  } else serialPort->print(F("|ns~Stop"));
//  serialPort->print(F("|nm~Mow is "));
//  sendOnOff(robot->motorMowEnable);  
//  serialPort->println("}");

  if (update) serialPort->print("{:"); else serialPort->println(F("{^Manual navigation`1000"));
  serialPort->print(F("|nl~Left|nr~Right"));
  serialPort->print(F("|nf~Forward"));
  serialPort->print(F("|nb~Reverse"));
  serialPort->print(F("|nm~Mow is "));
  sendOnOff(robot->motorMowEnable);  
  serialPort->print(F("|ns~Stop"));
  serialPort->println("}");  
}

void RemoteControl::processManualMenu(String pfodCmd){
//  if (pfodCmd == "nl"){
//    // manual: left
//    robot->setNextState(STATE_MANUAL, 0);          
//    float sign = 1.0;
//    if (robot->motorLeftSpeedRpmSet < 0) sign = -1.0;      
//    if (sign*robot->motorLeftSpeedRpmSet >= sign*robot->motorRightSpeedRpmSet) robot->motorLeftSpeedRpmSet  = sign * robot->motorSpeedMaxRpm/2;      
//        else robot->motorLeftSpeedRpmSet /= 2; 
//    robot->motorRightSpeedRpmSet = sign * robot->motorSpeedMaxRpm;
//    sendManualMenu(true);
//  } else if (pfodCmd == "nr"){      
//    // manual: right
//    robot->setNextState(STATE_MANUAL, 0);          
//    float sign = 1.0;
//    if (robot->motorRightSpeedRpmSet < 0) sign = -1.0;
//    if (sign*robot->motorRightSpeedRpmSet >= sign*robot->motorLeftSpeedRpmSet) robot->motorRightSpeedRpmSet  = sign* robot->motorSpeedMaxRpm/2;
//        else robot->motorRightSpeedRpmSet /= 2;            
//    robot->motorLeftSpeedRpmSet  = sign * robot->motorSpeedMaxRpm;
//    sendManualMenu(true);
//  } else if (pfodCmd == "nf"){
//    // manual: forward
//    robot->setNextState(STATE_MANUAL, 0);          
//    robot->motorLeftSpeedRpmSet  = robot->motorSpeedMaxRpm;
//    robot->motorRightSpeedRpmSet = robot->motorSpeedMaxRpm;
//    sendManualMenu(true);
//  } else if (pfodCmd == "nb"){
//    // manual: reverse
//    robot->setNextState(STATE_MANUAL, 0);          
//    robot->motorLeftSpeedRpmSet  = -robot->motorSpeedMaxRpm;
//    robot->motorRightSpeedRpmSet = -robot->motorSpeedMaxRpm;
//    sendManualMenu(true);
//  } else if (pfodCmd == "nm"){
//    // manual: mower ON/OFF
//    robot->motorMowEnable = !robot->motorMowEnable;            
//    sendManualMenu(true);
//  } else if (pfodCmd == "ns"){
//    // manual: stop
//    //setNextState(STATE_OFF, 0);          
//    robot->motorLeftSpeedRpmSet  =  robot->motorRightSpeedRpmSet = 0;      
//    sendManualMenu(true);
//  }  
  if (pfodCmd == "nl"){
    // manual: left
    robot->setNextState(STATE_MANUAL, 0);          
    float sign = 1.0;
    if (robot->motorLeftSpeedRpmSet < 0) sign = -1.0;      
    if (sign*robot->motorLeftSpeedRpmSet >= sign*robot->motorRightSpeedRpmSet) robot->motorLeftSpeedRpmSet  = sign * robot->motorSpeedMaxRpm/2;      
        else robot->motorLeftSpeedRpmSet /= 2; 
    robot->motorRightSpeedRpmSet = sign * robot->motorSpeedMaxRpm;
    sendManualMenu(true);
  } else if (pfodCmd == "nr"){      
    // manual: right
    robot->setNextState(STATE_MANUAL, 0);          
    float sign = 1.0;
    if (robot->motorRightSpeedRpmSet < 0) sign = -1.0;
    if (sign*robot->motorRightSpeedRpmSet >= sign*robot->motorLeftSpeedRpmSet) robot->motorRightSpeedRpmSet  = sign* robot->motorSpeedMaxRpm/2;
        else robot->motorRightSpeedRpmSet /= 2;            
    robot->motorLeftSpeedRpmSet  = sign * robot->motorSpeedMaxRpm;
    sendManualMenu(true);
    
  } else if (pfodCmd == "nf"){
    // manual: forward
    robot->setNextState(STATE_MANUAL, 0);
    if (robot->motorLeftSpeedRpmSet == 0 ||
        robot->motorRightSpeedRpmSet == 0) // Mower steht still, vorwärts mit halber Geschwindigkeit
    {
        robot->motorLeftSpeedRpmSet  = robot->motorSpeedMaxRpm/2;
        robot->motorRightSpeedRpmSet = robot->motorSpeedMaxRpm/2;
    }
    else if  (robot->motorLeftSpeedRpmSet == -robot->motorSpeedMaxRpm &&
             robot->motorRightSpeedRpmSet == -robot->motorSpeedMaxRpm )     // Mower fährt mit voller Geschwindigkeit rückwärts, Geschwindigkeit reduzieren
             
    {
        robot->motorLeftSpeedRpmSet  = -(robot->motorSpeedMaxRpm/2);
        robot->motorRightSpeedRpmSet = -(robot->motorSpeedMaxRpm/2);
    }
    else if (robot->motorLeftSpeedRpmSet != robot->motorRightSpeedRpmSet  && // Kurvenfahrt vorwärts
             robot->motorLeftSpeedRpmSet > 0 &&
             robot->motorRightSpeedRpmSet > 0 ) // Kurvenfahrt
             {
                   robot->motorLeftSpeedRpmSet  = robot->motorSpeedMaxRpm/2;
                   robot->motorRightSpeedRpmSet = robot->motorSpeedMaxRpm/2;
             }
             
    else if (robot->motorLeftSpeedRpmSet > 0 ||
             robot->motorLeftSpeedRpmSet > 0)// Mower fährt bereits halbe Geschwindigkeit vorwärts, Geschwindigkeit erhöhen
    {          
        robot->motorLeftSpeedRpmSet  = robot->motorSpeedMaxRpm;
        robot->motorRightSpeedRpmSet = robot->motorSpeedMaxRpm;
    }
    else  // Stop
    {
          robot->motorLeftSpeedRpmSet  =  robot->motorRightSpeedRpmSet = 0;      
    }
    sendManualMenu(true);
    
  } else if (pfodCmd == "nb"){
    // manual: reverse
    robot->setNextState(STATE_MANUAL, 0);          
    if (robot->motorLeftSpeedRpmSet == 0 ||
        robot->motorRightSpeedRpmSet == 0) // Mower steht still, rückwärts mit halber Geschwindigkeit
    {
      robot->motorLeftSpeedRpmSet  = -(robot->motorSpeedMaxRpm/2);
      robot->motorRightSpeedRpmSet = -(robot->motorSpeedMaxRpm/2);
    }
    else if  (robot->motorLeftSpeedRpmSet == robot->motorSpeedMaxRpm &&
              robot->motorRightSpeedRpmSet == robot->motorSpeedMaxRpm )      // Mower fährt mit voller Geschwindigkeit vorwärts, Geschwindigkeit reduzieren              
    {
        robot->motorLeftSpeedRpmSet  = robot->motorSpeedMaxRpm/2;
        robot->motorRightSpeedRpmSet = robot->motorSpeedMaxRpm/2;
    } 
    
    else if (robot->motorLeftSpeedRpmSet != robot->motorRightSpeedRpmSet  && // Kurvenfahrt rückwärts
             robot->motorLeftSpeedRpmSet < 0 &&
             robot->motorRightSpeedRpmSet < 0 ) // Kurvenfahrt
    {
        robot->motorLeftSpeedRpmSet  = -(robot->motorSpeedMaxRpm/2);
        robot->motorRightSpeedRpmSet = -(robot->motorSpeedMaxRpm/2);
    }
    else if (robot->motorLeftSpeedRpmSet < 0 ||
             robot->motorRightSpeedRpmSet < 0) // Mower fährt bereits halbe Geschwindigkeit, Geschindigkeit erhöhen
    {
         robot->motorLeftSpeedRpmSet  = -robot->motorSpeedMaxRpm;
         robot->motorRightSpeedRpmSet = -robot->motorSpeedMaxRpm;
    }
    else  // Stop
    {
          robot->motorLeftSpeedRpmSet  =  robot->motorRightSpeedRpmSet = 0;      
    }  
    sendManualMenu(true);
  
  } else if (pfodCmd == "nm"){
    // manual: mower ON/OFF
    robot->motorMowEnable = !robot->motorMowEnable;            
    sendManualMenu(true);
  } else if (pfodCmd == "ns"){
    // manual: stop
    //setNextState(STATE_OFF, 0);          
    robot->motorLeftSpeedRpmSet  =  robot->motorRightSpeedRpmSet = 0;      
    sendManualMenu(true);
  }  

}


Damit fährt es sich schon ganz gut. Wenn der Mäher im Manuellen Modus an ein Hindernis stößt, bleibt er stehen. Da er aber nicht zurück setzt, bleibt der Bumper aktiviert und man bekommt ihn nur mit viel Geduld (oder einfaches zurückziehen) wieder frei. Als nächstes werde ich mich darum kümmern, dass der Mäher ein Stück zurück setzt, dann aber stehen bleibt (und nicht in eine Richtung weg dreht).
 
Hallo Patrick,
ich habe mir auch als Plattform ein Tianchen genommen. Der läuft jetzt schon in der 3. Saison bei mir mit Ardumowerumbau.
Ich habe bereits viel mit der Odometrie gekämpft. Problem bei mir ist, dass mein Grundstück leicht abschüssig ist und der Tianchen leider 80 - 90 % seinen Dienst im unteren Bereich leistet. Dort ist immer tiptop gemäht und oben sieht man hier und da mal eine Bahn wo er lang gefahren ist.
Also ist das wichtigste einen wirklichen Geradeauslauf zu bekommen.
Mein bestes Ergebnis habe ich z.Z. bekomme, in dem ich einfachen Schlitzscheiben auf der Motorachse aufgeklebt und per Gabellichtschranke ausgewertet habe.

20160618_153832.jpg


20160618_204311.jpg


20160618_212508.jpg


So komme ich auf ca. 734 Ticks pro Radumdrehung und 9,9 pro cm. Das ist schon mal sehr gut. Und es läuft echt zuverlässig.
Jetzt versuche ich, wenn es mal nicht regnet, noch die optimalen Werte für den PID-Regler zu finden.
Ich hoffe ich konnte dir hier mit bei einer offenen Baustelle bei deinem Projekt etwas helfen.
Gruß
Stephan
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/921/20160618_153832.jpg/
 
Zuletzt bearbeitet von einem Moderator:
Hallo Stephan.

Dein Werk beobachte ich schon eine Weile. Schön dass du eine Lösung gefunden hast. Hätte nicht gedacht dass da zwischen die Motoren was passt. Ich werde mal die Kontakte nach außen biegen und schauen wie viel Platz mir bleibt. Wo hast du die Scheiben her? Sieht selbst gedruckt aus. Die Motorwelle steht bei meinen vielleicht 3mm aus dem motor raus. Reicht das zum aufkleben und womit hast du geklebt?
 
Hallo Patrick,
ja die Scheiben habe ich gedruckt.
Im Vergleich zu meinen vorherigen Versuchen ist da jetzt aber noch massig Platz zwischen den Motoren.
Die Motorwelle ist 5 mm im Durchmesser und kommt ca. 4 mm aus dem Motor raus. In den Scheiben habe ich 2,5 mm Vertiefungen für die Welle eingelassen und habe das ganze mit einem Tropfen handelsüblichen Sekundenkleber fixiert. Hält sehr gut. Wird ja mechanisch nicht belastet. Nur das Eigengewicht (Masse) der Scheiben selbst.

Hier sieht man den Abstand zwischen der Scheibe und dem Motor besser.
20160618_204319.jpg


Ich glaube aber ich werde nochmal neue Scheiben mit 14 Schlitzen drucken und testen. Mein Wunsch ist mehr an die Werte vom original Ardumowermotoren ran zu kommen.

Hier die Druckdatei:
Motor_Odo_Optic.zip



Gruß
Stephan

Ps. Würde mich mal freuen deinen Mower in Aktion zu sehen. Also wie er sich auf der Wiese so verhält.
Evtl. kannst du ja mal ein kurzes Video bei Gelegenheit hier rein stellen.
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/921/20160618_204319.jpg/
 
Zuletzt bearbeitet von einem Moderator:
Hallo Stephan,

vielen Dank für die Datei und die Beschreibung. 734 Ticks halte ich für einen sehr guten Wert. Durch das Spiel im Getriebe der Motoren glaube ich kaum, dass eine höhere Auflösung besser funktioniert. Aber ein Versuch ist es natürlich allemal wert.

Wenn die Schleife endlich verlegt ist (zuerst Kabel zu kurz, dann zu wenige Nägel, jetzt Dauerregen :evil: ) werde ich mal ein Video rein stellen :)
 
So hier gibt es noch ein paar Anpassungen im Code.

Da ich die L298N Motortreiber verwende, muss in der mower.cpp noch in der Methode readSensor der Aufruf von checkMotorFault auskommentiert werden. Andernfalls gibt es nur Motor Fault Errors


Code:
int Mower::readSensor(char type){
  switch (type) {
// motors------------------------------------------------------------------------------------------------
    case SEN_MOTOR_MOW: return ADCMan.read(pinMotorMowSense); break;
    case SEN_MOTOR_RIGHT: //checkMotorFault(); 
              return ADCMan.read(pinMotorRightSense); break;
    case SEN_MOTOR_LEFT: // checkMotorFault(); 
              return ADCMan.read(pinMotorLeftSense); break;
    //case SEN_MOTOR_MOW_RPM: break; // not used - rpm is upated via interrupt


Wenn der Mower im manuellen Modus irgendwo gegen fährt, schiebt er im original Code einfach weiter. Durch die Anpassung weiter oben bleibt er zumindest stehen. Da er aber nicht zurück setzt, bleibt der Bumper ewig aktiv und man bekommt den Mower nur von Hand raus. Normalerweise fährt der Mower ja zurück und dreht dann, ich will, dass er nur zurück setzt und dann stehen bleibt. Dazu sind einige Anpassungen erforderlich gewesen:

1. robot.h: Hier wird dem ENUM für die roll types ein weiterer Wert (NONE) eingefügt

Code:
// roll types
enum { LEFT, RIGHT, NONE };


2. robot.cpp
Zunächst ändern wir das Verhalten vom STATE_MANUAL. Wenn ein Bumper aktiviert wurde, wird nun reverseOrBidir(NONE) aufgerufen

Code:
case STATE_MANUAL:
      if ((bumperLeft || bumperRight)) {    
         reverseOrBidir(NONE);
      }
      break;


Die Methode reverseOrBidir bleibt wie gehabt. Die Methode setzt als nächsten State STATE_REVERSE (sofern kein bidirektionales Mähen). Diesen State müssen wir anpassen.


Code:
if (mowPatternCurr == MOW_BIDIR){
        double ratio = motorBiDirSpeedRatio1;
        if (stateTime > 4000) ratio = motorBiDirSpeedRatio2;
        if (rollDir == RIGHT) motorRightSpeedRpmSet = ((double)motorLeftSpeedRpmSet) * ratio;
          else motorLeftSpeedRpmSet = ((double)motorRightSpeedRpmSet) * ratio;                                
        if (stateTime > motorForwTimeMax){ 
          // timeout 
          if (rollDir == RIGHT) setNextState(STATE_FORWARD, LEFT); // toggle roll dir
            else setNextState(STATE_FORWARD, RIGHT);
        }        
      } else {        
        if (millis() >= stateEndTime) {
          if (rollDir != NONE) {
              setNextState(STATE_ROLL, rollDir);				                         
          }
          else { 
            setNextState(STATE_MANUAL, 0);
          }
        }
      }
      break;
    case STATE_PERI_ROLL:


Hier wurde eine weitere Prüfung auf rollDir eingefügt. Wenn dieser den Wert NONE hat, befinden wir uns im manuellen Modus und sind irgendwo dran gekommen. Somit ist der neue State STATE_MANUAL und nicht wie bisher STATE_ROLL.

In der Methode setNextState wird nun geprüft, ob der alte Status STATE_REVERSE und der neue STATE_MANUAL ist (ziemlich am Ende).

Code:
if (stateNew == STATE_PERI_TRACK){        
    //motorMowEnable = false;     // FIXME: should be an option?
    setActuator(ACT_CHGRELAY, 0);
    perimeterPID.reset();
    //beep(6);
  } 

    // Reverse im manuellen Modus, im Manuellen Modus wurde der Bumper ausgelöst
  if (stateNew == STATE_MANUAL && stateCurr == STATE_REVERSE)
  {
    motorLeftSpeedRpmSet = motorRightSpeedRpmSet = 0;
  }
  
  if (stateNew != STATE_REMOTE){
    motorMowSpeedPWMSet = motorMowSpeedMaxPwm;
  }

Somit wird erreicht, dass der Mower nach dem zurück setzen auch wieder stehen bleibt. Andernfalls würde er ewig zurück setzen.
 
Hier mal ein paar bewegte Bilder vom ersten richtigen Test. Das nächste Mal halte ich das Handy anders herum...

[video width=425 height=344 type=youtube]n8Ob18q05MA[/video]
[video width=425 height=344 type=youtube]Kld-nNNAh_8[/video]

Und hier einmal beim verfolgen des Perimeter Drahts
[video width=425 height=344 type=youtube]zR7qtD9evh8[/video]
 
So dank der Unterstützung von Stephan verfügt der Bock jetzt auch über Odometrie. Über je eine Schlitzscheibe an der Motorachse wird mit dem Lichtschranken-Kit aus dem Shop die zurückgelegte Entfernung gemessen.


20160705_202924.jpg


20160705_202857.jpg


Damit erreiche ich wie Stephan etwa 9,9 Ticks pro cm und ca. 800 pro Radumdrehung. Problem ist nun aber, dass der Mower mit eingeschalteter Odometrie ca. 5 Minuten läuft und dann einfach stehen bleibt. Mähmotoren laufen weiter, aber Bluetooth bricht ab. Es scheint als ob der Mega abstürzt.
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/2946/20160705_202924.jpg/
 
Zuletzt bearbeitet von einem Moderator:
Hallo Partick,
schön gelöst.
Ist dein Problem behoben wenn du die Odometrie abgeschaltet hast?
Ist 2-Way-Odometrie ausgeschaltet?
Nutzt du auch Ultraschallsensoren? Dann bitte mal ohne testen.
Schau doch mal in den 5min Laufzeit bei der App unter Fehlerzähler nach, ob der Odometriezähler hoch läuft.
Hast du auch die zusätzlichen Widerstände aus dem Workaraund von Jürgen eingebaut? Hier
Gruß
Stephan
 
Hallo

Die Pullup Widerstände sind verbaut. 2 way ist auch ausgeschaltet. Fehler werden auch keine gezählt. Ich kann auch beobachten wie die Odometrie zählt. Das letzte Mal ist er abgestürzt als er den Perimeter Draht überfahren hat.

Mit eingeschalteter odo fährt er auch deutlich langsamer und die Rollwinkel sind auch sehr klein. Zum Teil rollt er gar nicht.
Momentan ist der Perimeter Empfänger hinüber (hab den Poti überdreht). Sobald das repariert ist teste ich mal ohne Perimeter

Problem tritt nur bei aktivierter Odometrie auf.
 
Ultraschall ist übrigens deaktiviert da noch nicht vorhanden. Die werde ich aber nachrüsten damit die Rutsche der Kinder nicht so leidet.
 
Hallo,

der Mäher war die letzten Wochen oft im Garten unterwegs. Die Zeit habe ich genutzt, um an der Garage/Ladestation zu bauen. Beim Bau wurde ich ab und zu von seltsamen, knirschenden Geräuschen aufgeschreckt.

Nach einigen Tagen sahen die Radkästen des Mower so aus

20160722_1521101.jpg


Der Täter war erst nach langem Beobachten gefunden, die Schaukel der Kinder. Die Seitenteile der Schaukel sehen wie ein großes A aus. Die Schaukel habe ich nicht mit dem Perimeter ausgegrenzt, war mir zu viel Arbeit und macht ja nichts, wenn er dagegen stößt. Nun kommt es aber manchmal vor, dass der Mower durch das "A" fährt und dabei ganz knapp an einem Pfosten vorbei kommt. Der Bumper löst also nicht aus. Mein Mower ist am Heck aber höher als vorne, so dass der Radkasten an die Schaukel stößt. Der gealterte Kunststoff bricht und gibt nicht genügend Widerstand, um die Leistungsbegrenzung der Motoren zu aktivieren.

Darum habe ich die Radkästen mit Alu-Schienen (2mmx30mm) verstärkt. Das Chassis hat deutlich an Stabilität gewonnen und die Schaukel macht jetzt auch keine Probleme mehr.
20160726_2027161.jpg


20160726_2027291.jpg


20160726_2027441.jpg


Zeit, mich wieder der Garage zuzuwenden. Nächste Schritte sind Optimierungen am Mähwerk sowie Ultraschall Sensoren, damit auch das Planschbecken (wir bauen ja keine Pool-Roboter) und die Rutsche sicher erkannt werden.
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/2946/20160722_1521101.jpg/
 
Zuletzt bearbeitet von einem Moderator:
Schön Patrick jetzt kann er nicht mehr hängen Bleiben das finde ich auch bei meinem so Blöd das er an vielen Ecken und Kanten hängen bleiben kann.
 
Hallo zusammen,

am Wochenende war mal wieder Zeit, etwas zu basteln. Die Original Messer liefen bei mir zwar immer sehr ruhig (viele berichten von irrem Lärm bei Tianchen), das Schnittergebnis war aber nicht das beste. Ich habe die Messer nachgeschärft, aber viel besser wurde es nicht. Also habe ich eine Messeraufnahme für meinen Mower erstellt. Der original Motorflansch kann weiter verwendet werden. Als Klingen kommen jetzt die aus dem Shop zum Einsatz.

20160730_211803.jpg


Die Klingen sind aktuell auf der Oberseite der Scheiben montiert. Bei hohem Graß ist das Schnittergebnis ernüchternd. Das Gras wird beim Überfahren umgelegt, beim Aufrichten stößt es an die Messerscheibe und drückt sich unter den Klingen durch. Da hilft nur, die Messer auf der Unterseite zu befestigen (Messerscheibe umdrehen). Die Klingen können sich übrigens frei drehen.

20160730_211818.jpg


20160730_211828.jpg


Der Abstand zwischen den Klingen der beiden Messerscheiben beträgt im ausgefahrenen Zustand etwa 8mm, so dass die Klingen nicht aneinander stoßen können

20160730_211840.jpg


Zum Abschluss hier noch ein paar bewegte Bilder. Da ich den Schalldruck nicht messen kann, habe ich beim ersten Video Grashalme an die Messer gehalten. Man hört auf dem Video, wie das Gras geschnitten wird. (Das Video ist etwas verwackelt, ich habe mehr auf meine Hände als auf das Video geachtet :) )

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

Beim zweiten Video habe ich am Ende den Bumper betätigt. Man hört das klicken des Mikroschalters trotz aktivem Mähwerk. Auf beiden Videos hört man am Ende die Klingen rasseln, wenn die Motoren anhalten. Also ich bin fürs erste zufrieden. Die kommenden Tage werden zeigen, ob das Mähergebnis besser geworden ist.

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

Hier noch die STL Datei zum nachdrucken. Gedruckt wurde es mit ABS und etwa 20% infill. Zur Montage ist eine Feile und eine Raspel erforderlich. Das Langloch für den Motorflansch ist zu klein und musste aufgefeilt werden. Anschließend habe ich zuerst den Motorflansch, dann die montierte Messerscheibe (ohne Klingen!!!) mit der Raspel ausgewuchtet.


Bei Zeiten werde ich das Modell überarbeiten. Das Langloch wird vergrößert und die Messerscheibe wird flacher (15mm sind zu viel, 8mm reichen aus). Die Messerscheibe wird in der nächten Version auch so gebaut, dass man sie umdrehen kann.
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/2946/20160730_211803.jpg/
 
Zuletzt bearbeitet von einem Moderator:
[strike]PS: Wie kann ich die STL Datei hochladen? Auswählen und Einfügen hilft leider nicht.[/strike]
Erledigt
 
Hallo Patrick,
sehr schön gelöst mit deinen neuen Messerscheiben.
Die stl musst du einfach nur zippen und dann kannst du sie hier hochladen.
Gruß Stephan
 
Hallo,

hier ist es ruhig geworden, ich komme kaum dazu, den Mower zu erweitern. Trotzdem habe ich ein kleines Update, welches ich euch nicht vorenthalten möchte.

Letztes Jahr habe ich die Tianchen Messer durch selbstgedruckte Messeraufnahmen ersetzt. Das ging schon recht gut, allerdings hat besonders bei hohen Gras das Mähergebnis enttäuscht. Über den Winter ist mein eigener 3D Drucker entstanden und dieses Jahr eine neue Messeraufnahme. Die Klingen sind jetzt an die Unterseite gewandert, das Design wurde zudem vereinfacht. Was soll ich sagen, es läuft wie verrückt. Das Mähergebnis ist Klasse und man hört regelrecht, wie das Gras geschreddert wird.

Unbenannt_2017-05-16.png


Insgesamt verfügt jede Messerscheibe über drei Klingen (aus dem Ardumower Shop). In die Scheibe werden je drei Rampa Muffen (Gewindeeinsätze) geschraubt und daran dann die Messer.

Bei der ersten Montage habe ich den Mower auf die Seite gelegt, Mähmotor angeschaltet und mit einer Feile die letzten Unwuchten beseitigt. ACHTUNG: DIES NATÜRLICH OHNE KLINGEN MACHEN

Gedruckt habe ich es aus PETG mit 50% Infill.

Das Bild zeigt die Konstruktion nach ca 4 Wochen täglichem Einsatz.
20170515_192223.jpg

Attachment: https://forum.ardumower.de/data/media/kunena/attachments/2946/Unbenannt_2017-05-16.png/
 
Zuletzt bearbeitet von einem Moderator:
Oben