- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 24

Thema: neues fahrgestell, arduino mega, RP6 M256-WIFi und Ardu_IO

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    was die kommunikation von m32 zum arduino per I2C betrifft - sind Dir irgendwelche beispiele an die ich mich anlehnen könnte bekannt?
    Wie ist denn die Aufgabenverteilung?
    M32 = Master, Arduino = Slave?
    Wer steuert die 4 Motoren an (Arduino)?
    Wer ist der Hauptprozessor z.B. für Navigation?

    Was soll über I2C von Master zu Slave übertragen werden (Fahrbefehle, Sensordaten ...)?
    Soll der Slave z.B. auch Daten (Motorfehler, Odometrie ...) zurücksenden?
    Gruß
    Dirk

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    Wie ist denn die Aufgabenverteilung?
    folgendes fällt mir dazu ein:

    -beide microprozessoren haben kontakt per bluetooth zum PC (datentransfer zum terminal, für berechnungen und zum flashen)
    -beide microprozessoren haben ein LCD display (M32 – 4x20, arduino2x16) für die darstellung eigener daten

    -es gibt keine odometrie, nur die steppermotoren können vom arduino überwacht werden (wie?)

    -M32 = master, arduino = slave
    -der hauptprozessor ist der auf M32

    -arduino soll verantwortlich für sicheres fahren des robbys sein (steppermotoren, US-sensor, linienfolger)
    -arduino bekommt die fahr-befehle / ziele / gyrodaten vom M32

    Sensoren/ module / funktionen auf der M32:

    -gesamtsteuerung des roboters / navigation
    -noch zu definierende aufgaben

    -IR-sender / empfänger (datenverkehr mit IR-baken)
    -gyro

    -bluetoothverbindung zum PC


    Sensoren/ module / funktionen am arduino-teil:

    -steppermotoren
    -US-entfernungsmesser
    -linienfolgemodul

    -überwachung und korrektur der motordaten (z.b. beim geradeausfahren)

    -überwachung des ladezustands der accupacks / spannungsüberwachung
    -um- / zu- schaltung der accupacks
    -überwachnung des ladevorgangs der accupacks

    -speakjet(?)
    -bluetoothverbindung zum PC
    gruß inka

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Das sieht ja gut aus. Viel Arbeit!
    -es gibt keine odometrie, nur die steppermotoren können vom arduino überwacht werden (wie?)
    Die Steppermotoren bewegen pro Schritt der Ansteuerung das Rad um einen bestimmten Winkel, z.B. 1° (je nach Motortyp).
    Dann wären also 360 Schritte eine Umdrehung und die Entfernung wäre zu berechnen.
    Gruß
    Dirk

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    hi Dirk,
    Das sieht ja gut aus. Viel Arbeit!
    stimmt, aber wenn ich etwas habe, dann ist es zeit...

    Die Steppermotoren bewegen pro Schritt der Ansteuerung das Rad um einen bestimmten Winkel, z.B. 1° (je nach Motortyp).
    Dann wären also 360 Schritte eine Umdrehung und die Entfernung wäre zu berechnen.
    so war meine frage eigentlich nicht gemeint, diese berechnungen habe ich bereits angewendet, bzw. die entspreche library verwendet...

    Mir ging es um folgenden, konkreten fall: Die ersten vier stepper, die ich eingebaut habe, liefen alle schön gleichmäßig, wahrscheinlich alle aus dem gleichen fertigungslos. Nachdem eines ausgefallen war - keine ahnung warum (vielleicht doch zu billig) habe ich es ersetzt, seitdem zieht der robby beständig nach rechts.
    Es müsste also eine überwachung her und zwar nicht auf der outputseite, sondern auf der seite wo die stepps entstehen. Das sehen aber die von der lib her vorgesehen funktionen offensichtlich nicht vor...

    das hier wäre die funktion für den fall, dass alles gut läuft, wo man nicht eingreifen muss, wo aber auch das eingreifen relativ schwierig wird:
    Code:
        for (idx = stepper_VL; idx < stepper_MAX; idx++) //alle Stepper vorwärts
        {
          stepper[idx].setRPM(12);
          stepper[idx].setSPR(4075.7728395);
          stepper[idx].setDirection(CW);
          stepper[idx].rotateDegrees(60); //rotate(1)
        }
    das ist die weniger elegante variante, vo aber alle Stepper einzeln angepasst werden können:

    Code:
        stepper[stepper_VL].setRPM(12);
        stepper[stepper_HL].setRPM(12);
        stepper[stepper_HR].setRPM(12);
        stepper[stepper_VR].setRPM(12);
    
    
        stepper[stepper_VL].setSPR(4075.7728395);
        stepper[stepper_HL].setSPR(4075.7728395);
        stepper[stepper_HR].setSPR(4075.7728395);
        stepper[stepper_VR].setSPR(4075.7728395);
    
    
        stepper[stepper_VL].setDirection(CW);
        stepper[stepper_VL].rotateDegrees(30);
        stepper[stepper_HL].setDirection(CW);
        stepper[stepper_HL].rotateDegrees(30);
        stepper[stepper_HR].setDirection(CW);
        stepper[stepper_HR].rotateDegrees(30);
        stepper[stepper_VR].setDirection(CW);
        stepper[stepper_VR].rotateDegrees(30);
    beide varianten lassen sich aber - so wie sie sind - nicht im laufendem betrieb an eine neu entstandene situation "automatisiert" einstellen. Z.b. wenn der gyro meldet - "achtung, abweichung vom nordkurs, gegensteuern!"...
    Ginge das so, dass ich die werte in den klammern durch variable ersetze und die je nach situation ändere?

    frohe ostern!
    gruß inka

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    55
    Beiträge
    2.199
    Ich denke schon, dass es geht.
    Am besten packst du z.B. trpm in nen eigenes Unterprogramm, und rufst das dann bei Bedarf auf:

    void drehZahl(float a,b,c,d)
    {
    stepper[stepper_VL].setRPM(a);
    stepper[stepper_HL].setRPM(b);
    stepper[stepper_HR].setRPM(c);
    stepper[stepper_VR].setRPM(d);
    }

    An das Unterprogramm schickst du dann einfach die gewünschten Werte:

    drehZahl(12.2, 17.45, 12.92, 14);

    Vermutlich musst du das dann jedes Mal vor run() aufrufen, bzw. dann, wenn sich da Änderungen ergeben.
    Was deine verlorenen Schritte angeht: kann es sein, dass das Programm einfach zu schnell läuft, so dass die Motoren einfach nicht nachkommen?
    Das Problem hat man bei Servos ja auch, wenn man zu oft neue Positionen schickt, erreichen sie manche gar nicht.
    Das kannst du mit isDone() offenbar überprüfen.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    danke für den tipp...
    Ich denke schon, dass es geht.
    Am besten packst du z.B. trpm in nen eigenes Unterprogramm, und rufst das dann bei Bedarf auf:

    void drehZahl(float a,b,c,d)
    {
    stepper[stepper_VL].setRPM(a);
    stepper[stepper_HL].setRPM(b);
    stepper[stepper_HR].setRPM(c);
    stepper[stepper_VR].setRPM(d);
    }

    An das Unterprogramm schickst du dann einfach die gewünschten Werte:

    drehZahl(12.2, 17.45, 12.92, 14);
    das werde ich ausgiebig testen , eigentlich müsste man die restlichen konfigurationsbefehle für die Stepper ähnlich manipulieren können, oder?

    Was deine verlorenen Schritte angeht: kann es sein, dass das Programm einfach zu schnell läuft, so dass die Motoren einfach nicht nachkommen?
    glaube ich nicht, dass die Stepper nicht nachkommen, vor allem ist es ja nur der neuer, ausgewechselter:
    das ist die loop:
    Code:
    void loop()
    {
      lcd.setBacklight(LOW);
      hindernis_vorh();
      {
        alle_stepper_vorwaerts();
        bewegung = bewegung + 1;
        fahrt_ausfuehren();
      }
      if (bewegung >= 20)
      {
        lcd.setBacklight(HIGH);
        //previous_millis = current_millis;
        bewegung = 0;
        for (pos_1 = 0; pos_1 < 180; pos_1 += 1)
        {
          myservo_1.write(pos_1);
          delay(15);
          myservo_2.write(pos_1);
          delay(15);
        }
        for (pos_1 = 180; pos_1 >= 1; pos_1 -= 1)
        {
          myservo_1.write(pos_1);
          delay(15);
          myservo_2.write(pos_1);
          delay(15);
        }
        myservo_1.write(90);
        delay(15);
        myservo_2.write(90);
        delay(15);
        lcd.setBacklight(LOW);
      }
    }
    und "fahrt_ausfuehren()" und "fahrt fertig()" verwenden ja schon "isDone":

    Code:
    boolean fahrt_fertig()
    {
      return        stepper[stepper_VL].isDone() && stepper[stepper_HL].isDone()
                    && stepper[stepper_VR].isDone() && stepper[stepper_HR].isDone();
    }
    
    
    void fahrt_ausfuehren()
    {
      while ( ! fahrt_fertig() )
      {
        for (idx = stepper_VL; idx < stepper_MAX; idx++)
        {
          stepper[idx].run();
          // delay(1);
        }
      }
    }
    gruß inka

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    55
    Beiträge
    2.199
    Zitat Zitat von inka Beitrag anzeigen
    das werde ich ausgiebig testen , eigentlich müsste man die restlichen konfigurationsbefehle für die Stepper ähnlich manipulieren können, oder?
    Denk ich schon.
    Das funktioniert bei den meisten Bibliotheken so oder ähnlich- es wird ja nur ne Art "Voreinstellung" übergeben, wieso sollte man die nicht auch ändern können.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    hallo allerseits,

    mehrer male bin ich bereits von den omni-move rädern und den standard TT rädern und wieder zurück gewechselt, die omni-move räder sind recht schwer, die normalen räder rutschen durch...

    Die idee nun: schneeketten

    Klicke auf die Grafik für eine größere Ansicht

Name:	DSCI4304-1.jpg
Hits:	11
Größe:	56,0 KB
ID:	32521Klicke auf die Grafik für eine größere Ansicht

Name:	DSCI4305-1.jpg
Hits:	18
Größe:	64,7 KB
ID:	32522Klicke auf die Grafik für eine größere Ansicht

Name:	DSCI4290-1.jpg
Hits:	10
Größe:	38,3 KB
ID:	32523Klicke auf die Grafik für eine größere Ansicht

Name:	DSCI4291-1.jpg
Hits:	9
Größe:	32,4 KB
ID:	32524

    hier ein video, jetzt muss ich noch testen bei welcher geschwindigkeit des motors die räder mit den ketten wirklich nicht durchdrehen...
    gruß inka

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    hallo,

    die eingebauten getriebemotoren sind alle vier mit ir-encodern versehen. Das habe ich damals gemacht weil ich mir nicht sicher war ob ich sie brauchen werde oder nicht. Den einen habe ich versuchsweise in einem tesprogramm verwendet, der code ist so:

    Code:
    void encoder_1_auslesen(void)
    {
      wert_[1] = digitalRead(encoder_1);
    
    
      if (vorwaerts_[1] == 1)
      {
    
    
        if (wert_[1] == 0 && zaehler_[1] == 0)
        {
          zaehler_[1] = 1;
        }
    
    
        else if (wert_[1] == 1 && zaehler_[1] == 1)
        {
          zaehler_[1] = 0;
          summe_[1] = (summe_[1] + wert_[1]);
          Serial.print(wert_[1]);
          Serial.print("    ");
          Serial.println(summe_[1]);
          Serial1.print(wert_[1]);
          Serial1.print("    ");
          Serial1.println(summe_[1]);
        }
      }
      else
      {
        if (wert_[1] == 0 && zaehler_[1] == 0)
        {
          zaehler_[1] = 1;
        }
    
    
        else if (wert_[1] == 1 && zaehler_[1] == 1)
        {
          zaehler_[1] = 0;
          summe_[1] = (summe_[1] - wert_[1]); //+
          Serial.print(wert_[1]);
          Serial.print("    ");
          Serial.println(summe_[1]);
          Serial1.print(wert_[1]);
          Serial1.print("    ");
          Serial1.println(summe_[1]);
        }
      }
    }
    es funktioniert soweit, wäre auch möglich das einfach mal auf vier zu erweitern. Würde wahrscheinlich dahingehend probleme bringen, dass die ausgelesenen werte praktisch nie identisch wären. Glaube ich zumindest...

    Jetzt die frage: Kann sich hier jemand vorstellen, dass es wirklich situationen geben kann, wo alle vier notwendig sind? Oder würde z. b. ein zweiter "übers eck" also vorne-rechts, wenn der im code hinten-links ist, abzufragen?

    würde mich über meinungen sehr freuen...
    gruß inka

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    24.07.2011
    Beiträge
    14
    Hallo Inka,

    sehr schönes Projekt !

    Leider habe ich keine Antwort auf Deine Frage.

    Mich würde aber interessieren, welche Getriebemotoren (mit ir-encodern) du genau verwendest (wenn möglich mit Bezugsquelle).
    Auch die Übersetzung wäre interessant. Dein Robbi ist ja auf den Videos recht flott unterwegs.

    Viele Grüße,

    Gerhard

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. RP6 - M256 WIFI Modul
    Von markus788 im Forum Robby RP6
    Antworten: 1
    Letzter Beitrag: 26.05.2013, 16:45
  2. Probleme mit M256 WIFI 1.2
    Von markus788 im Forum Robby RP6
    Antworten: 26
    Letzter Beitrag: 06.05.2013, 18:47
  3. M256 WIFI Modul
    Von markus788 im Forum Robby RP6
    Antworten: 11
    Letzter Beitrag: 20.02.2013, 20:30
  4. Verkaufe Robotsystem RP6v2 + WIFI-System M256 + CCPro Mega 128 incl. Prozessor
    Von oldy im Forum Kaufen, Verkaufen, Tauschen, Suchen
    Antworten: 1
    Letzter Beitrag: 15.01.2013, 17:51
  5. RP6v2 M256 WiFi !?
    Von Dirk im Forum Robby RP6
    Antworten: 20
    Letzter Beitrag: 11.05.2012, 19:27

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad