Taula de continguts:

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

Vídeo: Arduino TDCS Super Simples. Bricolatge estimulador de corrent continu transcranial (tDCS): 5 passos

Vídeo: Arduino TDCS Super Simples. Bricolatge estimulador de corrent continu transcranial (tDCS): 5 passos
Vídeo: Simple DIY TENS and TDCS Example 2024, Juliol
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: