Introduction: Voodoo Sonic LoRaWAN-connected Doll
Voodoo Sonic is a LoRaWAN-connected Voodoo doll for noise pollution stress relief. Developed by @tamberg during the MakeZurich.ch 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 https://www.flickr.com/photos/tamberg/31859091074/...
Inspired by Petra Zumbach's Electronic Voodoo Doll workshop.
- Sonic Doll, e.g. http://www.ebay.ch/itm/Sonic-the-Hedgehog-Sonic-ca-17-cm-Plusch-Figur-Stofftier-/311783761400
- Conductive fabric, e.g. https://www.adafruit.com/products/1167 (I had RFID-blocking fabric from a #WearableNoir workshop with @hmoore)
- Conductive thread, e.g. https://www.adafruit.com/products/641
- Normal thread (from a local crafts supply)
- Voodoo needle (from a local crafts supply)
- Foam rubber (from a local crafts supply)
- Tiny bread-board, e.g. https://www.adafruit.com/products/65
- Jumper wires F-M, e.g. https://www.adafruit.com/products/1953
- Jumper wires M-M, e.g. https://www.adafruit.com/products/1956
- Button switch, e.g. https://www.adafruit.com/products/1119
- 5mm red LEDs, e.g. https://www.adafruit.com/products/299
- Micro USB cable, e.g. https://www.adafruit.com/products/592
- 3.7V LiPo battery, e.g. https://www.adafruit.com/products/2011
- 3.7V LiPo charger, e.g. https://www.adafruit.com/products/1304
- 3.3V Arduino Pro Mini, e.g. https://www.adafruit.com/products/2377
- 3.3V USB-to-Serial converter, e.g. https://www.adafruit.com/products/3309
- RN2483 LoRaWAN module, e.g. https://www.tindie.com/products/DrAzzy/lorawan-rn2483rn2903-breakout-board-assembled/ (868 MHz for Europe, no level shifter, with antenna connector)
- If there's no LoRa coverage yet in your area, you'll need a LoRaWAN gateway, e.g. https://github.com/ttn-zh/ic880a-gateway/wiki (range ~10 km)
- Sewing needle
- Soldering iron
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 https://github.com/rac2030/MakeZurich/wiki/Getting...
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): https://www.flickr.com/photos/tamberg/32576842751/...
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: https://bitbucket.org/tamberg/makezurich/raw/tip/2...
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 https://github.com/rac2030/MakeZurich/wiki/Hello-L...
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. https://www.youtube.com/watch?v=svZJemUuKUw
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 https://github.com/rac2030/MakeZurich/wiki/Forward...
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 https://bitbucket.org/tamberg/makezurich/raw/tip/2... -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 https://bitbucket.org/tamberg/makezurich/raw/tip/2... -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 Yaler.net account and type
$ mkdir ~/yalertunnel
$ cd ~/yalertunnel
$ curl -v https://bitbucket.org/yaler/yalertunnel/downloads/... -o YalerTunnel.src.zip
$ unzip YalerTunnel.src.zip
$ javac YalerTunnel.java
$ java YalerTunnel server 127.0.0.1:8080 try.yaler.io:80 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...
If you live in the Zürich region, consider joining TTN_ZH.
Thanks for reading this Instructable.