Touch-based interactive botanical installation for sight-impaired visitors. Visitors touch plants, plants produce sound. Must run for months without damaging plants. Signal must be meaningful, not random.
Disney's Touché technique, reimplemented with open-source hardware. Single electrode in soil, no contact with plant tissue.
Traditional capacitive sensing reads conductivity at one fixed frequency; SFCS uses a whole range so a single sensor's output becomes two-dimensional.
Electrode goes in soil, not on the plant. No adhesive, no gel drying out, no girdling as stems grow. The months-long electrode degradation problem that kills passive-sensing approaches doesn't apply.
sweep() is backwards from frequency. Bigger number = lower frequency. f = 16,000,000 / (1 + n).The NIME 2014 paper reports curve shapes repeat reliably even when the specific peak frequency and value drift. This matters for a long-running install — key on shape, not absolute peak.
Also position-sensitive, not just gesture-sensitive: the same two-finger pinch at different points on the rosemary (trunk, branch tip, etc.) produced distinguishable curves.
Cultivating Frequencies (project writeup, Max/MSP patch, installation site) ran fifteen plants off the four 16-bit timers of one Mega. This demanded significant processing power and memory, and that the system slows noticeably with each added touch point, since every pin must be read at every frequency. Not reading all sensors simultaneously helps but constrains interaction.
Fifteen plants on one Mega is the documented upper bound, and it was already straining.
Passive components only (no op-amp):
Send pin changes depending on Arduino model and which timer is used:
| Timer | Pins set to OUTPUT |
|---|---|
| 1 | 11, 12 |
| 3 | 2, 3, 5 |
| 4 | 6 |
| 5 | 46 |
| Timer | Pin |
|---|---|
| 1 | 9 |
connect one leg of the 10nF cap to the electrode in the soil.
The NIME paper's test used a “copper electrode roughly 5cm × 2cm”, and a ~15cm rosemary plant with an electrode placed in soil. This is a documented working starting point.
Architecture: Mega runs SFCS → hardware UART (Serial1/2/3) → ESP32 → WiFi/OSC. UARTs have separate baud generators, no timer conflict. To avoid possible interrupt jitter, buffer readings, send in bursts between sweeps.
One electrode per plant, shared soil, multiplexed. Shared soil causes crosstalk. Expect touched plant's channel to dominate, take strongest as winner..
The NIME paper's plant test found the soil disperses signal into the plant in a way that widened the range of CapSense results vs touching the electrode directly. Apparently soil coupling isn't purely a liability.
NIME 2014 — Techniques in Swept Frequency Capacitive Sensing
The core paper. Includes circuit schematic with all component values including R\* as well as a side-by-side CapSense vs. SFCS test data on a rosemary plant. Also has the Cultivating Frequencies case study with its scaling limits. Primary source.
Cultivating Frequencies
The installation's own site. The paper states they were collecting all data for the life of the piece and publishing it openly. The installation is at Aiguablava, Spain.
Disney Research — Touché (2012)
The source technique. Custom hardware (AD5932 + ARM), no code released. Read for capability space and applications. Uses a pure sine wave.
DZL's Evil Genius Lair — Arduino do the Touché dance
Nikolaj Møbius's original blog post — the actual origin of the Arduino circuit everything else derives from. Referenced by both the paper and damellis.
Instructables — Touché for Arduino
Mads Hobye's walkthrough, built on Møbius's work. Practical build guide and the code everything forked from.
GitHub — chonigman/SweepingCapSense
The library from the paper. Two objects: SweepingCap (drives the sweep) and Touch (stores per-frequency values — optional). Constructor takes either a timer number + frequency count, or just a count to use all four timers. Call setup() in setup, sweep(i) inside a for-loop over the frequency count. Dormant since ~2014.
damellis/ESP wiki — Touché example
Circuit diagram with explicit pin assignments and build photos. Two sketches: Touche.ino (serial out) and Touche_LEDs.ino (receives classifications back, drives LEDs on pins 2/3/4). ML layer uses user_touche.cpp; compile from source and uncomment the include in user.cpp. Classifier algorithm not specified in the wiki :(
GitHub — Surfincolin/plant-music
The Pd/Ableton side is the useful part — reference for getting sensor data into a sound environment.
GitHub — narner/Touche-Experiments
Redundant and hard to parse. Archived 2020. Plants folder and a circuit photo, no standalone sensing code — built on damellis/ESP. Low priority.
Medium — Talking To Plants: Touché Experiments
Companion writeup to the above. Limited value.