-
Notifications
You must be signed in to change notification settings - Fork 85
End Effectors
Note: Changing end effectors, assuming they have different lengths, changes Link Lengths, and that will make the Kinematics change. If you are using onboard Kin, via the 'M' and 'T' oplets, the SetParameter LinkLengths needs to be updated with a single value to change length 5.
In DDE, when using the "move_to" or other Kinematics commands, search the help panel for "link lengths" to ensure it is setup correctly.
Table of contents:
- Tool Interfaces: Version 1: RC servos or Version 2: Dynamixel servos
- End Effectors
- Future Versions
- See also
The V2 tool interface incorporates 2 Dynamixel XL-320 servos. One FPGA IO pin will be configured to send and receive data via the Dynamixel protocol 2.0 on the blue wire. This requires matching FPGA image.
To move the Dynamixel servos, the standard "a" move all joints command has been extended to include two more (optional) joint angles. E.g.:
Dexter.move_all_joints(J1, J2, J3, J4, J5, J6, J7) //assumes variables J1-7 are set to degrees
make_ins("a", 0, 0, 0, 0, 0, 512, 100)
Low level commands to directly communicate on the Dynamixel Protocol are also available e.g.
make_ins("S", "ServoSet", servo_addr, register_addr, val_8bit)
make_ins("S", "ServoSet2X", servo_addr, register_addr, val_16bit)
The XL-320 servos will apply full torque for about 5 seconds before going into an error state, blinking red, and no longer applying any torque. In this mode, they can be moved easily. To re-enable torque, use the following sequence of oplets:
S ServoSet 3 25 1; Turn XL320 J6 LED "Red"
S RebootServo 3; Restart Joint 6, Servo ID 3
z 1000000; Let servo restart
S ServoSet 3 25 0; Turn XL320 J6 LED Off
S ServoSet 1 25 1; Turn XL320 J7 LED "Red"
S RebootServo 1; Restart Joint 7, Servo ID 1
z 1000000; Let servo restart
S ServoSet 1 25 0; Turn XL320 J7 LED Off
The servo reboot command causes the servo to restart, during which time, it emits a series of troubleshooting messages which will walk on top of any attempt to send other data to the device. It is important to pause (using the z oplet) to wait for that to finish before trying to send any further commands.
The end effector servos can be controlled via the a or P oplets, as if they were joints. However, their motion is NOT coordinated with the other joints. e.g. J6 will rotate to the new commanded position as fast as it can, possibly reaching that position far before the other joints on the robot have move to a new commanded position. Or, if the other joints have only a short distance to move, J6 might reach it's commanded angle far after the other joints; they will not slow down to accommodate it. Also, quite often we want to make sure the gripper stays open when moving to a new location on the other joints, and then close it.
This example set of oplets with comments showing the same commands in DDE format, demonstrates a simple pick motion. It uses the [F]((Command-oplet-instruction#F) oplet to ensure the prior movement of the other joints is finished before closing the gripper, and it uses a delay, via the z oplet, to ensure that the gripper has time to close before moving the other joints.
new Job({
name: "pick",
do_list: [
Dexter.move_all_joints([0, 0, 0, 0, 0, 0, 200]), //open gripper
Dexter.move_all_joints([0, 0, 30, 0, 0, 0, 200]), //move somewhere keeping the gripper open
Dexter.empty_instruction_queue, //wait for that to finish
Dexter.move_all_joints([0, 0, 30, 0, 0, 0, 0]), //now close the gripper
Robot.wait_until(1), //and stay here until it's closed.
Dexter.move_all_joints([0, 0, 0, 0, 0, 0, 0]), //now move with the gripper closed
]})
Here are the actual oplets produced by that job. The DDE commands (following the ';') can be removed.
;new Job({
; name: "pick",
; do_list: [
a 0 0 0 0 0 0 200; Dexter.move_all_joints([0, 0, 0, 0, 0, 0, 200]), //open gripper
a 0 0 108000 0 0 0 200; Dexter.move_all_joints([0, 0, 30, 0, 0, 0, 200]), //move somewhere keeping the gripper open
F; Dexter.empty_instruction_queue, //wait for that to finish
a 0 0 108000 0 0 0 200; Dexter.move_all_joints([0, 0, 30, 0, 0, 0, 0]), //now close the gripper
z 1000000; Robot.wait_until(1), //and stay here until it's closed.
a 0 0 0 0 0 0 0; Dexter.move_all_joints([0, 0, 0, 0, 0, 0, 0]), //now move with the gripper closed
; ]})
A better solution, instead of simply waiting 1 second, would monitor the return status, index 48: "Joint 7 Torque", in a loop watching for the gripper to close, or reach full torque.
To avoid errors, it is important to watch the servo torque and set it's position to the current location when that exceeds 1000 for more than a few seconds. For example, when grasping an object, you can order J7 to close, then read the return status for the torque and position of J7, and if it stops moving and shows a high torque, then set it to stay at the current position, which should reduce the torque and allow it to continue to hold the object it has in it's grasp.
Signals from the Dexter Motor Control PCB to the Tool Interface:
- Black: Ground (J25 pin 1, top pin)
- Red: Logic power +5 Volts (J25 pin 2, the bottom pin). Note: Although out of spec, this actually appears to work very well as a power supply for the servos, making the next signal unnecessary.
- Yellow: Supply power. Currently unregulated 18V to 36V DC from AC adapter via the top slot, labeled "+" on the small screw terminal on the side near the top of the motor board. Could be regulated to Servo power voltage (6 - 8.75V) at the interface by the servo power supply board See: Parts, source, Schematic and PCB design. Note: The +5 supply line appears to work ok instead.
- Blue: Servo data bus, bidirectional. (AUX1 signal via J20 bottom pin, on bottom connector, back left side of motor board)
- Green: Aux / Return serial data. (AUX2 signal via J20 top pin, on bottom connector, back left side of motor board)
- White: The Dexter HD has 1 additional wire which could be used for the servo power (6 - 8.75V) if we want to route that separately from the main supply power. On the HDI, it is used as a second ground wire via the 2nd from the top slot, labeled "-" on the small screw terminal on the side near the top of the motor board
Note: J20 and J21 accept TE Connectivity part 2-179694-2 ^ ^ ^ . A 2 position, 2mm, IDC, AMP CT connector. While this is an IDC part, the crimp head cost is insane even without the crimp handle so manually pressing it in with round nose tweezers or just soldering the wire on maybe the practical choice.
Mechanically, the Tool Interface has a diamond shaped slide and a "power takeoff" (joint 7) to which end effectors are mounted. The slide can be lubricated with pencil graphite to ease insertion and removal of end effectors. The power takeoff should be rotated as shown below before inserting a new end effector. If you wish to leave the robot powered on while changing tools, position Joint 7 at about 170 degrees. (The raw value is 585) It should look like this:
If the end effector isn't all the way on, usually the power takeoff will pull it on the rest of the way with the first activation.
- http://hdrobotic.com/dexter-community/#!/grippers:marker-holder Simple Marker / Pen holder used to write or draw via DDE's DXF.init_drawing and txt.string_to_line functions. Hint: This functionality should allow Dexter to 3D print in the future.
- Laser
- Laser with Microscope
- http://www.appropedia.org/User:Zsarnold#Enterprise See "Semester 2" A Mantis gripper was adapted to Dexter for a great demo of removing parts from a 3D printer. Mantis Gripper Design and Dexter adapter files. Demo setup: Video, Images, and DDE code.
To insert the removable finger into the gripper, and install it into Tool Interface, first turn the knob so that the dial points to the line as shown here: |
Then push the finger in until the dial points toward the Tool Interface, and slide it in. |
The end point of the standard Dexter robot hardware is a replaceable "tool interface" It has a shape which makes it easy for other tools to be clicked on and off.
The signals available to the end effector include power, ground, and whatever signals the main board has been configured to produce. Early versions were wired to USB connection. Later version bring out the AUX1 and AUX2 GPIO pins from the FPGA via J20 and J21 which can be configured to produce different signals.
IO pin 7 of connector J19 on bottom of PCB. This is controlled via the GripperMotor SetParameter. e.g.
Dexter.move_all_joints(0, 0, 0, 0, 0)
make_ins("S", "GripperMotor", 1), //Digital output pin. 0 = off 1 = 5v
TODO: Verify this?
The FPGA support high resolution PWM on this pin, via W Oplet address 73 to 75. Bit 0 of W oplet address 75 enables / disables this pin. e.g. W 73 1
enables it. Address 74 controls the off time, and address 75 controls the on time.
AUX1 and AUX2 GPIO pins from the FPGA via J20 and J21. These are the white connectors in the upper right on the back of the motor board. On Dexter HD, the J20 pins are brought out to the end effector as the "green" and "blue" wires. Green is the top pin on J20, and blue is the bottom.
In the original firmware, these were connected to the EERoll and EESpan SetParameter commands.
Dexter.move_all_joints(0, 0, 0, 0, 0)
make_ins("S", "EERoll", 512), //PWN pin. Integer range of 0-512
In commit 42df0e01285ef8b67764ed53f3cc697df44d4d93, Roll and Span were changed to instead expect Dynamixel servos. However, the wires can still be set manually via the W oplet, at address 64-66.
Bit | Wire | Function |
---|---|---|
6, 7 | Blue |
6,7 Mode 0,0 GPIO (see bits 0, 1) 0,1 PWM High speed (not for servos) 1,0 RC PWM For standard servos 1,1 Dynamixel
|
4, 5 | Green |
4,5 Mode 0,0 GPIO (see bits 2, 3) 0,1 PWM High speed (not for servos) 1,0 RC PWM For standard servos |
3 | Green | Output level: When Tristate is 0 and mode GPIO, 0=low, 1=high |
2 | Green | Tristate 0=output (high or low), 1=input |
1 | Blue | Output level: When Tristate is 0 and mode GPIO, 0=low, 1=high |
0 | Blue | Tristate: 0=output (high or low), 1=input |
E.g. w 64 80
sets both wires for RC servo PWM output. 80 = 1010000 binary.
In PWM modes, the associated tristate bit must be zero, and the duty cycle is set via w 65 _dutycycle_
or w 66 _dutycycle_
. Instead of EESpan use w 65 _dutycycle_
and for EERoll, w 66 _dutycycle_
The dutycycle value should be 591*degrees+1142000
A Tinyscreen+ (ARM based, small OLED screen, 4 buttons, lots of IO) could listen on the servo bus and may return data there or via the dedicated return data line. e.g.
make_ins("S", "ServoSet2X", 2, char1 + char2<<8, char3+char4<<8)
Multiple signals are available from the Tinyscreen+ for many different purposes. A PCB to breakout those signals and make them accessible to end effectors via "spring loaded contacts" (pogos) is being designed. Schematic and PCB
- Version 2 Tool Interface CAD files (note: needs to be expanded)
- Version 1 Tool Interface CAD files (note: this will be replaced): OnShape, STL There is room in the body for wiring and a Tinyduino interface device which can be attached with slightly longer bolts.
- http://hdrobotic.com/dexter-community/#!/grippers Our forum section for grippers.
- https://www.eng.yale.edu/grablab/openhand/ These are good designs for open source grippers. They do NOT have the exact tool interface for Dexter, but could be adapted, or the tool interface part can be replace.
To search the Wiki, use the main search box in the black bar at the top, then select WiKi to filter the results or go to https://github.com/HaddingtonDynamics/Dexter/search?type=Wikis&q= and then add your search terms to the end of the URL.
To report errors, or request additional data, please chat with us on discord and/or raise a new issue