Tuesday, January 30, 2018

EC-1B Part 3 - The Clean-up Begins!

Something I've noticed about these EC-1/S-41 sets is that they like to rust - as evidenced in the "Before" pictures.  This one is far from the worst that I've seen, the cabinet will need some minor bodywork, but the chassis was actually protected by an ancient layer of oil.  I can only guess that a previous owner felt that it needed lubrication, but as bad as it looked, it actually cleaned-up rather easily.

Yech!

Nice!

An hour or so and a little elbow grease and the thing is quite presentable; not perfect, but preserved.

The chemicals used were a product called "Super Clean" - awesome stuff for removing decades of nicotine from old radio chassis - followed by Navel Jelly and a thorough flush with water.  After drying, I wipe the chassis down with Hoppe's #9, a firearm cleaner/protectant, to stall-off future rust issues.

Not bad for a casual evening's work!


Tomorrow it's out to the garage to start the bodywork.  That'll be fun!

Monday, January 29, 2018

Echophone EC-1B Part II


Here it is in all it's splendor and glory, happily playing away on the 49 Meter broadcast band.  Spoiler alert:  Radio Habana isn't a big fan of our President.

As mangy as this critter looks, it didn't take much to get it playing like new.  Actually, I think I spent more time mucking with the dial string than it took to replace all the defective electronic parts!  There's something to be said for simplicity.

Now it's on to the cabinet.  When I bought the rig, it was missing it's bottom and rear covers, so tonight I fabricated a reasonably correct bottom cover out of 20 Guage steel.  Even though it's a simple panel, I spent about an hour measuring and laying out the bends and holes before picking up any tools.  The old adage "measure twice, cut once" applies, though my technique was measure twice, cut once and cut yourself for good measure.  No project is complete without at least a little blood letting.

But, the care taken in plannng pays off - it only took a few minutes to fab the panel and it looks/fits like it came from the factory.


So, now that it's all working, I get to tear it all apart to prep it for paint!  

Side bar:  Some of my friends, well, lets just say they don't share my appreciation for these simple receivers.  Sure, they're not the most stable or selective, but they work, and work pretty well considering how basic the circuitry is.  I think Hallicrafters did just fine designing a solid, entry level receiver that sold for about the same price as a decent tabletop broadcast set.

As for resolving SSB/CW, CW isn't a problem, but SSB takes what Cmdr. MacDonald of Zenith called "Micrometer Fingers".  It can be done, but it takes patience and, without an RF gain control, strong signals will "override" the BFO signal.  This is true for the EC-1, S-41 and original S-38.  Don't waste your time trying with an S-38 B, C, D, E or S-120.  The regenerative IF BFO scheme in those sets is all but useless.

Oh, and if anyone's wondering, I'm still working on the SDR-2017-2018, but it's slow going.  I am learning this Python stuff, though.  Upward and onward.  Excelsior.

Saturday, January 27, 2018

Echophone EC-1B: Chicks dig it?


I attended the Michigan Antique Radio Club's annual Winter show earlier today with my friends Sean, WX8L and Mark, N8IAJ.  Always a decent show that seems to always be accompanied by bitter cold weather, the turn-out today was the best I can recall, helped, no doubt, by temperatures in the upper 40s and rare Michigan Winter Sunshine.  That always puts me in the mood to purchase some really nasty derelict to put right over the remaining Winter evenings, and there was lots of potential fodder at this show!

For these projects, I look for the stuff that most sane people would consider too far gone.  I don't know why, I guess I'm just at the point where I've gotten bored with "normal" repairs - I mean, after 40 years and too many capacitor replacement jobs to remember, I like the challenge of taking on something that's really screwed-up.  

And I found it:  A trashed Echophone EC-1B for the outrageous price of $10.  How could I say no?

I don't know much of the Hallicrafters/Echophone back story, but Hallicrafters manufactured the EC-1 under the Echophone name during WWII and marketed them heavily toward those serving in the military, with many of the advertisments featuring Private Hogarth, who, to me, looks a lot like Radar from the M*A*S*H* series. Evidently, the EC-1 made ol' Hogarth a hit with the ladies.  Yep, nothing get's the estrogen frothing like an inexpensive shortwave radio.  

Anyway.... I get somewhat nostalgic over the EC-1B because it's essentially the same as the Hallicrafters S-41G, one of which I spent many hours listening to when I was about 12.  Unfortunately, that radio succumbed to my overestimation of my technical skills at the time; I took it apart and never put it back together.  So, I've been looking for another for some time, but all that I've found were either hopelessly rusted (for some reason, these sets are prone to rust) or priced beyond what I wanted to spend. 

So, when I saw that this one, in spite of being rough, was fairly rust free, even the bodged electrolytics dangling from the chassis didn't dissuade me from making the purchase.


Looking at it from below deck, it's relationship to the later S-38 series is obvious.  Like the original '38, it's a six-tube transformerless superhet that covers from 540 KHz to 30 MHz in three bands.  Unlike the '38s with a letter suffix, it has a "real" BFO based around a 12SQ7 in a Hartley circuit that works reasonably well.  Where it differs from the '38 is the bandspread circuit; the '38 used a separate section on the tuning cap, where the EC-1B/S-41G(W) used a somewhat hokey variable inductance scheme; a powdered iron "slug" is moved through the tube containing the oscillator inductors by a series of strings and pulleys.  Kind of a Rube Goldberg arrangement, but it works well enough and allowed them to keep the costs down by using a standard broadcast tuning cap.

As you can see in the photo, this set suffers from some pretty poorly executed attempts at repair, which, apparently, caused some pretty serious release of the magic smoke:


Since these sets are simple, it only took a couple hours to set things right; I replaced the filters in a safe and professional manner, and replaced all of the old waxed-paper caps and a couple of out-of-spec resistors.  Once that was done, I powered the set and was rewarded with loud and clear reception on the local broadcast and shortwave bands.  Cool!

There were a few other problems, but none terribly serious.  The volume pot was open at the ground end, so I replaced it with one from my stash.  The audio was also intermittent, which was caused by a broken connection at the base of the 35L6 tube, so I replaced that as well.  The most perplexing problem was the BFO - it was oscillating at about 1.5 MHz!  The BFO coil had been replaced with the wrong value, but no big deal, I just added some parallel capacitance to bring the circuit into range and it's working well.

Imperfect as these rigs are, they're pretty hard to kill.  I think I've got about three hours into this one and it's already playing like a champ, but there's still more to do:

- Dial drive needs serious cleaning and re-lubrication.
- Bottom panel is missing; will make one out of 20ga steel.
- Finish is poor - will repaint and apply new decals (already ordered from Radio Daze).
- Chassis isolation grommets need replacement.
- Need to make or source a new rear cover.

So, yeah, I'll have a lot of time and a few bucks into a receiver that's not really cut-out for actual ham-band use, but it's all about the fun of breathing life into something that's long been left for dead.




Monday, January 22, 2018

SDR-2018: Minor success!

If you've been following this project, you know that I've been "stuck" on a software issue (I can almost hear Bill snickering) and haven't made any progress for several weeks.  Well, I've finally found that there is indeed light at the end of the tunnel, and it's not necessarily an oncoming train!

The problem is due entirely to my unfamiliarity with the Python language, and without that knowledge base, editing the Quisk hardware file for my application has been hit and miss, with more misses than hits.  To overcome this, I've been giving myself a crash-course on Python, and it's starting to pay-off.

Specifically, where I've been stuck is in sending/receiving a PTT signal between Quisk and my hardware, which emulates a Yaesu FT857D.  Quisk shares frequency and mode information over the CAT link just fine, but, in an exchange with Jim, N2ADR, I learned that Quisk doesn't poll hamlib for the PTT signal - that has to be asserted by the remote device.  I suppose that I could have rewritten the Arduino code to do that, but I got to thinking about all those unused GPIO lines on the Pi, which seemed almost made to order for this sort of thing.  But, without adequate Python knowledge, my efforts were futile.

After spending a few weeks boning-up on Python, tonight I had a fleeting moment of lucidity and started to understand what I needed to do to my Quisk hardware file in order to get it to set a GPIO pin HIGH when Quisk's on-screen PTT button is active.  Eureka! 

I've still got to write the code to allow Quisk to respond to a PTT signal coming from my hardware, but I think I know how to do that now and will hit it again tomorrow.

For those who are curious or have masochistic tendencies, here's my current draft hardware file:

# This is a hardware file to test reading and writing PTT status from/to GPIO.
#
# Version (test001) creates a key threading class that is called from the
# OnButtonPTT function to write "keyed" or "dekeyed" to the terminal
# depending on the current status of the PTT screen button.
# Version test002 implements writing PTT OUTPUT to GPIO
#
# It also uses the hamlib library to communicate with the radio hardware:
# If you change the frequency in Quisk, the change is sent to rigctld.  This hardware
# will query (poll) rigctld for its frequency at intervals to see if the rig changed
# the frequency.  If it did, the change is sent to Quisk.
#
# These are the attributes we watch:  Rx frequency, mode

from __future__ import print_function

DEBUG = 0


import socket, time, traceback
import _quisk as QS
import RPi.GPIO as GPIO

from quisk_hardware_model import Hardware as BaseHardware



class Hardware(BaseHardware):
  def __init__(self, app, conf):
    BaseHardware.__init__(self, app, conf)

# assign "keythread" to represent Key_Thread class:
    self.keythread = Key_Thread()
    self.hamlib_rigctld_port = 4532        # Standard rigctld control port
    self.hamlib_poll_seconds = 0.2        # Time interval to poll for changes
    self.hamlib_connected = False
    self.radio_freq = None
    self.radio_mode = None
    self.quisk_freq = None
    self.quisk_vfo = None
    self.quisk_mode = 'USB'
    self.received = ''
    self.toggle = False
    self.time0 = 0
  def open(self):
    ret = BaseHardware.open(self)
    self.hamlib_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.hamlib_socket.settimeout(0.0)
    self.ConnectRigctld()
    return ret
  def close(self):
    #Kill keythread and close GPIO:

    if self.keythread:
        self.keythread.stop()
    self.hamlib_socket.close()
    self.hamlib_connected = False
    return BaseHardware.close(self)
  def ConnectRigctld(self):
    if self.hamlib_connected:
      return True
    try:
      self.hamlib_socket.connect(('localhost', self.hamlib_rigctld_port))
    except:
      return False      # Failure to connect
    self.hamlib_connected = True
    if DEBUG: print("rigctld connected")
    return True         # Success
  def ChangeFrequency(self, tune, vfo, source='', band='', event=None):
    self.quisk_freq = tune
    self.quisk_vfo = tune -5000
    if DEBUG: print('Change', source, tune)
    return self.quisk_freq, self.quisk_vfo
  def ReturnFrequency(self):
    # Return the current tuning and VFO frequency.  If neither have changed,
    # you can return (None, None).  This is called at about 10 Hz by the main.

    return self.quisk_freq, self.quisk_vfo
  def ChangeMode(self, mode):        # Change the tx/rx mode
    # mode is a string: "USB", "AM", etc.
    if mode == 'CWU':
      mode = 'CW'
    elif mode == 'CWL':
      mode = 'CW'
    elif mode[0:4] == 'DGT-':
      mode = 'USB'
    self.quisk_mode = mode
    if DEBUG: print('Change', mode)
  def OnButtonPTT(self, event):
    btn = event.GetEventObject()
    if btn.GetValue():
      QS.set_PTT(1)
# Execute "keyed" function from Key_Thread class:
      self.keythread.keyed()
    else:
      QS.set_PTT(0)
# Execute "dekeyed" function from Key_Thread class:
      self.keythread.dekeyed()
  def ChangeBand(self, band):
    # band is a string: "60", "40", "WWV", etc.
    pass
  def HeartBeat(self):    # Called at about 10 Hz by the main
    if not self.hamlib_connected:    # Continually try to connect
      try:
        self.hamlib_socket.connect(('localhost', self.hamlib_rigctld_port))
      except:
        return
      else:
        self.hamlib_connected = True
        if DEBUG: print("rigctld Connected")
    self.ReadHamlib()
    if time.time() - self.time0 < self.hamlib_poll_seconds:
      return
    self.time0 = time.time()
    if self.quisk_mode != self.radio_mode:
      self.HamlibSend("|M %s 0\n" % self.quisk_mode)
    elif self.quisk_freq != self.radio_freq:
      self.HamlibSend("|F %d\n" % self.quisk_freq)
    elif self.toggle:
      self.toggle = False
      self.HamlibSend("|f\n")        # Poll for frequency
    else:
      self.toggle = True
      self.HamlibSend("|m\n")        # Poll for mode
  def HamlibSend(self, text):
    if DEBUG: print('Send', text, end=' ')
    try:
      self.hamlib_socket.sendall(text)
    except socket.error:
      pass
  def ReadHamlib(self):
    if not self.hamlib_connected:
      return
    try:    # Read any data from the socket
      text = self.hamlib_socket.recv(1024)
    except socket.timeout:    # This does not work
      pass
    except socket.error:    # Nothing to read
      pass
    else:                    # We got some characters
      self.received += text
    while '\n' in self.received:    # A complete response ending with newline is available
      reply, self.received = self.received.split('\n', 1)    # Split off the reply, save any further characters
      reply = reply.strip()        # Here is our reply
      if reply[-6:] != 'RPRT 0':
        if DEBUG: print('Reject', reply)
        continue
      try:
        if reply[0:9] == 'set_freq:':        # set_freq: 18120472|RPRT 0
          freq, status = reply[9:].split('|')
          freq = int(freq)
          if DEBUG: print('  Radio S freq', freq)
          self.radio_freq = freq
        elif reply[0:9] == 'get_freq:':    # get_freq:|Frequency: 18120450|RPRT 0
          z, freq, status = reply.split('|')
          z, freq = freq.split(':')
          freq = int(freq)
          if DEBUG: print('    Radio G freq', freq)
          if self.quisk_freq == self.radio_freq:
            self.radio_freq = freq
            self.ChangeFrequency(freq, self.quisk_vfo, 'hamlib')
        elif reply[0:9] == 'set_mode:':    # set_mode: FM 0|RPRT 0
          mode, status = reply[9:].split('|')
          mode, z = mode.split()
          if DEBUG: print('  Radio S mode', mode)
          self.radio_mode = mode
        elif reply[0:9] == 'get_mode:':    # get_mode:|Mode: FM|Passband: 12000|RPRT 0
          z, mode, passb, status = reply.split('|')
          z, mode = mode.split()
          if DEBUG: print('    Radio G mode', mode)
          if self.quisk_mode == self.radio_mode:
            if self.radio_mode != mode:        # The radio changed the mode
              self.radio_mode = mode
              self.quisk_mode = mode
              if mode in ('CW', 'CWR'):
                mode = 'CWU'
              self.application.OnBtnMode(None, mode)        # Set mode
        else:
          if DEBUG: print('Unknown', reply)
      except:
        if DEBUG: traceback.print_exc()

class Key_Thread:
    def __init__(self):
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(10,GPIO.OUT)

    def keyed(self):
        #print("Keyed")
        GPIO.output(10, GPIO.HIGH)
    def dekeyed(self):
        #print("De-Keyed")
        GPIO.output(10, GPIO.LOW)
    def stop(self):
        #Enter code to reset GPIO here:
        print("Key_Thread Stopped")
        GPIO.cleanup()

Tuesday, January 16, 2018

Learning Python

In my quest to learn Python, I came across a great (and free: My favorite price) interactive tutorial at This Site.  I'm impressed - quite a bit has somehow penetrated my thick skull in just the few hours that I've spent working the lessons thus far.

What is working for me are the exercises at the end of each lesson; they require you to creatively apply the concepts presented in the lesson, and, if you make a mistake, will show you the part of the code that's broken, but leave it to you to fix it. 

I wanted to share this because I reckon that I'm not the only one who learns best by doing, and this site is working for me.

Sorry, no radio related images today, just a picture of a very irritated cat.  You've heard of Grumpy Cat?  Meet Psycho Kitty.

 


Saturday, January 13, 2018

Flashback: RME-45

It's been quite a couple of weeks!  On New Years Day, I had the pleasure of being interviewed by Eric, 4Z1UG, for an episode of his excellent QSO Today podcast, which subsequently "aired" on January 7.  I imagine Eric's listeners responded in one of two ways:

1 - Who's this clown?
2 - N8NM? He still owes me money!

But, seriously, it was an honor.  To look back to some of those who've been featured in past episodes, many of whom are people who've had a marked influence on me and my amateur "career", it's nothing less than humbling.

Then, this morning, I hear my friends at SolderSmoke mention me during the same segment as Jeff Damm - wow!

And then I sit down and try to figure out why the SDR-2017/18 won't do what I want it to.  Python.  I suppose it's a great language, but I don't speak it, and, after nearly a month of hacking away at it, I've determined that I need to step back and start learning it from the ground up.  I'm a slow learner, this could take a while.

But, in the meantime, enough about me; let's talk about an old receiver: the RME-45.

Why you don't combine Ambien and Ebay.

I first became aware of this model about 25 years ago, when I was purchasing another old radio from a local collector and saw one that he had in his hoard.  What a dial!  But, since I'd already given over all my cash, I didn't ask if it were for sale, just filed the information with the intent to own one some day.  That came about five years ago, when I made the mistake of combining prescription drugs and Ebay.  Drugs are bad, just say no.  I really don't know what prompted me to pull the trigger on this deal, but I did, and a week later unpacked the wreck shown above.  At least I didn't pay much for it, at least not on the initial purchase.

Oh, but that dial!

Realistically, this should have been scrapped for parts; it had a lot of parts missing (and a few added), was rusted and dented, and, worst of all, had taken a significant "whack" to the tuning shaft, which destroyed the ball-drive and damaged the multi-section tuning cap. Ouch.

So, I'm looking at this thing, wondering what the hell I'm going to do with it, when I get this brilliant idea: Let's strip it down completely and rebuild it Heathkit style.

I'll let the pictures do the talking, but a few points of interest:
  • The ball-drive dial mechanism was replaced with one from a junked Philco 38-8 chassis, surprisingly little machining was necessary.
  • I filled the extra hole in the panel with JB Weld.
  • The wrinkled finish was simulated by spraying on a coat of Rust-O-Leum textured paint, then spraying a thin, blue-grey color coat over the top of it.
  • Yeah, I painted the chassis to cover up significant mouse-pee damage.
  • I had to make a new cover panel for the gear drive out of 22 GA steel.  This was bent-up old-school, in a vise.
  • During disassembly, I took approximately 200 pictures so that I'd know how every part was installed and every wire routed.
  • Repairing bent and broken four gang variable capacitors is hard.
  • Loctal tubes are cool!
Top view of chassis "before".  It looks better in the pic than it did in person. Mice had been busy using it as a toilet.

The stripped and painted bare chassis.

Starting to come together.

A little more progress.

The crystal filter module, ready for installation.

 First received signals were of my friend Don, K8BB, who's only a couple miles from me and was booming in at 60+ over!

As it is today.  Someday, I swear I'll get to silk-screening the labels, but as one of RME's founders said when asked why the controls on a prior model weren't labeled: "If you don't know what they do, you've got no business buying one."

So, how does it work?  Truthfully, it's outstandingly mediocre.  The performance is on-par with something like an NC-57 or S-40, the only real advantage it has over those rigs is the crystal filter, which works like that on an SX-42 but isn't quite as effective.  But it's got that great dial, and the tuning rate is adequate.  This is an early production model and has the dual-rate tuning system - the center of the the tuning knob is a slow rate, the outer concentric much quicker. 

The rig's OK, but for the same kind of money (and real-estate, it's a large box!) something like an NC-183 would have been a better value. 

73!

Tuesday, January 2, 2018

Non Sequitur #2 - Sweep generator for FM Alignment

Happy 2018!



Work on the SDR-2017 is continuing, though progress has been slow and fraught with frustration.  It pains me to say this, but it's mainly due to that "black box" stuff that N2CQR warns about - Linux and Quisk are fighting with my sound devices.  I'll get 'em whipped into shape, but in the meantime figured I'd share a project from a few years ago:

I've worked on enough old radios to where I can usually align the AM circuitry by-ear; I know where the local stations are on the dial and what to expect for sensitivity and selectivity.  AM is fairly easy because, for the large part, you're adjusting for maximum smoke.  FM is a little more tricky, though.  Yeah, it's possible to align by ear, but I find it actually faster and easier to align the IF and discriminator stages with a sweep generator, RF probe and scope.   But, my sweep generator was old, large and kind of a pain to use, so I built a small, stripped-down unit that didn't take up more bench space than the radio I was working on.


For those who may be new to the hobby, a sweep generator is an oscillator that repeatedly "drifts" from one frequency to another over a certain period of time, then abruptly "tunes" back to the frequency where it started.  When used in conjunction with an oscilloscope and detector probe, it allows one to view the shape, or bandpass, of a tuned circuit.  There are some great YouTube videos demonstrating the procedure, so rather than go into the procedure here, I'll focus on the circuit I threw together.

The heart of the circuit is a voltage-controlled-oscillator (VCO) based around Q4, that, at the center of it's control voltage range, runs at 10.7 MHz.  The 555 Timer is configured as a sawtooth-wave generator that serves as a common timebase for the VCO and "X" axis of an oscilloscope (via buffer U1B); the gain of U1C determines the sweep width, or differential between the high and low frequencies of the generator, and U1D adds a bias voltage to the ramp to scale the signal to tune the oscillator as desired. 

The circuitry around U1A, Q1 and Q2 is, I think, kind of cute.  I wanted to be able to indicate, on the screen of the scope, where 10.7 MHz would be on the X-axis, and came up with the rather crude but effective thought that, if I paused the timebase for just a couple milliseconds at any given point, it would light the screen phosphors a little brighter than the others - in other words, create a "blip" on the screen.  So, U1A is a comparator that, when the ramp waveform reaches a certain threshold (set by R2), stalls the ramp generator just enough to increase the intensity at that point.  Unfortunately, it doesn't photograph well, but you can almost, kind of see it at the peak of the waveform in the picture below:


The picture above and the one at the top of the page show the frequency response curves of properly adjusted IF stages.  This is done by applying the sweep generator signal at the input to the stage and monitoring the output with a simple, diode detector probe (connected to the scope's Y axis.)  The stages are "tweaked" for maximum amplitude at the marker (blip) frequency (10.7 MHz.)

The next shot shows what's called the "S-Curve" response of a properly aligned discriminator (detector) stage.  Again, the sweep generator is connected upstream, but this time the scope is connected, using a regular scope probe, to the output of the discriminator.
Again, the marked didn't photograph well, but you can almost see it right in the middle of the "S".  When the IF and discriminator are adjusted correctly, the positive and negative portions of the signal will be at their peak amplitudes, indicating that the IF's are adjusted for max.  They'll also be of equal (but, obviously, opposite) amplitude with their zero-crossing  point right at 10.7 MHz, indicating that the discriminator is in harmony with the IF passband.  If you have the volume of the set turned up, it'll sound like a motorboat or a long, impressive fart, depending on how your mind works.


The finished product is shown above.  The knobs are pretty self explanatory - marker is adjusted to put a "blip" right at 10.7 MHz, Width controls the difference between the lowest and highest frequencies of the oscillator (+/- a couple hundred KHz max) and level adjusts the output of the generator to suit the circuit under test.  Even at it's minimum setting, it may be higher than needed for some measurements, hence the stack of in-line attenuators.

The enclosure is a from a defunct PC power supply; I stripped it of it's guts, made front and rear panels from #22 aluminum stock and sprayed it with some Rust-Oleum hammertone paint.  Almost looks professional - close enough for me!

73 - Steve N8NM