Solved: Honda Lawn Mower (Model HRX217HYA) with GVC 200 Engine and Automatic Choke Hard to Start

In 2022 I bought a new, fancy, Honda lawn mower. I decided I needed something self-propelled and had a clutch so I wouldn’t have to restart it every time I had to stop and pick something up out of the grass.

This lawn mower has been a total bust. It was hard to start from day one. The retailer blamed the gas, which was nonsense. I did some research and these mowers regularly have issues with their automatic chokes, mainly due to it thermowax choke actuator. I detailed replacing the thermowax here.

By the time I replaced the thermowax, it was warm enough in the season I couldn’t really tell if the problem had been solved, but by the end of the season, clearly it had not.

Last season, on the last cutting of the year, it was quite cold and it took about 15 pulls to get the pile of crap running. I was not pleased, to say the least, and decided I was just going to have to get rid of it. Every honda engine I’ve ever had (generator, pressure washer, motorcycle, and auto) has been excellent. So this mower has been a true disappointment.

Last month I stopped to visit a friend who repairs garden tractors for a living. I discussed the issue with him. He was familiar with the thermowax actuator and said to check all of the linkage and be sure it was working before just scrapping the mower.

This morning I took a look at the motor. I started by taking a picture of the choke butterfly valve. To me, it is not closed far enough. I sent the picture to him, and he confirmed it definitely was not fully closed. Aha! At least there clearly an issue that might be able to be fixed.

I removed the carb and played with it. Clearly, the valve was not closing all the way, but there was nothing wrong with the linkage. The pin in the thermowax actuator was fully retracted, but the butter fly valve would open as I placed the carb back into position. It was like the thermowax actuator was just too long:

I sent this picture to my friend who said it definitely was sticking out too far and sent this video to me for reference:

I had direct sunlight and could see into the hole and I didn’t see anything in it, I just couldn’t get the actuator to go far enough back.

I had originally noticed some kind of rubber thermal putty around the actuator, but hadn’t thought any more about it. On further examination, I realized that putty was in the back of the hole – it looked enough like the head under bright light I didn’t see it at first.

I started picking at the putty with a small screw driver and was able to get a lot of it out, especially from the bottom of the hole where it was causing issue:

With the putty out of the hole, now the actuator fits properly:

and the choke butterfly valve fully closes:

 

NNote to anyone having this problem: above is exactly how the butterfly valve should look when the engine is cold. When this problem started, I tried repeatedly to find a picture of what this valve should look like closed so I could verify I was having a choke issue. I never found a clear picture and was never quite sure if the choke was the problem until now.

I fully reassembled and put in fresh ethanol-free fuel – I had let the engine burn out the remaining fuel end of last season.

Even with a dry carb, the mower started in 3 (moderate) pulls at 55 degrees F. Looks like the operation was a success! Tomorrow I’ll try another 50 degree start now that fuel is in the carb bowl. I’m betting it will start on 1-2 pulls rather than the 8-15 it has been taking when it is this cold.

Update

Next morning I tried another cold start in 46 degree F ambient temperature. Started on 2nd try. I can definitely live with that!

 

Posted in c-Misc | Tagged | 1 Comment

Canon iP8720 Inkjet Printer Error B200

Having not used my Canon inkjet printer for 4 months,  I fired it up the other day to print something in color. I was greeted with error code B200 and a message to take the printer to a service center. I got that sinking feeling yet again.

I detest inkjet printers as I’ve stated in the past. My ancient Brother laser printer has run error free for over a decade. I just replace toner and drums as necessary with no muss or fuss. I keep those parts on hand and never experience downtime with that printer.

The inkjet printers I’ve owned, on the other hand, regularly clog up and waste time and ink trying to get running satisfactorily. I would dump this iP8720 in a heart beat but once in a while I want to print to ledger size paper or maybe print a proof photo and I can do neither on the laser printer. So I continue to nurse this ailing beast along.

First I reset power on the printer with no luck. Then I replaced the several ink cartridges that were seriously low. Still no luck. Finally I resorted to removing and carefully cleaning the print head.

Even cleaning the print head made no difference, and I am very reluctant to replace it – it wouldn’t be much of a jump up to then just replace the printer with a new large format inkjet (albeit probably locked into mfg inks).

After doing a little research, I stumbled onto this video:

At first, there was nothing new in that video, but he did mention to try this:

Unplug the printer power, manually move the print head to the center position, plug the printer back into power, then when the print head starts moving, close the cover.

Frankly, that just sounded like voodoo, but with not much else to try, I gave it a shot and son of a gun if the printer didn’t power up correctly without error B200. From there I just had to clean print nozzles and do nozzle tests until I got a good result.

One additional note: last time I purchased a bunch of ink cartridges for this printer on ebay, they sent no gray cartridges. Looking around, I found just about no one including gray even though they say their ink is compatible with the iP8720. Yeah, compatible, but incomplete!

 

Posted in c-Misc | Tagged | Leave a comment

Matchstick Launcher

Warning: Don’t build this!! If you do build it, don’t use it!! You have been warned.

I bought a box of clothes pins. I use them to seal chip bags, bread, whatever. WAY cheaper than the plastic purpose built ‘chip clips’. And a box will last forever…

While putting these away, I remembered back to the matchstick launcher my Dad showed my brother and I how to build. Given we were both in elementary school at the time, it probably wasn’t one of his better parenting choices. Fortunately my mom did not buy kitchen matches or we probably would have burned the house down.

I hadn’t built such a launcher in decades so I went to the interwebs looking for instructions on exactly how to rearrange the spring into a trigger.

Oddly, there were complicated versions of a ‘matchstick gun’ that required some cutting and/or carving. Further, they all seemed to require lighting the match before launching. Tho those designs were admittedly superior, I couldn’t find a version of my Dad’s simple design – one so simple an elementary student could build 🙂

After some messing around I figured out how to build his version of a matchstick launcher. In his memory, I am posting it online. Thanks Dad, for this and the other poor parenting choices you made that made life fun!

Look at the picture and you will see how to rearrange the spring onto one side of the pin to turn it into a ‘gun’ with a trigger. Then simply lay a kitchen match on top, match head facing the spring. Pull the trigger, and the match will be lit and flicked.

I don’t have any kitchen matches on me to test with, but it will launch a cotton swab about 10 feet.

There is no ‘barrel’, no control over where it goes, and the trigger is extremely sensitive. It is an accident looking to happen. Again, don’t build this!!

 

Posted in c-Misc | Tagged , | Leave a comment

Sunrise / Sunset Algorithm Implemented in C / gcc

I needed to port the algorithm I wrote for Pascal to C. See Sunrise / Sunset Algorithm Implemented in Free Pascal / Lazarus for additional information.

The C library can be found here.

Besides the cpp and h files, there are some other files used by codeblocks. You can disregard those.

 

 

Posted in c-pcos | Tagged | Leave a comment

The HP 15C Scientific Calculator (Collectors Edition)

Several years ago, I wrote about the HP 16C Programmers Calculator. Although I don’t pull it out that often, there is a great emulation for the HP 16C (also discussed above) and I do use that when I need to twiddle bits.

The HP 16C was one in a series of calculators in the Voyager line of calculators. The HP 12C was the financial version in the Voyager line which was huge success and has been in production continuously since 1981. I can remember all of the corporate accountants had one. You can now find a new 12C on Amazon for about $37.

The HP 15C Hewlett-Packard’s scientific calculator. It was made from 1982 until 1989. While I would not have minded having one, it was expensive and not a calculator I really needed so I went with cheaper calculators for my non-programming needs.

Recently I discovered Hewlett-Packard had released a Collectors Edition of the HP 15C in 2023. In fact, there had been a Limited Edition released in 2011.

I have a small collection of calculators, largely old stuff I used at one point in time. I really want to add the HP 15C Collectors Edition although admittedly I have no need for it. I just WANT it!

I guess HP has sold out because I could only find 15Cs for sale by 3rd parties on Amazon or on eBay. The price is all over the place. I found someone who had sold a couple of hundred of them, and I got it from him for $170.

After receiving the HP 15C calculator, I wondered if there was an HP 15C emulator. Sure enough there is, and it is done by the same guy, Bill Foote, who did the HP 16C emulator.

The website is here: https://jrpn.jovial.com/. At the top of this page, you will find web-based versions of both calculators. Click on this picture to go directly to the web-based HP 15C:

If you go to the installation link, you can find versions for many platforms including Windows, Linux, and Android.

If you find you really like this emulator, you will want the manual as well:

hp15c-oh-en.pdf

If you’ve never used an RPN calculator before, it would pay to look at the first section of the book. RPN is a little weird to use at first, but once you figure it out it’s easy.

 

Posted in c-Misc | Tagged | Leave a comment

WWVB Atomic Clock Receiver Driver for Teensy 3/4 (MAS6180C)

I have finally gotten around to wrapping up my driver for the Canaduino 60kHz WWVB clock receiver breakout board I purchased last fall.

Information on assembling and testing the breakout board can be found here.

In that post I discuss the post written by Bruce E. Hall, W8BH. (I’m going to assume you understand his post well – my post will not explain any of the format of the data coming in, just how I process it). His post is a great explanation of using the breakout board and includes code to access it. Mr. Hall ends up writing interrupt based code to read the board. Unfortunately his code to find the beginning of the packet (a function called sync) is blocking code (e.g. nothing else can run while it is running). If you can’t get a clean signal quickly (almost always the case, at least for me), then the code still spends a lot of time in sync and blocking.

For the breakout board to meet my needs, it can’t be blocking any other code I want to run. So I decided to try and write my own Atomic Clock receiver interrupt routine that could perform the entire process of finding the start of a data packet and then retrieving and decoding it.

My code ONLY runs on a Teensy 3.x or 4.x microcontroller. It was my intention to write it to also run on an Arduino Nano, but I quickly found I did not have enough memory for it to run on a Nano. Except for the interrupt timer, the rest of the code is pretty vanilla so it probably would not be too hard to migrate to another MCU with more memory.

The interrupt routine was interesting to write. I’ve written interrupt routines before but nothing this large. In essence, it is a small program that runs constantly in the background trying to receive a good time packet while allowing the rest of the code to run unmolested.

The main code (loop()) is written as a state machine. The interrupt routine (wwvblib) is also written as a (finite) state machine. Prior to working with MCUs, maybe I ran across the definition of a state machine, but I never had any reason to implement one.

Once I started working with MCUs I struggled trying to handle interactions with the outside world reliably. I was then introduced to state machines. I remember seeing a state machine for a vending machine, and it was an AHA! moment. It had always been a mystery how a largely mechanical device could count change. Once I started using the state machine concept, I started being able to write much more bullet-proof MCU code.

The Library

The library and test code can be found here.

The wwvb library is in the files wwvblib.h and wwvblib.cpp. Those will also need globals.h and globals.cpp to provide some generic types and procedures I use across all these files.

The rest of the modules make up the code used to test the wwvblib.

I do not believe any other externals, other than those installed when Teensyduino is installed, are required to compile this code.

Operation of the Test Code

The hardware should be setup as described here with the breakout board pin OUT connected to pin 3 on the Teensy 4.x or pin 20 on the Teensy 3.x.

With the breakout board connected to the MCU, compile the code and connect to the MCU serial port with a terminal emulator configured for 9600 baud. You will see:

@loop
@STATE: st_init
@ti_init: tz: 3; useDLS: 1; timeStatus: 2
now(): 02/02/2024 08:55:41; ti_DLS: 0
@wwv_init: 02/02/2024 08:55:41; startHour: 0; duration: 0

Press any key to monitor signal strength.

Unless you just happen to have a strong signal, the code will do nothing else.

The first thing you can do is press a key to enable the signal strength monitor. This can help you align the antenna to get the best signal. When press any key you will see:

@STATE: st_idle_init
@STATE: st_sigStrength
Press any key to stop monitoring signal strength.
@wwv_sigStrength (08:55:57): Trans: 7; T/sec: 2; f: 1.000; Strength: 9
@wwv_sigStrength (08:56:00): Trans: 13; T/sec: 4; f: 0.958; Strength: 8
@wwv_sigStrength (08:56:03): Trans: 5; T/sec: 2; f: 1.000; Strength: 9
@wwv_sigStrength (08:56:06): Trans: 6; T/sec: 2; f: 1.000; Strength: 9
@wwv_sigStrength (08:56:09): Trans: 4; T/sec: 1; Strength: 10
@wwv_sigStrength (08:56:13): 
Done Monitoring.

The signal strength is reported as the last datum on each line. Rotating the antenna you will see the strength change. You MUST have a continual signal strength of 10 to receive valid data. That will normally only be the case at night, often for just a few hours.

Rather than wait for a good signal, you can emulate one using the procedure I outlined here. Note that I have had great luck using the emulator software on a tablet that has a stronger speaker than my phone. The procedure will work on my phone, but not as reliably.

Once the program sees the beginning of a packet, it will start reporting its progress of receiving and decoding the packet:

02/02/2024 08:57:59 2nd Marker found(59s)
Date & Time: 02/02/2024 08:58:00: ti_valid: 1
@readPacketInit_state
480 180 510 190 520 190 210 210 790 170 210 210 510 190 210 520 200 210 790 170 
250 170 250 170 210 250 480 520 790 180 250 480 520 190 210 210 210 210 800 200 
170 210 210 210 210 240 470 220 750 180 510 180 210 210 510 180 210 210 790 
@readPacketDone_state:
MHLHLHLLLMLLLHLLHLLMLLLLLLLHHMLLHHLLLLLMLLLLLLLHLMLHLLLHLLLM
@decodeBits_state: 08:58:59
@ti_setRTC: timeStamp: 1706885940
Teensy internal RTC to Fri Feb 2 06:59:00 2024
old time : 02/02/2024 08:58:59(1706864339)
new time : 02/02/2024 06:59:00(1706857140)
correction: -7199
02/02/2024 06:59:00: decoded wwvb packet: 033/2024 14:58:00 GMT
DUT1 sign: 0; Offset: 0.000000; Leap Year: 1; Leap Second: 0; DST: 0
mo: 2; da: 2
timeStamp : 1706885940
wwv_corrLast : -7199
wwv_syncCount: 1
wwv_corrTotal: 0
wwv_corrAvg : 0.000000
packetRxTimer: 59820
Date & Time: 02/02/2024 06:59:00: ti_valid: 1
@waitForNextCycleInit_state: reqStartHour: 0
@ti_updDLS: time changed manually. Locking out ti_updDLS

In the above example, you will see the time is corrected a lot – 7199 seconds. This was because the Teensy’s RTC (real-time clock) had been set 2 timezones different from what the test code was expecting (the RTC was set for CST and the test code was being run for PST).

wwvblib Calls

Note: I do NOT create objects in C++, thus this library doesn’t have any objects. Having used objects in Delphi/Lazarus for many years, I find C++ objects to be grotesque. You probably like them and that is fine. Just explaining why they aren’t present here…

There are just 3 calls necessary to use wwvlib:

wwv_init(<startHour>,<duration>)

Use wwv_init to initialized the process. When you call wwv_init, it will immediately enable wwv_tick (the function called by the timer interrupt), and start trying to get a good wwvb packet. Once a good time packet is received, then <startHour> / <duration> will control when wwv_tick will try again. <startHour> is the hour when it will start retrying. <duration> is how long it will try, in hours. The default is wwv_init(0, 6) which will start trying at midnight and try for 6 hours before giving up and waiting for the next midnight.

wwv_end()

You can call wwv_end at any time to stop wwvlib from trying to receive a good packet any longer by turning off wwv_tick.

int wwv_sigStrength()

wwv_sigStrength samples the OUT signal on the breakout board 100 times per second for 3 seconds. From this it will calculate the signal strength from 0 to 10 and return that value to you.

Supposedly, wwv_sigStrength will not impact the interrupt procedure (wwv_tick) which might also be trying to decode simultaneously. In practice, it seemed to me that it was interfering with wwv_tick.

There are several global variables you can read

wwv_abortCount – number of times wwv_tick gave up because duration exceeded.
wwv_corrAvg – Average of all the corerections (seconds).
wwv_corrLast  – the last correction (in seconds).
wwv_corrTotal – The total number of corrections.
wwv_decode – the last decoded wwvb packets.
wwv_timeSet – the time the RTC was last set by wwv.
wwv_state – state of wwv_tick: invalid, listening, valid.
wwv_syncCount – number of times the RTC has been set by wwv_tick.

Code Overview

firmware.ino contains setup() and loop() functions. Looking at it:

At the top are the compiler versions and board settings I used to compile the code.

As mentioned earlier, firmware.ino is implemented as a very simple state machine. The init state starts everything up. It then moves to the idle state which primarly just displays the current time every minute and waits for the user to press a key. If a key is pressed, sigStrength is entered which will continuously report the signal strength until another key is pressed.

globals.h contains a couple of config macros you will probably want to change:

#define rtcTeensy // RTC internal to Teensy 3x/4x
//#define rtcDS3231 // External DS3231 RTC
//#define rtcNone // No RTC available

The Teensy 4.x has a built in RTC (real-time clock). If you are using it, define rtcTeensy to make use of it.

The Teensy 3.x has an RTC, but requires a crystal be soldered to the board for it to function. If you have the crystal, use #define rtcTeensy. Otherwise, you can use an external DS3231 RTC or not use one at all (in which case the date/time is invalid when the Teensy 3.x starts and until it properly receives a packet from the breakout board.

wwvblib is where everything happens. Actually, wwv_init and wwv_end are very simple. They simply setup/teardown a timer interrupt that will call wwv_tick every 10ms. So, really, wwv_tick is where everything happens.

wwv_tick is implemented as a state machine. When the timer interrupt calls wwv_tick, it will execute which ever state is in the <state> variable. That state may or may not change the <state> variable, but, either way, once the current state is completed, wwv_tick is exited and the process starts over again on the next timer interrupt.

Note that there are quite a few variables in wwvlib.cpp declared static so they will retain their value between calls by the timer interrupt.

The states of wwv_tick (found in the <state> variable) are:

init_state – Setup to start looking for the beginning of a packet (2 adjacent MARKs).

getMark1_state – this state examines the breakout board OUT pin for a MARK signal. It waits for a HIGH signal then determines what type of signal it read. If a MARK is found, <state> is set to getMark2_state otherwise it is set to init_state.

getMark2_state – if a 1st MARK is found, then this state looks for the next bit read to also be a MARK. Two adjacent MARKs indicate the beginning of the packet has been found. If 2nd MARK is found, <state> becomes readPacketInit_state otherwise the <state> returns to init_state.

readPacketInit_state – we’ve found the beginning of a packet so setup to read it and then proceed to readPacket_state.

readPacket_state – This state will read all of the bits to create a buffer of the entire packet. If any error is detected, <state> returns to init_state. If we read all 60 bits, then <state> becomes readPacketDone_state.

readPacketDone_state – The packet has been read. This state will do some simple tests to verify a good packet. If good, <state> becomes decodeBits_state otherwise <state> becomes init_state.

decodeBits_state – This is a lengthy state that decodes every bit in <packet>, creating the proper values in wwv_decode. Once the packet is decoded, this state also sets the RTC using values decoded into wwv_decode. If an error is detected by this state, <state> is set to init_state otherwise it is set to done-state.

done_state – This state does a bit of cleanup, then proceeds to waitforNextCyleInit.

timeout_state – This state is entered only if <duration> is exceeded. A bit of cleanup occurs, then this state proceed to waitForNextCyleInit_state.

waitForNextCycleInit_state – This state determines if we need to wait until <startHour> to start another cycle or if we should start trying to receive another packet immediately. It wil either proceed to init_state or waitForNextCyle_state.

waitForNextCycle_state – This state pauses wwv_tick until <startHour> occurs.

The states of wwv_tick do a pretty good job of describing how the beginning of a packet is found, read, decoded, and processed. The one thing I don’t mention is how I try to handle noise.

<recentBits> is used to ignore short drops in a HIGH signal. wwv_tick looks at the radio signal every 10ms waiting to find a HIGH signal. Once a HIGH signal is seen, a timer (<timer>) is started and wwv_tick keeps sampling the radio signal. Now, however, instead of just looking for a single LOW signal, it waits until it samples 4 LOW signals in a row.

<recentBits> always contains the last 4 samples read from the breakout board. Only when the last 4 samples are LOW (<recentBits> == 0) does wwv_tick assume it really has encountered a LOW signal. Once that 4 LOW signals have been sampled in a row, then 40ms is subtracted from <timer> (10ms per LOW signal read), and <timer> now contains how long the HIGH signal lasted. Thus, spurious LOWs in the middle of a long HIGH are ignored.

Once the signal transitions from HIGH to LOW we can look at the value of <timer> to determine if we received a LOW, HIGH, or MARK bit. Per the MAS6180C datasheet the timer range for each is:

100-300              LOW
400-600              HIGH
700-900              MARK

What’s Next?

I’ve implemented this code on my Teensy 4.0 Dev platform which includes a WiFi module. I can obtain current time from either an NTP source or the WWVB radio station. Along with the Teensy RTC maintaining time when there is no power, I’ve created a pretty accurate clock.

Originally I was going to use this to drive a Nixie Tube display. But then I was given an old Simplex commercial clock (like found in schools at least when I went to school). I would like to place that Simplex clock in my lab.

Now my plan is to figure out how to force that clock to sync and use this project to then maintain accurate time on that old clock.

 

 

Posted in c-electronics, c-teensy | Tagged | Leave a comment

WWVB Antenna Alignment Really does MATTER!

I spent a little time in South Texas, so I took my WWVB receiver with me to mess with while there.

Being on the East side of the Rockies makes a huge difference in receiving the WWVB signal from Fort Collins, Colorado. On the west side of the Rockies I could only get the signal after dark and usually only for a few hours each night. In Texas, I’m receiving the signal pretty much 24 hours a day. What a difference!

Once I established I could receive the signal continuously with the antenna properly aligned, I rotated it 90 degrees – perfectly out of alignment.  Doing that, I could not receiving the signal at all no matter the time of the day.

If you want your WWVB project to work, make sure the antenna is aligned properly. The broadside (long side) of the antenna should be facing Fort Collins, CO.

To determine the compass heading from my location to Fort Collins, I used the website http://earthdirections.org/locate/

For city1 select the city closest to you (or use latitude/longitude of your location. Fort Collins isn’t in the list, so select Denver for city 2. It is pretty close:

The Azimuth is 335 degrees – that is the direction to face the broadside of your antenna.

Now I just need to know which way 335 points. 335 isn’t too far from 360 degrees. It would be about NNE on the compass rose. I’m pretty sure I know about which direction that is, but I’d rather be more precise.

To get an exact direction you will need a compass. Or in the ‘modern age’ a compass app. I have used an Android App simply called Compass.

When you start the app, it should tell you to calibrate the phone’s magnetometer. DO THIS. I’ve seen it be way off when not calibrated.

I believe the Azimuth uses true North. Make sure your compass app is set to show true North, then turn it until the proper heading is on the index line (gray arrow head on this compass):

Now I know which way to point the broadside of the antenna. There is no front or back – it can be either side of the broadside.

When I took this measurement, I put down a post-it note to mark the proper direction as I know I will knock the antenna around when I’m messing with it.

 

Posted in c-electronics | Tagged | Leave a comment

When a Permanent Marker isn’t Permanent Enough

I am a big fan of permanent markers (PM),  particularly the Sharpie brand. I keep them in my office, garage, kitchen, and lab.

I find it handy to write notes directly on objects so I don’t have to look up information. The weight of oil I need for my mower and generators is written on the machine. I have a big arrow pointing to the carb drain screw for a generator and a pressure washer because I can never remember exactly where they are. The dates I refilled my emergency water supply cans are written directly on the can. I find PMs very useful to aid my bad and getting worse memory! Nearly anything that will expire has the purchase date written on it.

I have noticed that PMs aren’t quite permanent. Overtime they fade. In this picture, the original marking of the oil weight is at least 10 years old. The underline is brand new.

I went through my house looking and most of the stuff marked with a PM looks about like the above: faded but still readable. The places where the writing is way worse is anything left out in the sun where UV does its magic. I attempted to write the install dates of the batteries for my weather station on its case, but those dates were completely gone within 2 years.

It came to my attention recently that a Coke bottle I signed with a PM quite a few years ago had almost completely faded. When I looked at it I could only barely make out the signature. I guess the glass surface of the Coke bottle plus UV light from where it had been stored combined to severely fade the ink.

Since it is rather rare that I loose a Coke bet, I wanted to make sure that bottle lived on, if only in infamy. So I did some research on finding something better than a PM.

I honestly don’t know exactly which website I found that discussed the problems with sharpies fading, but this one has the same advice. Namely, an oil-based paint PM would work much better on glass and is less prone to fading.

So I purchased a Sharpie oil-based paint marker like this from Amazon:

 

They come in different colors. When I received it, the tip was completely white and I was worried at first I had accidentally purchased white. Nope, you have to push down on the tip repeatedly to release the ink into the tip.

With the tip primed, I did a couple of tests and it seemed to work well, so I signed the Coke bottle again. After it dried, the result was much nicer than a normal sharpie – a very solid black line.

Time will tell just how much better this oil-based paint PM works rather than the standard PM. Next spring when I have to go up and replace batteries on my weather station, I’ll mark the date on the outside of the weather station and then see just how long that mark lasts.

The reviews on Amazon complain that the tip is not fine. I found it to be about the same sharpness as my normal fine point sharpie. Definitely nowhere near as sharp as my ultra fine sharpie, though.

I also saw some complaints about it running out of ink quickly. From what I can tell, a fair amount of paint is being released when you use the PM. And, being paint, I suspect once you ‘open’ the pen by pushing on the point, the paint in the is going to start drying slowly. I’ve made a note on the side of the pen (using my ultra-fine sharpie) as to when I opened it. I’ll try to remember to report back just how long the pen lasted.

 

Posted in c-Misc | Tagged , | Leave a comment

Emulating WWVB signal to Test CANADUINO 60kHz WWVB Atomic Clock Receiver (V3) – Breakout Board for MAS6180C

Just a quick note in my attempt to receive the WWVB time signal and set my microcontroller’s clock based on that time:

I was way too optimistic about being able to receive a readable signal from WWVB. Not only would I have to wait until night, but even at night the signal cannot get into my office where I am working on the project.

I needed some way to emulate the WWVB signal. I thought I was going to write some code to transmit a valid signal out a Arduino Nano pin attached to a simple wire antenna. Instead, I found someone has written an android app that can emulate the signal using the phone speaker.

The app is called WWVB Emulator, by mokyuu. Start the app and place the phone speaker right next to the antenna.

This has worked like a charm and I get a clean signal continuously.

Posted in c-electronics | Tagged | 1 Comment

Assembling and Testing CANADUINO 60kHz WWVB Atomic Clock Receiver (V3) – Breakout Board for MAS6180C

I recently ordered a WWVB receiver from CanAduino. This breakout board allows you to receive date/time transmissions from the WWVB radio site in Fort Collins, CO. I have kind of an idea I might use this for future projects needing accurate date/time when other methods are not available.

An explanation of WWVB can be found here.

The module showed up with no documentation. Going to their site, there are a few documents:

Note there is no documentation for V3 of the board. They say V3 changes are small enough not to warrant a documentation change.

You can only see the schematic of the breakout board thru a little view port. I can find no way to get a full size image so I can easily examine what is happening.

While looking at reviews on Amazon, hoping to find more basic info, I found someone complain they had trouble installing the crystal. Weird, I didn’t notice a crystal. There was one and it was so tiny it had fallen out of the bag and I never saw it. Luckily I was able to find where it had rolled away to.

I’ve purchased various Raspberry Pi’s and parts from CanAduino before without issue. I’m surprised this device wasn’t a little better documented for beginners. Or maybe they thought this was too hard for a beginner??

Assembly is pretty straight-forward. I stumbled thru the process and I’ll share what I did below. My only real flub was to not position the crystal properly leaving it to touch another pad. Wiring and testing is also pretty easy and was documented by Bruce Hall. I will summarize that in this procedure as well.

Assembly

You should have the following components: the breakout board, 8 header pins, a crystal, and a ferrite antenna:

Soldering Crystal to the Breakout Board

The breakout board works with different radio transmitters, each with its own frequency. The NIST radio station near Fort Collins, CO (WWVB ) as well as the ones in Japan and England transmit on 60kHz so you will install a 60kHz crystal (supplied). If you intend to receive a different station you would need the appropriate crystal.

This crystal is quite small. One reviewer on Amazon mentioned that he had a lot of trouble soldering the crystal leads to the pads as there wasn’t adequate solder on the pad. My technique should help alleviate this problem.

First, I placed the breakout board into a vise to hold it steady. For this job, I used my stickvise.

The crystal is NOT polarized so you can connect either lead to either pad. Using blue masking tape I carefully positioned the crystal. Make sure the crystal sits roughly in the cutout. It can come into contact with leads for one of the ICs on the PCB if you aren’t paying attention.

Before grabbing my solder iron, I used a dental pick and practiced how I would grab and hold the lead against the pad while it is being soldered. If you don’t have a dental pick I strongly recommend one – a whole set is pretty cheap on amazon. I don’t use it often, but I’m glad I have it when I need it to manipulate really small parts.

As you can see, there is already some solder on the pad. When you are ready to solder the lead, touch the tip of your solder iron to your own solder so the tip isn’t completely dry – that should give you enough solder to complete the job.

With the solder iron and dental pick ready to go, positioning and soldering the lead was pretty easy. Not pretty, but I got the job done:

Attaching the Antenna

The antenna presented a bit of a conundrum. First, the leads are too big to fit in the PCB. I saw one guy soldered his antenna’s leads to 2 header pins and soldered those to the PCB. Workable, but I decided I wanted the option to remove the antenna and perhaps extend it a bit. So I decided to crimp on female dupont connectors. I’ve covered this procedure before.

Note that the insulation will not fit into the crimper, but the bigger tabs crimp around the conductor just fine.

Solder on Header Pins

After snapping 6 pins carefully off, I placed the header pins into a breadboard and then soldered the PCB to them.

The final assembly looks like this:

Wiring

The module can support 3-15V. I happen to have a 9V battery that can be quickly connected to a bread board making this project mobile so that is what I used. I was pretty sure I was going to want to walk around testing and I was right.

For testing, wiring is very simple:

Pad Name                          Connection
3-15V                             +9V
AON                               Unconnected
PON                               GND
OUT                               Unconnected
BAR(OUT)                          GND
GND                               -9V

Testing

I live on the West side of the Rockies at least 700 miles from Ft. Collins. The “atomic” clocks inside of my house usually will only detect WWVB after dark, so I expected to have some issues with connectivity.

When you power up the breakout board, wait for the OUT LED to turn on. It can take as long as several minutes. Once the OUT LED lights, you should start seeing it flash.

About every 10 seconds, WWVB transmits a 800ms MARK which will cause the OUT LED to turn off for 800ms. If you have a good connection you should be seeing these MARKS.

When I have the unit on the east side of my house, with the antenna perpendicular to about where I think Fort Collins should be, I see the OUT LED flicker and fully extinguish periodically. When I go to the west side, the OUT LED is almost on solid. Just very short flickers. Chances are that is a bad signal.

If you don’t have a good signal, go outside. If it is still bad, try again later after dark. Here is a coverage map showing signal strength at different times.

My last step was to connect the breakout board to my Teensy 4.1 ‘Dev’ board I built this spring so I am ready to start reading data. I’ved tested with both 5V and 3.3V and the breakout board powered up fine. I will be using a USB battery pack for testing so I can move the whole assembly outside, at night, if necessary during testing.

Nov 2023 Update

I have written code that has successfully decoded the WWVB signal. It will be a while before I will get the chance to make a generic version of the code to make available. Until then, I have a couple of notes worth mentioning ahead of time.

First, in the picture of the breakout board above, connected to my little Teensy 4.0 dev board, you see long jumper wires. Specifically, you may notice that the 3.3V wire runs right next to the antenna. After spending days trying to understand why I could never get a good enough signal to decode even one packet, I found that those long jumper wires were causing interference.

Once I got the jumpers away from the antenna, my reception improved quite a lot and I managed to decode 7 packets that first night between about 12AM and 2AM.

Here is the rewired breakout board:

Further, my original explanation of what a good signal looks like is not very helpful. The OUT LED really doesn’t flicker. It should go to the OFF condition at .8, .5, or .2 second intervals. There should be minimal fast flickering – that indicates a poor signal. I took this video during the time I was getting maximum WWVB signal strength. The focus sucks – the board is in an awkward location where I expect to get the strongest signal. But you can see the OUT light flashing as an example.

Here is a trace of the OUT pin from the breakout board on an oscilloscope:

A ‘0’ is a LOW signal for 0.2 seconds. ‘1’ is LOW for 0.5 secs, and ‘MARK’ is LOW for 0.8 secs.

Posted in c-electronics | Tagged | 1 Comment