Mähzonen über GPS Punkte

Hi,

Danke für die Antwort!

Die Berechnung funktioniert ja bereits, leider der Teil "was mache ich an dem Punkt " nicht.

Ich denke das es sehr einfach ist, aber ich finde den Fehler nicht.

VG
 
Er soll einfach nur wissen das der Punkt gefunden wurde und dann in state Forward wechseln , nach Ablauf des Timers soll der der Status " area ist = area soll " resetet werden und das "normale mäh Programm " gestartet werden ....

Hoffe das meine Idee so vorstellbar ist ;)

VG
 
Nur noch mal zum Verständnis:
Dem Mäher wird gesagt, das er zu GPS Punkt X fahren soll, das macht er auch?
Er weiß, dass er den Punkt erreicht hat?
Wenn er den Punkt erreicht hat, was macht er dann, bleibt stehen und macht nix?

Ich habe mir den Code jetzt mal angeschaut und finde nicht die Stelle, wie er zu dem GPS Punkt geschickt wird und was er dann machen soll?
 
Hallo,

als ich die nerven verloren habe, weil das nicht so funktioniert wie ich will ist warscheinlich der teil mit rasgeflogen....
Wollte einen neuanfang :eek: wagen...


nun zur funktion:

1) über den timer wird die Area ausgewählt wo der mower Sarten soll (funktioniert)
2) Er sucht die schleife und fährt sie ab bis ehr an den GPS punkt kommt (funktioniert)
3) er bleibt stehen und startet den mähvorgang (er bleibt nur stehen, startet aber nicht mit dem Mähvorgang)
4) reset vom Status "Area soll" wenn " Area soll = Area ist " gegeben ist ( funktioniert nicht )

jetzt ist die richtige version im anhang
 

Anhänge

  • ardumower.zip
    136,2 KB · Aufrufe: 4
Zuletzt bearbeitet:
Hallo Thorsten,
ich weiß nicht, ob checkArea () und checkArea() das gleiche sind (mit Leerzeichen vor der Klammer)
aber
habe mir den code runtergeladen:
es fehlt das Ausstiegskriterium. Jetzt wird checkArea() nur im STATE_FORWARD aufgerufen. Soweit ich das sehen kann, sollte er dann korrekt in STATE_PERI_FIND wechseln.
Dann solltest Du aber checkArea() auch in STATE_PERI_FIND und STATE_PERI_TRACK aufrufen, damit er wieder aus den STATES zurückkommt sobald die area-Abfrage erfolgreich ist.

Gruß Fürst Ruprecht
 
Hi Fürst Ruprecht,

beim Kompilieren hatte ich mit lehrzeichen keine problem, hab jetzt die lehrzeile rausgenommen.....
meinst du das SO? anbei der neue code.....

Hab noch einen timer integriert, glaube aber das das so quatsch ist ....?


hab da noch eine ergänzung.....

void Robot::checkArea() {
if ((perimeterUse) && (millis() > nextTimeReadArea)) { //read only each 60 Secondes
nextTimeReadArea = nextTimeReadArea + 60000;
if ((Area_Ist != Area_Soll) && (Area_Soll > 0)) {
Console.println(F("AREA"));
if (perimeterUse) setNextState(STATE_PERI_FIND, 0);
else setNextState(STATE_OFF, 0);
if (Area_Ist == Area_Soll){
setNextState(STATE_FORWARD, 0);
Area_Soll = 0; // überlegung nach ereichen "Area_Ist == Area_Soll" reset von Area_Soll
if (Area_Soll ==0){
setNextState(STATE_FORWARD, 0);
}
}
}
}
}

geht das So?

danke für eure hilfe
 

Anhänge

  • ardumower.zip
    136,2 KB · Aufrufe: 0
Zuletzt bearbeitet:
-meine leidvolle Erfahrung ist, daß der compiler keine Probleme aufzeigt, der code einfach nicht funktioniert. Mit dem Leerzeichen vor der Klammer habe ich keine Erfahrung.

-nein, das funktioniert so noch nicht. Bin gerade nicht am PC - schicke Dir etwas zurück.

Gruß FR
 
HI,

also soll ich die beiden checkArea() wieder aus STATE_PERI_FIND und STATE_PERI_TRACK entfernen?


ist das denn so weit in ordnung ?

void Robot::checkArea() {
if ((perimeterUse) && (millis() > nextTimeReadArea)) { //read only each 60 Secondes
nextTimeReadArea = nextTimeReadArea + 60000;
if ((Area_Ist != Area_Soll) && (Area_Soll > 0)) {
Console.println(F("AREA"));
if (perimeterUse) setNextState(STATE_PERI_FIND, 0);
else setNextState(STATE_OFF, 0);
if (Area_Ist == Area_Soll){
setNextState(STATE_FORWARD, 0);
Area_Soll = 0; // überlegung nach ereichen "Area_Ist == Area_Soll" reset von Area_Soll
if (Area_Soll ==0){
setNextState(STATE_FORWARD, 0);
}
}
}
}
}

vg
thorsten
 
Nein, lass checkArea() in STATE_PERI_FIND und STATE_PERI_TRACK drinnen, sonst kommt der Mäher aus diesen States nicht mehr raus. Er würde jedes Mal bis in die Station fahren.
Du mußt aber in checkArea() auch die Batteriespannung berücksichtigen. So kann der Mäher nicht unterscheiden, ob er jetzt wegen der Batteriespannung oder wegen checkArea() im State_peri_find oder State_peri_track ist. Ist die Batt-Spannung o.k. dann checkArea().
Warum fragst Du perimeterUse ab?
Gruß Fürst Ruprecht
 
Hi

meinst du so?

void Robot::checkArea() {
if ((perimeterUse) && (millis() > nextTimeReadArea)) { //read only each 60 Secondes
nextTimeReadArea = nextTimeReadArea + 60000;
if ((Area_Ist != Area_Soll) && (Area_Soll > 0)) {
Console.println(F("AREA"));
if (batMonitor){ // so?
if (chgVoltage > 5.0); // so?

if (perimeterUse) setNextState(STATE_PERI_FIND, 0);
else setNextState(STATE_OFF, 0);
if (Area_Ist == Area_Soll){
setNextState(STATE_FORWARD, 0);
Area_Soll = 0; // überlegung nach ereichen "Area_Ist == Area_Soll" reset von Area_Soll
if (Area_Soll ==0){
setNextState(STATE_FORWARD, 0);
}
}
}
}
}
}

Perimeteruse hab ich nur eingebaut für meinen Ardumower mini um grundsetzlich zu testen ob er die funktion aufruft.
Das macht er auch, grundsetzlich schadet die funktion ja nicht ;)

VG
Thorsten
 
void Robot::checkArea() {
if ((perimeterUse) && (batVoltage > batGoHomeIfBelow) && (millis() > nextTimeReadArea)) { //read only each 60 Secondes
nextTimeReadArea = nextTimeReadArea + 60000;
if ((Area_Ist != Area_Soll) && (Area_Soll > 0)) {
Console.println(F("AREA"));

if (perimeterUse) setNextState(STATE_PERI_FIND, 0);
else setNextState(STATE_OFF, 0);
if (Area_Ist == Area_Soll){
setNextState(STATE_FORWARD, 0);
Area_Soll = 0; // überlegung nach ereichen "Area_Ist == Area_Soll" reset von Area_Soll
if (Area_Soll ==0){
setNextState(STATE_FORWARD, 0);
}
}
}
}
}
}


probiers mal so.
Gruß Fürst Ruprecht
 
if (Area_Ist == Area_Soll){
setNextState(STATE_FORWARD, 0);
Area_Soll = 0; // überlegung nach ereichen "Area_Ist == Area_Soll" reset von Area_Soll
if (Area_Soll ==0){ <= das macht keinen Sinn, weil Du vorher Area_Soll=0 setzt, also ist die Bedingung immer erfüllt
setNextState(STATE_FORWARD, 0);
}

Wenn Du Area_Soll zurücksetzen würdest, dann fährt der Mäher sofort wieder in Area-0. So wie ich das verstehe, setzt Du die Area über das Webinterface.
Evtl. macht es Sinn, in STATE_STATION die Area neu zu setzen. Dann würde er immer eine Area mähen, zurück zum Laden in die Station, danach in die nächste Area. ?

Der Rest erscheint mir logisch.
Gruß Fürst Ruprecht
 
Hi,
wenn ich Area =0 auswähle dann geht er sofort in setNextState(STATE_FORWARD) und deaktiviere dann die Area Auswahl..
Das funktioniert bis heute da der Mäher damit immer unterwegs ist.

Vg

Thorsten
 
Ja, das glaube ich Dir. Der code macht trotzdem keinen Sinn.


if (Area_Ist == Area_Soll){
setNextState(STATE_FORWARD, 0); // das kann glaub ich auch weg,
Area_Soll = 0; // wenn Du vorher Area2 ausgewählt hattest, dann fährt er jetzt nach Area0 und bleibt dort
setNextState(STATE_FORWARD, 0);
}
 
Oben