Arduino TDCS Super Simples. Bricolatge estimulador de corrent continu transcranial (tDCS): 5 passos
Arduino TDCS Super Simples. Bricolatge estimulador de corrent continu transcranial (tDCS): 5 passos
Anonim
Arduino TDCS Super Simples. Estimulador de corrent continu transcranial (tDCS) DIY
Arduino TDCS Super Simples. Estimulador de corrent continu transcranial (tDCS) DIY

Per a fer aquest tDCS es precisarà apenas d'un arduino, resistor, condensador i alguns cabos

  1. Arduino

    • Pino D13 com a saída PWM (pot ser alterat).
    • Pino A0 com a entrada analògica (per a retroalimentació de corrent).
    • Pino GND apenas para GND.
  2. Resistor (~ 470 Ω, més provavelment entre 300-1000 Ω funciona, es precisarà alterar sense codi font)
  3. Condensador (220 μF). Serveix per estabilitzar els polsos de PWM.
  4. Eletrodos de Esponja (Use água salina para molhá-lo).

Com funciona

O Arduino calcula a corrente padrão (can ser alterado) que passará pelo seu cérebro apenas por mudar a voltagem de saída. També podeu canviar el valor de target_mA pelo serial CLI (Console).

Pas 1: Saiba Mais

Saiba Mais
Saiba Mais

Você deve ler mais sobre tDCS primer. No és aprovat pel pèl FDA i pots ser perjudicial per a la seva salut, principalment no es pot saber res sobre els efeitos colaterais, precauções e dentre outros …

Pas 2: Monte O Circuito Abaixo

Monte O Circuito Abaixo
Monte O Circuito Abaixo

Não se esqueça das esponjas com água salina!

Step 3: Instale O Code No Seu Arduino

Lembre-se alterar as configurações i parametros na area de HARDWARE PARAMS i CONFIGURABLE PARAMS.

També s'ha de canviar o canviar el número de sèrie per a: 115200 per a poder veure el resultat.

Per executar comandos, trets o No Line Ending per a Carriage Return.

O codi font + tutorial també podem trobar-nos sense repositori:

Codi:

const String ver = "2.0m"; // HARDWARE PARAMS const int analogInPin = A0; // Entrada do Analógico const int analogOutPin = 13; // Saida D13 padrão float maxOutV = 5.0; // A voltagem de saída PWM padrão do Arduino [V] float maxRefInV = 1.1; // Referencia à voltagem analógica [V] float R = 470.0; // Resistencia da corrente [Ohm]

// PARAMS CONFIGURABLES

plotter bool = fals; // Definició: true, caso esteja using o Serial plotter bool putty = false; // Definició: true, cas que es faci servir o PuTTT (pot ser modificat sense CLI) int maxmin = 30; // Tempo (em minutos) necessário para desligar [Min] float target_mA = 2.73; // Essa és a corrent que passarà els seus cabells !!! [mA] float epsilon_mA = 0,03; // Diferència màxima entre un corrent real i o target_mA (No tinc cas no tinc saiba o que està fent!)

// INIT GLOBALS

estat int = 1; / * -1 - Cérebro no identificat 0 - Voltagem sendo alterada per definir a current padrão 1 - Tudo certo. Você esta na corrente definida -10 - Voltagem desligada * / float outV = maxOutV; // Voltagem int debowed_state = 0; int zeros_len = 0; float smoothed_mA = 0;

String commandString = ""; // per a CLI

// AJUDES DE FEEDBACK

float computeOutVoltage (float V, float new_mA) {if (abs (new_mA-target_mA) maxOutV) {state = -1; // resistência muito alta -> cérebro no trobat? retorn maxOutV; // torna maxOutV / 5.0; // para segurança} state = 0; retorna 0,1 * nou_V + 0,9 * V; // torna nou_V; }

int convertVtoOutputValue (float V) {

restringir retorn (int (V / maxOutV * 255), 0, 255); }

float sensorValue2mA (int sensorValue) {

float sensorVoltage = sensorValue / 1023.0 * maxRefInV; float sensor_mA = sensorVoltage / R * 1000.0; retorn sensor_mA; }

int deburred_state_compute (estat int) {

if (estat 5) retorna 0; } retorn 1; }

inici llarg sense signar, endc;

void process_feedback () {int sensorValue = analogRead (analogInPin); float new_mA = sensorValue2mA (sensorValue); smoothed_mA = 0,2 * new_mA + 0,8 * smoothed_mA; flotador V = outV; outV = computeOutVoltage (V, new_mA); analogWrite (analogOutPin, convertVtoOutputValue (outV)); debounced_state = debounced_state_compute (estat); // Exibir informações no CLI endc = (millis () - start) / 1000; String tv = "[", ttm = "mA /", tsm = "V", ts = "mA] | Estado:", h = "| Tempo:", s = ":", leadM = "", leadS = "", plotT = "Target:", plotmA = "\ t MA smoothed:", plotMin = "\ tMin:", tempo; unsigned long tmin = endc / 60 - ((endc / 60)% 1); // Formatação if (endc% 60 <10) leadS = "0"; if (tmin = 0) ts = ts + "+"; // Parar automaticamente if (tmin> maxmin) stop_device (); Txt de cadena; if (plotter) txt = plotT + target_mA + plotMin + "0" + plotmA + smoothed_mA; else txt = tv + V + tsm + smoothed_mA + ttm + target_mA + ts + debused_state + h + tempo; if (massilla) Serial.print ("\ r / e [? 25l" + txt); else Serial.println (txt);

// espereu 2 mil·lisegons abans del següent bucle

// perquè el convertidor analògic-digital es resolgui // després de la darrera lectura: delay (5); }

void stop_device () {

estat = -10; analogWrite (analogOutPin, 0); clearAndHome (); Serial.println ("Sessão tDCS interrompida"); Serial.println ("------------------------"); ajudar (); }

// AJUDES CLI

void clearAndHome () {Serial.write (27); Serial.print ("[2J"); // limpa a tela Serial.write (27); // ESC Serial.print ("[H"); // / r if (! putty) for (int i = 0; i <= 30; i ++) Serial.println (""); }

ajuda nul·la () {

Serial.println ("tDSC arduino, ver" + ver); Serial.println ("'?' - ajuda"); Serial.println ("'max_time' - atualiza o tempo máximo (em minutos)"); Serial.println ("'target_mA' - atualiza o target (mA)"); Serial.println ("'epsilon_mA' - atualiza o epsilon_mA (mA)"); Serial.println ("'R': actualitza la resistència del maquinari (Ohm)"); Serial.println ("'putty' - muda a formatação de saída pro PuTTY"); Serial.println ("'stop' - per a estimulação"); Serial.println ("'restart' - inicia / reinicia a estimulação & o timer"); Serial.println ("'continue' - continua a estimulação"); Serial.print ("\ n / rEstado: / n / r * max_time:"); Serial.print (maxmin); Serial.print ("minutos / n / r * target_mA:"); Serial.print (target_mA); Serial.print ("mA / n / r * epsilon_mA:"); Serial.print (epsilon_mA); Serial.print ("mA / n / r * R:"); Serial.print (R); Serial.println ("Ohms"); }

bool parse_param (String & cmdString) {

int spacePos = cmdString.indexOf (''); if (spacePos <= 0) retorna false; Ordre de cadena = cmdString.substring (0, spacePos); Cadena fval = cmdString.substring (spacePos + 1); if (ordre == "massilla") if (fval == "true") {massilla = true; tornar cert; } else if (fval == "false") {massilla = false; tornar cert; } float val = fval.toFloat (); if (ordre == "target_mA") {if (val100.0) {return false; } target_mA = val; clearAndHome (); ajudar (); } else if (ordre == "epsilon_mA") {if (val0.3) {return false; } epsilon_mA = val; clearAndHome (); ajudar (); } else if (ordre == "R") {R = val; clearAndHome (); ajudar (); } else if (ordre == "max_time") {maxmin = val; clearAndHome (); ajudar (); } else {return false; } tornar cert; }

// CONFIGURACIÓ I LOOP PRINCIPAL

configuració nul·la () {Serial.begin (115200); analogReference (INTERN); //1.1 V Serial.print ("Sessão iniciada!"); inici = millis (); } bucle buit () {if (state! = - 10) {process_feedback (); } if (Serial.available ()> 0) {char v = Serial.read (); if (byte (v) == 13) {// Cool return bool acceptable = true; if (commandString == "?" || commandString == "stop") {stop_device (); } else if (commandString == "reinicia") {clearAndHome (); estat = -1; outV = maxOutV / 5.0; inici = millis (); acceptat = fals; } else if (commandString == "continuar") {clearAndHome (); estat = -1; outV = maxOutV / 5.0; acceptat = fals; } else {bool ok = parse_param (commandString); if (! ok) {clearAndHome (); ajudar (); acceptat = fals; Serial.println ("Comando desconhecido: '" + commandString + "'"); }} commandString = ""; if (acceptat) {clearAndHome (); ajudar (); Serial.println ("Ok!"); }} else {commandString + = v; if (state == - 10) {Serial.print (v); }}}}

Pas 4: Uma UI personalitzada

Uma UI personalitzada
Uma UI personalitzada

Per a més acompanyament i seguretat, utilitzeu una ferramenta PuTTY, i definiu un codi font:

massilla = cert

Recomanacions de definicions:

  • Finestra
    • 61 Colunas e 20 Linhas
    • Mostra la barra de desplaçament desativada
  • Finestra> Aparença

    Fonte: Lucida Console, 28 px

Pas 5: Dúvidas?

Per obrir una guia d'ajuda, digite:

?

e pressione [ENTER]

OBS: Cas o Estado seja:

-1 -> Cérebro no identificat (corrent oberta) +0 -> Ajustant voltatge + 1 -> Tot cert, tDCS funcionant

Recomanat: