Stefan's nächster

redtop

Member
Nach langer zeit wieder da ;)

Jetzt hab es endlich geschafft mir wieder einen "kleinen" Aufzubauen.

Software erstmal die Azurit 1.0a6 und nur mit Bumper, Odometrie und IMU. US, Perimeter und GPS kommen noch.

Wenn alles läuft wird auf Sunray" getestet.

Auf das Protektor Board habe ich verzichtet, da ich glaube das die abgebrannten Motortreiber mit zu steilen Rampenwinkeln zu tun haben. Dies hatte ich bei den ganz Großen Motoren, die ich mal hatte, auch schon beobachtet.

Gestern die ertste Probefahrt im Garten erfolgreich absolviert :)

und hier ein paar Bild. Fehlt nur noch der Deckel und der Ein/Aus Schalter.

Nach ein paar Einstellungen am Rückwährstfahren und drehen hat er seine Sache auch schon ganz gut gmacht

Bin auf eure Kommentare gespannt.

IMAG0842.jpg


IMAG0841.jpg


IMAG0843.jpg


IMAG0844.jpg


IMAG0845.jpg


IMAG0846.jpg


IMAG0847.jpg


IMAG0848.jpg
 
Deine Bumperlösung finde ich gut ... vielleicht auch, weil ich mit einer identischen Lösung 1,5 Jahre meinen Mäher durch den Garten geschickt habe :)

Hab aber aktuell eine andere Lösung eingebaut, da die alte Lösung sich häufiger mal ordentlich verkeilt hatte. Die Zapfen waren bei mir nicht ordentlich geführt und haben sich dann bei gelegentlich auftretender Seitenbelastung (schiefes Auftreffen auf Hindernisse, die die Frontschiene seitlich versucht haben zu verschieben) so ungünstig verkeilt, dass er entweder nicht reingeschoben (zum Auslösen) wurde, oder nicht wieder herauskam (durch Federkraft).

Vorteil der Lösung ist, dass der Schalter selber nicht mechanisch belastet wird und die Endstellung auch nciht vom Schalter festgelegt wird.

Kannst ja deine Langzeiterfahrung mal testen, sobald der Mäher einige hundert Stunden im Garten verbracht hat.

Gruß,
Jem
 
Hallo

Sieht schick aus. Schön, dass man auch rein schauen kann.

Was ist das für ein Material? Acryl, Plexiglas, Makrolon? Die Bumper gefallen mir auch, möchte meinen noch mit Bumper am Heck ausstatten.
 
Hallo,

ja die Bumper sind sehr Robust geworden :) Je zwei Bohrungen mit "Spiel" innen als Langloch, damit genug Platz ist.
Mal sehen wie lange sie halten. Einige Unsanfte Berührungen gab es schon mit Wänden, ohne Schaden.

Die Idee war das der Kontakt zwar schnell bei Berührung ausgelöst wird aber der Roboter ja nicht sofort stoppt. Deswegen habe ich nach hinten dann etwas Luft, damit der Einschlag nicht zu heftig wird.

Das Material ist 8 mm Plexiglas, was noch rumliegen hatte.

Da ich den Akku von meinem Ambrigo L50 und das Netzteil verwende, suche noch noch nach einer Ladeschaltung für den Akku.

Im Augenblick bleibt er leider immer wieder stehen und fängt an zu piepsen. Da muss ich wohl noch die richtigen Einstellungen für den Akku finden.
 
Die Langlöcher vom Bumper sind leider nicht nur Langlöcher geworden, sonder auch nach oben und unten weggelaufen beim bohren.
Ich werde jetzt einfach einen Alustreifen oder PE oben und unten als Führung anbringen.

Dank dem Wlan Tutorial von Benjamin hat er jetzt auch Wlan.
Somiz stünde darüber eine genau Zeit ( RTC ) Entfällt und eine einfache Steuerungsmöglichkeit über den PC und die Haussteuerung zur Verfügung.

Leider wird mir nur von einem Motor der Strom angezeigt, Durchgang bis zum pin hat er, dort ändert sich auch die Spannung in Abhängigkeit von der Last aber als Anzeige steht nur inf.
Ich fürchte da hat der Arduino ein Problem.

Da er auch oben Griffe aus Metall für die Ladekontakte bekommen hat, überlege ich ob ich es irgendwie auswerten kann wenn man sie anfasst und er dann sofort stoppt. Zur Sicherheit.

Auch die Schleifenplatien funktioniert super, allerdings habe ich keine Ahnung wofür die weißen LED`s sind.
Die Schleife läuft mit 8V und 100ma der Schleifenwiederstand ist nur knapp über einem Ohm, deswegen habe noch ein paar alte 1Ohm Lastwiederstände, die hier noch rumlagen, dazwischengeschaltet.

Stefan
 
So Griffe als Sensoren könnte man als Kapazitiven Sensor auslegen.
Dazu einfach einen Analogen Eingang über einen 1M Ohm auf 3,3 oder 5V legen, mit einem Kondensator auf den Griff und schon kann die Änderung ausgelesen werden.

Jetzt muss ich mir noch einfallen lassen, wie das in die Software einbaue.


Vieleicht hat ja jemand eine Idee. Hier der Code aus dem Versuchsaufbau :


Code:
int LED=13, festgedrueckt=150, t=200;;

void setup() {
  pinMode(LED, OUTPUT);       // LED Ausgang
  pinMode(A1,INPUT);          // Taste 1
  digitalWrite(A2,HIGH); 
  Serial.begin(115200);

}

void loop() {
  if(readButton(1)) blink(3); // bei Taste 1 3x blinken
}

int readButton(int pin) {     // Taste einlesen
  Serial.print("pin ");
  Serial.print(pin);
  Serial.print(": ");
  
  Serial.println(analogRead(pin));
  delay(500);
  if(analogRead(pin) < 500) { // Analog Eingang abfragen
  Serial.println("Blink ");

      return 1;               // war gedrückt
  }
  return 0;                   // war nicht gedrückt
}
  
void blink(int anz) {         // LED x-mal blinken lassen
  for(int i=0; i < anz; i++) {
    digitalWrite(LED, HIGH);  // LED an
    delay(t);                 // warten
    digitalWrite(LED, LOW);   // LED aus
    delay(t);    
  }
}


Beim Einbau des ESP Wlan Moduls gab es einige Probleme, dabei habe ich auch gleich mal die Baudrate des Bluetooth Moduls auf 115200 Bauf geändert, keine Ahnung warum die so niedrig stand aber damit lief BT deutlich besser.

Aber es sit schon Cool jetzt per Wlan auf den Mower zugreifen zu können, sowohl pfod als auch über das Web Interface.

Danke nochmal an Stephan für diesen esp-link

Stefan
 
So ich hab heute mal kräftig weitergemacht und es gibt doch noch ein paar größere Baustellen.

Odometrie und IMU

Odometrie geht gar nicht. Sobald ich die Einschalte kommt nach 1 - 2 metern ein Odometrie fehler.
Genau kalibriert One und Two Way ausprobiert Rad Zehn Umdrehungen machen lassen und die Ticks gezählt hilft alles nichts. Imu & Sonar waren auch aus, nur Perimeter war an.

Wenn ich Sie übers test Programm laufen lassen werden die Werte auch korrekt angezeigt.

Die Motoren die ich verwende haben eingebauten Sensoren, die je Motor Umdrehung zwei Signale erzeugen bei einer Untersetzung von 63:1 passt das auch mit dem was ich ausgetestet habe. Auch mit dem Oszilloskop kontrolliert Signale sind Super.

Erst nachdem ich den zweiten Signal Pin (für die Richtung) abgeklemmt habe, mechanisch, ging es.

Muss aber noch weiter getestet werden.

Die andere Baustelle ist mein IMU. Funktioniert super bis er über eine Harte Kante rollt oder besser springt.
Dann wird der IMU Tilt ausgelöst und er steht auf dem Kopf oder liegt auf der Seite, jedenfall denkt der IMU das unf gibt einen Tilt aus, was bei einem Winkel größer 90 Grad auch OK währe aber er steht noch immer normal auf dem Boden
aber IMU sagt was anderes, solange bis ich Ihn Aus- und wieder Einschalte. keine Ahnung was das ist.
Der IMU ist auf Doppelseotigem Klebeband mit Schaumstoff (Spiegelband) montiert.

Vieleicht hat ja jemand einen Tip, denn ich würde Ihn gerne wieder in Betrieb nehmen, da das Mähverhalten damit deutlich besser ist.
 
Ich habe mal kurz über die Softwareumsetzung bezüglich Odometrie geschaut. Ist ja doch ziemlich Umfangreich für einen Encoder Interrupt. Es wird auch die Standard read Funktion verwendet die extrem langsam ist.

Verbesserungsvorschlag:

Nur auf steigende Flanken des Pin A den Interrupt auslösen (falls bei 256 möglich). Dann muss man nur noch den B Pin auslesen.
Pin am besten direkt ohne die Arduino read Funktion auslesen.

Ich habe mal die von mir verwendete Encoder Klasse rangehängt. Vielleicht nützt es dir ja bisschen.
Bin nicht in der Lage Dateien einzufügen :eek:hmy:

Ich hatte bei mir den B Pin am Anfang auch abgeklemmt. Hatte dadurch erhebliche Störungen auf dem A Pin. Daher ggf. das B-Encoder Kabel und den B-Pin besser auf Masse legen.
 
Danke für den Tip aber mit nur einem Angeschlossenen Pin schein es ja jetzt zu gehen.
Sollte es doch noch Probleme machen kann ich es ja mal versuchen ich bin nicht der Software Guru ;)

Es sollte auch als Hinweis für adere sein die Probleme haben wenn der zwei weg Encoder Probleme macht und eigentlich ist es für uns nicht nötig zu wissen in welche Richtung sich das Rad dreht, das wissen wir ja wie wir es ansteuern.

Stefan
 
War nur so eine Idee von mir. Kann auch sein das es nicht funktioniert, gerade wenn die Pins den gleichen Interruptvector sharen oder nur auf change getriggert werden kann.
 
Im Trockentest ging es aber sobald er auf dem Rasen steht kommt nach kurzer Zeit wieder der Odometrie fehler.

Ich werde wir deinen Code Schnipsel mal ansehen und probieren ihn einzufügen.

Stefan
 
Wenn man im Forum liest gibt es wohl immer wider Probleme damit.

Ich habe mir deinen Code angesehen, scheint ja deutlich einfacher zu sein. Was mich Wundert ist das bei der Azurit
jedem pin ein Interrupt zugeordnet ist, selbst wenn ein pin angeschlossen ist .

Aber um dein Beispiel in die Azurit einzufügen übersteigt wohl dann doch meine Fähigkeiten ;)

Stefan
 
Habs mir gerade nochmal angeguckt. Das wird wohl nichts einfaches werden. attachInterrupt funktioniert nur auf den Pins 2, 3, 18, 19, 20, 21. Der Code verwendet aber die Pins A12 bis A15. Ich glaube da geht nur ein change interrupt. Und scheinbar benutzen alle den gleichen Interruptvector. Allerdings stecke ich in dem Mega nicht mehr drinne, da ich vor 3 Jahren das letzte mal damit programmiert habe.
 
Ich probier jetzt mal die Änderungen von Chris


Code:
unsigned long timeMicros = micros();
  boolean odometryLeftState = digitalRead(pinOdometryLeft);
  boolean odometryLeftState2 = digitalRead(pinOdometryLeft2);
  boolean odometryRightState = digitalRead(pinOdometryRight);  
  boolean odometryRightState2 = digitalRead(pinOdometryRight2);  
  boolean motorMowRpmState = digitalRead(pinMotorMowRpm);
  robot.setOdometryState(timeMicros, odometryLeftState, odometryRightState, odometryLeftState2, odometryRightState2);   
  robot.setMotorMowRPMState(motorMowRpmState);  
}


Dann sind zwar noch immer Interrupts belegt abe diese werden nicht ausgelöst. Ich könnte noch zusätzlich die nicht benutzten Pins der Odometrie auf Low legen, damit nicht durch Störungen ein Interrupt ausgelöst wird.
 
Das sieht genauso aus wie der Code, den ich gerade betrachte. Da ist keine Verbesserung zu sehen. Die Interrupts kommen immer. Das kannst du mit dem Code nicht aufhalten.
Den B Kanal abzuziehen ist auch keine Lösung, da dann nicht mehr richtig gezählt wird (vermute ich, hab es nicht überprüft). Du könntest den Code so umschreiben, dass nur der A Kanal berücksichtigt wird ohne negatives zählen, müsstest dann aber den gesamten Code durchforsten ob dieser mit absolut Werten arbeitet und dies ggf. korrigieren.

Was ich auf jeden Fall machen würde ist die Werte direkt aus den Registern zu lesen oder die fastRead Funktion zu verwenden.
Dann könnte man z.B. nur jeden achten Interrupt Aufruf auswerten - falls möglich, nicht geprüft.
Oder man könnte noch einen Zählerbaustein vor die Pins schalten, um nicht mehr soviel Pulse zu kriegen.

Meine persönliche Meinung und was ich auch als erstes gemacht habe:
a) Perimetererkennung auslagern
b) Leistungsfähige Prozessoren nehmen

Anbei mal ein Video meines Bumpers. Gerade heute getestet.
Die Auslösung erkenne ich durch einen Hall-Sensor. Der hat eine Hysterese, damit bekomme ich kein Bouncing wie bei Schaltern.
https://www.youtube.com/watch?v=if61o4rP32w
Würde mich mal interessieren wie andere die Bumper umgesetzt haben. Was immer so einfach aussieht erfordert doch einiges an Aufwand.
 
Ja stimmt, die Bumper sind nicht ohne, dies ist ja insgesamt der dritte aufbau. Die Überlegung war das er nicht sofort stoppt und einen gewissen Bremsweg braucht. Die Federn könnten nur etwas stärke sein, geht aber auch so.

Deiner löst sehr empfindlich aus, das war bei mir ein Problem wenn das Gras mal etwas höher ist, dann wurde der Bumper auch schon durch Grasbüschel ausgelöst.

Was halst du für ein Material genommen ? Lexan ?
Stärkerer Prozessor ist für die 1,2 Platine, die hier schon liegt geplannt. Da soll erst mal der Due drauf und wenn der Arduino Otto kommt wird der getestet.

Zur not gehts ja auch ohne Odometrie, mich wundert es auch das das solche Problem macht, Sollte doch eines der Basics sein. In dem "Sheep Sheep" Threat wird das auch gerade diskutiert.

Welche Software verwendest ? Wenn du eine andere Odometrie auswertung hast ?

Stefan
 
Oh, den Thread habe ich ganz vergessen. Habe dazu ja selber was kommentiert bezüglich Due und schnellem Pin auslesen. Er verwendet ja nur den A Kanal als Interrupt und liest B aus. Scheint ja zu funktionieren. Und eine Lösung für die Readfunktion hat er auch angegeben.

Ich verwende Acrylglas 4mm.

Die Software habe ich selber geschrieben. Verwende den mbed online Compiler von ARM.

Im folgenden mal ein Link, welche 32 bit Development Boards unterstützt werden. https://developer.mbed.org/platforms/
Da ist der OttO von Arduino ja eine wahre Innovation ;)
 
Oben