Introduction: Voodoo Sonic LoRaWAN-connected Doll

Voodoo Sonic is a LoRaWAN-connected Voodoo doll for noise pollution stress relief. Developed by @tamberg during the civic tech hackathon. Noise pollution is highly subjective, so measuring nightlife noise does not help, according to Zürich city officials. Therefore, this project tries to measure the anger of affected residents instead, and display the result on a map.

Based on a DIY fabric sensor, a 3V Arduino Pro Mini and a Microchip RN2483 LoRaWAN module, the doll counts and transmits the number of needle stings via TheThingsNetwork, an open source LoRaWAN infrastructure built by local communities around the world.

Video of how it works

Inspired by Petra Zumbach's Electronic Voodoo Doll workshop.



  • Scissors
  • Sewing needle
  • Soldering iron
  • Multimeter
  • Clippers


Step 1: Wiring the Arduino, LED Eyes and a Test Button

Connect the USB-toSerial adapter to the Arduino Pro Mini. The wiring diagram shows an FTDI adapter. For details on Getting Started with the Pro Mini, see

Wiring details might depend on the actual adapter. Make sure TX and RX are crossed over. Use F-M jumper wires to connect the LEDs. Adding a 1K resistor might prolong their life. The button was used during development. It's also great to debug the final setup. Here's a video (I used an Arduino Uno here):

This circuit, together with the fabric sensor you'll sew in the next step is enough for a stand-alone Voodoo doll that counts the number of needle-stings. Here's the (offline) test code:

Step 2: Sewing and Testing the Fabric Sensor

Use the normal thread to sew a three layer sandwich with isolating foam in the middle. Cut one M-M wire in half, bend the end and use some solder to make a loop. Then use the conductive thread to sew connector loops to each sheet.

Make sure the conductive sheets are well isolated from each other. Use a multimeter to ensure there is no contact between the two.

Now connect the fabric sensor to the bread-board, in parallel to the test button. Check the wiring diagram in the next step if you're in doubt. Piercing through all layers with a needle should close the switch.

Step 3: Connecting the Microchip RN2483 LoRaWAN Module

Make sure to connect the antenna before applying power to the RN2483. Use either the LiPo or the USB-to-Serial converter, but never plug in both at once.

Connect the RN2483 as shown in the wiring diagram. Details might differ for your LoRa module. For getting started with the RN2483 and connecting it to TheThingsNetwork, see

Edit the VoodooSonic.ino Arduino code to enter the DEV_ADDR, NEW_SKEY and APP_SKEY you got from the TTN console. Upload the code to the Pro Mini and run it. Check the serial monitor to see debugging info. If everything works, disconnect the USB-to-Serial adapter and connect the charged LiPo battery.

Wrap the fabric sensor around the electronics as shown, position the LEDs and test the assembly. I ended up sticking the bread-board to the back of the LoRa module to reduce size. Ditching the bread-board and soldering wires instead might have been more robust. I had quite some issues with bad connections.

Step 4: Adding the Sensor and Electronics to the Doll

Open the doll along the spine and remove some of the stuffing material. Burn holes through the eyes using a soldering iron to add the LEDs. Then insert the fabric sensor into the forehead, followed by the Arduino and RN2438 assembly.

Finally, add the LiPo battery. Make sure it is protected from the needle. I used an additional layer of foam rubber. Piercing a LiPo can be dangerous. See e.g.

Step 5: Setting Up a Web Server Providing a Real-time Map

For an intro to getting data from TheThingsNetwork into your Web app, see

The voodoo-server acts as a MQTT client to get packets sent via LoRaWAN from TheThingsNetwork. On each packet, a Websocket message is emitted to the Web client.

To run the server on your desktop, make sure Node.js is installed, open a terminal and type the following commands:

$ mkdir ~/voodoo-server
$ cd ~/voodoo-server
$ npm install --save ws
$ npm install --save express
$ npm install --save ttn
$ curl -v -o server.js

Edit the server.js file to enter your TTN_APP_ID and TTN_ACCESS_KEY.

The Web client is a simple HTML page displaying a MapBox map (you need an account to get a access token), with a Leaflet.js marker, plus a red circle with a radius depending on the incoming measurement.

$ mkdir public
$ cd public
$ curl -v -o index.html

Edit the index.html file to enter your MAPBOX_ACCESS_TOKEN.

To run the server on localhost port 8080, type

$ cd ~/voodoo-server
$ node server.js

As a last step, to make the server accessible from the Web, get a account and type

$ mkdir ~/yalertunnel
$ cd ~/yalertunnel
$ curl -v -o
$ unzip
$ javac
$ java YalerTunnel server RELAY_DOMAIN

Make sure to use your actual relay domain.

That's it. The map should now be accessible at

To test the setup, simply stick the Voodoo needle into the Sonic doll's forehead...

Other projects of the fabulous MakeZurich hackathon are listed here.

If you live in the Zürich region, consider joining TTN_ZH.

Thanks for reading this Instructable.

Cheers, @tamberg