- LiFePO4 Speicher Test         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 26

Thema: sainsmart-car mit omni wheels

  1. #11
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    55
    Beiträge
    2.198
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Cooles Konstrukt!

    Ich hab keinen Kühlkörper raufgemacht, das war nicht nötig (keine Ahnung mehr, wofür ich das Ding das letzte mal verwendet hatte, ist ewig her-> ich mag Shields nicht).
    Das mit den aufgedoppelten Treibern sieht aber tatsächlich so aus- und funktioniert super.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  2. #12
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    Zitat Zitat von Moppi Beitrag anzeigen
    Lt. Datenblatt schalten die ab, wenn die zu heiß werden. Das könnte das Aussetzen erklären. Defekt vielleicht noch nicht..... Und man könnte, wenn dieser Fehler mal behoben ist, auch noch Kühlkörper drauf setzen, wegen dem Abschalten, bei Überhitzung.
    habe beim aufmachen keinen fehler finden können, aber mit aufgesetzten kühlkörper
    Klicke auf die Grafik für eine größere Ansicht

Name:	2020_01_27_kühlkörper.jpg
Hits:	11
Größe:	81,0 KB
ID:	34775
    geht es einwandfrei, also ohne aussetzer. Ein bischen musste ich noch die maximale geschwindigkeit reduzieren. Aber es ist ja auch kein RC-flitzer...

    EDIT:
    hier ein video... ich bin von der omni wheels einfach begeistert!

    Und jetzt geht's an die encoder, im moment wird die dauer der bewegungen alleine über die zeit gesteuert...
    Geändert von inka (27.01.2020 um 17:40 Uhr) Grund: video hinzu
    gruß inka

  3. #13
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.645
    Ganz schön groß. Mit den Rädern drinnen gut unterwegs. Das gibt einen super Staubsaugerchassis ab. Die Bewegungen sind schon so.


    MfG

  4. #14
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    Zitat Zitat von Moppi Beitrag anzeigen
    Ganz schön groß. Mit den Rädern drinnen gut unterwegs. Das gibt einen super Staubsaugerchassis ab. Die Bewegungen sind schon so.
    meinst Du jetzt den roboter oder den kühlkörper?

    btw: mein Roboterstaubsauger ist gemütlicher unterwegs

    aber was anderes, zu den encodern. Du verwendest doch auch die von den TT-motoren:

    ich kann alle vier abfragen, sie funktionieren also alle. Um sie nutzen zu können, braucht man ja für eine auf den momentanen stand aufbauenden aktion den momentanen wert, oder sie müssen zu dem zeitpunkt auf "0" gesetzt werden, bevor bei einem bestimmten wert diese eine aktion dann ausgeführt wird. Ein stopp z.b. Wie machst Du das?
    - 0-wert, oder
    - den momentanen stand abfragen?
    gruß inka

  5. #15
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.645
    Zitat Zitat von inka Beitrag anzeigen
    meinst Du jetzt den roboter oder den kühlkörper?
    Sorry, ich bezog mich auf das Video.

    TT-Motoren:

    Ich benutze diese Lochscheiben, die dabei waren.
    Wie mach ich das? - Ich benutze eine Gabellichtschranke, wo die Lochscheibe drin dreht.
    Ich habe aber ein Oszi dran gehängt. Das sind sehr schöne Rechtecksignale, die meine Lichtschranke liefert. Je langsamer die Lochscheibe läuft, desto länger werden die Impulse (LOW wird länger und HIGH wird ebenfalls länger). An dieser Länge kann man also th. die Geschwindigkeit berechnen bzw. ablesen. Manche Leute versuchen die Impulse zu zählen, finde ich aber unpraktisch, weil man über eine längere Zeit zählen muss und keinen Impuls verlieren darf.


    MfG
    Geändert von Moppi (28.01.2020 um 16:32 Uhr)

  6. #16
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.056
    Man zählt die Impulse (also z.B. steigende Flanke) mit einem Interrupt oder gibt diesen auf einen Timer/Counter Anschluss. Dann wird automatisch gezählt.

    Ich würde aber mit einem INT die Impulse zählen und mittels Timer dann den Zählwert auslesen und auf 0 stellen.

    MfG Hannes

  7. #17
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    ich spiel jetzt einfach mal ein bischen mit dem teil und versuche das er sich so bewegt, wie ich's will. Was ich nicht verstehe ist folgendes:

    bei diesem
    Code:
    void zehn_ms_rechts_rotieren(void)
    {
      currentMillis = millis();
      servo_mitte();
      if (currentMillis - previousMillis > dauer_fahrt)
      {
    
        Serial.println("zehn ms rechts rotieren");
        motor_hl->setSpeed(s_speed);
        motor_hr->setSpeed(s_speed+1);
        motor_vr->setSpeed(s_speed+1);
        motor_vl->setSpeed(s_speed);
    
        motor_hl->run(FORWARD);
        motor_hr->run(BACKWARD);
        motor_vr->run(BACKWARD);
        motor_vl->run(FORWARD);
    
        dauer_fahrt = 10;
    
      }
    }
    
    
    void halbe_sec_rechts_rotieren(void)
    {
      currentMillis = millis();
      servo_mitte();
      if (currentMillis - previousMillis > dauer_fahrt)
      {
    
        Serial.println("halbe sec rechts rotieren");
        motor_hl->setSpeed(s_speed);
        motor_hr->setSpeed(s_speed+1);
        motor_vr->setSpeed(s_speed+1);
        motor_vl->setSpeed(s_speed);
    
        motor_hl->run(FORWARD);
        motor_hr->run(BACKWARD);
        motor_vr->run(BACKWARD);
        motor_vl->run(FORWARD);
    
        dauer_fahrt = 500;
    
      }
    }
    
    void zwei_sec_rechts_rotieren(void)
    {
      currentMillis = millis();
      servo_mitte();
      if (currentMillis - previousMillis > dauer_fahrt)
      {
    
        Serial.println("zwei sec rechts rotieren");
        motor_hl->setSpeed(s_speed);
        motor_hr->setSpeed(s_speed+1);
        motor_vr->setSpeed(s_speed+1);
        motor_vl->setSpeed(s_speed);
    
        motor_hl->run(FORWARD);
        motor_hr->run(BACKWARD);
        motor_vr->run(BACKWARD);
        motor_vl->run(FORWARD);
    
        dauer_fahrt = 2000;
    
      }
    }
    wobei die richtungsangaben hier nur als beispiel zu sehen sind. Aufgerufen wird das hiermit:
    Code:
      zwei_sec_links_rotieren();
      delay(500);
      zwei_sec_links_schieben();
      delay(500);
      zwei_sec_rueckwaerts();
      delay(500);
      zwei_sec_rechts_schieben();
      delay(500);
      zwei_sec_vorwaerts();
      delay(500);
    
      encoder_auslesen();
      Serial.println(out_s);
    was mich wundert ist, dass die einzelnen bewegungen, egal ob ich nun 10ms, eine halbe sekunde, oder 2 sec wähle fast gleich lang dauern. Hängt das womöglich mit den ganzen servo und printbefehlen in den funktionen zusammen?
    gruß inka

  8. #18
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    55
    Beiträge
    2.198
    Wenn du das _so_ lösen willst, wirst du eher ne while()-Schleife brauchen.
    Der prüft in deinem Beispiel einmal, ob die Bedingung wahr ist, schaltet dann die Motoren kurz entsprechend und ist aus der Schleife wieder raus.
    Vermutlich sorgt dann dein delay(500) im anderen Programmteil dafür, dass die halt ne halbe Sekunde lang so bleiben, wie sie eingeschalten wurden.


    Allerdings frage ich mich, wieso du die Motoren zeitgesteuert handlen willst- warum nicht Ereignisgesteuert?
    Du hast doch Drehgeber- damit wird es wesentlich einfacher, z.B. Fahrwege zu berechnen, oder auch Kurvenradien.
    Zeitgesteuert wird das nie was...
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  9. #19
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    das mit der ereignissteuerung ist noch in der mache...
    Dieser
    Code:
    void halbe_sec_vorwaerts(void)
    {
      currentMillis = millis();
    
      if (currentMillis - previousMillis > dauer_fahrt)
      {
        Serial.println("halbe sec vorwärts");
        motor_hl->setSpeed(s_speed);
        motor_hr->setSpeed(s_speed+1);
        motor_vr->setSpeed(s_speed+1);
        motor_vl->setSpeed(s_speed);
    
        motor_hl->run(FORWARD);
        motor_hr->run(FORWARD);
        motor_vr->run(FORWARD);
        motor_vl->run(FORWARD);
        dauer_fahrt = 500;
    
      }
    }
    sorgt doch dafür, dass die motoren für (hier) eine halbe sekunde mit der hier vorgegebenen geschwindigkeit und richtung eingeschaltet werden und bleiben. Also dass der roboter 30sec in eine bestimmte richtung fährt, während er auch was anderes machen kann...
    Oder habe ich da wieder mal was missverstanden?
    die delay alternative machte das zumindest, allerdings blockierend, was ich ja nicht will...
    gruß inka

  10. #20
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.645
    Hallo,

    Wenn ich es richtig sehe, hast Du schon den richtigen Ansatz genommen.
    Hier so ein ähnlicher:

    1. Du erstellst eine Variable zum Zählen: count oder delay
    2. Du durchläufst den Code ohne die Standrad-Delay-Funktion aufzurufen.
    3. Am Anfang von loop() ermittelst Du die verstrichene Zeit, dafür gibt es z.B.: millis()
    4. aus diesem Miilis()-Wert und dem Letzten ermittelst Du, durch Subtraktion, die Differenz.
    5. In einer Schleife kannst Du deine Zählervariable herunterzählen, solang diese (und die berechnete Differenz der Millis) noch größer "0" ist.
    6. Wenn Deine Zählervariable "0" erreicht hat, führst Du die Aktion aus.

    Alternative für Schritt 5: statt die Zählervariable per Schleife herunter zu zählen, kannst Du auch eine schnellere Variante, mit Subtraktion, wählen.
    Wenn also der Wert der Zählervariable größer ist, als die o.g. berechnete Differenz, ziehst Du die Differenz von der Zählervariable ab und fertig.
    Wenn der Wert der Zählervariable kleiner ist, als die Differenz, setzt Du die Zählervariable auf "0" und bist ebenfalls fertig.

    Dein Ansatz funktioniert auch.

    MfG

    - - - Aktualisiert - - -

    Ich glaube, da ist noch ein Fehler. Du willst, dass die Schleife eine bestimmte Zeit durchlaufen wird und dann nicht mehr. Das müsste dann eigentlich wie folgt aussehen.

    Code:
      dauer_fahrt = 500;
    
      if (currentMillis - previousMillis < dauer_fahrt)  {
          Serial.println("halbe sec vorwärts");    
          motor_hl->setSpeed(s_speed);    
          motor_hr->setSpeed(s_speed+1);    
          motor_vr->setSpeed(s_speed+1);    
          motor_vl->setSpeed(s_speed);    
          motor_hl->run(FORWARD);    
          motor_hr->run(FORWARD);    
          motor_vr->run(FORWARD);    
          motor_vl->run(FORWARD);  
    }
    Geändert von Moppi (31.01.2020 um 16:44 Uhr)

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Ähnliche Themen

  1. Mecanum-Wheels -Bot will nicht richtig..., aber warum ??
    Von oderlachs im Forum Sonstige Roboter- und artverwandte Modelle
    Antworten: 10
    Letzter Beitrag: 23.07.2016, 11:37
  2. Antworten: 1
    Letzter Beitrag: 02.11.2015, 15:57
  3. Roboterbasis mit Mecanum Wheels
    Von malthy im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 37
    Letzter Beitrag: 31.08.2015, 19:09
  4. SainSmart uno r3-atmega328
    Von Droggelbecher im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 18
    Letzter Beitrag: 04.01.2013, 11:57
  5. Pulling Test - Wheels, Tyres and Traction
    Von Vogon im Forum Mechanik
    Antworten: 4
    Letzter Beitrag: 08.02.2006, 18:34

Berechtigungen

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

Labornetzteil AliExpress