How do you decide what hardware to buy? Do you do anything special to make sure things are compatible?
Are there any special considerations to keep in mind when buying hardware for a Nerves project?
Great question! I was wondering the same
When you say “hardware” do you mean the base system, such as raspberry pi revision/version, or things like sensors?
I usually just go on Alibaba and look for whatever will be cheapest/shortest shipping for both.
I look for hardware using the following criteria:
- Supported communication [GPIO, SPI, UART, I2C]
- Specifications for sending/receiving data (decipher a lot of docs in a Chinese dialect)
- Power requirements (can I power off the GPIO or do I need a barrel jack + power brick)
- Digital vs Analog (do I need an MCP3008 chip)
Places to buy (off the top of my head)
Where’s a good place to learn about these?
Would I need to be able to read a specification to do something? Would one of those communication libraries handle this sort of thing for me, such that understanding a specification isn’t necessary?
I learned by reading the examples in the libraries I linked, going through the source code, and hacking on a project. IIRC I did have to Wikipedia SPI and 1 wire Dallas protocol because I wanted to know more than the libraries provided.
Get a raspberry pi zero w, breadboard, wires, LEDs, and experiment
Depending on budget, you can get a starter pack with most everything you need.
It depends on the hardware. The temperature sensor I used was as easy as reading a file and parsing out certain characters to get the data. On the flip side, the wind speed sensor required specs and knowledge of binary communication to send/receive data. It wasn’t anything too complex, don’t let that scare anyone.
If you are interested, I can link the code I used for both sensors.
I just want to call more attention to this to say that, unless you have a Pi hat that gives you analog-to-digital conversion, you’ll want to make sure your sensors are digital (SPI, I2C, 1-wire, etc) instead of analog (e.g. 0-5V) because the Raspberry Pi doesn’t have analog pins like an Arduino does.
I’d recommend getting started by just buying Pi hats to connect to your RPi, because then you can be pretty sure that the hardware will work. That way, you can get comfortable with how things work before you branch out into the unknown.
I want to put something out there that may help someone else out down the line about buying/selecting a device that can run Nerves. Sorry in advance for the huge wall of text you are about to witness.
What it means to “run” Nerves.
I see a lot of confusion here as what it means to run Nerves, so i am going to define this first. Nerves itself is just a lot of tooling that essentially removes everything that might be in your way. This includes building the kernel (hereafter referred to as simply
linux) and the root file system (this contains your various
root dirs such as
/etc and all their contents). these things are related but not the same as some fruity organizations would lead you to believe. So Nerves is just the tooling that brings all those pieces together using a project called
buildroot. It compiles both
linux, and the
rootfs using a cross compiler toolchain. (we won’t get into that, it’s essentially magic).
so what it means to “run” Nerves is the device must have
linux support to some extent, and buildroot support. If you start with
linux, buildroot is usually pretty easy depending on how true to the kernel build process your manufacturer is.
Now some boards have both
buildroot, can’t (read “no one has put the work in yet”) work with Nerves. This includes the elusive
C.H.I.P board. I won’t go into the details as to why it doesn’t work easily, but I will say there is a third part that makes Nerves so magic: fwup.
Fwup is how
linux, the rootfs, and your elixir project is all packaged. Now supporting fwup is nothing all to special, its just a configuration file with a manifest of all the required files, some block offsets mapping to a block devices, etc that builds a special zip file. the caveat is that while it doesn’t require a certain sort of storage device, it makes it so much easier to get up and running.
If you’re still confused just know that if your device of choice can boot
linux somehow, and a root filesystem can be written to an sdcard, you are probably good.
This means Nerves will never “run” on an embedded micro controller such as Arduino, Teensy, etc. They just won’t/can’t meet the requirements that the Nerves tooling expects or requires. That is not to say that Nerves can’t interface with those devices however.
So if looking for a device that “supports” Nerves, just know if you want to “interface” with a Nerves device, or “be” the Nerves device.