(July 2019)
For two reasons:
It's about a single-board computer (SBC) that I wanted to control remotely - my Atomic PI. I wrote about this SBC a month ago - it's an unbelievably cheap (35$) Intel-based computer, with many features. Amongst them: 2GB of RAM, 16GB of EMMC storage and a 4-core Atom CPU.
The AtomicPI needs to be powered by a good, solid 5V power supply - and since I measured its current consumption (see article for details) I knew that my Raspberry PI's power supply is more than up to the task.
So I had to splice a jack - that would allow me to plug into my custom AtomicPI power adapter.
After some cutting, kapton tape-ing, soldering and heat-shrinking...
...the power supply was ready - and I could connect it to an ESP8266-based power module:
The ESP8266 board (more specifically, ESP01/relay module) is a dirt-cheap one (1.8 Euros as of July 2019) that I bought from AliExpress.
What I didn't know when I bought it, is that the PCB design had two flaws:
VCC
(Pin 1) and CH_PD
(Pin 3) had to be bridged (that's the small yellow wire you see protruding in the picture above).Oh well - for that price, including shipping, I shouldn't complain too much. Diagnosing and fixing things is, after all, what makes this fun :-)
Now, all that was left was to program the ESP8266 with my own software.
What, you actually expected me to trust closed-source SW connecting to my Wi-Fi?
Are you serious? :-)
There are tons of examples on the Web, demonstrating how to boot up a simple Web server on the ESP8266 - I did a very simple implementation that controls the GPIO0 pin (since that's the one that the PCB routes to the relay control):
... const char* ssid = "Your SSID goes here"; const char* password = "Your WiFi pass goes here"; ESP8266WebServer server(80); ... server.on("/", handleRoot); auto redirect = []() { server.sendHeader("Location", String("http://") + WiFi.localIP() + String("/"), true); server.send(302, "text/plain", ""); }; server.on("/poweron", [&]() { if (!poweredUp) { poweredUp = true; digitalWrite(controlPin, 1); } redirect(); }); server.on("/poweroff", [&]() { if (poweredUp) { poweredUp = false; digitalWrite(controlPin, 0); } redirect(); });
I am sure you'll agree that modern C++ is much better than the old ways. The code is a lot closer to what one writes in higher-level languages - passing lambdas that do the work, as callbacks for specific Web-server end-points.
So what does that translate to, in the end - how do I actually control the relay remotely?
bash$ curl http://IP_ADDRESS/poweron
bash$ curl http://IP_ADDRESS/poweroff
Not too shabby :-)
In case it's not clear, the IP address is not accessible from the outside; this is a static IP allocated to the ESP behind the firewall.
I also added a mainpage, offering direct links that I can just click on - from any browser (e.g. from my phone).
Executive summary: Here's a video with the whole thing in action.
UPDATE - the following weekend...
I used a small piece of perfboard, to get access to - and connect - the TX/RX/GND pins of the ESP8266 to the corresponding ones on the AtomicPI (i.e. the CN10 connector):
This allowed me to enjoy a remote serial port!
And be able to fully control the booting process and the BIOS:
...which in turn allowed me to perform an OpenBSD installation over this remote serial!
I just needed to type this in the boot
menu:
stty com0 115200 set tty com0
Half an hour later, I concluded an installation of a UNIX OS over a remote serial port.
That was a new experience :-)
Overall, this was a very fun and educational process - highly recommended!
And for anyone else that is interested in reproducing this, the code I hacked to run inside the ESP8266 is here.
P.S. Obligatory trolling - who needs Intel's Management Engine? :-)
Index CV | Updated: Sat Oct 8 20:33:36 2022 |
The comments on this website require the use of JavaScript. Perhaps your browser isn't JavaScript capable or the script is not being run for another reason. If you're interested in reading the comments or leaving a comment behind please try again with a different browser or from a different connection.