Hardware - pkscout/Harmoino GitHub Wiki
Requirements
Harmony Hub Remote
I know. It feels like it should go without saying, but you need the Harmony Hub and remote if you're going to use the remote. Amazingly, you can still pick these things up, and the remote is still one of the best ones I've ever used. You'll only need the hub for the initial pairing. After that, you can put it in the attic somewhere and think longingly of what could have been.
ESP32 board
You're going to need an ESP32 board that supports WiFi or the RTL8201 LAN chipset.
For WiFi, it seems like almost every board I've tried works fine with the default WiFi package in Arduino. If the WiFi on the board you pick requires a special WiFi header (i.e. not WiFi.h), then you might still be able to get it to work, but you'll probably have to modify the sketch code.
For the RTL8201, I only tested a wESP32, but the code does let you configure basically all the options when initiating the board via ETH.begin(), so in theory if your board's RTL8201 doesn't work by default, you should be able to update the Harmoino software config to get it working.
The board also needs to support SPI and define the pins for that via a board definition file. The board needs to provide 3.3v on the header (as well as ground). You also need two free GPIO pins (so a total of five pins given the three you need for SPI, or seven if you are counting the 3.3v and ground).
NRF24L01+ Wireless Transceiver Module
This is the transceiver that will eventually listen for commands from the remote. I got mine from Amazon, but I'm sure you can find them other places too.
Wiring Things Up
You need to wire the NRF24L01+ to your ESP32 by connecting the three SPI pins (MISO, MOSI, and SCK), the two radio pins for CE and CSN (pins 14 and 8 respectively are the default, but you can change that in the Harmoino configuration before compiling), 3.3v (do NOT use a 5v pin - you will fry the transceiver), and GND. The only documentation I've found for the NRF24L01+ pins is in a forum post on the internet, so I'm including it here.
Adafruit Feather Example
My first try with this was using an Adafruit ESP32-S3 Feather. I'm pretty sure all the Feathers have the same pinouts and physical dimensions (that's kind of the point with the Feathers), so I suspect almost any Feather would work just as well. The default pins defined in Harmoino for CE and CSN will work fine, so there's a minimum amount of configuration you have to do to get everything working with this board.
Parts
Here are the parts you need:
- Adafruit ESP32-S3 Feather (the Feathers all come with unsoldered headers)
- NRF24L01+
- Seven 3" female to female jumper wires
- Two M2.5x5mm screws (if you are printing the case provided in this package)
Solder the headers to the Feather, then plug in the wires in the right place. If you need to, you can check the Pinout reference at Adafruit. By default, the program uses GPIO8 for the CSN pin and GPIO14 for the CE pin. You can change the CSN and CE pins in the Harmoino config if you really want to. Here's what it looks like with all the pins connected.
wESP32 Example
I am one of those people who hate having stuff on 2.5GHz WiFi, so as much as I can, I get stuff onto my wired network. The PoE powered wESP32 is great for this. The PoE powered aspect is doubly great, as I don't even need an extra USB cable for power.
Parts
Here are the parts you need:
- wESP32
- wESP32-Prog submodule (you only need one of these even if you have multiple wESP32 boards)
- NRF24L01+
- 20 header pins in two 10 pin groups
- Seven 3" female to female jumper wires
- Four M2.5x5mm screws (if you are printing the case provided in this package)
Solder the headers to the wESP32, then plug the wires into the right place. A word of warning so that you can avoid wasting six hours like I did. The Pinout diagram for the wESP32 is confusing. It shows a bunch of numbers by each pin. Those are a lie. They are just what I will call positional numbers. They are most definitely not the GPIO numbers. There is nothing on that diagram called GPIO. Instead, look at the IO numbers. Those are the pin numbers you want. Also, there are two SPI buses (at least in theory). Use the VSPI bus. Just pretend the HSPI bus does not exist, because by default the Arduino SPI doesn't understand how to use it. For power, use the one marked as 3.3v (positional pin 2) and the GND right next to it (positional pin 1). Wire up the MOSI, MISO, and SCK for SPI (positional pins 3, 7, and 11). Use GPIO2 (positional pin 18) for the CE pin and GPIO4 (positional pin 15) for the CSN pin. See? Easy peasy. Here's what it looks like after you've yelled at the world for six hours and then figured out how to wire it:
The Cases
There are STL files included for both the Adafruit Feather and the wESP32. In both cases, The top can be printed without supports, but you should print the bottom with supports (I use tree supports). If you don't print the bottom with supports the USB-C or Ethernet Jack hole might sag at the top, and then the board won't fit right. You can technically print the top with supports, but they are definitely not needed. If your 3D printer lets you define supports per object, then you can print this in one session. If not, print the top and bottom separately.
If you look at either of the above images, you can kind of tell in this image that the NRF24L01+ sits in a slot at the front of the case. It goes in kind of at an angle, as there are resistors on the board you don't want to damage. For both cases, the exposed port (either the USB-C port on the Feather or the Ethernet jack on the wESP32) sit pretty much flush with the outside edge of the case. The screw holes will like up with the board holes when you have it lined up right. The holes are kind of threaded, but you'll need to put a bit of force behind the M2.5 screws to get them started.
There are four screw holes for the wESP32. For the Feather case, I cannot stress enough that you should only use TWO screws up by the USB-C side of the board. If you try and screw in two more (good luck, the case has no threaded holes on the antenna side), you will damage the WiFi antenna. And probably crack the board, as the holes are smaller than 3mm. That's probably on purpose so you don't screw screws in there.
Once you have the ESP32 mounted, the bottom edge of the bottom print slides into slots in the top. It will slightly click into place and be held by friction. If you need to open the case, I find that gently pushing up on the bottom releases it enough that you can slide it with your finger. With the wESP32, you can just use the network cable as leverage to pop open the case. With the Feather the USBC cable tends to pop out before the case releases, thus the "push on the buttom" trick.
Here are what the two cases look like when closed.