arduino - grau multimèdiagraumultimedia.com/wp-content/uploads/pac2_amengual_pere-3.pdf5 ’inter a...

10
Disseny d’Interacció Arduino PAC 2 Pere Amengual Gomila Abril 2016

Upload: others

Post on 09-Mar-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Arduino - Grau Multimèdiagraumultimedia.com/wp-content/uploads/PAC2_Amengual_Pere-3.pdf5 ’Inter A 2 realitzar un forat per on surten els fils. Investigant les possibilitats de la

Disseny d’Interacció

Arduino

PAC 2Pere Amengual GomilaAbril 2016

Page 2: Arduino - Grau Multimèdiagraumultimedia.com/wp-content/uploads/PAC2_Amengual_Pere-3.pdf5 ’Inter A 2 realitzar un forat per on surten els fils. Investigant les possibilitats de la

2

Disseny d’Interacció - PAC 2

Neuromín. Descripció del projecte.

El projecte presentat consisteix en un prototip d’instrument musical accionat per mitjà de les oscil·lacions neurals(1). Aquestes oscil·lacions són activitats neurals periòdiques del sistema nerviós central induïdes per l’activitat d’una població de neurones que generen un camp oscil·latori observable en un electroencefalograma.

Per detectar les oscil·lacions neurals es fa servir un econòmic sensor neural que pertany a la joguina Mindflex de Mattel i les lectures de valors del sensor es converteixen en paràmetres d’un sintetizador de so que genera un so similar al del Theremin.

Sensors:

Mindflex de Mattel modificat per obtenir directament el senyal FFT sense passar pel circuit wireless del joc

Potenciómetre 10K lineal per controlar el suavitzat de la lectura dels valors proporcionats pel sensor

Actuadors:

LED verd per indicar la lectura correcta del sensor

Equip de so (mesclador + amplificador + altaveu) per escoltar el senyal sonor generat per la placa Arduino

Llibreries:

- Arduino Brain Library (https://github.com/kitschpatrol/Arduino-Brain-Library): Posa a disposició de l’entorn Arduino els valors del sensor EEG proporcionant vuit bandes de potència corresponents a ones Delta, Theta, LowAlpha, HighAlpha, LowBeta, HighBeta, LowGamma i

Prototip de sistema electrònic interactiu amb Arduino

Page 3: Arduino - Grau Multimèdiagraumultimedia.com/wp-content/uploads/PAC2_Amengual_Pere-3.pdf5 ’Inter A 2 realitzar un forat per on surten els fils. Investigant les possibilitats de la

3

Disseny d’Interacció - PAC 2

MidGamma.

- Mozzi (http://sensorium.github.io/Mozzi/): Llibreria de síntesi sonora per Arduino que permet accedir a classes com ADSR, AudioDelay, DCFilter, Line, Oscil, Phasor, ReverbTank, WaveShaper, etc...

Funcionament del prototip

El sensor Mindflex proporciona la lectura dels valors EEG en un format que la placa Arduino rep pel port sèrie RX al pin Digital 0.

La llibreria Arduino Brain Library s’encarrega de posar a disposició els valors rebuts al port sèrie. En aquest prototip es fa servir la lectura d’ones Theta(2) que són un patró d’oscil·lació que en els humans fa referència a components de freqüència entre els 4 Hz i els 7 Hz. En els adults, aquests patrons apareixen durant estats meditatius o propers al son, però no durant les fases profundes d’aquest.

La llibreria també proporciona un valor de qualitat del senyal, que presenta el valor 200 quan la lectura dels valors EEG no és correcte. En el nostre cas, quan ens posem el sensor neural i es detecten patrons d’activitat cerebral, s’encén un LED de color verd.

El sensor envia lectures a la placa aproximadament cada segon, motiu pel qual es fa necessari crear un suavitzat dels valors llegits abans de treballar amb ells amb la finalitat de eliminar el renou de fons i els errors de lectura del sensor. Un potenciómetre connectat al port Analògic d’entrada A2 ens proporciona un valor entre 0 i 1023 que, convenientment escalat, es fa servir per suavitzar els valors del senyal fent servir un senzill mètode d’interpolació lineal.

Cal destacar que la llibreria Mozzi requereix fer servir funcions de lectura especials com mozziAnalogRead() ja que les estàndard fan ús de les interrupcions necessàries per la creació de sons i farien apareixer clics i distorsions.

Per crear sons amb la llibreria Mozzi i la placa Arduino cal tenir en compte les següents consideracions:

Visualització pel port sèrie de les dades del sensor

Page 4: Arduino - Grau Multimèdiagraumultimedia.com/wp-content/uploads/PAC2_Amengual_Pere-3.pdf5 ’Inter A 2 realitzar un forat per on surten els fils. Investigant les possibilitats de la

4

Disseny d’Interacció - PAC 2

a) Dins setup() cal inicialitzar el motor d’àudio amb startMozzi(CONTROL_RATE) indicant la taxa de control amb un valor que sigui potència de 2 que ajusta un temporitzador que cridarà la funció updateControl() a la taxa escollida i, addicionalment, un altre temporitzador que manda el valor de les mostres al pin de sortida a la freqüència de mostreig de 16384 Hz.

b) Dins updateControl() es realitzaran les lectures dels sensors i s’actualitzaran els valors que controlaran el so a la taxa de control indicada

c) Dins updateAudio() es realitzaran les actualitzacions dels valors de les mostres d’àudio

d) És preferible no situar a loop() més codi que audioHook() per evitar que es buidi la memòria de treball.

Procés de treball

Vaig conéixer les possibilitats dels sensors EEG al Symposium KISS2013 a Brusel·les organitzat per LARAS ISIB i Symbolic Sound(3). En aquesta trobada, John Mantegna va interpretar una sonificació d’una sessió de meditació on amb el sensor d’activitat cerebral Emotiv controlava el sistema Kyma en temps real.

Arrel de la proposta d’investigació de l’asignatura en les primeres setmanes del curs he cercat sensors alternatius per la placa Arduino i he descobert les possibilitats que ofereixen els bio-sensors. Com el

preu d’un kit de bio-sensors de qualitat és una mica massa elevat per una primera aproximació a la matèria, he optat per adquirir un sensor de joguina i modificar-lo seguint les instruccions detallades a Hackaday, en l’entrada “Hacking the Mindflex, more!” per Jakob Griffith i al vídeo Brain Hack de kitschpatrol.

Una vegada provat el correcte funcionament de la joguina, he procedit a obrir el sensor i a connectar directament a la placa Arduino els pins on els valors raw es transmeten a la base del joc. Per realitzar aquesta tasca he hagut d’obrir el sensor, soldar uns fils directament a la placa i

Modificació del sensor de la joguina Mindflex

Page 5: Arduino - Grau Multimèdiagraumultimedia.com/wp-content/uploads/PAC2_Amengual_Pere-3.pdf5 ’Inter A 2 realitzar un forat per on surten els fils. Investigant les possibilitats de la

5

Disseny d’Interacció - PAC 2

realitzar un forat per on surten els fils.

Investigant les possibilitats de la llibreria Arduino Brain Library he descobert que es poden rebre molts valors, entre d’ells el de qualitat del senyal. Fent algunes proves he determinat el valor que indica una recepció bona i l’he fet servir per controlar el LED verd de la placa.

La part més dificil del procés, ja que requereix fer servir mètodes i funcions poc habituals, ha estat el control i la generació de sons amb la llibreria Mozzi. Les primeres vegades, fent servir els mètodes habituals com setup() i loop() el so presentava molts clics i distorsions cada vegada que es realitzava qualsevol activitat com enviar dades al port sèrie o llegir el valor d’un sensor. Investigant una mica, no ha estat difícil descobrir com Mozzi requereix estructurar el codi per optimitzar-lo i aconseguir bons resultats.

Els sons confeccionats amb la placa Arduino recorden als de un Theremin, amb una sinusoïdal modificada per un característic vibrato.

Millores previstes en el prototip

Una de les tasques més difícils en la posta en funcionament del prototip ha estat donar sentit a

les dades llegides pel sensor. No és fàcil entrar en els estats mentals que donen pas a les diferentes ones EEG i el renou de fons del sistema altera les lectures de forma aparentment aleatòria de forma constant.

Per tant, una de les millores previstes seria l’adquisició d’un sensor de més qualitat i fer-lo funcionar de forma conjunta amb altres sensors biomètrics com pressió sanguínea, resposta galvànica, velocitat dels bategs del cor, etc... Així, el component performatiu es veuria sensiblement millorat i augmentat.

També seria interessant incorporar un major nombre de paràmetres en la generació del so i controlar-los en temps real fent servir un controlador MIDI amb múltiples potenciómetres, interruptors i faders

assignats a CC’s.

De cara a la pràctica final, estic considerant la possilibitat de millorar el prototip fent servir Arduino per controlar una Raspberry PI executant PURE DATA o una placa AXOLOTI. Això obriria moltes possibilitats respecte de la creació de senyals sonors de dos canals amb els que intentar també una visualització sonora mitjançant figures de Lissajous.

Page 6: Arduino - Grau Multimèdiagraumultimedia.com/wp-content/uploads/PAC2_Amengual_Pere-3.pdf5 ’Inter A 2 realitzar un forat per on surten els fils. Investigant les possibilitats de la

6

Disseny d’Interacció - PAC 2

Esquema elèctric del circuit

Page 7: Arduino - Grau Multimèdiagraumultimedia.com/wp-content/uploads/PAC2_Amengual_Pere-3.pdf5 ’Inter A 2 realitzar un forat per on surten els fils. Investigant les possibilitats de la

7

Disseny d’Interacció - PAC 2

Breadboard i diagrama de connexions

Page 8: Arduino - Grau Multimèdiagraumultimedia.com/wp-content/uploads/PAC2_Amengual_Pere-3.pdf5 ’Inter A 2 realitzar un forat per on surten els fils. Investigant les possibilitats de la

8

Disseny d’Interacció - PAC 2

Enllaç del vídeo a vimeo:

https://vimeo.com/162906019

Codi Arduino

#include <Brain.h>// Llibreria Arduino Brain. Més informació a https://github.com/kitschpatrol/Arduino-Brain-Library#include <MozziGuts.h>// Llibreria Mozzi. Més informació a http://sensorium.github.io/Mozzi/#include <Oscil.h>#include <tables/cos2048_int8.h> // taula de valors oscil·lador cosenoidal#include <mozzi_midi.h> // per funció mtof que converteix valor nota MIDI a Hz#include <mozzi_fixmath.h> // per funcions matemàtiques optimitzades

#define CONTROL_RATE 64 // tasa d’actualització de valors de controlOscil<COS2048_NUM_CELLS, AUDIO_RATE> aCos(COS2048_DATA); // crea oscil·lador principalOscil<COS2048_NUM_CELLS, AUDIO_RATE> aVibrato(COS2048_DATA); // crea oscil·lador LFObyte intensity = 120; // intensitat de modulació del LFOfloat theta; // valor de potència d’ones theta(4-7Hz) associades a estat de relaxació meditatiufloat oldTheta = 0.0; // per emmagatzemar valors temporals de la lectura

Brain brain(Serial); // inicialitza l’analitzador i defineix el port sèrie com punt d’escolta

const int ledPin = 13; // pin del LED que indica lectura correcta de valors del sensorint ledState = LOW; // estat inicial apagat

int potPin = 2; // pin del potenciómetre per controlar suavitzat dels valors llegitsfloat val = 0.0; // variable per emmagatzemar el valor del protenciómetre (0-1023)

void setup() { startMozzi(CONTROL_RATE); // inicialitza el motor d’àudio de Mozzi aCos.setFreq(mtof(74.f)); // defineix freqüència oscil·lador principal aVibrato.setFreq(2.f); // defineix freqüència oscil·lador LFO oldTheta = brain.readTheta() / 10000.0; // llegeix valor ones theta del sensor Mindflex pinMode(ledPin, OUTPUT); // ajusta el pin del LED com pin de sortida Serial.begin(9600); // arrenca el port sèrie (per depuració codi i visualització valors)}

Page 9: Arduino - Grau Multimèdiagraumultimedia.com/wp-content/uploads/PAC2_Amengual_Pere-3.pdf5 ’Inter A 2 realitzar un forat per on surten els fils. Investigant les possibilitats de la

9

Disseny d’Interacció - PAC 2

void updateControl() { val = mozziAnalogRead(potPin) / 1023.0; // lectura de potenciómetre compatible amb Mozzi oldTheta = theta; // emmagatzema el valor per poder fer suavitzats theta = (val * brain.readTheta() / 10000.0) + ((1 - val) * oldTheta) + 400; // calcula valor suavitzat i escalat aCos.setFreq(ledState * (theta)); // assigna valor freqüència oscil·lador principal aVibrato.setFreq(8); // assigna valor freqüència vibrato}

int updateAudio() { Q15n16 vibrato = (Q15n16) intensity * aVibrato.next(); // calcula valor vibrato return aCos.phMod(vibrato); // aplica la modulació de fase (equivalent a FM)}

void loop() { audioHook(); // connexió amb Mozzi if (brain.update()) { // visualització valors pel port sèrie //Serial.println(brain.readErrors()); //Serial.println(brain.readCSV()); //Serial.println(theta); // meditative state //Serial.println(oldTheta); // meditative state }

if (brain.readSignalQuality() < 200) { // encén el LED verd quan es detecta senyal vàlida del sensor Mindflex ledState = HIGH; } else { ledState = LOW; } digitalWrite(ledPin, ledState);}

Page 10: Arduino - Grau Multimèdiagraumultimedia.com/wp-content/uploads/PAC2_Amengual_Pere-3.pdf5 ’Inter A 2 realitzar un forat per on surten els fils. Investigant les possibilitats de la

10

Disseny d’Interacció - PAC 2

Bibliografia i fonts consultades

Referències bibliogràfiques i en línia

(1) Wikipedia contributors. Neural oscillation [en línia]. Wikipedia, The Free Encyclopedia; 2016. Disponible en: <https://en.wikipedia.org/w/index.php?title=Neural_oscillation&oldid=705904137.>

(2) Wikipedia contributors. Theta rhythm [Internet]. Wikipedia, The Free Encyclopedia; 2016. Disponible en: <https://en.wikipedia.org/w/index.php?title=Theta_rhythm&oldid=713056701.>

(3) Symbolic Sound. KISS2013. [Internet]. Disponible en: <http://kiss2013.symbolicsound.com/program/>

Jakob Griffith. Hacking the Mindflex, more! [en línia] Hackaday. Disponible en < http://hackaday.com/2010/04/08/hacking-the-mindflex-more/>

Kitschpatrol. Brain Hack [en línia] Vimeo, 2016. Disponible a <https://vimeo.com/10184668>

Imatges

Imatge de Portada: Professor Morbius exercitant el dispositiu mental dels Krell. Forbidden Planet (1956) MGM.

Totes les altres imatges (cc 0) Pere Amengual Gomila