====== Nr. 5 - resurrection / Mitsubishi Movemaster RM-101 ======
{{process:shack-heritage-badge.png}}
-----
**Das Gerät wurde zuerst kaputt gebastelt und schließlich gestohlen. Dieser Artikel dient rein archivarischen Zwecken**
-----
{{tag>project software hardware electronics computing }}
===== Was ist das? =====
Der Mitsubishi Movemaster RM-101 ist ein 5-Achsen-Roboterarm.
Das Geraet wurde ca. 1984 gebaut.
===== Media =====
* [[http://vimeo.com/44572459|initial show off video @ vimeo]]
* [[http://twitter.com/4RM4/status/216724331542216704/photo/1/large|Light Painting]]
* [[http://hackaday.com/tag/rm-101/|Hackaday]]
* [[http://www.youtube.com/watch?v=hqOJN07eqFo|Pen Plotting]]
===== 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. [[http://en.wikipedia.org/wiki/Parallel_port|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.
* [[http://www.roboex.com/pdf/Mitsubishi%20Robot%20Manual%20RM-501.pdf|RM-501]] gibt moegliche Tips fuer Kommandos auf p.25(pdf) p.22(toc) ff.
* [[http://www.roboex.com/pdf/Mitsubishi%20Robot%20Manual%20RM-501.pdf|RM-501]] gibt moegliche Tips fuer Signalleitungen auf p.78(pdf) p.75(toc) ff.
* [[project:mitsubishi_rv-m1_instruction_manual|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.
* [[http://linuxcnc.org/|LinuxCNC.org]] Steuerungssoftware (für wenn's tut)
* [[http://www.etf.unssa.rs.ba/~slubura/robotika/sarajevo/ROBOT/calgari/ROBSYM.HTM|Denavit-Hartenberg parameters -> RM-101]]
===== 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
^Stelle^Gelenk^Funktion
| 1 | Drehachse, Achse 1 von unten | "-" gegen Uhrzeigersinn "+" Uhrzeigersinn
| 2 | Schulter | "+" heben "-" senken
| 3 | Ellenbogen | "+" heben "-" senken
| 4 | Handgelenk | Differential, "rechts" "+" nach unten, "-" nach oben
| 5 | Handgelenk | Differential, "links" "+" nach oben, "-" nach unten
| | | Hand hoch: 4. Stelle negativ, 5. Stelle positiv, gleicher Betrag
| | | Hand runter: 4. Stelle positiv, 5. Stelle negativ
| | | Hand drehen: 4. und Stelle gleiches Vorzeichen, , gleicher Betrag
| 6 | Greifer | "-" oeffnet, "+" schliesst
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':
#!/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':
#!/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
===status2017===
laut "Menschen" hat Tim die Platine zu einem CRAMPS v2.2 (http://pico-systems.com/osc2.5/catalog/product_info.php?products_id=35) mit beagelbone installiert. Die motoren sind daran nich angeschlossen.
Weitere Dokumentation wurde nicht gefunden