Servo Motoren ansteuern

Hallo,

wir haben in der Schule ein Projekt das nennt sich SIA, Schüler-Ingenieurs-Akademie. Hierbei geht es darum, ein selbst hergestelltes Fahrzeug (aus Aluminium) mit dem Arduino und Hilfskomponenten wie Motoren, Abstandssensoren usw. fahren zu lassen.
Ein Teil hiervon ist auch ein Greifer, bei diesem wird die Höhe über Servos gesteuert und die Zange vorne zum zugreifen auch.

Nun zum Problem:

  • der Servo lässt sich nicht richtig ansteuern, sobald das USB-Kabel und somit die Verbindung zur Arduino-Software getrennt ist. Solange die Verbindung besteht funktioniert dieses Programm einwandfrei und hält problemlos die Höhe.
#include <Servo.h>

Servo greifer_Hoehe;
Servo greifer_Zange;

int pin_greifer_Hoehe = 6;
int pin_greifer_Zange = 5;

int value_Gfront = 1;
int value_Ghigh = 1;

void setup() 
{
  pinMode(pin_greifer_Hoehe, OUTPUT);
  greifer_Hoehe.attach(pin_greifer_Hoehe);
  pinMode(pin_greifer_Zange, OUTPUT);
  greifer_Zange.attach(pin_greifer_Zange);
}

void loop() 
{

    greifer_Hoehe.write(147);
    greifer_Zange.write(158);
    delay(1000);

    greifer_Hoehe.write(100);
    greifer_Zange.write(100);
    delay(1000);
  

}

Vielen Dank für eure Antworten,
Ludwig

Was liefert USB? Strom!
Was fehlt vermutlich ohne USB? Strom!

In diese Richtung würde ich mal suchen :slight_smile:

Schaltplan?
Was versorgt denn die Sache wenn kein USB dran ist?

Stromversorgung ist durch den Akku gegeben, 9,6V.
5V von der Platine direkt runter an die entsprechenden Pins des Servos.

Ihr versorgt also mehrere Servos direkt über den Spannungsregler des Arduino?
Dann wundert euch bitte nicht, wenn da mal irgendwo Rauch raus kommt-ihr überlastet das Ding total!

Das macht man auf gar keinen Fall-dafür ist der Arduino nicht ausgelegt.
Die Servos werden an die entsprechden Steuerpins mit ihrer Signal-Leitung (meist orange oder gelb) angeschlossen, Masse kommt an Masse des Aruino, aber die 5V unbedingt anderweitig besorgen.

Mit einem Step Down Regulator bekommt man aus den 9,6 V die gewünschten 6 oder 5 V.

naja das bekomme ich schon, wenn ich einfach nach 4 1,25 V Akkus nen Kabel raus lege. Das habe ich schon probiert, aber es hat nichts gebracht.

Dann liefern Deine Akkus möglicherweise nicht genügend Strom. Aber für eine genauere Analyse fehlen Infos!

Ich kann nachher mal das Verkabelungsschema hier posten, wie wir es löten sollten. In der Platine beim löten sind aber keine Fehler

Ludwig98Mueller:
In der Platine beim löten sind aber keine Fehler

Das glaube ich auch immer, bis ich eine kalte Lötstelle finde :smiley:

Hier ist der Lötplan, das 5V Kabel geht direkt zum Akku.

Was bitte, solln das sein? Erinnert irgendwie an Höhlenmalerei... :o

Sorry, aber......wenn ihr so baut wie ihr zeichnet, kann man nur "viel Glück" wünschen.
Zum Akku: ich vermute mal auch, der schafft den Strom nicht.
Und dann: es ist generell gar keine gute Idee, nen Akkupack einfach mitten drin irgendwo anzuzapfen.
Näheres dazu findet man in allen elektrischen Grundlagen.

Also baut das ordentlich, mit nem eigenen Spannungswandler-kostet kaum was und funktioniert dann auch. Vorausgesetzt, die Akkus sind wirklich ausreichend (irgendwelche Mickymaus-Billig-NiMh in AA-Grösse dann eher nicht).
Fragt mal eueren Lehrer, ob er euch nicht wenigstens die einfachsten Grundlagen der Elektrotechnik/Elektronik bei bringen könnte, ehe er euch "Roboter" bauen lässt- nötig wärs.

Mir is das schon klar das der Lötplan total... Naja sagen wir mal sehr individuell gestaltet ist. Akku abzapfen is eig auch nicht mein ding, aber mal schauen was er meint.

Also es lag einfach am Servo, mir hat man, leider, einen defekten Servo untergejubelt. Man konnte den einfach mit der Hand ohne Widerstand drehen! Jetzt mit Ersatzservo funktioniert alles einwandfrei

Ludwig98Mueller:
Jetzt mit Ersatzservo funktioniert alles einwandfrei

Danke für die Rückmeldung!

Ja kann ja eigentlich nur daran liegen, wenn das Programm richtig geschrieben ist. Und an dem Roboter unseres Lehrers funktionierte mein Programm einwandfrei

Man dreht Servos niemals per Hand.
Vermutlich hast du es damit erst zerstört- viele Servogetriebe halten das nämlich nicht aus.
Erst recht dann nicht, wenn das Servo Strom hat.

naja ich hab es nicht mit Absicht gedreht, Strom war auch nicht drauf! Das Problem war von Anfang an, schon beim auseinander nehmen des alten Roboterfahrzeugs hat dieser ncith richtig funktioniert, liegt wahrscheinlich daran, dass der Greifer relativ schwer ist und kein Gegengewicht vorhanden ist. Wenn dann vorne noch ein massiver Aluminiumkegel hängt, dann ist die Belastung noch höher. Er hat von Anfang an schon nicht richtig funktioniert, also möchte ich diese Möglichkeit auch nicht ausschließen.

Wie löst Ihr die Problematik der Anfangsstellung? Beim Einschalten weiß der Arduino ja nicht, wo der Servo steht. Wenn er dann die Sollposition 90° bekommt, zuckt er mit maximaler Geschwindigkeit in diese Position, was für das Servogetriebe schädlich sein könnte.

Wenn das Thema für Dich relevant ist: RC-Servo mit Istpositionsmeldung - Anfangszucken eines Servos unterdrücken

Ich fand einen Kohlekran mit "sausender" Schaufel nicht so toll.

Also die Anfangspoition kenne ich, da der Servo direkt (wegen der Gewichtskraft) in die unterste Position fällt. Meine Möglichkeit dann den Arm langsam zu steuern ist relativ simpel:
Es folgen nun nur Einzelauszüge aus dem Hauptprogramm:

#include <Servo.h>

Servo greifer_Hoehe;


/* define global variables for IN- and OUTPUTS: */

int pin_greifer_Hoehe = 6;

int value_Ghigh = 1;

char empfangen;
String zsg;
  



void setup()
{
  Serial.begin(9600);  

  pinMode(pin_greifer_Hoehe, OUTPUT);
  greifer_Hoehe.attach(pin_greifer_Hoehe);

  greifer_Hoehe.write(108);
}
void loop()
{
  

  /* receive letters and numbers from the app via bluetooth: */
  
  while(Serial.available())
  {
    delay(3);
    empfangen = Serial.read();
    zsg += empfangen;
  }

  Serial.println(zsg);
    if(zsg == "GUp")
    {
      if(value_Ghigh == 0)
      {
        for(int idx = 108; idx <= 50; idx--)
        {
          greifer_Hoehe.write(idx);
          delay(10);
          value_Ghigh = 1;
        }
      }
      greifer_Hoehe.write(50);
  
    }  
    
    if(zsg == "GDown")
    {  
      if(value_Ghigh == 1)
      {
        for(int idx = 50; idx <= 108; idx++)
        {
          greifer_Hoehe.write(idx);
          delay(10);
        }
        value_Ghigh = 0;
      }
      else
        greifer_Hoehe.write(108);
    }

Ich denke das müsste das meiste sein, was man zum Verständnis braucht. die delays in den for-Schleifen sorgen dafür, dass der Greifer einen Moment lang Zeit hat die Position einzunehmen. Je nach dem wie groß, kann man damit die Geschwindigkeit relativ genau steuern. Wenn jemand Verbesserungsvorschläge hat, dann gerne her damit :wink:
Ich kann auch mal das ganze Programm reinstellen wenn es jemanden interessiert.