Thursday, December 13, 2018

DIY Monk/Loricraft type record cleaner (it is a prototype)



I don't know if I have discussed vintage audio gear here...but I never threw out my old stuff, and still use it...so I was still using vinyl when it came back into vogue (yea for me).

I will not get into the debate of analog vs digital, but the reality is they do sound different (for a variety of reasons, not just due to the media)...

...but for me the important difference is when you play a vinyl record you are making a conscious and physical effort to listen to a piece of music...you take that delicate plastic out of its protective sleeve, you carefully place it on the platter, you meticulously clean it, gently lower the hard diamond stylus on to that soft plastic, and sit back to listen to 20 minutes of music.

It is that deliberate, hands on, mechanical action that is a great part of the event for me...at that moment you think about the amount of time and effort spent practicing, playing, mixing, mastering, then pressing that record.

Of course the GIANT drawback is trying to keep that vinyl clean so you don't hear pops etc.  Tons of money have been spent in that fight.  Hundreds of gizmos are available to solve this problem...and some get close, but you have to spend big bucks to really get some good cleaning.

For the audiophile who throws money at oxygen-impregnated speaker cables etc. there are a few upper end options out there...one is a vacuum that is literally like taking your upholstery attachment and running it against the wet record to vacuum up all the cleaning solution. (~$1000) a drawback is the edges or lips of the vacuum that touch the record get dirty themselves and have to be cleaned...but apparently it works well (I don't know).

Those devices are out of reach for me...i.e. not financially worth it...

...some time passes...

So eventually I see this video and it changes everything for me.



This vacuum style cleaner is called the Keith Monk, or Loricraft record cleaner.   This one looks like a record player complete with tonearm...but in this case the tonearm contains a small vacuum nozzle that sucks up the solution as the record turns and the tonearm moves across.   These also sell for around ~$1000, but some crafty individuals have figured out how to relatively simply copy the design DIY.

I looked at their projects and borrowed a lot of their ideas to make mine.

I used an Arduino to control everything...I will paste the code at the end.

Parts list after the Arduino code...

Also links covering all my research sources at end...(btw, this is my working prototype...I don't like the platter, definitely don't like the box, I need to 3D print some parts to hold the servos, the arduino and relay, and the 'head'...maybe even replace the whole tonearm assembly...


To start, I needed a basic setup to build from...so I figured I could hack apart an unwanted turntable and start there.  I knew I needed a removable platter with a spindle, so a belt drive turntable made sense...I lucked out in that the spindle was removable from the turntable and almost exactly the same as the geared motor I had...close enough that I could use the 10mm coupler to join the gear drive to the spindle...and the platter mounted on the spindle with no interference.



I just needed to tap the gear housing for bolts (already had 3 pre drilled bosses, a metric tap was closest in size, so I used metric.  I was then able to use different length bolts with some nuts to get the proper platter height.



So platter issue is solved...now the hard part...

Luckily the existing tonearm was open enough for me to use it with minimal modification.

The Monk/Loricraft design has the vacuum attached to the tip (where the stylus would be).  Using the desoldering tip (made of Teflon)  I removed the center part (tip is force fit into outer housing).   That center tip portion I mounted into the tonearm head (where the stylus would have gone) with some hot glue so that it protrudes out of the top of the head about 1/4".





Some brass tubing connected to hose snakes that down behind the tonearm through a slot in the deck...more tubing connects that to the collector jar, and then to the vacuum.





Another aspect of the design is to have a bit of thread under the vacuum tip, to keep the tip off the record...this I fished through using the 1/16" heatshrink tubing through the middle of the tonearm.  (I used the vacuum to suck it through...only mistake was cutting tubing BEFORE sucking thread through...)

So no mod to the tonearm itself other than the addition of some parts and adding a bigger spring on the back (vs counterweight in nicer tonearms) to counteract the weight of the added hardware (still tweaking that).

Underneath the deck was a bit more work.   I was able to reuse the control arm for the tonearm, but I needed the pushrod linkages to connect the servo to it...I drilled a couple of holes before I got the geometry correct (180 swing of servo might not be enough throw depending on where it attached to tonearm control arm.)


There is a control/smoothness tradeoff...the shorter the throw of the servo, the more granular the movement, so I put it as far out on that mounting arm as I could and still get the full tonearm movement I needed.

Second underdeck challenge is raising the tonearm...there is an existing assembly that even has a cushion to slowly lower the arm...I fiddled around until I got it to work right.


The red is the back of some thick double sided sticky tape to make it closer to the servo arm, and allow some 'give' (that same tape is used throughout this prototype..the servos are currently mounted using it...)

(action video)




I think that is about enough hardware info...now the Arduino code...



Here comes the code...I think it is documented adequately...

...BTW, the circuitry in the picture above are simply a resistor for the button circuit, one for the led circuit, and a bunch of connectors so I can unplug things as needed for testing/fixing...

(Due to a Blogger limitation I had to edit in the brackets symbol around the Servo.h after #include...cut and paste FROM this page seems to work...but when you compile you will get an error there...you will have to manually edit in the correct brackets, everything else should work as a large cut and paste)

//recordcleaning code  apparently the relay module uses LOW to activate relay and HIGH to deactivate

#include <Servo.h>


Servo myservolift;  // create servo object to control a servo
Servo myservomove;  // create servo object to control a servo
// twelve servo objects can be created on most boards


int poslift = 0;    // variable to store the servo position
int posmove = 0;    // variable to store the servo position
int ledPin = 13;    // choose the pin for the LED
int inPin = 7;      // choose the input pin (for a pushbutton)
int val = 0;        // variable for reading the pin status
int relm = 6;       // relay motor control
int relv = 5;       // relay vacuum control


void setup() {
  myservolift.attach(9);      // attaches the lift servo on pin 9 to the servo object
  myservomove.attach(10);     // attaches the move servo on pin 10 to the servo object
  myservolift.write(poslift); // lifts tonearm
  myservomove.write(posmove); // moves tonearm
  pinMode(ledPin, OUTPUT);    // declare LED as output
  pinMode(inPin, INPUT);      // declare pushbutton as input
  pinMode(relm, OUTPUT);      // set 6 as relay output for motor
  pinMode(relv, OUTPUT);      // set 5 as relay output for vacuum
  digitalWrite(relm, HIGH);              // stop turntable motor
  digitalWrite(relv, HIGH);              // stop vacuum motor
}

  //subroutine to run cleaning cycle
  void CleanRoutine() {
    digitalWrite(ledPin, HIGH);           // turn LED ON
  
   val = 0;                              // clears the inital pushbutton entry just in case
  
    for (poslift = 0; poslift <= 90; poslift += 1) { // goes from 0 degrees to 90 degrees
                                         // in steps of 1 degree to lift tonearm
     myservolift.write(poslift);         // tell liftservo to go to position in variable 'poslift'
     delay(50);                          // waits 15ms for the servo to reach the position
    }
    digitalWrite(relm, LOW);
    for (posmove = 0; posmove <= 110; posmove += 1) { // goes from 0 degrees to ~180 degrees
                                          // in steps of 1 degree
     myservomove.write(posmove);          // tell moveservo to go to position in variable 'posmove'
     val = digitalRead(inPin);            // read input value to see if it should abort
     if (val == HIGH ) {                  // check if the input is LOW (button pressed)
       goto exit;                         // sends to end of routine to abort
     }
     delay(15);                           // waits 15ms for the servo to reach the position
    }
                  // start turntable motor
    delay(2000);
    val = digitalRead(inPin);             // read input value
    if (val == HIGH ) {                   // check if the input is LOW (button pressed)
    goto exit;                            // sends to end of routine to abort
    }
    digitalWrite(relv, LOW);              // LOW turns on relay to start vacuum
    delay(2000);                           // delay to allow vacuum to reach full power
    for (poslift = 90; poslift >= 0; poslift -= 1) {  // goes from 90 degrees to 0 degrees
      myservolift.write(poslift);         // tell liftservo 'poslift' to lower tonearm
      delay(15);                          // waits 15ms for the servo to reach the position  
      val = digitalRead(inPin);           // read input value - abort?
      if (val == HIGH ) {                 // check if the input is LOW (button pressed)
        goto exit;                        // sends to end of routine to abort
      } 
    }
    for (posmove; posmove >= 40; posmove -= 1) { // goes from 180 degrees to 60 degrees
      myservomove.write(posmove);         // tell moveservo variable 'posmove' to move tonearm to edge
      val = digitalRead(inPin);           // read input value - abort?
      if (val == HIGH ) {                 // check if the input is LOW (button pressed)
        goto exit;                        // sends to end of routine to abort
      }
      delay(1000);                         // 2000 so that entire record gets vacuumed - maybe longer
    }
    exit:                                 // just a marker so the abort button has somwhere to go
    AbortClean();                         // same routine whether done with the cycle or aborting the cycle
  }

 
  //subroutine to end cleaning cycle - lifts and parks tonarm
  void AbortClean() {
   for (poslift = 0; poslift <= 90; poslift += 1) { // goes from 0 degrees to 90 degrees
                                          // in steps of 1 degree
     myservolift.write(poslift);          // lift tonearm
     delay(15);                           // waits 15ms for the servo to reach the position
   }
   delay(500);
   digitalWrite(relv, HIGH);
   delay(3000);
   for (posmove; posmove >= 0; posmove -= 1) { // goes from 'posmove' to 0 degrees
    myservomove.write(posmove);          // move tonarm to park position
    delay(30);                           // waits 15ms for the servo to reach the position
   }
   for (poslift = 90; poslift >= 0; poslift -= 1) { // goes from 180 degrees to 0 degrees
    myservolift.write(poslift);          // lower tonearm to park
    delay(15);                           // waits 15ms for the servo to reach the position   
   }
   digitalWrite(relm, HIGH);             // HIGH turns off turntable motor relay
   digitalWrite(ledPin, LOW);            // turn LED OFF
   status = 0;
  }



void loop() {
val = digitalRead(inPin);    // read input value
 if (val == HIGH ) {         // check if the input is LOW (button pressed)
   delay(15);
   CleanRoutine();
 }
}



...enough code...



Parts:
- Arduino Uno (Redboard)
- power supply for Arduino

- 2 servos (I used very small metal gear ones)
- Hobbypark 25pcs Adjustable Pushrod Connector Linkage Stoppers D1.3mm  (Amazon)
- Excelity® 2 Channel DC 5V Relay Module for Arduino (Amazon)

- 80 RPM 120 VAC Brevel Gearmotor 5-1572  (ebay)
- uxcell 10mm to 10mm Bore Brass Robot Motor Wheel Coupling Coupler w Tight Screws

- Thomas 2450AE44 Oil Free Compressor- Vacuum Pump 115 V 2-3 CFM (eBay)
- 70-031     Replacement Tip For Desoldering Pump (from Parts Express)
- Gudebrod  Fishing Rod Winding thread Nylon  Size D,   Dark Blue  246.  (ebay)
- Winters PFQ Series Stainless Steel 304 Dual Scale Liquid Filled Pressure Gauge,
    30"Hg Vacuum/kpa, 2" Dial Display,  1/8" NPT Back Mount (Amazon...didn't need to be liquid)
-  2 of Fitting Pipe Bulkhead NPT 1/2" Male to 1/4" Female Adapter Brass (Amazon)


- ADAM TECHNOLOGIES IEC-GS-1-100 Power Entry Module Unfiltered Male 3 Position,
   Switch/Fuse Straight, 1.5" (bulkhead power with switch and fuse) (Amazon)
- 2' length of 1/16" heatshrink tubing (Amazon)

- various odds and ends plumbing, wiring, screws etc...
- some wood for box
- donor Sony PS-LX250H Turntable (eBay)


Links

http://secret-sound-labs.net/wash.htm

Different source of same page

Same links translated

http://www.pisshead.net/ls/

Same link translated

 https://www.lencoheaven.net/forum/index.php?topic=9217.0

 https://www.lencoheaven.net/forum/index.php?topic=843.0

 https://www.canuckaudiomart.com/forum/viewtopic.php?f=32&t=15910

 https://www.htforum.nl/yabbse/index.php?topic=108431.0

 http://audiokarma.org/forums/index.php?threads/thread-buffer-rcm-i-the-works.204450/

 https://www.youtube.com/watch?v=Wqll7_J63G0

 https://www.youtube.com/watch?v=gr7bXNiiEnM

 https://www.youtube.com/watch?v=KbUDuHhT10w