Showing posts with label ham radio. Show all posts
Showing posts with label ham radio. Show all posts

Friday, December 22, 2017

Ham Shack Major Upgrade


This is my little corner of the world. The new desk is almost finished. Key features:
  1. about 7ft wide, 30" deep and 7ft high
  2. 3 drawers on the left, room for 2 computers plus paraphernalia (UPS, ethernet switch, etc) on the right--I will add the second computer after I install AndysHamV21 on it
  3. ~18" adjustable shelves on each side
  4. top shelf holding misc items
  5. middle shelf for stability and storage--and ultimately my on air sign 
  6. 200mm computer case fan to cool the HF rig (Ten Tec Jupiter)
  7. small, fixed shelf on the right to hold the 2M rig and power supply
  8. my DIY 12V power strip (for the fan and sign)
  9. pull-out keyboard shelf and pull out work/writing area
  10. 8-outlet power strip (behid the monitors and radio)
  11. 26" Samsung TV/monitor connected via HDMI cable
  12. 21"  monitor connected via VGA cable through a KVM switch to both computers to facilitate sharing
  13. pre-existing telephone jack now comes in through a wall plate in the desk side
  14. 2" holes in several locations for wire management
  15. notches in each of the 18" shelves to accommodate wires and cables
It took the equivalent of 4 4'x8' sheets of 3/4" plywood, plus some 2x4s for framing, some 1"x4" pine for trim, and some 1/2" plywood for the keyboard shelf. I put on 2 coats of stain plus 2 coats of polyurethane (8 coats on the desktop). We  used drawer slides from Rockler for the drawers and the pullouts

We also took the time to run the coax from the 2M and HF antennae across the ceiling and behind the wall. The desk is where the coax came into the shack anyway--it's just neater now, coming in through a wall plate and on to the radios,. We also ran the ethernet cables behind the walls. There had been cables all over the place. Now the ethernet runs:
  • from the cable modem/wireless router into the wall across the ceiling to a dual wall plate
  • from the dual wall plate an ethernet switch
  • from the switch to the XYL's computer and another cable from the switch back into the wall plate
  • from the wall plate across the ceiling to another wall plate under the desk
  • from the wall plate to another switch that feeds each computer
Dual ethernet wall plate--cable comes from the cable modem/wireless router and into switch. One output from the switch goes to the XYL's desktop--the other goes back to the wall plate and on to the shack

I'm in heaven.  All credit goes to my brother-in law (the one with the skills). .This is a substantial piece of furniture. I can't get a clear shot to take a photo of the whole thing--it's too big. I still have a little work to do, but it's great!

Wednesday, December 13, 2017

12V DC Power Strip

Assembled and tested, ready for use

I have been busy with some projects lately, and have not been active on the blog. This effort is a small part of my desk project that will be on the blog soon (give or take...).  The desk will accommodate (among other things) my amateur radio equipment.  Amateur radio stuff generally runs off ~12V DC (actually closer to 13.8). There are DC power strips available commercially, but because they handle 30 Amps or more and are intended to be fed by a power supply designed for a radio, they are expensive. I just want to power a fan that cools the radio and a station "on air" sign, so I don't need that.

So, I got a Harbor Freight givaway 110VAC power strip, and took it apart.

I cut off the power cord (it will make an extension cord someday), removed the safety ground copper strip, and drilled out the slots for the prongs of AC plugs to accommodate DC binding posts.
Strip with holes drilled, and some posts installed. Note the mod to the red post on the right.
I cut off the threaded bottom parts to leave just the post (see photo).  Then I soldered the bare binding posts to the copper strips on the positive and negative rails, and screwed bottom back on.
Next I needed a 12V supply. I bought an old wall wart for US$2 at a "Hamfest" (that's basically a flea market for amateur radio people, although there can be some high priced stuff there). Since the jack on the wall wart was not standard, I cut it off and just soldered the wires to the wires to the power strip. It will handle 1250mA, which should be sufficient. As shown in the first photo, it worked. Next step: plug the 200mm computer case fan into the power strip.

Fan plugged into power strip
I'll add the On Air sign after Santa Claus brings it.

Preview of the desk. The blue light to the right of the monitor and behind the radio is the fan--it has 4 blues LEDs, powered by the wall wart through the power strip. My old desk is on the left. It will be removed soon.
I've been using the desk, although we have a couple of additions to make.  We'll add a slide-out drawer for the keyboard and mouse, and a pull-out work surface on the right, over the computers. We also have some trim to add. When I say "we" I mean my brother-in-law--the one with the skills--under my "supervision."

Friday, September 8, 2017

Ambivalence re FT8



17:09 UTC today marked exactly one week of FT8 usage. For the 7 months preceding that, I had been focusing on JT9/JT65, and was amazed at how rapidly I was building up my list of contacts--640, at least 63 countries. FT8 puts that to shame: in ONE WEEK I had  312 QSOs with 29 countries. I worked 9 stations in my first 45 minutes using the mode.

FT8 is really addictive--it's hard to step away from--the instant response is great reinforcement.  I went back to JT65 the other day and found it WAY too slow. The difference is that you have to stay with FT8--on JT65 you can set it up and go do other work on the computer until you get an alert, then go back and jump in.

Right now, I love FT8.  It's a great way to build up contacts and fill in gaps for awards--as well as to communicate with the world (tiny messages notwithstanding). One negative I see now is that I expect to burn out on it--I can feel that starting to happen already. We'll see--the up side is that I've been motivated to go back to SSB at times--I've been in some contests, and I was able to work an Oklahoma station, which was the last state I needed for WAS Phone (now if I can just get 8 stations to return QSL cards...).

There is a philosophical discussion around whether FT8 is a real mode that should count for awards and such.   As a relatively new ham with no Morse Code nostalgia, I believe that there should be no distinction.  There are categories within the awards for various modes and bands, and those should satisfy the curmudgeons.  Amateur Radio has always been about  continuous improvement and use of new technology. To disparage people who do that is to disparage the service in an attempt to define a "real ham" in the image of one's own experience.

On the other hand, FT8 will take some getting used to.  It's different.  It's also fun and useful.


Wednesday, September 6, 2017

More on Worked All States Plus CQ WPX

In my last post on this subject, I mentioned that I just needed Maine for several endorsements. Well. I finally got Maine on FT8 on 40M, giving me WAS Digital.  I am still at 49, lacking Maine,  for WAS 20M and JT65.

Also, I made SSB contact with an Oklahoma station the other night, giving me WAS Phone, although I an awaiting 8 QSL cards for documentation. So, that's WAS Mixed, Digital, and Phone,

Meanwhile, I discovered the CQ WPX award, which counts prefixes. I qualify for WPX Mixed (400 contacts) ans WPX Digital (300) plus 20M and North America endorsements for both.  I was going to apply but LOTW wanted $56+ on top of the $12 CQ Magazine would charge for each.  I'll be happy with the accomplishment and forego the fancy certificates.

Friday, August 11, 2017

Worked All States, but need Maine for 5 more awards/endorsements

Here's my current Logbook of the World (LOTW) status.

WAS Award                  States
Mixed 50
40M 26
20M 49
Phone 37
Digital 49
JT65 49
JT9 15
PSK31 11
40M Phone 12
40M Digital 21
40M JT65 19
40M JT9 3
40M PSK31 1
20M Phone 28
20M Digital 49
20M JT65 49
20M JT9 13
20M PSK31 10
Triple Play 86
5-Band 75

The only state I am missing for 20M, Digital, JT65, 20M Dgital, and 20M JT65 is Maine!

So, any Maine Hams out there: look for W1LEM on 20M and on JT65 (please).

Saturday, June 10, 2017

Worked All States!!

I did it! Yesterday afternoon I had a JT65 QSO with a station in Hawaii. When I checked my Logbook of the World account this morning, it was confirmed.  That completes my 50 states (mixed). I have other Worked All States (WAS) awards to pursue, but I'm really happy to have this completed.

Twenty Meters was great yesterday--I made this contact with Hawaii before I repaired my antenna (one of my side of my G5RV Jr. had broken loose from the cord that ran from the dogbone to a tree...later yesterday with help from another ham I inserted a bungee cord, re-tied the cord, and raised and tightened the antenna).

Tuesday, June 6, 2017

Vintage Clock Radio Teardown



Yesterday my wife presented me with a 1966 Sears Silvertone Clock radio, model 6048.  The clock turned on but the radio did not.  I opened the case to find it was a vacuum tube device, so before I tore it down I took it a meeting of one of my amateur radio clubs, which happened to be last night, to see if anyone wanted to play with it. There was some curiosity, but no takers, so I tore it down.
Case open, pre teardown
Torn down
Salvaged Parts
After all that, I wound up with pretty much what I expected: a speaker, some knobs, 2 POTs, and some screws.  I also kept the transformer for the speaker--cursory research reveals that a permanent magnet speaker may need a transformer. I do not know if that's a function of the radio or the speaker--but I will try to find out.  I also kept the internal antenna, just for grins.

So, a piece of history bites the dust, but hopefully I will have some use for the parts.

Sunday, May 7, 2017

49 States!

I've been working HF for just over a year, and have been looking forward to qualifying for the ARRL "worked all states" (WAS) award.  After starting digital modes in February, I got up to 48 states, leaving just Maine and Hawaii.  I did not think ME would be a problem, since I live in Massachusetts, but it proved to be difficult.

This weekend is the New England QSO Party, so I figured that this would be my chance. I am not hearing a lot on 40 meters today (the most likely band for me to hear ME on), but I did get 1 ME confirmed contact...so now I just need Hawaii.

Any HI hams out there wanna help me out?

73, W1LEM

Thursday, February 23, 2017

Andy's Ham V20 Virtual Machine Update

When last we left Andy's Ham, in this post, I had Andy's linux ham radio distribution installed in a virtual machine running on a Windows 10 host under Virtualbox. The installation was successful, but I still had to run some software.

The first step was to get the virtual machine to recognize my my Signalink USB. After starting up the VM, in Virtualbox, I went to "Settings/USB" and found "Burr-Brown from TI USB Audio Codec." I ticked that, and for a couple of weeks I could not get the VM to do anything but freeze up.  I was pretty sure that that was the Signalink, so I scoured the interwebs for information, to no avail. In desperation, In installed AndysHam on a different physical machine and plugged in the Signalink. The same option appeared in USB settings, and it worked. This time I notice the options for USB controller: 1.0, 2.0, and 3.0.  In both cases I had ticked 2.0.  However, the computer with the VM has some USB 3.0 ports (see this post on my upgrade). I had not noticed that I had plugged the Signalink into a 3.0 port (I just reached around to the back of the computer and plugged it in where I could). I went back and ticked 3.0 and all was well. The VM did not freeze and the Signalink showed up as an option in the software (fldigi and WSJT-X).
VirtualBox USB settings for Signalink (be sure to enable the correct USB controller)

If I have WSJT-X (e.g.) running on the host, the guest grabs the USB port for the Signalink and holds it until the VM is shut down. So, I can run the software on the guest, but not the host. On the host, the Signalink is not an option for sound card until the guest is shut down. It may be necessary to redesignate the sound card every time--however, if you plan to use the Signalink in the guest only, this is not an issue.

So, I got AndysHam to work in two environments--on a stand-alone machine and as a guest machine under Virtualbox.  There are a couple of things I need to get used to. First, JTAlert does not run on linux.  I have been enjoying the features, so I'm not sure I want to give that up. Second, I find the set up a little inflexible.  I'm sure I can do what I want to do, but it's been set up to provide most things, and for under-powered computers--which mine is not.  

I'll work with it some more, and if I have anything useful to say in the future I will post it here.

Wednesday, January 25, 2017

Andy's Ham Version 20 VM Installation

I have recently made progress with digital modes.  On 2 Meters, I have been successful with packet on my Alinco DR-135. I am considering a Tigertronics Signalink as sound card interface for my Ten Tec Jupiter.

Meanwhile, I need software.  I could pursue commercial options like Ham Radio Deluxe, but I decided to explore some free options.  I discovered KB1OIQ - Andy's Ham Radio Linux .  The advantage is that it includes a variety of free packages, including logging, rig control, satellite tracking, and a variety of others.

I had 3 options for installation:
  1. Turn my Windows 10 system into a dual boot, and boot into linux when I want to play radio and Windows for other applications
  2. Install Andy's Ham on a separate matching dedicated to playing radio
  3. Install Andy's Ham as a virtual machine (VM), running under Windows
I chose option 3, because dual booting can be a pain and a separate computer can add complexity. Running a VM allows both Windows and linux to be available at the same time. To do that, I needed virtualization software. I chose VirtualBox because I have used it before at work and home.  Installation on Windows is simple: download the correct version at the link just provided, and run the .exe.  It makes sense to download the Extension Pack and install it, too (honestly, I don't know why that's an option--just always install it).

Once VirtualBox is installed:
  1. run it and create a VM (follow the prompts--consult the user documentation at the download link if you need to). The only change I needed to make from defaults was disk size--it defaults to 8G but I gave it 20G--Ubuntu says it needs ~20. 
  2. download Andy's Ham (link in the second paragraph above)
  3. in VirtualBox, click settings, then storage for the machine you created. Next to Optical Drive on the right, click on the CD image and point it to the downloaded Andy's Ham .iso file.
    Installing Andy's Ham in a VM
    1. Start the VM--follow the current instructions. For me I chose the "live" option when prompted. When asked for a user id gave it "ubuntu" and presses enter on password (no Password). Once the VM comes up, you can play with the installation, but nothing is permanent until you install to the VN's hard drive. To do that, click on "Debian"  at the lower left, an in the menu that pops up click "System" then "Install to Hard Disk."  This will take a while, but cannot run unattended because you need to respond to some prompts along the way.
    2. Restart the VM (click on machine/ACPI shutdown, then double click the machine name), and you're done.  One of the prompts you responded to created a user and password--use those to log in to your new machine.
    This is a nice remix of Ubuntu if all you want to do is play radio.  I'm going to have to play to see how to add back some Ubuntu features that I'm used to.  I will post again after I've had a chance to play/learn.

    Install Andys Ham to hard drive after starting with "live" option

    Example of how to navigate to some of the features

    Monday, December 26, 2016

    I upgraded my computer--including stupid technician tricks

    System Information (from Control Panel/System)


    The last two times I was on +Adafruit Industries #showandtell, my video was unacceptable.  That's a minor irritation for me, but the second time I had my seven-year-old-granddaughter on. She was able to get through it, but it was a struggle.  Show and and Tell is a Google Hangout, and the minimum requirements include a quad-core processor.  I had been getting by with an AMD Athlon X2 dual-core processor and ASUS Motherboard for the 3 years I've been participating by shutting everything else down and running just one tab on Chrome for the hangout, but I guess Google's "enhancements" have rendered my computer obsolete.

    The computer was an 8-year old home-build, and has served me well, but I decided that I needed to get my granddaughter on again in fine style, so I bought an AMD 8-core processor and ASUS motherboard. Actually I bought an ASRock motherboard first, but I had some issues with the build (see below) and I read reports of this mobo bursting into flames, so I returned it and ordered the ASUS. I will report here after I try Show and Tell again, but so far it's great.

    Additions

    I also ordered a new graphics card.  I'm not very happy with it. First, the description, the invoice, and the parts list all say it supports DirectX 12.  What Newegg sent me supports DirectX 11.2, according to the box. I returned it for replacement, expecting them to fix their error right away.  It turns out that they refused to replace it until the receive the one they sent in error.  So, I changed it to refund and ordered a new one.  I got the new one 5 days before they received the return. To my surprise, it was the same version. Newegg has been good in the past, but this is not good.  Over 2 weeks later I still do not have a refund.  

    In addition, I got this card because Microsoft says that the Windows 10 video capture tool works with AMD Radeon R7 and later. However, it's still telling me that my video card is not good enough for them. More research.

    The motherboard has an  M.2 slot for what is essentially and SSD stick.  When I get around to it, I will add a 250GB SSD using this new, smaller, faster technology.

    The motherboard also has COM header for a serial port, Since my ham radios are able to work digital modes through a serial port I ordered one from China and will hook that up to enable me to experiment with digital modes. More learning and excitement!

    Since the 650W power supply I had in the machine had failed recently, I had replaced it with a 800W supply.  Underpowering a system is an invitation to frustration, so if you're upgrading, don't forget to be sure that you have a power supply that will meet all the requirements of your new system.

    Stupid Technician Tricks

    I won't go into detail on the big one (it's embarrassing and I know better), but here are some suggestions for installing an AMD CPU on a motherboard:
    1. lift up the lever next to the pad on the motherboard
    2. align the arrow in one corner of the CPU with the arrow on the motherboard pad (also check the pattern of the CPU pins to be sure they align with the pattern on the pad
    3. only after the CPU is seated properly, push the lever down
    4. check that everything is secure BEFORE adding the heatsink/fan assembly
    Enough said, except that the overarching recommendation is "Take your time!"  

    The only other problem I had was minor:  the hard drive light was not lighting. Obviously, I connected it wrong.  Lesson: double check your connections before you plug in the unit, and check that everything works before putting the case all back together.

    Activation

    Initially, I thought I may need to buy a new copy of Windows, but I read up on Microsoft's digital license policy and made sure that I was all set up.  I had Windows 10 Pro, installed as part of Microsoft's free upgrade program. Since I had purchased Windows 8.1 Pro, it upgraded me to Windows 10 Pro.  After I fired up the  machine I was not asked to activate Windows (although Office 2010 did ask to be activated--quick and easy).  I did get a message "you need to fix your Microsoft Account."  Google revealed that I needed to update a user. When I went in to do that I was told I couldn't because Windows wasn't activated.  I went through the activation process--which tells you you need to buy a new copy but has a non-prominent link "I recently upgraded my hardware."  I clicked that, and after a couple of "our servers are down" messages, I was able to activate.  Done,

    I use Norton Security provided as part of my subscription to Comcast.  Norton said it had expired.  I couldn't convince it that it hadn't, and Comcast help was typically useless, so I uninstalled it and reinstalled and all was forgiven.

    Summary

    I have a fast new machine that should work with the Adafruit Show and Tell Google Hangout. Everything is activated.  I have and upgrade path to an SSD and will have a serial port to use for ham radio digital modes as soon as it arrives.  Overall I'm happy with the build.

    The only issue is the video card.  I read on the interwebs that others with this card have had the problem Windows 10 video capture.  I'm working on it.

    Saturday, December 10, 2016

    I am an Extra Class Operator


    In 1958, my friend Freddy and I studied Morse Code with the intention of becoming licensed Ham Radio operators. Then Junior High School happened, along with the 60's and other decades of distraction, so I never got licensed.  About 3 years ago, I became interested in hobby electronics. In the process I built a crystal radio, and all the ham interest came back. A little over a year ago, I decided to investigate the local ham community.  I found an active, vibrant community so I decided to get licensed. I passed my first exam in January of this year.

    As of about 9:45 AM EST 10 December 2016, I am an Amateur Extra Class Radio Operator. I passed the test with a 100% score. I have now taken all 3 Ham Radio license exams this year. I scored 100% on the Technician, got 1 wrong on the General (although when they asked me the question after the test I got it right), and 100% on the Extra.

    So, now I have to go learn what the questions really mean--but I am proud and happy, and I have made two QSOs (contacts) so far with my new privileges.


    Tuesday, October 11, 2016

    Interrupts, Power Saving, the Zero, OLED display, and a compass


    This is a story about bumbling into moderate success. The project objective, which I met, was to build a compass. Sounds simple, but the real objective to all of this is to learn--and I met that, too (as usual). In the sequence below, Steps 1-3 are basic setup, Step 4 is a straightforward programming implementation, The learning (for me) begins at Step5.

    It all started a few months ago as explained in this post  on Arduino and an OLED display. As mentioned in that post,  I bought "Arduino for Ham Radio" by +Glen Popiel to see if I could spend time on two of my hobbies together. I'm neutral on the book, but I thought the compass project might be useful.

    In attempt #1, partially pictured in the post mentioned above, I used an Uno clone and an OLED display and a magnetometer from eBay.  I can't sweat to it now, but at the time I was sure that the magnetometer readings were off.  Google revealed that some clones yield odd results.  The board works fine for everything else I've tried, so I'm not sure, but in any case I have since committed to buy only genuine Arduino boards (for official boards like the Uno--I will buy variants by +Adafruit Industries like the Feather in this example).

    Next step was to try another board.  I got the Adafruit Feather M0 Basic Proto, Feather Wing OLED display, and HMC5883l Magnetometer (just in case the cheap one from eBay was faulty). With a breadboard and some jumper wires that's all I needed to build the prototype.

    In this post, I will go through the learning and prototyping I did to build the compass.
    1. test the display
    2. add the magnetometer
    3. combine the examples
    4. add the text direction
    5. slow this down (this is where the fun starts)
    6. interrupt with and without sleeping
    7. battery status
    8. improving the display
    9. parts and code
    10. next steps
    But first, here's a discussion of learning points and peculiarities (or at least things peculiar to me):

    Resetting the Feather M0 for upload
    Arduino and Arduino-ish boards have a variety of reset issues. For example, the Adafruit Trinket often requires that the user press upload in the IDE, wait a while, then press reset on the Trinket--otherwise the booloader is not active.  On the Feather M0, it is often necessary to "double-click" the reset button to force it into booloader mode, where it stays until after upload.

    This is a nice feature, but at least on my system (Windows 10, IDE 1.6.12) the Feather sometimes switches ports (COM3 before double-click reset, COM4 after, or vice versa, in my case).

    Coding  (stuff new to me)
    I'm sure this is old news to some, but I learned some stuff in this exercise.  
    In researching how to enter sleep mode, I found this:
       SCB->SCR |= 1<<2 div="">
    SCB is System Control Block and SCR is System Control Register. -> is member assignment and << is left shift.  I knew most of that (not ->), but the instruction looked strange to me. In English (my paraphrase--others may object), it says "OR the SCR with a 1 shifted 2 bits to the left, and assign the result to the SCR member of teh SCB structure." SCR bit 2 is the sleep bit. 0 is idle, 1 is deepsleep (see next item), so ORing it with a 1 makes the bit 1.
    I thought that syntasx was a little obtuse, and with the help of the Adafruit Forum I found:
        //  SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;  
    which does the same thing, but (to me) makes more sense--it is closer to saying what you want to do instead of how you're twiddling the bits.
    Now we can turn on the sleep bit--how to turn it off.  For 40 years, I've been turning bits on with OR's and off with ANDs. Here, we are addressing the whole SCR but manipulating only one bit, so in either case, you need to leave everything else as is. You undo that by ORing with 0s and ANDing with 1s.  I tried I few ways to code a binary in the operand, and thanks to the forum, this works (as in compiles--|= 0b000010 does work for deep sleep):
        SCB->SCR &|= 0b11111011;
    A better answer is to AND with the inverse of what we ORed with, so
       SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;    
    turns the bit off. 

    Another feature, described in Step 6 below is digitalPinToInterrupt(). I was reading old materials on interrupts, evidently before this feature was added. In the olden days (like 3 years ago), the attachInterrupt instruction required (interrupt#, ISR, mode)--more on operand 2 and 3 later. Interrupt number is hardware dependent and different from pin number in many cases.  To make it more readable and more portable, replace interrupt# with digitalPinToInterrupt(pin#). The function returns the interrupt number for that pin on the device being used. This is really important as more and more boards join the Arduino family.

    Sleep mode
    As I write this I am in a discussion on the Adafruit forum to determine how to get the Feather M0 into idle mode, showing how the Adafruit community helped me solvd the problem of getting to idle mode,
    For deep sleep, I coded the instruction above in setup, and put a wait-for-interrupt (__wfi();) at the top of the loop. That works. The button press causes an interrupt, the loop does it's thing then waits again on iterating back to the top (see Step 6 below).  I could not get it to work for idle mode.
    Looking through datasheets, programming guides, examples, searches and the above-referenced forum thread, the best answer is to code    SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;    in setup.  However, according to what I read, this is not enough,  There are 3 idle modes, controlled by 2 bits in Power Management.  The masks for each value are defined (on my Windows system) in ~\AppData\Local\Arduino15\packages\tools\CMSIS\4.0.0-Atmel\Device\ATMEL\samd21\include\component\pm.h
    So, PM->SLEEP.reg |= PM_SLEEP_IDLE_APB; sets the bits to 2 (b'10')
    Even with the correct syntax, I struggled with this. It appeared that it was not waiting. As it turns out, in idle mode, other things could still wake it up, so I added an explicit test of the booleans set in the ISRs. If neither was set, I wait until one is. Very simple solution. Thanks Adafruit forum!

    ISR modes and sleeping
    As noted below, FALLING works for a pin going from HIGH to LOW if you're not sleeping. However, FALLING and RISING use clock, which is turned off.  So the attach should be coded:
         attachInterrupt(digitalPinToInterrupt(BUTTON_B), headingISR, LOW); 

    Those are the high points.  What follows is how I went about building it.

    Step 1 - test the display

    This step was really just a matter of soldering stacking headers on the Feather M0, female headers on the Feather Wing, and following the Adafruit SSD1306 tutorial.
    1. solder the headers on the boards 
    2. mount the M0 on the breadboard
    3. mount the Feather Wing on the M0
    4. install the Adafruit_SSD1306 and Adafruit_GFX libraries (see SSD1306 tutorial)
    5. preparing the IDE for the M0 (see the M0 tutorial)
    6. run the SSD1306 example program ssd1306_128x32_i2c (see SSD1306 tutorial)--the Feather Wing is 128X32 and uses I2C

    Step 2 - add the magnetometer

    Note that the example uses serial, not the OLED display, so you could do this part with or without the Feather Wing.
    1. solder the header pins (if it's new like mine was)
    2. add to the breadboard
    3. it's I2C, so connect SDA to pin A4 on the M0, SCL to A5
    4. connect VIN to the 3V rail and GND to the ground rail
    5. follow the Adafruit HMC5883l tutorial to install the Adafruit_Sensor and Adafruit_HMC5883_U libraries
    6. run the Adafruit_HMC5883_U example sketch magsensor 

    Step 3 - combine the examples

    I was now working with 3 examples that I needed to combine: SSD1306, HMC5833_U, and the book.

    The example in the "Arduino for Ham Radio" uses a variant of the magsensor example (from a different library) to display the heading in degrees and the corresponding text compass heading on an LCD display.  The main modifications were to used the OLED instructions instead of  LCD instructions and to use a function instead of a lengthy series of if constructs to determine the text heading (see Step 4).

    To me, the most logical approach was to start  with the magsensor example and add to that, reasoning that the compass is the objective and this code already has display code that I just needed to modify. Also, since the book example used a similar sketch as a base, I could just make the corresponding modifications as I went.
    1. save the magsensor example to your sketchbook directory/folder and give it a meaningful name like "magsensor_OLED"
    2. add the OLED libraries (see step 1 above)
    3. add ssd1306 display code (I find the easiest way to do this is to leave the Serial instructions in place to use for testing and clone them as displays). Note that you will need to add clearDisplay, setCursor, and the all-important display.display() in addition to changing serial.print to display.print (etc.). So, this line:
          Serial.print("Heading Degrees: ");Serial.println(headingDegrees);
      will be copied and cloned as:
          Serial.print("Heading Degrees: ");Serial.println(headingDegrees);
          display.clearDisplay();
          display.setCursor(0,0);
          display.print("Heading Degrees: "); display.println(headingDegrees);
          display.display():
      So, we still use the serial monitor, but that scrolls continually. For the OLED, we need to clear whatever was there (ClearDisplay). position the cursor at the home position (setCursor--operands are column, row-relative to zero), move the text to the buffer (print, println--work just like Serial). and display the buffer contents (display).  Trust me, if you you skip the display.display(), you will not see what you expect.

    Step 4 - add the text direction

    The Ham Radio book uses what I consider to be an ugly series of if statements to determine which of the 16 compass points (N, NNE, NE, ENE, E and so on) corresponds to the heading in degrees. I replaced this with a 16 element string array, and a function to find the appropriate element.

    String directionArray[] = {"N","NNE","NE","ENE","E","ESE", "SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW" };   //array for map function 16 compass directions

    The function (see the comment about how N is handled, also note that map only works on decimals, so I multiplied by 100 and worked in steps of 2250):

    String mapDirection (float headDeg)
    {
    /*function to return direction in text based on heading in degrees. N is 11.25 degrees each side of 0, so that doesn't work too well with the map function. So if it's N, we say so. This is a nice way of taking the procedural stuff out of line, so the loop code can just ask for the direction
    */
        if (headDeg > 348.75 |  headDeg < 11.26)<11 .26="" 0="" around="" case="" degrees="" direction="North," div="" nbsp="" special="" wrapped="">
        {
            Dir = 0;
        } else {  
    //not North, so we eliminate the decimals and map degrees to text in 22.5 degree increments      
            Dir = map(headDeg*100, 1126, 34875,1,15);  //map only works on whole #s so we eliminate 2 decimal places
        }
    //and return the selected text compass direction    
        return directionArray[Dir];
    }

    So, we can use the function directly in the display statement from the last step, which now reads:
        display.print("Heading Degrees: "); display.print(headingDegrees); display.print(" ");
        display.println(mapDirection(headingDegrees));

    Step 5 - slow this down (this is where the fun starts)

        Sitting at a desktop computer, it's fun to watch the heading info scroll by on the serial monitor or flash by on the OLED.  However, that'not great for a walk in the woods.  First of all, you probably won't have the project tied to a USB port, it would be powered by a battery. Further, continuous updates would use more battery than you want.  

    Option 1: delay
        The first option, the one used in the Ham Radio book, is to code a delay, maybe for a second, to slow things down and reduce the number of times the Feather has to read the sensor. In this case, just code
        delay(1000); 
    after displaying the heading.

    Option 2: button
        Option 1 still probably yields more measurements than you need, wasting power.  Another possibility would be to only display the heading when the operator asks for it. The Feather Wing has 3 buttons, labeled A, B, and C.  So, in setup we could display "press button B" on the OLED, and in the loop test to see if button B was pressed.  (I'll explain later why I don't use button A).
        The buttons have pull-up resistors, so pressing them causes the pin to go LOW.  On the zero, the buttons are assigned to pins as follows:
        #define BUTTON_A 9
        #define BUTTON_B 6
        #define BUTTON_C 5
    Then, in loop, test the button state:
          if (!digitalRead(BUTTON_B))   //means BUTTON_B is LOW, so it's pressed
          {
              [get the sensor data, display on OLED as above]
          } 
          delay(3000) //wait 3 seconds
          clear display
          display "press button" message

        This is all fine and good, but what we want is for the device to sleep unless we want to use it, not to be continually checking to see if the button was pressed,  That requires some additional programming. 

    Step 6: interrupt with and without sleeping

    I recently bought "Programming Arduino: Getting Started with Sketches" by +Simon Monk. It reintroduced me concepts I first met in Jeremy Blum's (+sciguy14) arduino tutorials (tutorial #10 was on interrupts).  I also did a C Course on Udemy that included interrupts on a TI device..

    So, I thought this would be a good application.

    Interrupt without sleep
    First, I figured I'd replace testing for a button press with code to see if we'd been interrupted. This should have been straightforward. In setup, code an attachInterrupt of the type:
          attachInterrupt(interrupt#, ISR, mode); where
              interrupt# = number of the interrupt (hardware dependent, NOT the same as pin number)
              ISR = interrupt service routine--code that is executed on the interrupt, returning to the interrupt point
              mode = HIGH, LOW, RISING, FALLING, CHANGE depending on how you want the interrupt triggered--when the pin goes HIGH, LOW, LOW to HIGH, HIGH to LOW, or changes, respectively.

    This drove me a little nuts.  I went through the Adafruit documentation for the device, and found the pinout diagram. Following what Simon and Jeremy said, I coded the statement for interrupt number 4 (button b is connected to pin 6, and in the pinout.it says EXTINT4 for that pin).  It didn't work.  I looked through the interwebs until I stumbled upon the statement definition on arduino.cc (when all else fails...).  There I learned 2 things. First, on the zero, the pin number = interrupt number (I don't know what EXTINT4 in the pinout means).  Second, for portability, you can use digitalPinToInterrupt(pin#), so if you change to a board that uses a different interrupt number for the same pin you don't have to change your code. Of course, if the second board does not allow interrupts on that pin, you still need to change it. So, I was able to code:
      attachInterrupt(digitalPinToInterrupt(BUTTON_B), headingISR, FALLING);
    meaning that when the pin BUTTON_B goes from HIGH to LOW, invoke headingISR

    All headingISR does is set a boolean.  The loop code can then check to see if the boolean is set and if so, reset it and go on to display the compass reading. Here are the relevant parts:

            volatile boolean headingRead = false;


            void headingISR() //ISR for button B  press

           {

                headingRead = true;

            }


            in loop:
            if (headingRead) {
                headingRead = false;
                [code to read compass and display heading]   
            } else {
                [delay/clear/display press button message, as above]
            }

    Interrupt with sleep
    This works nicely, but the device is still active all the time.  The next step was to figure out how to put the M0 into low-power mode (sleep) while it's waiting for the operator to ask for a button to be pushed.  The solution took some investigation to find, but it turns out to be very simple to implement.

    What we want to do is to tell the M0 to wait for an interrupt, and to sleep while it's doing that. Fortunately there is a wait-for interrupt instruction:
           __wfi(); 
    That's a double underscore, I did not notice that at first and chased a lot of documentation before I figured it out.
    If you just use that instruction, it has no effect.  It must be preceded by setting a bit in the System Control Register (SCR).  Bit 2 is the sleep bit. 0 means sleep, 1 means deep sleep.  Not all processors support two sleep modes.  As best I can determine, the Feather M0 supports only deep sleep, because leaving the bit at 0, or setting it to zero, has no effect--just like coding the wfi with no preceding operations. As I write, I have a query on the Adafruit forum to verify this (see discussion under "Sleep Mode" above).
    The sequence is:
      SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;  /set sleep bit to 1--do this in setup
    then, in loop, code:
      __wfi():
    I found the above in this post on the arduino.cc forum. I also found the bit-twiddling written this way:
        SCR->SCR |= 1<<2 1="" 2="" a="" bit="" bits="" div="" left="" nbsp="" or="" scr="" shifted="" the="" to="" with="">
    and I figured out that it also works if coded SCR->SCR |= 0b00000100. I think the shifting is the least readable (as in self-documenting), the bits are a little better, and the mask (first example) is the best. I'm sure others disagree.

    To implement, leave the attachInterrupt and ISR as above, add the bit setting in setup, and delete the if/else construct for headingRead, replacing it with:
                __wfi();
                [code to read compass and display heading]   
                [delay/clear/display press button message, as above]
    The display now reads "press button B" until button B is pressed. On the interrupt, it gets the reading and displays it for the time of the delay (I used 3 seconds), then displays the button message again and goes to sleep.
    To have the button message display initially, that code must also be included in setup.

    Reminder: the FALLING mode on the attachInterrupt does not work in sleep mode since it involves the timer, so I changed the mode to LOW (since pressing the button sets the pin to LOW).

    Step 7 - Battery status

    Since the probable use of these device is in the field, on battery, it would be nice to track battery status. The Feather M0 has this ability to read battery voltage. See the Feather M0 Basic Proto tutorial.

    A fully charged 3.7V LiPo battery will read ~4.2V.  When it drops below 3,7V, it should be recharged (nice that the Feather has a built-in charger).

    The code in the tutorial works as-is.  Note that VBATPIN is A7. A7 is also D9, and D9 is connected to BUTTON_A.  That's why I don't use BUTTON_A for interrupts. The code sort of works, but it's flaky.  

    In keeping with learning interrupts, I added on on BUTTON_C.  When the operator presses BUTTON_C, the battery status is displayed for 3 seconds and then the heading is displayed.

    To implement, we add VBATPIN:
        #define VBATPIN A7
    add a new attachInterrupt:

      attachInterrupt(digitalPinToInterrupt(BUTTON_C), batteryISR, LOW);
    add the ISR:
        void batteryISR() //ISR for button A  press
        {
            batteryRead = true;
        }
    and in loop, after the wfi, code:
    if(batteryRead) //we woke up because Button C was pressed
    { batteryRead = false; //reset the battery flag
       [code to display battery status from tutorial]
       delay(3000); //hold for 3 seconds
     }
    [rest of current loop: display compass heading ]

    Step 8 - improving the display

    The 128x32 dimensions of trhe display is in pixels. The library generates characters of 5x8 pixels, meaning we get 128/8 = ~ 25 columns X 32/8 = 4 rows of characters, using the setTextSize(1), where 1 is a whole number to scale the dimensions.The display is pretty small, and we don't have a lot of text, so we can make some characters larger.  For example, to enlarge just the "B" in the press button b message, we code:
      // Clear the buffer and display the press button message
      display.clearDisplay();
      display.setCursor(0,0);
      display.print("Press Button ");display.setTextSize(2); display.print("B");  
      display.display();
      display.setTextSize(1);  //reset size for next time
    The "press button " is standard, but the B is double size (10x16 pixels)--we can only get 2 rows of about 12 characters at that size.

    For further readability, I also made the entire battery status and heading messages double size. Another option that I did not choose would have been to setTextColor(INVERSE)--I used WHITE. 

    Step 9 - parts and code

    Parts List
    Adafruit Feather M0 Basic Proto with stacking headers
    Adafruit HMC5883l Magnetometer with standard male headers
    Breadboard and jumper wires

    Code
    /********************************
    2016-1011 VM
    Code sample from Adafruit web site, FeatherWing OLED example
    Combined with HMC5883L example as described below
    Added power management, interrupts, and battery status display, plus a function
    ******************/
    /***************************************************************************
      This is a library example for the HMC5883 magnentometer/compass

      Designed specifically to work with the Adafruit HMC5883 Breakout
      http://www.adafruit.com/products/1746

      *** You will also need to install the Adafruit_Sensor library! ***

      These displays use I2C to communicate, 2 pins are required to interface.

      Adafruit invests time and resources providing this open source code,
      please support Adafruit andopen-source hardware by purchasing products
      from Adafruit!

      Written by Kevin Townsend for Adafruit Industries with some heading example from
      Love Electronics (loveelectronics.co.uk)

     This program is free software: you can redistribute it and/or modify
     it under the terms of the version 3 GNU General Public License as
     published by the Free Software Foundation.

     This program is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     GNU General Public License for more details.

     You should have received a copy of the GNU General Public License
     along with this program.  If not, see .

     ***************************************************************************/
    #include
    #include
    #include
    #include
    #include

    Adafruit_SSD1306 display = Adafruit_SSD1306();

    #if defined(ESP8266)
      #define BUTTON_A 0
      #define BUTTON_B 16
      #define BUTTON_C 2
      #define LED      0
    #elif defined(ARDUINO_STM32F2_FEATHER)
      #define BUTTON_A PA15
      #define BUTTON_B PC7
      #define BUTTON_C PC5
      #define LED PB5
    #elif defined(TEENSYDUINO)
      #define BUTTON_A 4
      #define BUTTON_B 3
      #define BUTTON_C 8
      #define LED 13
    #else
    //these are the values for the Feather M0
      #define BUTTON_A 9
      #define BUTTON_B 6
      #define BUTTON_C 5
      #define LED      13
    #endif

    #define VBATPIN A7 //aka D9, which BUTTON_A uses on the M0--don't use BUTTON_A for interrupts if you are also trying to display battery status

    #if (SSD1306_LCDHEIGHT != 32)
     #error("Height incorrect, please fix Adafruit_SSD1306.h!");
    #endif

    /* Assign a unique ID to this sensor at the same time */
    Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);

    String directionArray[] = {"N","NNE","NE","ENE","E","ESE", "SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW" };   //array for map function 16 compass directions
    int Dir=0;  //index for directionArray

    const float declinationAngle = 0.261799;  //angle for Orleans, MA
    float heading = 0; //this and next for comparison to see if we've been interrupted
    volatile boolean headingRead = false; //variables in ISR need to be volatile
    volatile boolean batteryRead = false;

    #if defined(ARDUINO_SAMD_ZERO) && defined(SERIAL_PORT_USBVIRTUAL)
      // Required for Serial on Zero based boards
      #define Serial SERIAL_PORT_USBVIRTUAL
    #endif

    void headingISR() //ISR for button B  press
    {
        headingRead = true;
    }
    void batteryISR() //ISR for button A  press
    {
        batteryRead = true;
    }

    String mapDirection (float headDeg)
    {
    //function to return direction in text based on heading in degrees
    //N is 11.25 degrees each side of 0, so that doesn't work too well with the map function
    //so if it's N, we say so
    //this is a nice way of taking the procedural stuff out of line, so the loop code can just ask for the direction
        if (headDeg > 348.75 | headDeg <11 .26="" 0="" around="" case="" direction="North," nbsp="" p="" special="" wrapped="">    {
            Dir = 0;
        } else {
    //otherwise we elimiate the decimals and map degrees to text in 22.5 degree increments    
            Dir = map(headDeg*100,1126,34875,1,15);
        }
    //and return the selected text compass direction  
        return directionArray[Dir];
    }

    void setup() {

      // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x32)
      // init done
      // Show image buffer on the display hardware.
      // Since the buffer is intialized with an Adafruit splashscreen
      // internally, this will display the splashscreen.
      display.display();
      delay(1000);


      pinMode(BUTTON_A, INPUT_PULLUP);
      pinMode(BUTTON_B, INPUT_PULLUP);
      pinMode(BUTTON_C, INPUT_PULLUP);

      // Clear the buffer and display the press button message
      display.clearDisplay();
      display.setCursor(0,0);
      display.print("Press Button ");display.setTextSize(2); display.print("B");
      display.display();
      display.setTextSize(1);  //reset size

      /* Initialise the sensor */
      if(!mag.begin())
      {
        /* There was a problem detecting the HMC5883 ... check your connections */
        display.println("Ooops, no HMC5883 detected ... Check your wiring!");  display.display();
        while(1);
      }

      interrupts(); //enable interrupts (should not need to do this, but just for drill...)
    //on the zero (as in Feather M0), interrup#=pin#; we use digitalPintToInterrupt here to provide some portability
    //if we change to a different board AND that board allows interrups on the same pins, we don't have to change anything to get the interrupt number
    //if we're using the battery function, VBATPIN is A7, also D9, and button A uses D9, so we avoid conflict
      attachInterrupt(digitalPinToInterrupt(BUTTON_B), headingISR, LOW); // when button B is pressed display compass heading; use LOW because FALLING does not work in sleep mode--needs a timer
      attachInterrupt(digitalPinToInterrupt(BUTTON_C), batteryISR, LOW); // when button C is pressed display battery status
    //set System Control Register (SCR) sleep bit to deep sleep (do once so wfi (wait for intyerrupt)  in loop waits)
    //There are 2 sleep modes, idle and standby (deep) Sleep bit is SCR bit 2, 0 is idle, 1 is standby
    // SCB->SCR |= 0b00000100; //just a test to see how to code binary--this works
    //   SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;  // set to deep sleep (bit-1) by ORing with 100
     SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;   //set to idle (bit=0) by ANDing with the inverse of above--leaves all bita alone except sleep, which ANDs to 0
    //  SCB->SCR &= 0b11111011;  //another test
    //There are 3 idle modes, 0 (CPU),1 (CPU,AHB clock),2 (CPU,AHB,APB). Set this if using IDLE
     PM->SLEEP.reg |= PM_SLEEP_IDLE_APB;  //idle turn off CPU, AFB, APB //Advanced Peripheral Bus (APB)   Advanced High-performance Bus (AHB)

      // display instructions at startup
      //set size and color of text, tell the user we're waiting 10s, then say to press the button
      display.setTextSize(1);       //parameter is scale of 5X8 pixels
      display.setTextColor(WHITE);  //options are BLACK | WHITE | INVERSE
      display.clearDisplay();
      display.setCursor(0,0);
      display.println("initializing for 10s");
      display.display();
    //  delay(10000);  //see if sensor will settle down before taking reading
      display.setCursor(0,0);
      display.clearDisplay();
      display.print("Press Button ");display.setTextSize(2); display.print("B"); //button letter is double size
      display.display();
      display.setTextSize(1);  //reset size
    }

    void loop() {
    //the wfi() means we only progress in loop on an interrupt, either button B or C pressed invoking headingISR or batteryISR
    //which set the corresponding booleans
    //If it was C, we display the battery status for 3 seconds and go on
    //in either case, we display the compass heading, complete the loop, and wait for the next button press
     
    //wait-for-interrupt has no effect unless the sleep bit is set in the
    //System Control Register (SCR)(see setup, in the attachInterrupt area)
    while (!(batteryRead || headingRead)) { //if an ISR has not set one of the booleans, wait (they're both initalized to false)
    //if the sleep bit is set, we wait after this instruction for an interrupt
     __WFI();  //Double underscore!! (took me a few looks to see that)
    }
     if (batteryRead)  //if we got here because operator wants battery info (button C pressed--see batteryISR)
      {
        batteryRead=!batteryRead;  //reset for next pass
        float measuredvbat = analogRead(VBATPIN);
        measuredvbat *= 2;    // we divided by 2, so multiply back
        measuredvbat *= 3.3;  // Multiply by 3.3V, our reference voltage
        measuredvbat /= 1024; // convert to voltage
        display.clearDisplay();
        display.setCursor(0,0);
        display.setTextSize(2);  //set size    
        display.print("VBat: " ); display.println(measuredvbat);
        display.setTextSize(1);  //reset size
        display.print("Press Button ");display.setTextSize(2); display.println("B");
        display.display();
        display.setTextSize(1);  //reset size
        delay(3000);       //hold for 3 sec, then go on and display heading
      }
    //however we got here (BUTTON_B or BUTTON_C), read the compass and display
        /* Get a new sensor event */
        headingRead = false;  //set headingRead to false whether we need to or not
        sensors_event_t event;
        mag.getEvent(&event);
        float heading = atan2(event.magnetic.y, event.magnetic.x);
        heading+=declinationAngle;  //add declination for location--initialized as a constant
        // Correct for when signs are reversed.
        if(heading < 0) heading += 2*PI;
        // Check for wrap due to addition of declination.
        if(heading > 2*PI) heading -= 2*PI;
        // Convert radians to degrees for readability.
        float headingDegrees = heading * 180/M_PI;
        // use degrees to determine text Direction in map function
        display.clearDisplay();
        display.setCursor(0,0);
        display.setTextSize(2); display.print(headingDegrees);display.print("="); display.println(mapDirection(headingDegrees));
        display.setTextSize(1);display.print("Press Button ");display.setTextSize(2); display.print("B");
        display.display();
        display.setTextSize(1);  //reset size
    //end of loop--back to top to wait for interrupt (next button press)
    }

    Step 10 - next steps

    Now that it works on a breadboard the next step is to put it in an enclosure. I have a Radio Shack 3x2x1" box. I'll add a power LED, put the project on a perf board,make holes for the LED and the microUSB to reprogram and charge the battery, and make an opening for the display and buttons.

    One problem is that the HMC588l is sensitive to magnetic and metal objects, including batteries. When I power it with a LiPo, the battery causes it to give erroneous headings.  I need to work on that.



             


      


    Monday, August 22, 2016

    Interference Problem Solved

    For the category "better late than never"...

    Before I left for Texas for a month, I disconnected the antenna cables to my Ten Tec Jupiter HF  rig and my Yaesu FT1900R 2 meter rig.  When I got back and reconnected everything,  I had major QRN on 2 meters. People could hear me fine, but reception was spotty at best.  

    I tried moving the cable around with no success.  The only difference from before the trip is that central air conditioning unit was on.  I never got motivated to get into into in detail, because HF was fine (I thought) and I use 2 meters more for mobile.

    This past weekend we had an ARES drill for which I was assigned to operate my base station. I turned off the A/C--no difference on 2M.  The next suspect was the computer, but that's always been right where it is.  I shut the computer down and the static disappeared. I looked online and found that the monitor may be the problem.  I tried just turning off the monitor without shutting down--that was it.  Brain jock that I am, I ran the antenna cable behind the monitor.  I moved it, running it under my desk to the Yaesu, and that was it.

    We were also operating on 40 meters.  I was getting static there in about a 3kHz range. Since the radio gods have a sense of humor, the frequency we used was right in the middle of that range.  It turns out that the source was the A/C--when the unit switched on, I got static.

    Moral of the story: don't run antenna cables behind a computer monitor, and A/C has potential  to produce interference.

    Monday, April 25, 2016

    On the air!

    As described in  this post  the antenna (G5RV Jr) was mounted yesterday. Today, we finished the connections (see photo), and hooked up the Ten Tec Jupiter.
    Ladder line connected to coax via a juntion box, to the balun and off to the rig
    I was able to hear a lot on 20 meters and some on 40.  It's tough to break in at times, and it's not always clear whether I'm not getting through or some one else is transmitting over me. Very often, you only hear one side of a conversation.  For example, I could hear someone in the Czech Republic clearly. At one point he was talking to someone in Connecticut, probably 200-300 miles from hear, but I could not here the Connecticut station.  Propagation is funny like that.

    I did check into a marine net just to be sure I was getting out, and a relay station in Georgia confirmed the check-in. Later I spoke with someone in Portugal and someone else in Nicaragua.  This is cool. Tommorow morning I'll try ECARS (East Coast Amateur Radio Service) to see how I do on 40 meters.

    Sunday, April 24, 2016

    G5RV Jr mounted--almost all set


    On the house (middle)--J-Pole for 2 meters on the left
    G5RV Jr on the mast with balun and juntion box
    I wanted to get my new antenna mounted and installed yesterday (23 April) so I could get on the air for Marconi Day.  Unfortunately, it rained and we decided to be safe.


    Today, we go the antenna mounted on the house and ran the horizontal wires out to trees, The job went smoothly almost without issue.  The only problem was that the ladder line extended down farther than I expected. We measured, and it was 19+ft.  I went back and checked the specs, which say 16ft. I went to my 2 meter rig and raised a local ham with the same antenna, and he verified the 16ft. 

    So, we took the antenna down, cut the ladder line down, desoldered the existing connection from ladder line to the SO-239, and soldered the shorter piece. Then we re-mounted the antenna and ran the horizontals out to trees in the back yard. We used ropes connected to the insulators to secure the antenna to the trees, and inserted 24" rubber bungees for strain relief.

    By that time we were ready to call it a day.  For tomorrow:

    1. mount the choke balun on then house
    2. mount a waterproof juntion box next to the balun
    3. connect the balun to the ladder line inside the junction box
    4. connect coax to the balun, with a lightning arrestor  between them
    5. ground the lightning arrestor to the ground rod
    6. run the coax through the wall to the shack and connect to the HF rig
    7. figure out what I need to do for station ground
    8. get on the air!