|
Programmierung der Industry Robot mit Java 6 und BlueJEine Auswahl der Industry Robots. Hier zur Programmierung über das Robo Interface und ftcomputing.robo.jar. Aufbau der Robots nach Bauanleitung mit Säule an M1, Endtaster I1,
Impulstaster I2, Downloads : workSpace34.zip Klasse RobTut : Säule fährt Home und dann nach rechtsImport, Klasse und Konstruktorimport ftcomputing.robo.*; Säule fährt linksdrehend an ihre Home-Position public void goHome() { System... zur Anzeige der aktuellen Aktivität auf der Konsole. Säule dreht rechts um die angegebene Schrittzahl public void goRight(int Inc) { setMotor mit zusätzlichem Parameter Impulszahl. Die Methode wird asynchron ausgeführt. Bei Erreichen der vorgegebenen Impulszahl wird der Motor wieder abgeschaltet. Das Programm läuft derweil weiter. Da hier sonst nichts zu tun ist, wird hier schlicht gewartet (waitForMotors). Der Parameter 0 steht dabei für Warten bis fertig. Testen mit BlueJAuf das Klassensymbol von RobTut rechtsklicken und ein neues Objekt anlegen. Darauf klicken und die interessierende Methode aufrufen. Achtung : Nach Änderungen in der Source muß das BlueJ vorher noch zurückgesetzt werden (Rechtsklick auf das Run-Symbol). Alternativ können die interessierenden Befehle oder Methoden auch im Direkteingabe-Fenster eingegeben werden. Als erster Befehl muss dann eine RobTut = ft new RobTut() Instanz angelegt werden. Testen mit BlueJ : Methode Mainpublic class RobMain { Eine zweite Klasse mit der statischen Methode main() anlegen und in ihr die interessierenden Befehle unterbringen. RobTutZwei : Der gesamte Robot wird gescheuchtImport, Klasse und Konstruktorimport ftcomputing.robo.*; Es wird ein Array angelegt, der die aktuelle Position der Robot-Komponenten in Impulsen ab Home (Endtaster) enthält. Die Verbindung zum Interface wird jetzt in einer eigenen Methode hergestellt. Hinzu kommt eine weitere Methode für das Beenden der Verbindung. Macht zwar im Testbetrieb etwas mehr Arbeit, erleichtert aber auch die Arbeit. Anfahren der Home-Position public void driveHome(int motNr) { Angefahren wird die Home-Position einer Komponente. Die zugehörende Motornummer wird als Parameter übergeben. Die Nummer des Endtasters wird aus der Motornummer ermittelt. Die eigentliche Home-Funktion entspricht dem schon bekannten goHome. Hinzugekommen ist noch ein Null-Setzen der aktuellen Position. Anfahren einer vorgegebenen Position - Impulse ab Home public void driveTo(int motNr, int pos) { Die Methode ist komfortabler als die bekannte goRight, aber auch komplizierter. Mit dem if-Konstrukt wird zunächst einmal die erforderliche Drehrichtung bestimmt. Nach links, wenn die neue Position kleiner ist als die aktulle, nach rechts, wenn sie größer ist. Gar nicht, wenn Zielposition und aktuelle Position übereinstimmen. In Verbindung mit der Drehrichtungsbestimmung wird dann der zugehörenden Fahrbefehl wie in goRight aufgerufen. Beim ebenfalls wieder erforderlichen waitForMotors wird jetzt ein wenig aufwandgetrieben, um die laufende Aktion zu "visualisieren" : Anzeige des aktuellen Counterstandes alle 1,111 Sekunden. Zu Schluß wird noch die aktuelle Position in actPos aktualisiert. Die Verwendung von motNr in setMotor und motNr-1 bei actPos kann ein wenig verwirren. Die M-Ausgänge zählen entsprechend der Beschriftung auf dem Interface ab 1, bei Arrays hat das erste Element aber den Index 0. Testen mit Mainpublic class RobMainZwei { Das Main ist etwas aufwändiger geworden. static : main() muß eine static
Methode sein um startbar zu sein. Wenn main() auf globale Elemente zugreifen
will, müssen diese auch static sein. Das gilt für Object rob und die Methoden
der Klasse. Alternativ kann man natürlich auch weiterhin mit den direkten Testmethoden von BlueJ arbeiten (s.o.). Unter Menü Ansicht des Hauptfensters von BlueJ kann man zusätzlich ein Debugger-Fenster einschalten. Und nun : Alle private static void AlleDrei() { Zunächst werden die Home-Positionen aller beteiligten Komponenten nacheinander angefahren. Anschließend wird eine Komponente nach der anderen in die gewünschte Position gebracht. Simultan : Alles auf einmal public void moveHome() { Das Anfahren Home mit allen Komponenten gleichzeitig ist eigentlich recht simpel. Zunächst einmal werden die beteiligten Motoren in Richtung links für 9999 Impulse geschaltet. Hier wird eine zusätzliche Eigenheit von setMotor genutzt : Der Motor wird abgeschaltet, wenn der zugehörende Endtaster erreicht wird - 9999 wird nie erreicht. Anschließend wird in Ruhe auf das Ende der Operation gewartet. waitForMotors hat hier eine Liste aller beteiligten Motoren als Parameter. Zu Schluß dann actPos = 0; public void moveTo(int... pos) { Auch hier Start aller beteiligten Motor in einer for-Schleife. Hier wird aber nach links / rechts unterschieden wie schon bei driveTo. Der Parameter int... pos von moveTo steht für variable Anzahl von Argumenten. Es müssen also nur die Motoren von "vorne (ab 1)" angegeben werden, deren Position sich ändert. Gewartet wird aber wieder auf alle Beteiligten. Test : RobGo - RobListe private static void RobGo() { Ist eigentlich schon ein wenig mickrig. private static void RobListe() { Deswegen nochmal, aber listengesteuert. Hier wird erstmal eine Liste der Positionen aufgebaut, die dann in einer Schleife abgearbeitet wird. Klasse RobIR2 : Betrieb des SäulenrobotsIst primär eine Überarbeitung der Klasse RobTutZwei ohne deren Struktur deutlich zu verändern. Import, Klasse und Konstruktorimport ftcomputing.robo.*; Neu ist hier die klare Trennung des eigentlichen Robot von seinen Werkzeugen : Liste RobMot mit einer Aufzählung der Robotmotoren und GripMot mit der Nummer des Greifermotor. Dazu gehören actPos mit der aktuellen Position des Robots und gripOpen für die Stellung des Greifers. In start() werden die Werte zurückgesetzt. Hinweis for(int pos: actPos) pos = 0; ist eine "foreach"-Schleife, die es seit Java 1.5 bzw. 5 gibt. Sie erlaubt eine deutlich kürzere Schreibweise bei Aufzählungen als mit der bekannten for-Schleife. Hier werden alle Elemente des Arrays actPos auf 0 gesetzt. moveHome : Überarbeitet public void moveHome() { In RobIR2 nur noch die simultane Methode, die auch den Greifer berücksichtigt. Bei waitForMotors kann jetzt als Argument die Liste der beteiligten Motoren verwendet werden. moveTo : Neuausgabe public void moveTo(int... pos) { Wie gehabt, jetzt mit Anzeige der anzufahrenden Position. gripper : Extrawurst für den Greifer public void gripper(int open) { Da der Greifer erst dann öffnet oder schließt, wenn der Robot steht, auch eine separate Methode dafür. sie lehnt sich an das bekannt driveHome/To an. Da der Greifer keine "Zwischentöne" kennt sondern nur "auf" / "zu" hier auch als Parameter die Werte 0 für auf und 1 für zu. Was zu in Impulsen heißt, sagt die Konstante GripClosed. Zuätzlich wird bei zu abgefragt, ob der Greifer schon zu ist, so kann man den Robot mit gleicher Greiferstellung zwischen mehreren Robot-Positionen verfahren. Testen von RobIR2import ftcomputing.robo.*; Eigentlich auch schon bekannt. Die Methode RobListe hat jetzt einen Parameter mit der um die Greiferstellung erweiterten posListe bekommen. Nach dem Anfahren der Robot-Position mit moveTo wird der Greifer gesteuert. Die um einen Eintrag (Greifer) längere posListe macht dem moveTo nichts, da es sich intern an actPos orientiert. Stand : 18.03.2010 |