Nr. 5 - resurrection / Mitsubishi Movemaster RM-101

Was ist das?

Der Mitsubishi Movemaster RM-101 ist ein 5-Achsen-Roboterarm. Das Geraet wurde ca. 1984 gebaut.

Media

Zustand

Etwas angeschmutzt, Reinigung und Schmierung erforderlich. Der Anschluss „CON3“ wurde mit einem 25p-Sub-D-Stecker verbunden. Eine Gehaeuseblende fuer den Anschluss fehlt wurde angefertigt. Die Belegung des Steckers legt den Anschuss an einen Printerport nahe.

db25 / CON3

CON3, Bestueckungsseite:

B1(L)(9)(L)(GND+25)(GND+25)(L)(10)(11)
A1(1)(8)(7) (6) (5) (4)(3) (2)

Die Zahlen geben die Pins des db25-Steckers an. „L“ steht fuer „lose“, also Leitungen, die nicht zum db25-Stecker gefuehrt sind. Am db25-Stecker sind die Pins 18 bis 25 miteinander verbunden.

Lt. WP ist der Printerport so belegt:

Pin Funktion Richtung used here
1 /Strobe IN/OUT *
2 Data0 OUT *
3 Data1 OUT *
4 Data2 OUT *
5 Data3 OUT *
6 Data4 OUT *
7 Data5 OUT *
8 Data6 OUT *
9 Data7 OUT *
10 ACK IN *
11 /Busy IN *
12 Paper-Out IN
13 Select IN
14 /LF IN/OUT
15 Error IN
16 Reset IN/OUT
17 /SelectPRN IN/OUT
18-25 Ground - *

Aufbau

Z80-CPU (LH0080A Z80A) mit 4(?) MHz, ein Dutzend Gatter (74LS…), ein EPROM (MBM2732A-25, 32kBit=4KB) und ein RAM-Baustein (MSM5128-12RS, 2048-WORD x 8-BIT C-MOS STATIC RAM) auf einer doppelseitigen Platine. Auf einer 2. Platine sitzen die Treiber fuer die Stepper.

Test

Beim Einschalten den Taster „Test“ festhalten.

Danach kann mit „TEST“ eine Achse nach der anderen bewegt werden, jeweils zuerst vor und dann zurueck. Die Bewegung haelt an, solange der Taster gedrueckt oder bis der Anschlag erreicht ist.

Soweit scheint das Geraet in Ordnung zu sein.

ToDo

  • Anschlussblende anfertigen und montieren.
  • den db25-Stecker mittels gewinkelter Pfostenleiste an das Geraet anbinden. skipped.
  • Ansteuerung reversen.

Quellen

Super duenn :-(

Mit Gugel findet man Hinweise auf 3-4 Buecher und ein paar unbeantwortete Fragen nach Dokumentation. Doku fuer andere Mitsubishi-Geraete (z.B. RM-501) scheint nur bedingt zu passen.

  • RM-501 gibt moegliche Tips fuer Kommandos auf p.25(pdf) p.22(toc) ff.
  • RM-501 gibt moegliche Tips fuer Signalleitungen auf p.78(pdf) p.75(toc) ff.
  • RV-M1 gibt moegliche Tips fuer Befehle auf p.62(pdf) sec.3.3.1(toc) ff. Es wird explizit erwaehnt, dass der Robot als Printer angeschlossen werden kann.
  • LinuxCNC.org Steuerungssoftware (für wenn's tut)

Manual

On shack@shackit:mitsubishi-rm101 .

Firmware Reverse Engineering

ROM-Dump and IDA-Database on shack@shack:mitsubishi-rm101 .

Kommandos

Jedes Kommando besteht aus einem einzelnen Großbuchstaben, gefolgt von 0-7 Parametern, durch Kommata getrennt. Leerzeichen werden ignoriert.

Parameter können Hex oder Dezimal sein, + oder - als Präfix sind erlaubt.

Ein Kommando nimmt entweder keine, einen Hex- oder 1-7 Dezimalparameter. Hex und Dezimal werden nie gemischt. Maximallänge inkl. eventuellem Präfix in Klammern.

Wenn das Gerät im Error-Zustand landet (Error-LED, falscher Input), akzeptiert es nur noch das Kommando „N“ (wahrscheinlich Reset).

Kommando Parameter Kommentar
C none Schliesst den Greifer
E 1 dez(3) geraten: Save position (evtl. vertauscht mit M)
F none Oeffnet den Greifer
H none Set Current Position to Home Position
I 6 dez(4) Relative Bewegungen um 6 Achsen, s.u.
L 1 dez(1)
M 1 dez(3) geraten: Move to saved position
N none „neutrale“ Position – die, die er beim Einschalten hatte
O 1 hex(4)
P 7 dez(4) wahrscheinlich entsprechend PS bei RM-501
Q 1 dez(2)
S 1 dez(1)
T 1 dez(2)
U 4 dez(1) Parameter müssen 0 oder 1 sein
V 4 dez(1) gleicher Code wie U, nur wird ein Zwischenergebnis invertiert

Kommando "I"

allg: I1,2,3,4,5,6

StelleGelenk
1 Drehachse, Achse 1 von unten
2 Schulter
3 Ellenbogen
4 Handgelenk
5 Handgelenk
6 Greifer

7200 ergibt eine Drehung des Greifers um 360 Grad.

Wenn ein Parameter die Betriebsgrenzen ueberschreitet, verliert das System Steps und die Neutrale Position geht verloren → Neukalibrieren.

Tests 2012-06-18

Kommando Reaktion Massnahme Schluss
A Error-LED Power-Cycle
N none -
AN Error-LED -
A\nN Error-LED - N macht KEINEN reset
' ' none -
F none -

protokoll:

 F oeffnet den Greifer, setzt Error-LED
 N schliesst den Greifer, setzt Error-LED
 F -> keine Reaktion
 Power-Cycle
 F0 oeffnet den greifer, schliesst ihn, oeffnet ihn abermals, setzt Error-LED
 N schliesst den Greifer, setzt Error-LED
 F0 -> keine Reaktion
 F -> keine Reaktion
 Power-Cycle
 F oeffnet den greifer, keine Error-LED
 N schliesst den greifer, keine Error-LED
 F oeffnet den greifer, keine Error-LED
 N schliesst den greifer, keine Error-LED
 -> dreck ?
 B -> nix, Error-LED
 C -> nix, keine Error-LED
 Power-Cycle
 D -> nix, Error-LED
 Power-Cycle
 E -> nix, keine Error-LED
 F -> oeffnet den greifer, keine Error-LED
 G -> nix, Error-LED
 Power-Cycle -> schliesst den greifer
 H -> nix, keine Error-LED
 I -> nix, Error-LED
 Power-Cycle
 J -> nix, Error-LED
 Power-Cycle
 K -> nix, Error-LED
 Power-Cycle
 L -> nix, keine Error-LED
 Power-Cycle
 L10 -> nix, Error-LED
 Power-Cycle
 L1 -> nix, keine Error-LED
 L2 -> nix, Error-LED
 Power-Cycle
 L0 -> nix, keine Error-LED
 M -> nix, keine Error-LED
 M0 -> nix, keine Error-LED
 M1 -> nix, keine Error-LED
 M2 -> nix, keine Error-LED
 M10 -> nix, keine Error-LED
 O -> nix, keine Error-LED
 O1111 -> nix, keine Error-LED
 Power-Cycle
 O1111 -> nix, keine Error-LED
 P -> Error-LED
 Power-Cycle
 Q -> nix, keine Error-LED
 R -> nix, Error-LED
 Power-Cycle
 R180 -> nix, Error-LED
 S -> nix, Error-LED
 Power-Cycle
 S1 -> nix, keine Error-LED
 T -> nix, keine Error-LED
 T10 -> nix, keine Error-LED
 U -> nix, Error-LED
 'U ' -> nix, Error-LED
 Power-Cycle
 U -> nix, Error-LED
 U1010 -> nix, Error-LED
 Power-Cycle
 U1010 -> nix, Error-LED
 Power-Cycle
 U10,10,10,10 -> nix, Error-LED
 Power-Cycle
 U1,1,1,1 -> nix, keine Error-LED
 U0,0,0,0 -> nix, keine Error-LED
 U5,5,5,5 -> nix, Error-LED
 Power-Cycle
 V -> nix, Error-LED
 Power-Cycle
 V1,1,1,1 -> nix, keine Error-LED
 V0,0,0,0 -> nix, keine Error-LED
 V2,2,2,2 -> nix, Error-LED
 Power-Cycle
 W -> nix, Error-LED
 Power-Cycle
 W0 -> nix, Error-LED
 Power-Cycle
 X -> nix, Error-LED
 Power-Cycle
 Y -> nix, Error-LED
 Power-Cycle
 Z -> nix, Error-LED
 Power-Cycle
 I500,500,500,500,500,500 -> arm bewegt sich um alle achsen :-) !!!!111111!!1einseinself!!
 I500,500,500,500,500,500 -> arm bewegt sich um alle achsen :-) !!!!111111!!1einseinself!!  -> inkrementelle bewegung
 I-500,-500,-500,-500,-500,-500 -> arm bewegt sich in gegenrichtung

Fazit:

 erste stelle: drehgelenk, achse 1 von unten -gegen Uhrzeigersinn +Uhrzeigersinn
 zweite stelle: 1. schwenkgelenk +heben -senken
 dritte stelle: 2. schwenkgelenk +heben -senken
 vierte stelle: 3. handgelenk differential "rechts" nach unten, "-" nach oben
 fuenfte stelle: 3. handgelenk differential "links" nach oben,  "-" nach unten
 -> hand hoch:   4. st negativ, 5. stelle positiv
 -> hand runter: 4. st positiv, 5. stelle negativ
 sechste stelle: greifer "-" oeffnet, "+" schliesst

Befehle RM-501

  • HO - Home Position Set - Set home position to current position
  • OG - Origin - Return to home position
  • MI (6 params) - Move Immediate - e.g.: MI-1000,300,300,100,100,0
  • MO (1 param) - Move - 1 ⇐ param ⇐ 629 - Move to a position recorded by PS or HE
  • IP (1 param) - increment of position
  • DP (1 param) - decrement of position
  • PS (6 params) - position set - see MI
  • HE (1 param) - Here -
  • PE (1..2 params) - Position Clear
  • GP (3 params) - grip pressure set
  • GO - grip open
  • GC - grip close
  • GF (1 param) - grip flag - 0 or 1
  • SP (1 param) - speed set - 0..9
  • TI (1 param) - time set - 0..99 - stops operation in x * 0.1 sec
  • ID - input data from external controller
  • OT (1 param) - output data to external controller
  • LG … - conditional operation
  • EQ … - conditional operation
  • SM … - conditional operation
  • NE … - conditional operation
  • TB (2 params) - test bit -
  • GS (1 param) - go subroutine
  • RT - return
  • RC (1 param) - repeat cycle set - loop
  • NX - next cycle execute
  • GT (1 param) - goto
  • ED - end
  • NW - new
  • DL (1..2 params) - delete
  • RN (1 param) - run
  • WR (1 param) - write - rom operation
  • TR (1 param) - transfer - rom operation
  • RS - reset
  • EF (1 param) - error flag

Tests

  • Anschluss ans Netbook mit einem „067b:2305 Prolific Technology, Inc. PL2305 Parallel Port“-USB-Adapter (evtl. wird ein hardwarenaeherer Zugang benoetigt)
  • das Zeilenende (CRLF vs. NL) hat keine momentan beobachtbaren Auswirkungen.
  • der Controller unterscheidet zwischen Grossbuchstaben (setzen die Error-LED) und uebrigen Zeichen (keine Reaktion).
  • keine Reaktion vom Antrieb
  • Beobachtung: einige Motoren werden richig uebel heiss - obwohl keine Bewegung ausgefuehrt wurde.

Scripte

simples frontend 'robo':

robo
#!/bin/bash
 
#
# usage: 
# 	robo { n | N }         - go to  null position
# 	robo a.b.c.d.e.f [-r]  - execute 'I' command with numerical parameters a..f
# 	                       - '.' is eqivalent to ','
#                          - values of '0' may be omitted e.g.: ..100... = 0,0,100,0,0,0
#                          - a trailing "-r" changes the sign of all the parameters
# 	robo Xn                - send arbitrary command
#
 
IFC=/dev/usblp0
 
case "$1" in 
        n|N) 
                echo "N" > $IFC
                ;;
        [-0-9,.]*)
                P=${1//./,}
                P=${P//,,/,0,}
                P=$( echo "$P" | sed 's/,$/,0/' )
                P=$( echo "$P" | sed 's/^,/0,/' )
                #echo "*$P*"
                P=$( echo "$P" | tr , '\n' )
                #echo "*$P*"
                if [ "$2" = "-r" ]; then 
                        P=$( 
                                echo "$P" | 
                                awk '
                                        # { print "-"$1"-" }
                                        $1 == 0 { print "0" }
                                        $1 != 0 { print $1 * -1 }
                                        ' |
                                tr '\n' ,  
                        )
                else 
                        P=$( 
                                echo "$P" | 
                                awk '
                                        # { print "+"$1"+" }
                                        $1 == 0 { print "0" }
                                        $1 != 0 { print $1 * 1 }
                                        ' |
                                tr '\n' ,  
                        )
                fi 
                P=${P%,}
                echo "I$P" > $IFC
                ;;
        *) 
                echo "$1" > $IFC
                ;;
esac

ablauf 'nach rechts drehen, karte greifen, praesentieren' 'robo.sh':

robo.sh
#!/bin/bash -xv
export PATH=$PATH:/home/shack
# echo "N" > /dev/usblp0
read () {
        :
}
 
read x
robo 2150,1250,0,1760,1760,0
read x
robo 0,0,-1000,0,0,-1000
read x
robo 0,0,0,-250,250,0
read x
# robo 0,0,-250,0,0,0
# read x
robo 0,-200,50,0,0,0
read x
robo 0,-225,150,0,0,0
#robo 0,50,-25,0,0,0
read x
 
# griff
robo 0,0,0,0,0,1025
read x
robo 0,500,1000,0,0,0
#read x
#robo 0,-250,-250,0,0,0
 
read x
robo N
# present
read x
robo 0,0,0,3600,3600,0
project/nr5.txt · Zuletzt geändert: 2012/07/12 16:21 von 109.192.98.64