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











Friday, April 13, 2018

Allstar Node using Baofeng BF-888s, a RIM-Lite, and a Raspberry Pi.

If you don't know what an Allstar Node is...join the club.   I went from hearing the term Allstar to building the node in a couple of months.

Allstar is a way to link a repeater to the Internet...or more specifically for the user to link through an analog repeater via the Internet to another analog repeater.

If you are familiar at all with Echolink...it is similar.

If you have perused my other posts, you have seen me play with DMR, D-Star, and Hotspots to connect both of those Digital radio formats to the internet.

Allstar is taking an analog radio and putting it on the internet.   So in my case an analog HT connecting via RF through the Allstar node pictured below.

The question is always WHY?   I can't give you all the good reasons...but my local linked repeater system is using Allstar nodes to both link remote repeaters to the system...AND as a backup in case the RF link drops, or a repeater in the link chain gets locked out.

One of the repeaters in the linked system has an Allstar node that is accessible to 'whitelisted' users.   That means that even though I am out of range of the link system in my house, I can link in with an Allstar node and be on the linked repeater system.

And tonight the NWS is using the linked repeater system for getting storm spotter info from remote locations...because I am linked in, I get to hear all the NWS transmissions.

This article is about building the Allstar Node I am using.


(Pictured...large battery, Pi, RIM-Lite, Baofeng BF-888s.   also powering Baofeng using modified battery replacement car adapter, note I left the mic on the HT, and plug a 3.5mm plug into the mic socket to disable it.)

I would say the first thing to do if you plan on building an Allstar Node is to get an account and Node number at  https://allstarlink.org/  

They usually have a good turn around, and are pretty good about responding to emails to fix problems.


I won't duplicate the already well documented info out there...I will however fill in the blanks...

I am using a Baofeng BF-888s UHF HT.  This radio goes for $24 a pair on Amazon.   It is a low power 16 channel preprogrammed radio...no display.   You program it using the standard Baofeng programming cable.

https://hamvoip.org/ has full documentation on the radio mods and software downloads for the Pi.

(this one has a variable resistor on the RX output, for troubleshooting a problem I didn't have...)

Once you have the radio modded (you need audio from TX and RX, a COS input, and a connection to the HTs PTT circuit.) you need a way for the Pi to talk to it.   There are two ways, home brew and commercial.   I elected for commercial (but I do have the parts for homebrewing it).

I am using the RIM-Lite by Repeater Builder 



$50 USB plug in board with DB-9 connector...and even includes the unpopulated male connector for attaching to the modded radio.

Finally you need a Raspberry Pi.

There is a good image available, but the hard part is understanding the software.

I will make a new post about the software part.

Note:  Allstar uses DTMF tones to connect and disconnect and do other admin items...so I am using an HT with a keypad to punch in the codes...I will cover that later also.

Saturday, January 20, 2018

Pi-Star. Software for DVMega on Raspberry Pi

Ever since I first installed the DVMega on a Raspberry Pi, I have gone through many iterations of software...mostly because software was just being created at the same time I was trying it.

First I tried installing the packages myself on Raspian.  It worked, but was very kludgy to install, start, operate and update.

Next I started downloading premade images...again from many sources, (Westernstar,  Maryland D-star, DMR-Utah, etc)  each more polished than the last.  I was very happy with the package from KB5RAB...(apparently the link I had is no longer valid...not sure of it's status)

Anywho, I heard of another DVMega image for the Pi called Pi-Star, from Pi-Star UK.  I immediately liked this software package because it was so polished.

Pi-Star can admin DMR, D-Star, YSF  (Fusion), and P25...I don't know if they are all 100% functional right now, but DMR, and D-Star are for sure.

The biggest problem with Pi DVMega software packages is the ability to administrate them...you either SSL command line in, or VNC into the Pi.   Both still leave you with some effort to change the settings you want...starting with the challenge of finding the Pi on a new network, or getting it logged into your hotel wifi etc.

So,  Pi-Star boots up with a webserver running and advertises itself on the network as pi-star.local.


You point your web browser to pi-star.local, and you have the main screen, from there you can monitor on the dashboard, or dig into the system with other menu options.


INCLUDING, setting up the wifi and permanently saving the setting, or deleting the particular wifi connection.



Ok, all well and good, but what about at a hotel or other area?   It will be a bit more challenging at a hotel where you log into the wifi via a web page...probably have to share it off your computer...

...but for a regular open network...

So here is my scenario this weekend.  I am in a hotel room, with the open wifi, and need to get my Dvmega on it.   I plug my laptop ethernet (acutally usb dongle in my case) into the Raspberry Pi eithernet port.   I wait a bit, and see "PI-STAR" as an item on the local network...



...from there I just type pi-star.local into the browser, and I am in.