One of these wacky inventions was the EMF Roamer, a quarter-scale wooden Tesla Cybertruck, deployed to roam around the side, controlled by anyone over the internet!

Just allowing people to drive it line of sight wasn’t good enough! Especially not in the world of the Internet of Things. Live video from a camera, along with the location on a map is streamed to the user while they have control of the roamer.
A free for all in terms of control would have been a mess, so we devised a queue system. People could join the queue in their web browser and wait their turn, or provide a mobile phone number to receive an SMS when their turn is up (thanks Vonage!). The queue system is “serverless”, in that it does not require a dedicated server. Instead, it runs on simple shared hosting, with PHP coordinating the queue on-demand, which is stored in a MySQL database.
To build a queue system for yourself, take a look at the WebUserQueue project on my GitHub, or follow the guide on the Vonage Developer Blog.
]]>You can now add a registry key to start with Windows. Create on/off timers for devices. Automatically turn devices on/off on program launch/exit.]]>
New features:
CLI mode.
Copy ID to clipboard.
Bug fixes:
Better management of tray icons.
Removed from alt-tab list when minimised to tray.
On my latest board using an ESP32 I connected an LED to pin 19, but it would never light up.
I wasn’t using the pin for anything else, and sources online didn’t seem to indicate any problem with using it as a GPIO output. I was however using the VSPI port to connect to an ePaper display, but it was only physically connected in 3 wire mode.
When the display was initialised, I could no longer control the LED.
Fortunately I had read about a handy feature of the ESP32 known as the GPIO matrix. It allows the physical pins of the chip to be mapped (and importantly unmapped) from an internal signal.
Poking around inside esp32-hal-spi.c the signal name of “VSPIQ_OUT_IDX ” can be found.
A little further on an example of detatching a signal can be found here.
pinMatrixInDetach(signal, false, false);
Meaning all we need to run to detatch the MISO of VSPI is:
pinMatrixInDetach(VSPIQ_OUT_IDX, false, false);
And it works!
]]>Just allowing people to drive it line of sight wasn’t good enough! Especially not in the world of raspberry pi’s. The video from a raspi camera should be streamed to the user while they have control. A GPS module showing a roamer icon on the official EMF map was also a must-have at this point.
A free for all in terms of control would also be a mess, so we devised a queue system. People could join the queue in their web browser and wait their turn, or provide a mobile phone number to receive an SMS when their turn is up (thanks nexmo!). We also planned twitter integration, but didn’t get our account approved for developer use until after the event. Cheers twitter. The queue system was hosted by Hostgator ,but it ground to a painfully slow halt where pages took almost 60 seconds to use, forcing us to move the whole thing over to Servage. I think I will be ditching Hostgator soon after this experience.
The first step was to get a low latency video stream working. Youtube does offer a low latency mode, but I found that it still had a latency of 5-10 seconds. Nowhere near good enough for live control! Youtube streaming was however still a nice idea, as it would allow people to watch the stream as they wait in the queue. Step in MJPEG-Streamer. It can produce a stream with extremely low latency. Perfectly good enough for control. The only difficulty being that once the MJPEG streamer was using the raspi camera, it was then locked and could not be used by other programs.
Step in horrendous FFMPEG commands! After far too much poking around online, with lots of commands that didn’t work, or did something slightly different that broke when I tried to modify them, I found a winning combination. FFMPEG picks up the MJPEG stream, adds a fake audio source (required for youtube), and sends it out to the youtube ingest server over RTMP. This FFMPEG command sat inside a shell script that would monitor the log, and restart the process if no new frames were sent in a few seconds.
My initial plan for controlling the motors was to run an HTTP server on the pi, and control the GPIO pins depending on which directories were accessed. This was accomplished through a python/flask script. The motors themselves are controlled by a [chip] H bridge driver chip.
The GPS side of things was pretty trivial using this python port of TinyGPS. The data is sent to a webserver via GET where it is then stored in the MySQL database. The official EMF map was open source, but after a couple of days of trying, we were’t able to integrate a roamer icon on to the map nicely. Instead as a last minute bodge, I centred an icon on top of the map in straight up HTML, and repositioned the map to reflect the position.
In order to get the best possible WiFi coverage and quality, we purchased a high gain antenna/adaptor from Amazon, which was supposedly Pi compatible. This worked on my home WiFi, but actually felt more laggy than the el-cheapo Netgear adaptor we were initially using.
When we arrived at emfcamp, the fancy WiFi adaptor just flat out refused to connect to either their legacy or insecure 2.4GHz networks. I can only put this down to an incompatibility with WPA2 enterprise. This can apparently be fixed by recompiling some drivers, if you have the patience. We did not have the patience, so taped the Netgear adaptor to the high gain antenna on a USB extender. Coverage was a little patchy, and it was unreachable for several seconds when it roamed between AP’s.
This patchy WiFi performance was a massive problem to the controls. Sometimes the stop packet was lost in transit, and the motors would lock on moving in a direction. To try to mitigate this, I had programmed a 3 second dead mans switch, which would stop the motors if no new packers were received. Three seconds of driving in a random direction however was a pretty poor experience. I quickly replaced the HTTP control with websockets, and the results seemed much better. I was able to reduce the dead mans switch to one second, and it seemed to be needed less often.
All of these scrips were started using cron jobs to run @reboot.
Tiny tracks and long grass were a terrible idea. Initially you were able to turn on the spot by driving one motor forwards, and the other back. I ended up disabling this as it caused the tracks to ingest way too much grass, and was probably the main culprit to us shredding the first gearbox. It also fell over at almost any opportunity.
. @emfroamer Sad roamer, where shall we take it? Keeps turning in a circle even after being de-hayed. pic.twitter.com/J6CnaTgK6i
— Lauren Hutchinson (@Ravenbloom) September 1, 2018
Just needed a quick gearbox rebuild. Gears+grass=bad pic.twitter.com/yVSI09pj0w
— EMF Roamer (@EmfRoamer) September 1, 2018
This however did not stop one keen driver from taking it for a lap around the Hacky Racers track, and officially scoring the worst time of the entire event.
Just completed a blazing fast lap of 6:42 with @EmfRoamer on the @Hacky_Racers track at #EMFcamp pic.twitter.com/1joAqtAXFf
— Sebastian Goscik (@ep1cman) September 2, 2018
Some stats:
Improvements:
I used Excel 3D Maps to produce the map animation from CSV GPS logs.
]]>It turned out to be fairly straightforward!
The details of the project can be found at the hackaday.io page.
]]>A #OneSquareInch musical tesla coil playing ghostbusters for the @hackadayio square inch PCB contest! pic.twitter.com/W7CcJEdNDg
— Chris Stubbs (@M6EDF) September 16, 2018
When I’m using my PC, it’s a minor pain to have to unlock my phone, open the Kasa app, wait for it to finish displaying the infernal splashscreen, then turn on my socket.
What I wanted was a program sitting in the windows tray to control them. So that’s what I made. It’s in VB.NET. All you need to do is toggle a switch icon on your taskbar.
This is heavily based on the API research over at itnerd.space
Instructions:
Changelog:
1.0.0.4 – 15/05/2018 – Fix errors when a device in your account is offline.
2.0.0.0 – 23/06/2019 – New features: CLI mode. Copy ID to clipboard. Bug fixes: Better management of tray icons. Removed from alt-tab list when minimised to tray.
2.1.0.0 – 25/06/2019 – New features: Start with Windows. Create on/off timers for devices. Automatically turn devices on/off on program launch/exit.
Download source code from GitHub.
[GUIDE] Make windows taskbar always show an icon
[GUIDE] Command line interface
This program has no affiliation with itnerd.space or tp-link. I accept no liability for its use. This program is provided without warranty/guarantee.
]]>We launched a Cheapo Micro tracker under a 100g Pawan balloon, then tracked the flight from the event using a couple of RTL-SDR’s with a yagi and a 2m/70cms magmount.
Video and photos credit Pete M0PSX
Footage from TX Factor to follow.
]]>