Let the ideas flow.

Jaigouk Kim

A geek who's interested in physical web.


Our Newsletter

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.




raspberry pi zero w for IOT dev env

Jaigouk KimJaigouk Kim


Recently, I watched google i/o tech talks and I found that progressive web + physical web is quite interesting. I had an idea that i want to play with Bluetooth Low Energy devices. For prototying the idea, I bought a raspberry pi zero w. (yup. this is my second one). Before watching the techtalk, rpi0 meant nothing to me. Because I always wanted to have powerful small computers that I can make a cluster. Now, it makes sense to play with rpi0w. it's a good fit for me to play with it to prototype physical web related ideas.


  • [x] add extra packages like git, vim, ssh, bluez, etc
  • [x] burn the sd card
  • [ ] install Dropbear SSH instead of sshd
  • [ ] configure bluez with dbus
  • [ ] ssh into rpi0


  • install virtualbox and ubuntu. prepare your disk that is larger than 16GB if it's a desktop version of ubuntu.
  • docker should be up and running locally


In your mix.exs add rpi0_ble

 def deps("rpi0") do
    [{:nerves_runtime, "~> 0.1.0"},
     {:"nerves_system_rpi0_ble", github: "jaigouk/nerves_system_rpi0_ble", tag: "v0.0.4", runtime: false},
     {:nerves_interim_wifi, "~> 0.1.0"}]

burn your sdcard with following commands.

MIX_TARGET=rpi0 mix deps.get
MIX_TARGET=rpi0 mix firmware
#Burn to an SD card with 
MIX_TARGET=rpi0 mix firmware.burn

the image has iptables, ssh, erlang, node.js, bluez, git, vi, etc. Because it's for prototyping a ble app and testing it.

configure the image

I need to customize the default rpi0 because i need to add bluez. I found this tutorial from adafruit. Since nerves-project is using buildroot, there must be a way to add the libarary to my rpi0. And then I found this blog post


I referenced this slide and getting started doc from nerves-project.

install and download libraries we need

sudo apt-get install git g++ libssl-dev libncurses5-dev bc m4 make unzip cmake
git clone [email protected]:nerves-project/nerves-system-br.git
git clone [email protected]:jaigouk/nerves_system_rpi0_ble.git
mkdir -p ~/.nerves/cache/buildroot
nerves_system_br/create-build.sh nerves_system_rpi0_ble/nerves_defconfig ~/.nerves/cache/buildroot
cd ~/.nerves/cache/buildroot

Now, let's configure our linux image.

  • Select base packages by running make menuconfig
  • Modify the Linux kernel and kernel modules with make linux-menuconfig
  • Enable more command line utilities using make busybox-menuconfig

make menuconfig will launch gui that helps you to add extra packages. I want to add iptables, git

│ Prompt: git
│   Location:
│     -> Target packages
│       -> Development tools


│ Prompt: iptables
│   Location:
│     -> Target packages
│       -> Networking applications

open ssh

│ Prompt: openssh
│   Location:
│     -> Target packages
│       -> Networking applications


 Prompt: openssl
│   Location:
│     -> Target packages
│       -> Libraries
│         -> Crypto

you can even find nginx, wireshark,etc in networking applications.

Run make savedefconfig after make menuconfig to update the nerves_defconfig in your System. it will spit out results like this.

umask 0022 && make -C /home/jaigouk/nerves_system_br/buildroot-2016.11.1 O=/home/jaigouk/.nerves/cache/buildroot/. savedefconfig
  GEN     /home/jaigouk/.nerves/cache/buildroot/Makefile


│ Prompt: Bluetooth Low Energy (LE) features
│   Location:
│     -> Networking support (NET [=y])
│       -> Bluetooth subsystem support (BT [=y])

Run make linux-savedefconfig and cp build/linux-x.y.z/defconfig <your system>

umask 0022 && make -C /home/jaigouk/nerves_system_br/buildroot-2016.11.1 O=/home/jaigouk/.nerves/cache/buildroot/. linux-savedefconfig

we can add vim, grep, ifconfig, ping, ps, top, free, etc with following command. busybox-menuconfig only works when busybox is enabled.

make busybox-menuconfig

this is what getstarted doc says.

If your system doesn’t contain a custom Linux configuration yet, you’ll need to update the Buildroot configuration to point to the new Linux defconfig in your system directory. The path is usually something like $( )/linux-x.y_defconfig.
For Busybox, the convention is to copy build/busybox-x.y.z/.config to a file in the System repository. Like the Linux configuration, the Buildroot configuration will need to be updated to point to the custom config.


So I copied defconfig to nerves_system_rpi0_ble/linux-4.4.defconfig and .config to nerves_system_rpi0_ble/nerves_defconfig

now my custom rpi0 config is ready to be used.

Jaigouk Kim

Jaigouk Kim

A geek who's interested in physical web.