I made some progress on the status indicators and attached three Neopixels for testing. I’m controlling them via NodeRED where I’m faking the Status JSON file from Elite Dangerous so I can play with the flags a little bit.
I’m really happy with this, because with the same logic I can basically drive as many LED as I want as long as I provide enough power to have all LED going at the same time. This Proof of concept works just fine.
Some people asked me for details on how I used Node-RED to get some game status information of Elite Dangerous into my SimPit so here is a more cohesive write-up with a short demo video.
I was looking for a simple way to do this but all the programs I found online are closed source solutions that have to be bought and are – as usual – Windows only. Best it would get is Android support and requires a tablet with touch functions. Nothing of this I want! The idea is to use something system agnostic that can be adjusted easily, because I want to use this for different games and not depend on a single vendor, hoping support will last and the thing work with my setup.
This was when I remembered Node-RED from usage in home automation because this is basically the same. You get a zoo of hardware, that somehow all interacts with a dashboard. All the data is on the wire and can be accessed via a web-browser. Fun enough I wasn’t the first with this idea because when I started searching for “Node-RED for simpit usage” I stumbled over the YouTube channel of Jon Back (https://www.jonback.se/) who did exactly this before (and even also used cardboard for prototyping). Encouraging and big shout out for the pioneer work!
So after installing Node-RED on my Linux PC and on my Raspberry Pi I connected the two installations via Websockets. That’s basically just entering an IP. While using MQTT is probably a better solution this was the easiest one because it doesn’t need an additional service.
Why I installed it twice? Well Elite drops a lot of the current game status in various JSON files, like a timestamped Journal and a Status file that holds most of the ship data I’m interested in most. The file is updated on changes and it’s easy to watch for such a change on a local filesystem. I also intend to make the receiving side as dumb as possible so I don’t have to update the code too often. I’m still uncertain what I’ll use in the end – an Arduino is also in consideration. This way I can hopefully connect other games easily as well by keeping the resulting data structure more universal and let the sender to the hard work of hammering the data into shape.
Short explanation what’s going on: File Changes listens for changes in my ED folder where the JSON files are located. Switches check for the file name forward it to a file opener. This one reads the file (Journal line by line) and passes the data to a JSON parser. This one forwards the parsed JSON data to a function that creates the desired data structures. Finally it is send to the receiver.
The receiving Node-RED process on the Raspberry Pi does something similar.
The received data is once more parsed as JSON and checked based on the event string what type of message it got. If a status event is found it’s forwarded as 0 or 1 to a GPIO where a LED will be enabled or disabled. See the short demo video of the Primary Buffer Panel in action:
This is a proof of concept so far so it uses only a tiny bit of the available information to drive some LED I have on my custom GPIO breakout board. I ordered an WS2811 LED strip that should arrive next week. This type is basically a long string of RGB LED that are individually addressable. This is done via one single data PIN that is forwarded from LED to LED so I don’t need many GPIOs and only have to keep an eye on the ampere. Basically endless status indicator (until one in the chain breaks for good but hey, it’s a toy and not a real spacecraft :P).
Will this work? No idea. The hardware is not yet here but I found various ways to drive a so called “neopixel” LED stripe so from my understanding it should just work 🙃
Didn’t have much time since the last update but I got plenty of new push buttons and switches connected. Shipment took weeks for some, which I don’t exactly mind since this is a low priority fun project, but I was still happy when everything finally arrived.
Made a grave mistake also when I jacked into the USB connector to get a read on how many mA I already need here and mixed up VCC and GND during the hot wiring. Good thing that the PCB I use has a fail-safe diode so it didn’t die on me. Phew, close one. I guess USB standards are good for something like this 😅 Anyway, I’m not even scratching the limits here yet so I’m good to go. I can also separate the powering of all LED from the controller any time by design and switch over to the 12V from the LCD panel and/or add a downstepper from that. The PSU for this I have under control. USB is limited and that has to be kept in mind.
Spent most of the rest of the night wiring up a new cable tree for the potentiometers and connect most of the new LED. Got some switches with integrated LED and safety caps mostly for seeing if I like them. I do. So I added them. I’ll make them light up when OFF because I’m going to use them for fire and forget functions like launching a missile or activating self destruct at some point in the future.
Speaking of LED, I got myself a decent LED light bar hanging over my desk so I can finally _see_ the stuff I’m working on. For the first time I was able to identify + and – on the components without the use of a magnifying glass. That’s really a huge improvement.
My soldering skills also improved. I’m still fighting with a way too huge tip on the soldering iron, because it’s the best I have, with temperature all over the place, but I’m slowly getting the hang of it again. Burnt myself only once yesterday too 🤣
The cable job looks like made from a madman. Trying to keep components grouped by type because stuff is still changing position here and there. Worked out okay for me so far. It’s very tedious work to connect all the tiny wires on the fly and it’s getting really crowded in there.
I’m also totally out of options to connect further joystick buttons. The tiny PCB I used so far is saturated so it’s probably time to switch to an Arduino or similar where I can read many more inputs. This brings me to another topic. First of I need some sort of de-bounce logic because a lot of the push buttons are very flimsy and should not trigger multiple times when pushed once. This can be easily done in software but that takes up program space. A circuit for hardware de-bounce (or filtering) isn’t that complex but requires additional components and this is where I really don’t want free flying parts inside the Primary Buffer Panel any more so I guess it’s also time to start making some own PCBs (and try that Aisler manufacturer this time).
The Arduino has also another very good argument to offer: Controlling status LED. At the moment all buttons simply glow but they can not be individually addressed. What can be individually addressed tho is a WS2811 or WS2812 LED stripe. This is basically one long string of LED that forward a data wire so I can power the whole thing with my regular VCC for all the lights and control the data lane with an IC like the Arduino. I found an older type that does not come as SMD but with “real” round LED that can be put on a panel more easily. It’s also RGB 🙋 There is only one drawback: If one LED gives up it usually dooms all the others following from operating until it is replaced. The stripe comes with 50pcs tho so I’ll have plenty as backup. Best of it: This solution is dirty cheap and occupies only one of the valuable pins before I have to go for an additional multiplexer. Not that such an IC is expensive but it adds another part to the free flying mix that is already going on.
Oh yeah, and I could finally put my rotary encoder to use too.
Okay, recap from the last making session of the button box for my #simPit. What I achieved this time: The LCD controller has now a place inside the contraption while the LCD controller buttons are screwed on the outside. This is mostly because I have no buttons laying around to be used instead. I did note down the pin-out of the connector though so I can change this any time. It has a funny LED though that has 3 pins, GND, Red and Green. Uncertain what to make of this.
The button box itself was put on stilts for the extra room required. The LCD itself is prepared to be added to the button box but I’ve to remove part of the former hinges because they are way too sturdy to be removed with a simple cutter knife. I’ll probably need a grinder or a saw and that’s work I will not do at my computer but in the basement.
Next was preparing the ICP in the centre. For this I created a new box of cardboard that is attached to the button box with tape that also acts as a hinge so I can “open” it to work on the switches that go there. I also noticed that my knobs for the rotary encoders or potentiometer are way too big. I could compensate this with more height but I don’t want the ICP to dwarf the button box itself 🤔 So… mebbe I’ll use smaller knobs. On the topic of knobs: Dem, the costs for decent sized knobs are insane. Like ~8 EUR for one knob! So… perhaps I’ll go for spray painted wood here. I don’t know yet 🤷
Yeah, and I got tired of calling it just “button box”. It’s not. It’s a “glorified button box mock-up with a gorram LCD made from cardboard”. So I decided that it needs a name and as a nerd I came up with… Primary Buffer Panel! Firefly fans will know. Others may educate themselves via https://www.youtube.com/watch?v=mY59BYSrxn0 and have a laugh.
It’s also a running gag in the family. My van tended to loose all kind of parts while driving and when Serenity aired my dad yelled at this very specific scene: “Hah, just like your car!” 🤣