Robby V2 fertig

Anbei ein Video in Action

Video.avi

Attachment: https://forum.ardumower.de/data/media/kunena/attachments/2990/Video.avi/
 
Zuletzt bearbeitet von einem Moderator:
Kann das Video leider nicht ansehen. Irgendwie ein grüner Balken in der Mitte unten. Vielleicht kannst du es auf youtube veröffentlichen?
 
Bei mir geht das Video auch nicht. Mach mal bei Youtube, das ist für alle einfacher.
 
al_ohr3 schrieb:
Ich bin seit einer Woche auf 2 Perimeter Empfänger (links rechts) umgestiegen.

Vorteile:
1. Du kannst in der richtigen Richtung wegdrehen wenn du auf die Schleige gefahren bist und bleibst nicht eventuell draussen wo hängen.
2. Bin gerade dabei das dreden komplett einzustampfern .. braucht zu viel Zeit.. Er fährt dann nur noch in einem Kreisbogen an die Schleife ran.

Grüße

Andy

Hi,

tolles Projekt - super umgesetzt!

Könntest du den Ardumower-Code für zwei Perimeterspulen teilen? Das steht auf meiner Liste für dieses Jahr :) Würde mir den Umstieg sehr erleichtern!

Grüße
Sebastian

PS: die Links zu deinen Komponenten sind glaube ich nicht mehr alle aktiv
 
Zuletzt bearbeitet von einem Moderator:
@ Al
Wegen Code teilen:
Da häng ich mich gleich noch mit einer Bitte an:
Im Mähzonen thread hast du ja schon Schnipsel für GPS gepostet.
Ich bekomme es nicht kompiliert(error: 'ttimer_t' has no member named 'Area_Timer').
Der Fix von dir in der Pfod.cpp hilft nicht.

Ist Gps bei dir noch aktuell in Verwendung?

Danke
 
Moin moin.

Also die Implementierung von zwei Spulen habe ich erledigt. Das war wirklich relativ einfach. Danke für den Hinweis im anderen Thread.

Ich komme nochmal auf die Schrittmotoren zurück. Generell ist die Steuerung mit einem Nano via I2C-Signal vom Mega sehr sinnvoll. Ich stelle mir nur die Frage, wie in diesem Fall die PID-basierte Steuerung der Motoren beim Perimeter-Tracking funktioniert...? Ist I2C dafür schnell genug? Oder findet die PID-Regelung der Motoren zum Tracking auf dem Nano selbst statt?

Grüße
Sebastian
 
Hi Sebasitian,

I2C ist super schnell .. es werden na nur were bei einer Geschwindigkeitsänderungen bei mir übertragen.
Bei mir fährt Robby ganz gerade über den Perimeterdraht.

ich versuche heute Abend mal ein Video einzustellen

Grüße

Andreas
 
Hallo zusammen

da ich auch zwei Spulen nutzen möchte, bin ich in der Forumssuche auf diesen Thread gestoßen. Leider finde ich auch mit dem Hinweis:
Danke für den Hinweis im anderen Thread.
nichts weiteres. Könnt ihr mir da weiterhelfen?

Vielen Dank schon mal vorab!

LG
Peter
 
Hi Bernard,

I have found in my try that the Mower, if he hits the perimeter loop at the 45 ° angle (for example, on the right forefront to the loop) then turns to the right and then returns to the loop at a 90 ° angle. Then the Mower turns back in one direction and returns to the loop and turns again. If the Mower has two coils and comes with the right hand on the perimeter loop, he should turn away to the left and does not move to the loop at the same time. That would be much more efficient.

Peter
 
Hi Peter,

here are my code to set rotation direction depending on left right coil hitting the boundary.


Code:
if ((perimeterUse) && (millis() >= nextTimePerimeter)){    
    nextTimePerimeter = millis() +  50; // 50    

    //PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
    perimeterMag = readSensor(SEN_PERIM_RIGHT);
    if ((perimeter.isInside(1) != perimeterInside_R)){      
      perimeterCounter++;
      perimeterLastTransitionTime = millis();
      perimeterInside_R = perimeter.isInside(1);
    }
    //PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP


    
    perimeterMag = readSensor(SEN_PERIM_LEFT);
    if ((perimeter.isInside(0) != perimeterInside)){      
      perimeterCounter++;
      perimeterLastTransitionTime = millis();
      perimeterInside = perimeter.isInside(0);
    }    


  Console.print  (F("PERIMETER inside L R :                     "));  
  Console.print(perimeterInside);
    Console.print  (F("         "));  
  Console.println(perimeterInside_R);
    
    if (perimeterInside < 0) setActuator(ACT_LED, HIGH);                     
      else setActuator(ACT_LED, LOW);    
    if (((!perimeterInside) || (!perimeterInside_R))&& (perimeterTriggerTime == 0)){ //PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
      // set perimeter trigger time      
      if (millis() > stateStartTime + 2000){ // far away from perimeter?
        perimeterTriggerTime = millis() + perimeterTriggerTimeout;  
      } else {  
        perimeterTriggerTime = millis();
      }
    }
if (perimeter.signalTimedOut(0))  {      
      if ( (stateCurr != STATE_OFF) && (stateCurr != STATE_MANUAL) && (stateCurr != STATE_STATION) 
        && (stateCurr != STATE_STATION_CHARGING) && (stateCurr != STATE_STATION_CHECK) 
        && (stateCurr != STATE_STATION_REV) && (stateCurr != STATE_STATION_ROLL) 
        && (stateCurr != STATE_STATION_FORW) && (stateCurr != STATE_REMOTE) && (stateCurr != STATE_PERI_OUT_FORW)
        && (stateCurr != STATE_PERI_OUT_REV) && (stateCurr != STATE_PERI_OUT_ROLL) && (stateCurr != STATE_PERI_TRACK)) {
        Console.println("Error: perimeter too far away");
        addErrorCounter(ERR_PERIMETER_TIMEOUT);
        setNextState(STATE_ERROR,0);
      }
    }
  }


and


Code:
// check perimeter as a boundary
void Robot::checkPerimeterBoundary(){

int Peri_Left_P, Peri_Right_P;
int Peri_Schwellwert = 70; // 70% vom Max Peri Wert
  
  if (millis() >= nextTimeRotationChange){
      nextTimeRotationChange = millis() + 60000;
      rotateLeft = !rotateLeft;
    }

  if (mowPatternCurr == MOW_BIDIR){
    if ((millis() < stateStartTime + 3000)) return;    
    if (!perimeterInside) {
      if ((rand() % 2) == 0){      
        reverseOrBidir(LEFT);
      } else {
        reverseOrBidir(RIGHT);
      }     
    }
  } else {  
    if (stateCurr == STATE_FORWARD) {


      
      if (perimeterTriggerTime != 0) {
        if (millis() >= perimeterTriggerTime){        
          perimeterTriggerTime = 0;
          Peri_Trigger_Block = millis() + 5000;   //  2TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
          //if ((rand() % 2) == 0){  
          if ((perimeterInside && (!perimeterInside_R)) || ((!perimeterInside && !perimeterInside_R) && rotateLeft)){
 //         if(rotateLeft){    PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
          setNextState(STATE_PERI_OUT_REV, LEFT);
          } else {
          setNextState(STATE_PERI_OUT_REV, RIGHT);
          }
        }
      }
      else  // perimeterTriggerTime !=0
      {
        // 2TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT 

        Peri_Left_P = (motorLeftSenseADC_readmax *100) / motorLeftSenseADC_MAX;
        Peri_Right_P = (motorRightSenseADC_readmax *100) / motorRightSenseADC_MAX;

        if ((motorPowerIgnoreTime  < 2000)&& (perimeterCounter > 8) && (Peri_Trigger_Block < millis()))
           {

             Console.print  (F(" Left_P / Right_P : "));
             Console.print(Peri_Left_P);
             Console.print  (F(" L /  "));
             Console.println(Peri_Right_P);

              if ((Peri_Left_P > Peri_Schwellwert) or (Peri_Right_P > Peri_Schwellwert)) 
                {

                   if (Peri_Trigger_Block > Peri_Roll_Start) Peri_Roll_Start= millis();

                   if (Peri_Left_P > Peri_Right_P)
                     {
                        motorRightSpeedRpmSet = motorSpeedMaxRpm / (map(Peri_Left_P,Peri_Schwellwert,100,11,18)/10);
                        motorLeftSpeedRpmSet = motorSpeedMaxRpm; 
                     }
                     else
                     {
                        motorRightSpeedRpmSet = motorSpeedMaxRpm;
                        motorLeftSpeedRpmSet = motorSpeedMaxRpm / (map(Peri_Left_P,Peri_Schwellwert,100,11,18)/10);             
                     }

                   if ((Peri_Roll_Start + 10000) < millis()) Peri_Trigger_Block = millis() +5000;  //  wenn Robby 10 sekunden in diesem Modus ist dann Abbruch und min 5 sek normaler Modus 
        
               }
               else  // wenn kein Schwellwert mehr überschritten dann volle Geschwindigkeit vorwärts
                 {
                   motorRightSpeedRpmSet = motorSpeedMaxRpm;
                   motorLeftSpeedRpmSet = motorSpeedMaxRpm; 
                   Peri_Trigger_Block = millis() + 5000;    // nach Schleife 5 sek normaler Betrieb
                 }

           }

         // 2TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

      }
    } 
    
    else if ((stateCurr == STATE_ROLL)) {
      if (perimeterTriggerTime != 0) {
        if (millis() >= perimeterTriggerTime){ 
          perimeterTriggerTime = 0;
          setMotorPWM( 0, 0, false );
          //if ((rand() % 2) == 0){
          if (rotateLeft){    
          setNextState(STATE_PERI_OUT_FORW, LEFT);
          } else {
          setNextState(STATE_PERI_OUT_FORW, RIGHT);
          }  
        }
      }
    }
  }
}
 
Hi!

mit welchen Werten fütterst du denn diese Berechnung:

Code:
Peri_Left_P = (motorLeftSenseADC_readmax *100) / motorLeftSenseADC_MAX;


motorLeftSenseADC_readmax = ??
motorLeftSenseADC_MAX = ??

Verstehe ich den Code richtig, dass der Mower in Perimeter-Nähe eine "Kurve" fährt, um je nach Gegebenheit gar nicht wenden zu müssen?

VG
Sebastian
 
Hi Sebasitian

ja das war der Plan ist aber leider noch nicht aktiv da ich die Were nicht so schnell durch die Interrupt auslesen konnte.

Also leider noch nicht aktiv

Viele Grüße aus München
 
Hallo al_ohr3,

könntest du mal die Umsetzung deiner Vorderräder mit Aufhängung näher zeigen und ggf. die Druckdateien hochladen?

Danke
Roland
 
Hi Roland,

gerne

Das Rad besteht aus zwei hälften die einfach zusammengeklebt werden.
Im Rad werden 2 Kugellager eingedrückt (siehe unten).
Die Achse ist aus Edelshathldrahr 3mm im Schraubstock gebogen.

Die Achse wird dannüber das Auflager in das Gehäuse gesteckt.

Das Auflager besteht aus 2 Druckteilen (siehe unten) und einem Lager (siehe unten)

Hab auch nochmal mei Hinterrad angefügt.

Viele Grüße aus München

Andreas



3176AA64-F67A-49CC-8B0F-764F3C2916D7.jpeg

Attachment: https://forum.ardumower.de/data/med...90/3176AA64-F67A-49CC-8B0F-764F3C2916D7.jpeg/
 
Zuletzt bearbeitet von einem Moderator:
Hallo Andreas,
erst jetzt geht es bei mir weiter... PCP 1.3 habe ich gerade rudimentär in Betrieb genommen, der erste Nanao hat deinen Code für die Stepper Motoren bekommen...
Ich sitze gerade über der Verkabelung I2C DUE => I2C Nano, die Verkabelung vom Nano zum Microstep Friver und der Micro Step Einstellung am Dip Switch...
Wäre es machbar, dass du mir zur Kontrolle deine Verkabelung, Einstellung zukommen lässt ehe ich mir etwas zerschieße?

Gruß, Michael
 
Hallo Andreas,
so, grundsätzlich läuft er jetzt :) !
Wäre toll wenn ich die Einstellwerte für die Motoren und die Perimeterschleife mit dir vergleichen könnte ... wäre das OK?

Gruß, Michael
 
Hi Michael gerne,

war leider krankheisbeding ausgefallen.. und wird noch bis oster dauern.

Ab nächstem Wochenende gerne

Viele Grüße

Andreas
 
Oben