- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 26

Thema: sainsmart-car mit omni wheels

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Lt. Datenblatt schalten die ab, wenn die zu heiß werden. Das könnte das Aussetzen erklären. Defekt vielleicht noch nicht. Aber einer von den ICs wird sehr heiß. Ich würde die Verkabelung prüfen, ob irgendwo ein Kabel - aus Versehen - quer hängt und Kurzschluss verursacht (Platinenunterseite evtl. oder sonst wo). Sind alle Kabel fest in den Klemmen verschraubt? Sind die Klemmen alle eingelötet oder ist eine Klemme auf der Platine lose? Die Schraubklemmen kann man u.U. nachlöten, manchmal sind solche Klemmen auch nicht sauber verlötet. Es muss einen Grund haben, warum ein IC zu heiß wird. Auch die Lötpunkte anschauen, ob irgendwo Zinn quer hängt und evtl. eine Brücke bildet. Und man könnte, wenn dieser Fehler mal behoben ist, auch noch Kühlkörper drauf setzen, wegen dem Abschalten, bei Überhitzung.


    MfG

    - - - Aktualisiert - - -

    Vielleicht ist es auch ein Motor, der ständig zu viel Strom zieht. Kabel alle richtig angelötet (Kurzschluss über Motorgehäuse ausschließen). Motoren mal abklemmen und einzeln anschließen. Vielleicht findest Du so heraus, welcher Probleme macht (vielleicht wird ein Motor auch warm).

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    damals, 2017, gab es diese probleme nicht, jetzt beim einsetzen der neuen akkus kann sich an den anschlüssen tief drinnen in dem ganzen was halb gelöst haben...
    Also morgen aufmachen. Das ist bei mir immer so wie bei den chirurgen eine OP am offenen herzen. Freue mich schon drauf
    gruß inka

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Ich habe diese Gefährte letztens auch irgendwo gesehen. Schlecht sind die nicht - so vom Erscheinungsbild.

    Aber ich muss mal sagen, dass Du ganz schön viele Geräte angeschafft hast. Wieviele Roboter hast Du noch so?

    Dann viel Spaß beim Auseinanderbauen!
    Ich bin immer froh, wenn etwas zusammen ist und ich es nicht aufmachen muss.


    MfG

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    Zitat Zitat von Moppi Beitrag anzeigen
    Ich habe diese Gefährte letztens auch irgendwo gesehen. Schlecht sind die nicht - so vom Erscheinungsbild. Dann viel Spaß beim Auseinanderbauen!
    das gehäuse ist nicht schlecht, allerdings habe ich als erstes die gewinde im 1,5mm alu(!) durch setzmuttern aus V2A ersetzt, sonst wäre es heute nur noch schrott - wegen dauernd auseinander nehmen

    Ich versuche es aber erstmal mit einem kühlkörper, manchmal muss man den weg des geringeren widerstandes gehen - ich hab einfach schiss, dass da noch mehr kaputtgeht...

    @Rabenauge:
    Das neuere Motorshield kenne ich nicht. Das ältere konnte nur max. 600mA, wenn ich mich recht entsinne. Da hab ich, auf die beiden Treiber, huckepack einfach noch welche raufgelötet (den Tip hatte ich irgendwo bekommen)- das verdoppelt die Leistung.
    Du meinst bestimmt diese abenteuerliche konstruktion:
    Klicke auf die Grafik für eine größere Ansicht

Name:	20200127_110116.jpg
Hits:	7
Größe:	60,2 KB
ID:	34771
    gruß inka

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.210
    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..

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    ich weiss nicht ob das herausnehmen der angabe der fahrtdauer aus der "millis-schleife" das problem löst:
    Code:
    void zwei_sec_links_rotieren(void)
    {
      currentMillis = millis();
      dauer_fahrt = 2000;
    
      if (currentMillis - previousMillis > dauer_fahrt)
      {
    
        Serial.println("zwei sec links 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(BACKWARD);
        motor_hr->run(FORWARD);
        motor_vr->run(FORWARD);
        motor_vl->run(BACKWARD);
    
      }
    }
    der code wird in der loop so aufgerufen:
    Code:
      zwei_sec_links_rotieren();
      delay(500);
      alle_motoren_halt();
    und die räder drehen eine halbe sekunde und nicht zwei. Ich verstehe es nicht, in anderen beispielen funktioniert es so mit den millis...
    gruß inka

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Die halbe Sekunde kommt wohl von "delay(500);"

    Das mit dem Code haut so nicht hin. Der muss anders gestaltet werden. Du willst doch "delay" raus haben.

    Zuerst startest Du die Motoren.
    Dann wartest Du in "loop()", bis 2 Sekunden um sind.
    Dann stoppst Du die Motoren.

    Die Funktion "
    void zwei_sec_links_rotieren(void)" ist von der Namensgabe her schon so nicht brauchbar, weil sie was falsches vermittelt, was Du dann vermutlich innerhalb der Funktion umzusetzen versuchst, weil ja sonst die Logik nicht zum Namen der Funktion passt.

    Also mal anders denken, hier ein Beispiel:

    Was brauchst Du für Funktionen?

    Code:
    void  links_rotieren(void){   
    
        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(BACKWARD);
        motor_hr->run(FORWARD);
        motor_vr->run(FORWARD);
        motor_vl->run(BACKWARD);
    }
    
    
    void alle_motoren_halt(void){
        
        ...
    
    
    }


    Welche Variablen außerhalb von "loop()" brauchst Du?

    Code:
    int status = 0;
    unsigned long previousMillis, currentMillis, dauer_fahrt;


    Wie in "loop()" aufrufen?

    Code:
    currentMillis = millis();
    
    
    if (status == 0) {
            status = 1;
            previousMillis = currentMillis;
            dauer_fahrt = 2000;
            links_rotieren();
    }
    
    
    if (status == 1  &&  (currentMillis - previousMillis) > dauer_fahrt) {
            alle_motoren_halt();
    }


    PS: der Code soll nur am Beispiel zeigen, wie es funktionieren kann.

    MfG

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.210
    Das neuere Motorshield kenne ich nicht.
    Das ältere konnte nur max. 600mA, wenn ich mich recht entsinne.
    Da hab ich, auf die beiden Treiber, huckepack einfach noch welche raufgelötet (den Tip hatte ich irgendwo bekommen)- das verdoppelt die Leistung.

    Und nö: so einfache Sachen wie ne Motoransteuerung mache ich ohne Bibliothek- man weiss nie ganz genau, was die im Hintergrund treiben.
    Und: da kommt sich auch schnell mal was in die Quere- die eine Bibliothek schnappt sich nen Interrupt, den ich eigentlich wo anders brauche, oder ähnliche Überraschungen.
    Da halt ich es wie Moppi: nur das, was mir zu kompliziert wird (beispielsweise WS 2812-RGB-LED-Streifen).
    Im XPlorer hab ich genau diese eine Geschichte mit ner Bibliothek gemacht (FastLED)- alles andere zu Fuss.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    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. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    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 1 von 2 12 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
  •  

12V Akku bauen