- Labornetzteil AliExpress         
Seite 8 von 15 ErsteErste ... 678910 ... LetzteLetzte
Ergebnis 71 bis 80 von 145

Thema: Tips zum Umbau von ferngesteuert auf selbst fahrend für mein Roboter

  1. #71
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.210
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hm-liest sich doch gleich besser auf deutsch oder? scan, distance,triggerdistance....viel verständlicher. Nix für ungut-ist wirkllich deine Sache, dem Arduino ists egal.

    Was ich mich bei deinem jetztigen Code frage ist, wieso distance() nicht gleich von scan_ zurückgeliefert wird.
    Würd das ungefähr so erledigen:

    Code:
    int distance;
    
    void scanVM()
    
    {
    distance=sensorWert_; //der muss natürlich ausgelesen werden, wie auch immer du das machst
    }
    ..und nun kannst du in der main() einfach distance() auswerten.

    An deiner Stelle empfehle ich dir, mach dir mal nen Ablaufplan, so auf Papier (nen wirklich effektives Programm für kenn ich auch nicht), was in deinem Programm wann passieren soll, so mit Ausgaben, Eingaben usw. dann blickst du den Ablauf echt besser.
    Und da erkennt man auch schnell, wenn man unbeabsichtigt irgendwelche Dinge verdreht.
    Dein Programm ist eher simpel, aber ich habs mir angewöhnt, bei etwas mehr Code alles auszulagern. Dann werden in der Hauptschleife nur noch Unterprograme aufgerufen.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  2. #72
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2011
    Ort
    Heilbronn
    Alter
    35
    Beiträge
    180
    ich hab ja schon vieles in Unterprogrammen ..... bzw Unterprogramme für die Scans und die Fahrbewegungen.
    würde es helfen wenn ich mal den ganze Sketch poste?

    Code:
    void scan_VORNE_MITTE()
    {
      pingTime_VORNE_MITTE = sonar_FRONT_MIDDLE.ping();           // Variable zum Speichern der Zeit, wie lange das Echo zurück braucht
      distance = pingTime_VORNE_MITTE / US_ROUNDTRIP_CM;          // Zeit in Abstand umrechnen
      if(distance == 0)
      {                                     // Wenn kein Echo zurück kommt,
        distance = 100;                     // den Abstand auf Max setzen
      }
      delay(100);
    }
    Geändert von Benny1989 (11.08.2014 um 22:52 Uhr)
    Meine Homepage www.belagra.de

  3. #73
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.210
    Zitat Zitat von Benny1989 Beitrag anzeigen
    .
    würde es helfen wenn ich mal den ganze Sketch poste?
    Weiss nicht, ob dir das helfen würde-ich hab nicht vor, dein Programm zu schreiben.

    Du scheinst ne globale Variable für pingTime_VM zu benutzen _und_ eine für distance.
    Das ist bissel Verschwendung, da du diese pingTime ausserhalb des Unterprogramms wohl nie brauchst.
    Ich verwende da ne lokale- die kann nach einmaliger Benutzung aus dem Spcuer verschwinden:

    Code:
    void scanneFront() // **************vordere US-Sensoren abfragen******************************
    {
      int tempVL = vornLinks.ping();
      vorneLinks= tempVL/US_ROUNDTRIP_CM;
      if(vorneLinks==0)
        {vorneLinks=maxDist;}
      delay(70);
      int tempVR = vornRechts.ping();
      vorneRechts= tempVR/US_ROUNDTRIP_CM;
      if (vorneRechts==0)
        {vorneRechts=maxDist;}
      delay(70);
     }
    Weiters könntest du noch etwas optimieren, da du ja nur wissen willst "ist da irgendwas"- aber die wirkliche Entfernung scheinbar gar nicht brauchst.
    Dann kannst du die Berechnung distance = pingTime_VORNE_MITTE / US_ROUNDTRIP_CM; // Zeit in Abstand umrechnen
    wohl auch weg lassen, musst halt _einmal_ gucken, in welchem Wertebereich du arbeiten willst.
    Das spart zwar nur Millisekunden, aber über ne Betriebszeit von ner halben Stunde läppert sich das. Ich hab es deshalb drin, weil dynamisch reagiert werden soll: je näher das Hindernis kommt, umso mehr muss reagiert werden, bei Geshwindigkeiten > 10km/h gehts bei 4m Reichweite kaum anders.
    Ausserdem habe ich, wie du erkennen kannst, maxDist global definiert- die wird für _alle_ meine Sensoren benutzt.
    Dadurch brauch ich nicht für jeden Sensor eine und spare wieder bissel Speicher. Und: wenn ich die Entfernung ändern möchte, ändere ichs einmal, und nicht für jeden Sensor einzeln.
    Die Eingrenzung des Bereiches mit
    if(distance == 0)
    { // Wenn kein Echo zurück kommt,
    distance = 100; // den Abstand auf Max setzen
    ist tückisch- ich hab da allerdings auch noch keine bessere Lösung gefunden.
    Wenn nämlich ein Hindernis plötzlich direkt vor den Sensor gerät (Katze??) ist distance auch 0, und dann geht der Roboter davon aus, dass der Weg frei ist!
    Kann man so machen, wenn man ganz sicher ist, dass direkt vor den Sensor nichts kommen kann.
    Wie gesagt: ne bessere Lösung hab ich dazu auch noch nicht...
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  4. #74
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2011
    Ort
    Heilbronn
    Alter
    35
    Beiträge
    180
    so war es auch nicht gemeint, nur zum besseren Verständnis ...

    ist bei mir das pingTime_VORNE_MITTE global und dein int tempVL ist dann lokal ? oder ist vorneLinks deine lokale Variable?
    Weil int tempVL muss man ja vor dem loop schreiben und das braucht man ja für jeden Sensor.

    Naja gut ich weis auch keine andere Lösung, und diese funktioniert vorerst mal, ich kann das ja bei mir von glabl zu lokal ändern!

    Bin mir nur nicht sicher ob mein Loop Teil stimmt, der Compiler meckert nicht, ich hab die einzelnen Scans für jeden Sensor einfach untereinander geschrieben!

    Code:
    void loop()
    {
        scan_VORNE_MITTE();
        distanz_VORNE_MITTE = distance;
        if(distanz_VORNE_MITTE < triggerDistanz)
         {
           zurueck();
         }
          else
         {
           vor();
         }
         
        scan_VORNE_RECHTS();
        distanz_VORNE_RECHTS = distance;
        if(distanz_VORNE_RECHTS < triggerDistanz)
         {
           zurueck();
         }
          else
         {
           vor();
         }
         
        scan_VORNE_LINKS();
        distanz_VORNE_LINKS = distance;
        if(distanz_VORNE_LINKS < triggerDistanz)
         {
           zurueck();
         }
          else
         {
           vor();
         }
         
        scan_RECHTS();
        distanz_RECHTS = distance;
        if(distanz_RECHTS < triggerDistanz)
         {
           zurueck();
         }
          else
         {
           vor();
         }
         
        scan_LINKS();
        distanz_LINKS = distance;
        if(distanz_LINKS < triggerDistanz)
         {
           zurueck();
         }
          else
         {
           vor();
         }
    }
    Wenn ich das wie du Lokal mache, verschwindet die Distanz_VORNE_MITTE = distanz.
    Und stat if(distant_VORNE_MITTE < triggerDistanz) komt dann if(vorneMitte < triggerDistanz)

    Hab ich das richtig verstanden?
    Meine Homepage www.belagra.de

  5. #75
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    56
    Beiträge
    2.814
    1234567890
    Geändert von i_make_it (04.02.2015 um 20:31 Uhr)

  6. #76
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.210
    Du kannst die Sensoren auch direkt nacheinander abfragen, und dann alles verODERn:

    if(vorneRechtsWasIst ODER vorneLinksWasIst ODER vorneMittigWasIst)
    { ausweichmanoeverStarten(); }

    In ausweichmanoeverStarten() kannst du nun entscheiden, ob du grade zurück willst, oder nach links bzw. rechts ausweichen willst.
    Lokal sind bei mir die, die mit tempXYZ, die werden nämlich nur an dieser Stelle mal kurz gebraucht.
    Die Werte vorneLinks bzw. vorneRechts aber sind global-die kann ich in anderen Unterprogrammen auch benutzen-um z.B. entsprechend zu reagieren.
    Ist ganz einfach: eine Variable gibt es dort, wo sie deklariert wurde: machst du das im Header, hast du sie für sämtliche Tasks dann zur Verfügung. Machst du es- wie ich mit den beiden tempXYZ, im jeweiligen Task, dann "leben" die auch nur dort.
    Bei mir schwirren inzwischen wohl an die 100 Variablen (davon nen drittel Long-Variablen) im Programm herum, da macht sowas durchaus Sinn- irgendwann ist der grösste Speicher voll, da spare ich lieber gleich das, was simpel zu sparen geht.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  7. #77
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2011
    Ort
    Heilbronn
    Alter
    35
    Beiträge
    180
    @ i_make_it

    da hast du vollkommen recht, darüber hab ich mir auch schon Gedanken gemacht keine Sorge^^

    Ich werde sogar wahrscheinlich 4 Taster bzw ein Großen Bumber noch bauen, bzw konstruieren, weil gerade als Notlösung oder wenn ein Stein oder
    Lebewesen vor den Roboter kommt, wo aber unterhalb der Sensoren sind oder die Sensoren das zu tiefe Hindernis nicht erkennen, der Roboter trotzdem zurücksetzt !!.
    Das ist schon wichtig da hast du auf alle Fälle recht =)

    @ Rabenauge

    das würde dann so ausschauen:

    wenn sensor_vorne_mitte kleiner als 70cm mist ODER sensor_vorne_rechts kleiner als 70cm miss ODER sensor_vorne_links kleiner als 70cm Mist ODER ...... USW
    dann fahre zurück drehe nach rechts und fahre weiter so lange vor bis zum Nächsten Hindernis!

    Code:
    void loop()
    {
      if(distanz_VORNE_MITTE < triggerDistanz || distanz_VORNE_RECHTS < triggerDistanz ||
      distanz_VORNE_LINKS < triggerDistanz || distanz_RECHTS < triggerDistanz || distanz_LINKS < triggerDistanz)
      {
        zurueck();
      }
        else
      {
        vor();
      }
    }
    Sehe ich das so richtig?

    Oder schreibt man:

    sensor_vorne_mitte ODER sensor_vorne_rechts ODER sensor_vorne_links ODER .... USW kleiner als 70cm dann mach dies oder das ??
    Oder wie ich im Code geschrieben habe nach jedem Sensor die triggerDistanz?
    Meine Homepage www.belagra.de

  8. #78
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.210
    So ungefähr. Da müssen nur noch nen paar Klammern rein, sonst klappt das nicht:

    Code:
      if((distanz_VORNE_MITTE < triggerDistanz) || (distanz_VORNE_RECHTS < triggerDistanz) ||
      (distanz_VORNE_LINKS < triggerDistanz) || (distanz_RECHTS < triggerDistanz) || (distanz_LINKS < triggerDistanz))
    Im übrigen würde ich wenigstens unterscheiden: ist vorne rechts was, dann nach links ausweichen, ist links was, dann nach rechts.
    Und selbst das gibt noch keine gute Fahrstrategie, immerhin soll ja möglichst alles gemäht werden, also auch möglichst nahe an Hindernissen.
    Das ist dann der _wirklich_ schwierige Teil....

    Übrigens: was den Bumper angeht, das ist mechanisch recht simpel baubar: ne Art bewegliche Stosstange vorn (bisschen um die Ecken ziehen ggf.), schwingend aufgehängt, und nen Mikrotaster oder 2 dran, fertig.
    Die dann ganz knapp über dem Boden. Bei langsam fahrenden Maschinen funktioniert das.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  9. #79
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    So ungefähr. Da müssen nur noch nen paar Klammern rein, sonst klappt das nicht...
    Die Klammern sind nicht nötig.

  10. #80
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.210
    Hm-biste da sicher? Ich hatte schon nen paarmal damit Probleme...und eigentlich leuchtet es auch ein, da ja jeweils _nur_ die Ergebnisse der Vergleiche verODERT werden müssen.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

Seite 8 von 15 ErsteErste ... 678910 ... LetzteLetzte

Ähnliche Themen

  1. [ERLEDIGT] Umbau Roomba 581 von NiMh auf LiFePO4 (Lithium)... Testphase
    Von Zündfunke im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 15
    Letzter Beitrag: 25.07.2012, 17:02
  2. Antworten: 0
    Letzter Beitrag: 27.08.2011, 22:57
  3. Tchibo Reinigungsroboter Erfahrungen / Tips / Umbau
    Von joline im Forum Staubsaugerroboter / Reinigungs- und Rasenmähroboter
    Antworten: 123
    Letzter Beitrag: 02.02.2008, 22:59
  4. Antworten: 6
    Letzter Beitrag: 13.12.2007, 17:03
  5. umbau vom lego controllcenter zum steuergeräz für roboter
    Von leonmortiba im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 5
    Letzter Beitrag: 21.09.2004, 13:49

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen