Monday 25 August 2014

Bearings & Shoulder Rebuild

A rainy Bank Holiday in the UK, so what a better way to spend the day..... playing with Armdroids of course !!

Its been a while since touching my Armdroid, or the one being restored for The National Museum of Computing, and decided today, I would strip down the base, clean, and inspect every individual part before rebuilding again.

I've not previously covered anything on the Blog about the Bearing Assemblies, so thought this would be well worth some coverage here.

The following picture is a recap from last year, what my bearing assembly looks like:



This is a custom machined from Aluminum which forms the following components: (1) Base Bearing support column, (2) Shoulder Bearing support, and (3) Bearing adjusting ring (pictured with grub screw).  This is complimented by 24 ball bearings fitted around the upper and lower flanges.   Reading the construction notes, I imagine its quite a fiddle to assemble, keeping the ball bearings in place whilst turning over to work on the opposite side.

When first inspecting TNMOC's Armdroid, I always knew there was a difference with the bearings, but couldn't see clearly what was happening under all the dirt 'n grime, but, check this out - beautifully machined from solid brass



...which accepts flat needle-type roller bearings with steel shims for the upper and lower supports:



This is how the top of the assembly looks without the other assembles installed:


I'm guessing a previous owner made this as a repair, or perhaps an enhancement to the original assembly
Update:  After searching the internet and examining further photographs, I've now seen plenty of other examples of this arrangement, implying Colne Robotics introduced this as a later improvement.

The center bore for the cables is a lot narrower than the original assembly which does make feeding of cables tricky.  Another observation with this design - its no longer possible for users to make adjustments here.

The original assemblies can be easily damaged by cross-threading the adjustment ring, so be careful not to over-tighten if you need to make any adjustments here.

Having stripped all this down, gave it a jolly good clean, lubricated all moving parts, rotates like a dream now!

I've added more photographs of the rebuild below - might be useful if your rebuilding your base and shoulder and need a reference.

Saturday 2 August 2014

Talk about Torque

The Armdroid Library on GitHub has just been updated with an enhancement allowing Holding Torque to be released or re-applied, and this is especially useful when recovering the robot after things have gone badly wrong, or runaway.

Holding Torque is defined as the amount of stationary torque required for a stepper motor to remain in a fixed position.

This is unlike operating torque (max and minimum) which is the torque a stepper motor can apply when experiencing zero resistance.  Changing voltage will of course, change this torque rating.  Additionally, there is stall torque, which is the torque a stepper motor requires when powered but held so it cannot rotate.

The specifications of the ID35 stepper motors used on the Armdroid are rated with a holding torque of 8.5Ncm (newton centimeters) and its almost impossible to manually articulate any joint while these coils are energized.  The enhancement made to the firmware library allows stepper motors to be freed under computer control, making it possible to manually re-position the arm.  The steppers can then be explicitly torqued again to hold the new position, or by simply running the motors again will indirectly do this.

Another potentially useful purpose is power saving when the arm is idle for long periods of time.

 void ArmBase::torqueMotors(boolean torqueEnabled)  
 {  
  for(uint8_t motor = 0; motor < 6; motor++)  
  {  
   MTR_CTRL* const mtr_ctrl = &mtr_control_table[ motor ];  
   // combine with coils off pattern + control bits if disabling holding torque, otherwise  
   // reinstate coil pattern from last step index  
   const uint8_t output = (torqueEnabled ? mtr_waveform_table[ mtr_ctrl->step_index ] : FREEARM) + mtr_ctrl->address + STROBE;  
   // write command to Armdroid port  
   armdroid_write( output );  
   armdroid_write( output - STROBE );  
   delay(1);  
  }  
  // ensure Armdroid is returned to Input mode  
  armdroid_write( STROBE );  
 }  

To accommodate this new method, a slight modification was necessary to the Armdroid Serial Remote Control protocol, but still remains compatible with the existing revision.