A simple oral electro tactile interface based on this paper by Kurt Kaczmarek and some inspiration from Cthulhu Shield by Sapien LLC.
The basic setup is a shield for the Arduino Mega board, with an edge connector for attaching TDU electrodes. The Tactile Pop itself uses a PCB, so it is not certified for contact with the mouth: please use it at your own risk! The pop should be coated with a food safe resin, leaving the electrodes exposed. Use gold coating on the electrode PCB for a safer surface coating.
This repository contains firmware, patterns and Eagle project files for the Tactile Pop TDU.
Code/— Arduino sketches and supporting code.Patterns/— pattern generator and example patterns (Patterns.ino).Screen/,Serial/— alternative sketches and helpers for serial interface and an attached display.
Electronics/— Eagle project files and CAM outputs for the controller shield and the the pop TDU pcb.
- Open the relevant Arduino sketch from
Code/in the Arduino IDE . - Compile and upload to your compatible microcontroller.
- Use the
Patternssketch or the serial interface to send patterns to the device.
A number of parameters in the pulse patter can be changed, to give a range of intensity and qualities of sensation. Longer pulses will effect Nociceptors (prickly, needle like sensations), while shorter will tend to activate tactile receptors. Some stimulation of taste receptors is also possible.
The the following parameters can be edited, and fine tuned for each individual electrode.
PP[] — Pulse Period (microseconds). Total period of one inner pulse (high + low). Unit: µs. Pp[] — Pulse-on time (microseconds). Time the pin is HIGH during one inner pulse. Unit: µs. IN[] — Inner burst count (integer). Number of inner pulses in one inner burst. IP[] — Inner burst pause (microseconds). Pause after each inner burst (time between inner bursts). ON[] — Outer burst count (integer). Number of inner bursts in one outer burst.
It's possible to sense tongue contact using ADC-capable pins, which is only the first three rows of the TDU.
const int sensingPins[5][5] = {
{A1, A2, A3, A4, A5},
{A6, A7, A8, A9, A10},
{A11, A12, A13, A14, A15},
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10}
};The example below shows how you can also read a chanel, to check if the tongue is in contact with an electrode.
int baseLine = 800;
bool readSensing(int row, int col) {
if (row < 0 || row >= 5 || col < 0 || col >= 5) return -1;
int pin = sensingPins[row][col];
return analogRead(pin);
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH);
delayMicroseconds(400);
pinMode(pin, INPUT);
int response = analogRead(pin);
delay(IntensityDelay);
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
return (response>baseLine);
}