====== 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