Aus Raspberry Pi Geek 10/2018

Fischertechnik-Roboter via RasPi ansteuern (Seite 4)

Das Programm roboter.c – Sie finden den kompletten Quellcode in den Downloads zu diesem Artikel – initialisiert den Roboter zuerst mit der Funktion initRobot(): Die Motoren fahren alle solange nach rechts, bis sie die Nullpunkttaster erreichen. Es mag Ihnen vorkommen, als würde nichts passieren. Das liegt daran, dass die Routine zum Initialisieren nicht weiß, wo der Motor der entsprechenden Achse steht, und daher solange warten muss, bis der Motor sicher bis zur Nullposition kommt.

Nach dem Setup fährt die Software den Roboterarm in die Startposition (gotoStartPosition()). Das geschieht, damit der Roboter immer von einer definierten Position aus seine Aufgaben erledigt – es wäre schwierig, ein Programm zu schreiben, ohne einen immer gleichen Startpunkt zu haben.

Nach dem Erreichen der Startposition wartet das Programm darauf, dass einer der beiden Taster ein Signal sendet. Ist Taster S1 am Zug, fährt der Roboter das Band 3 an, greift den Gegenstand und befördert in zu Band 1, wo er ihn ablädt. Kommt das Signal vom Taster S2, holt der Roboter den Gegenstand von Band 3 und legt ihn auf Band 2 ab. Um einen besseren Eindruck davon zu bekommen, wie das gemeint ist, finden Sie online ein Video, dass den Aufbau in Aktion zeigt [3].

Beachten Sie, dass alle Positionen, die der Roboter anfährt, empirisch ermittelt wurden. Wenn Sie dieses Projekt nachbauen, setzt das voraus, dass Sie alle Positionen an Ihren konkreten Aufbau anpassen. Möchten Sie die Bibliothek verwenden, um ein eigenes Projekt für den Roboter aufzubauen, haben Sie komplett freie Hand, wie Sie das Programm schreiben.

Listing 8 zeigt lediglich die Funktion main() des Programms. Nach der Initialisierung wartet die Software darauf, dass einer der beiden Taster ein Signal sendet.

Listing 8

 

int main(void) {
  wiringPiSetup();
  firopiSetup();
  initRobot();
  gotoStartPosition();
  for (;;) {
    if (digitalRead(5)==1){
      band3to2();
    }
    if (digitalRead(1)==1){
      band3to1();
    }
  delay(50);
  }
}

Die Funktion gotoStartPosition(); definiert für jede Achse eine Startposition und dreht den Motor abhängig von der aktuellen Position entweder nach rechts oder nach links. Listing 9 zeigt beispielhaft die Befehle für die Rotationsachse.

Listing 9

 

targetRotate=1400;
  if (positionRotate>targetRotate){
    motorRotateTurnRight();
    for(;positionRotate>targetRotate;){
      delay(100);
      }
    }else{
    motorRotateTurnLeft();
    for(;positionRotate<targetRotate;){
      delay(100);
      }
    }

Zuletzt werfen wir noch einen Blick in die Funktion band3to1() (Listing 10). Sie sorgt dafür, dass die Teile nacheinander alle notwendigen Positionen anfahren, um die Bänder zu beladen. Prinzipiell funktioniert es immer nach demselben Schema: Target-Wert vorgeben und dann den Motor entsprechend bewegen.

Listing 10

 

void band3to1(void){
  printf("Button1 pressed\n");
  targetRotate=1750;
  motorRotateTurnLeft();
  for(;positionRotate<1750;){delay(100);}
  targetLift=1070;
  motorLiftTurnLeft();
  for(;positionLift<1050;){delay(100);}
  targetGoOut=80;
  motorGoOutTurnLeft();
  for(;positionGoOut<80;){delay(100);}
  targetGrab=20;
  motorGrabTurnLeft();
  delay(2000);
  motorGrabStop();
  targetLift=800;
  motorLiftTurnRight();
  for(;positionLift>800;){delay(100);}
  targetRotate=1200;
  targetGoOut=20;
  motorRotateTurnRight();
  motorGoOutTurnRight();
  for(;positionRotate>1200;){delay(100);}
  for(;positionGoOut>20;){delay(100);}
  targetLift=1070;
  motorLiftTurnLeft();
  for(;positionLift<1050;){delay(100);}
  targetGrab=5;
  motorGrabTurnRight();
  for(;positionGrab>5;){delay(100);}
  targetLift=600;
  motorLiftTurnRight();
  for(;positionLift>600;){delay(100);}
  gotoStartPosition();
}

Die zahlreichen For-Schleifen dienen dazu, zu warten, bis eine Bewegung abgeschlossen ist, bevor die nächste beginnt. Es wäre alternativ möglich, alle Achsen gleichzeitig zu bewegen – das endet meistens aber in einem Chaos. Möchten Sie doch einmal mehrere Achsen gleichzeitig bewegen, finden Sie in der Mitte des Code-Fragments eine Stelle in der motorRotateTurnRight() und motorGoOutTurnRight() gleichzeitig laufen.

Eine weitere kleine Besonderheit stellt der Greifer dar: Je nachdem, wie exakt er die Ladung zu fassen bekommt, blockiert er eventuell zu früh und erreicht dann nicht den Target-Wert. Um das Problem zu umgehen, schließt die Software ihn einfach immer zwei Sekunden lang. Da alle Bausteine kurzschlussfest sind, entsteht dadurch kein Schaden. Beim Öffnen nutzt das Programm die bewährte Methode mit den Target-Werten. Die Funktion band3to2() arbeitet nach demselben Schema.

Wenn Sie beginnen, ein eigenes Projekt aufzubauen, seien Sie nicht zu ungeduldig. Dieser Artikel zeigt nicht, wie oft der Roboter im Test daneben gegriffen oder Teile der Anlage umgestoßen hat. Es gab sogar einige Crashs, nach denen erst einmal Reparaturen nötig waren. Lassen Sie sich also nicht entmutigen, wenn nicht alles auf Anhieb läuft. Und machen Sie sich keine Sorgen: Die Fischertechnik-Bauteile sind äußerst robust und nicht kaputt zu bekommen.

Fazit

Der Fischertechnik-Roboter ist für einen Geek ein wirklich tolles Spielzeug – eventuell sogar viel mehr als nur das: Hier können Sie die Grundlagen der Robotik üben und das hardwarenahe Programmieren von Interrupts erlernen. Das ist etwas, was es im Alltag eines Programmierers eher selten gibt.

Das Modell eignet sich darüber hinaus sehr gut für die Ausbildung und bietet für Azubis eine willkommene Abwechslung zu den sonstigen Aufgaben. Da Fischertechnik so extrem flexibel ist, fällt es leicht, schnell einmal etwas an der Hardware des Roboters zu ändern. Auch der Preis spricht für das Fischertechnik-Angebot: Der Roboter ist im Versandhandel für etwa 150 Euro zu haben, die Teile für die Ansteuerelektronik kosten knapp 20 Euro. Damit liegen Sie im Vergleich mit ähnlich leistungsfähigen Modellen eher günstig. 

Der Autor

Der Martin Mohr hat die komplette Entwicklung der modernen Computertechnik live miterlebt. Nach einem Informatikstudium entwickelte er überwiegend Java-Applikationen. Mit dem Raspberry Pi erwachte seine alte Liebe zur Elektronik wieder.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 8 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben