Modular Servo Translation Flexure Stage

This is an evolution of "Modulare Flexure Translation Stage" with different driver options and magnetic length measurement inspired from Youtube channel "Diffraction Limited" https://www.youtube.com/watch?v=MgQbPdiuUTw

With a voice coil, an Arduino, a Motor shield, 7 cylinder magnets and an AS5600 magnetic angle encoder one can build a translation servo with a nominal resolution of roguhly 2 microns. The flexure could be used for (cheap) manual operation without voice coil but with M3 screws for actuation. Due to the magnetic measurement the translation of the moving shuttle can be measured and no micrometer screw with scale is needed. Theoretical resolution of the magnetic scale: ~ 2um

Update: With a MT6835 Encoder and a proper driver soft- and hardware one can achieve a theoretical resolution of 3.8nm.

A variety of actuation option is available:

  1. Micrometer screw
  2. M3 screw
  3. Voice coil

Description of parts:
Base Flexure:
1 x Modflex_Base2.stl Base with recess for Grove-AS5600 Angle encoder
1 x Modflex_Shuttle.stl Moving shuttle with bay for array of cylinder magnets (4mm diameter, 8mm length)
2 x Modflex-Frame- Innter.stl Cover plate for fixing blade to shuttle
2 x Modflex-Frame-Hex.stl Cover plate for fixing blade to base; It turned out that it is much easier to screw from the oudside than from the inside. Therefor this element with 4 hexagonal insets for M3 hex nuts
4 x Modflex-Blade.stl Flexure blade
2 x Modflex-Interm-inner.stl Beam for intermediate stage - inner part parallel to shuttle
2 x Modflex-Interm-joiner.stl Beam for intermediate stage - joining outer and inner blades
2 x Modflex-Interm-cover.stl Cover for intermediate stage

Optional Auxilary parts (Drilling templates):
Modflex-Drilltemplate.stl Drilling template for base and for optional reinforcing Aluminum plate beneath the base
Modflex-Front.stl Drilling template for blade mounting holes in base

Driver Accessories:

General remark: in order to push the shuttle by the driver one screws a M4 screw into it whose head is sanded off. The even surface of the flattened screw is pressed by the driver screw or a micrometer screw with ball head.
Alternativey one can mount a 4mm cylindrical magnet into the central shuttle bore. For a low friction actuation a steel ball can be placed between driving screw and the manget, such that the screw works in two ways: push and pull.

simples mode of actuation with M3 screw
Drivebit-simple.stl Fits in 10mm hole of base for holding M3 driving screw (turns to wear out a bit after a while)
Modflex-Rad.stl Tuning knob for M3 screw

more precise actuation with M3 screw using 2 M3 hex nuts (very sensitive adjustment possible!)
2 x Drivebit2-outer.stl cover plates with M3 nut insets
Drivebit2-inner.stl center driver barrel

for driving with Micrometer screws:
Mikrometer-Adapter.stl cylinder with 4mm and 5mm diameter hole, can be used to modify a plane Micrometer screw into a ball headed screw by means of a 4mm cylinder magent and a steel ball

for Servo-Flexure actuated with Vocie coil:
Modflex-Voicecoil-adapter.stl
Roddy.stl
Voice Coil: Geetech VM2618-112
1 x AFMotor-Shield or Mosfet Voicecoil-Driver as per Circuit Diagram
1 x Arduino Uno or Mega
1 x Grove AS5600 Magnetic Rotary Encoder (goes into the cut out at the bottom of the base; the center of the encoder chip aligns with one side of the magnet array)
7 x Nd Magnets: Diameter 4mm, length 8mm (place them anti parallelly oriented into the shuttle bay)
Arduino-Sketch: ModularFlexure.ino
Roddy.stl: Cylinder with 2 holes: one for 3mm Driving-Rod from Voice-Coil, 4mm for Nd Magnet + Steel Ball. Use plane M4 Steel screw in flexure

Hint: accuracy depends on stability of power supply of the Motor-Shield

Ultra-High Resolution Positioner:

  • Voice-Coil: VM2618-112
  • Voice-Coil-Driver (see Schematic)
    NO Motor-Shield needed

  • Sensor MT6835
  • Driver Program: ModularFlexureV2.ino
    The program implements High-Resolution PWM and a pre-control mechanism such that PID controller only needs to do the high precision adjustments in micrometer range. Furthermore dithering is implemented to overcome friction of the voice coil.

How to setup:

  1. Load Magnets into Magnet bay at the bottom of the shuttle
  2. screw a flat grinded steel screw into the shuttle
  3. assemble the flexure
  4. Position MT6835 Breakout board beneath the shuttle such that sensor edge is lined up parallel to the magnet array but sensor package shall not overlap with magnets
    (MT6835 has 21 bit resolution: with 4mm magnets : 1 count corresponds to 4nm; effective resolution is worse as the manufacturing tolerances of the magnets are higher; the sensor produces a slight sinusoidal distortion pattern which could principally be calibrated)
  5. Start the sketch
  6. Align Sensor-Breakout board such that a monotoneous reading is achieved when moving the shuttle
  7. Mount Voice-Coil Sensor: Screw the Roddy-Part onto the axis of the voice coil and load othe end with ND magnet (4mm diameter 8mm length) and place a 3mm steel ball between flattened screw and Nd Magnet
  8. Energize Driver board and connect Arduino GND to Driver Board and Pin D9 to PWM input
  9. Apply PWM:0 (Command w 0). adjust Offset Potentiometer such that shuttle just starts moving
  10. Apply PWM: 1023 (Command w 1023) and adjust Gain Potentiometer such that shuttle sops at desired end position
    (if desired end position cannot be reached, use thinner blades or increase Voltage of driver circuit. However with stiffer flexure voice more coil current is required, leading to high temperatures; 0.6-0.7mm thick flexure blades work well; for 0.8 mm thick blades voice coil gets very hot at maximum end position)
  11. Run Calibration Command c
  12. Start with low PID gains: Commands:
    sp 0.0001 and
    si 0.007
  13. Set Dither sa 15
  14. Try to move to a position: e.g. m 700000
  15. Activate PID control (p command)
  16. Try various positions and play with PID-Gains and Dither
    if the shuttle jitters, pacify it by hand or reduce PID-gains or reduce Voltage
    If the position shows instable (more than +/-3 counts) , reduce dither amplitude