Stegoboard-SatNOGS ground station

I started to feel like the SatNOGS ground station “pile” on my desk was taking up space and didn’t look good. I remembered a Stegoboard kit I had purchased a while back, and with the new pi4 out, figured this would make for a good time to rebuild my ground station. What resulted is a pretty cool wall-mounted ground station:

The station

  • Raspberry Pi4, 32GB SD card
  • Raspberry Pi 7" display
  • 500 GB SSD for longer-term data storage (IQ)
  • RTLSDR v3
  • Arduino Uno + LSF G-5500 rotor shield
  • 16x2 LCD for rotor info
  • NeoPixel stick for more status indication

The build

I have a Stegoboard 104 kit, though for this use case the 102 is all that is needed. (I don’t have any connection with the company and this isn’t a promo for them, you could do the same with your own acrylic and a drill - but I’m happy to have bought it for the simplicity)

The board is designed with holes aligned for mounting various devices like SBCs and hard drives in different configurations. There is no right or wrong way, and for me there was a lot of trial and error. I started by laying things out on one board:

I quickly realized that I needed to start thinking three-dimensionally, as the top board would provide more mount points. The top board would also have items mounted on both sides (as the screen would be front-facing), so this also meant arranging the order in which the screws were added. Heat becomes more of a concern with the Pi4, especially where airflow will be restricted in this setup, so I added a fan (which did help a lot!).

(think of this as an open clamshell)

The clearance of the arduino and its shield was the next challenge, as I needed to add the 16x2 LCD display connections. I cut a corner here by using some 90 degree double headers from my parts bin. I made a small power breakout board at this point since I needed more than the pins provided alone.

(I fixed poor little GND - no pins were permanently harmed in this build)

I wanted the ability to quickly glance at the station and know that everything is okay, and blinkenlights are just cool. I went with the Adafruit NeoPixel stick, which added a couple of challenges to the build: it requires 5v logic (and the raspberry pi outputs 3.3v), and it can draw about a full amp for these lights - so its own power source was needed. This called for another custom board with USB for power and a logic level shifting circuit. Given that the pi4 is powered by USB-C and the 7" display by USB-micro, I was going to need 2 power sources anyway, so the USB-micro is split between the 7" display and the NeoPixels. Everything else is powered through the Pi4’s USB bus

(the lights are way too bright at max level - I end up running them around 1% in the top picture)

Next step was to put it all together and clean up the wiring

At this point, powered it up and wasted a day on a bad usb cable that I just got brand new for the project. Pro tip: try everything out before it is all put together.

Mounted on the wall it looks pretty good

The 7" display

The display is showing satnogs-monitor from @wose. It is a Linux terminal based display. The small pi display posed a couple of challenges, a smaller text resolution and I did not want the overhead of X when this is text based to begin with. Out of the box it doesn’t look good at all, but as he mentions in the docs it works well with the Lucy Tewi font. Thankfully he also has a fork of yaft (yet another framebuffer terminal) which includes this font. So - on boot the pi user does an auto-login to console and runs yaft with satnogs-monitor as the target command.

The 16x2 rotor display

This is a very basic 16x2 display, as supported by the K3NG arduino code that runs the Yaesu G-5500 interface. The code supports a wide variety of displays and information to display, but I caution the reader that the code base takes up most of the 32KB of an Uno-class arduino, and the additional space needed by the display varies depending on the display type. In this case it is a HD44780, but you can also get around this by using an arduino mega-class instead.


If you are still reading, it gets hacky from here on out. I wanted quick visual notification of a problem (the kind I might hear from @BOCTOK-1 about)… :slight_smile: System health, /tmp filling up, internet down, etc…

Today I’m using 4 of the 8 lights:

  • First indicator is for network connectivity (as I often lose it), with a simple connect test to google
  • Second is for drive space - if any of the drives I have, or /tmp, fills up to 90% it will turn red.
  • Third, I have netdata running on the pi. This is a bit overkill but at this point so is the whole project. I check the API of the instance ( for any alarms. If any are found in “WARNING” state, amber light… if any in “CRITICAL”, red light.
  • Lastly, a Blue light shows when a job is running, enabled/disabled via SATNOGS_PRE_OBSERVATION_SCRIPT and SATNOGS_POST_OBSERVATION_SCRIPT

Now - the challenge of this NeoPixel stick is that it does not keep state (and why would it?). Since we have redis running on the client already I wrote a library to retrieve, modify, then store the light state in redis anytime one of the other apps needed to make a change. I imagine there are plenty of better ways of handling this.


I like the look of it. I like the cables exposed, while knowing that there is organized chaos inside. The down side is that if I ever need to replace the SD card, I will have to open it up… and as much as I would love to take it with me to show at conferences, it looks like a bomb waiting for James Bond to diffuse!


This is fantastic! Thanks so much for detailed post.
I have built a web based monitor for my two stations (VHF and UHF) for an old Android tablet, but yours is way cooler.
I also use Netdata and love it.
Mostly I use Node-RED. The SatNOGS API is awesome and provides everything I need for that.

Anyway, just wanted to say thanks for the detailed post, you have given me some ideas…


Awesome @cshields. Many thanks for sharing. After I had my pole sorted yesterday i just wanted to start on this topic today. My desk is unusable too. Many thanks for a bunch of ideas.

73 Oliver

1 Like

Hi @thebaldgeek. I am using Node-Red in my house too. Is there something to read on how to combine node-red and the satnogs-api?

73 Oliver

1 Like

Yes. I put a sample flow here;

This is where I started, then added more fancy stuff after I got the basics going.


Oh, that was fast. Many thanks @thebaldgeek !

73 Oliver

Took a few hours, but I got the satnogs-monitor working… thanks to @wose At the moment its just running in PuTTY on my monitor, but I will be building a display for the pi and mounting it like you have.

Thanks again for this post, really kicked me into action.


Thanks from me too - this is wonderfully inspiring!

I spent a happy evening setting up my 7" screen with an old Pi 2 I wasn’t using, and now have yaft and satnogs-monitor running on it. I have a silly question to ask:

Can you share how you have it booting into yaft and satnogs-monitor? I’ve tried several ways (crontab, rc.local and init.d) but the closest I can get is starting yaft or satnogs-monitor - but not both. So I’m currently running them manually on startup instead.

Thanks again!

Thanks a lot for sharing this information.

At the moment, since I am only running on my desktop PC and an old iPad, I manually start the terminal.
I am hunting around for a monitor to put on my Pi… No luck so far.
Will report back if we get something running and auto starting.

Here is a little more information on the old iPad.
Its so old as to not get updates and so its stuck back in the dark ages.
Most of the common and popular apps (Chrome for example) either wont even load or if they do, they are feature crippled.
I did find an SSH app that would load and run Ok… So, what better screen to run satnogs-monitor!
It looks a little stretched due to the aspect ratio, but all in a all, its a great use for an old screen.

EDIT. Here is a photo of the old iPad running Satnogs-Monitor.


Welcome @testmatch!

Its a bit hacky. Set the pi to autologin the pi user to console (raspi-config), then in /home/pi/.bash_profile set:

if tty | grep -q '/dev/tty1'; then
    sleep 10
    /usr/bin/yaft <your path to>/satnogs-monitor

I ran into a race condition where yaft wouldn’t start right away on boot, hence the sleep. (I don’t recall what the startup dependency was, and I’m not in a place to recreate it right now)



Splendid - that works. :smiley:

Thanks for the welcome too - I’ve been around for a few months, but not posted until today.


I found that Satnogs-Monitor also works great on an old Android phone I had sitting on the shelf.


I’m using this flow as well and its pretty handy. Much better than the one I tried to produce. How is it developing?


If you are meaning the Node-RED flow, I have not done much with it.
I have been focused on my other web based dashboard and the satnogs-monitor dashboard.
I plan to get back to Node-RED and pretty it up, but honestly, its pretty functional as it is.

Its been running for me since you sorted out my flow (tnx btw) and like you said it works well. The satnogs-monitor dashboard is great. Maybe one day I’ll sort out a permanent one.

btw how did you get it on an android screen?

I jumped on the Google Play Store and did a search for SSH Terminal.
I think the top result is Juice SSH, so thats what I pulled down.
It has some Pro (paid) features that we don’t need, so the free version is fine.
Its been up and running 24 hours for the past few days and seems rock solid. The app itself has an ‘always keep screen on’ option, so I just use that.


Thats another thing for the to do list

1 Like


I dived into the satnogs-api this week and in was lost in the satnogs-display python3 code from Sebastian.

I did several changes to the code, so that it displays frequency, decoded frames and actually it shows my observations for the day in a slideshow. I will post my changes later, there are still some errors and i want to have more different text colors.

But this is a nice feature for the second display.

An example:

A more fancy Node-Red-Flow is still on my list.

73 Oliver


I’d be very interested in using what you come up with.
Please keep me in mind.