Índice:

Arduino TDCS Super Simples. Estimulador de corrente contínua transcraniana (tDCS) Faça você mesmo: 5 etapas
Arduino TDCS Super Simples. Estimulador de corrente contínua transcraniana (tDCS) Faça você mesmo: 5 etapas

Vídeo: Arduino TDCS Super Simples. Estimulador de corrente contínua transcraniana (tDCS) Faça você mesmo: 5 etapas

Vídeo: Arduino TDCS Super Simples. Estimulador de corrente contínua transcraniana (tDCS) Faça você mesmo: 5 etapas
Vídeo: Estimulação elétrica não-periódica no tratamento da epilepsia e comorbidades 2024, Julho
Anonim
Arduino TDCS Super Simples. Estimulador Transcraniano de Corrente Contínua (tDCS) Faça Você Mesmo
Arduino TDCS Super Simples. Estimulador Transcraniano de Corrente Contínua (tDCS) Faça Você Mesmo

Para fazer este tDCS você só precisa de um arduino, resistor, capacitor e alguns cabosComponentes

  1. Arduino

    • Pino D13 como saída PWM (pode ser alterado).
    • Pino A0 como entrada analógica (para feedback de corrente).
    • Pino GND apenas para GND.
  2. Resistor (~ 470 Ω, mas provavelmente entre 300-1000 Ω funciona, você deseja alterar no código fonte)
  3. Capacitor (220 μF). Servir para estabilizar os pulsos do PWM.
  4. Eletrodos de Esponja (Use água salina para molhá-lo).

Como funciona

O Arduino calcula a corrente padrão (pode ser alterado) que passará pelo seu cérebro apenas por mudar a voltagem de saída. Você também pode alterar o valor do target_mA pelo serial CLI (Console).

Etapa 1: Saiba Mais

Saiba Mais
Saiba Mais

Você deve ler mais sobre tDCS primeiro. Não é aprovado pelo FDA e pode ser prejudicial à sua saúde, principalmente se você não sabe nada sobre os efeitos associados, precauções e dentre outros…

Etapa 2: Monte O Circuito Abaixo

Monte O Circuito Abaixo
Monte O Circuito Abaixo

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

Etapa 3: Instale O Código No Seu Arduino

Lembre-se de alterar as configurações e parâmetros na área de HARDWARE PARAMS e CONFIGURABLE PARAMS.

Você também deve alterar o boud rate do Serial para: 115200 para poder ver o resultado.

Para executar comandos, troque o No Line Ending para Carriage Return.

O código fonte + tutorial também podem ser encontrados no repositório:

Código:

const String ver = "2.0m"; // PARAMS DE HARDWARE const int analogInPin = A0; // Entrada do Analógico const int analogOutPin = 13; // Saida D13 padrão float maxOutV = 5.0; // Uma 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 CONFIGURÁVEIS

plotter bool = falso; // Defina: verdadeiro, caso esteja usando o Serial plotter bool putty = false; // Defina: verdadeiro, caso esteja usando o PuTTT (pode ser alterado no CLI) int maxmin = 30; // Tempo (em minutos) necessário para desligar [Min] float target_mA = 2.73; // Essa é a corrente que passará pelo seu cérebro !!! [mA] float epsilon_mA = 0,03; // Diferença máxima entre a corrente real e o target_mA (Não altere caso não saiba o que está fazendo!)

// INIT GLOBALS

estado interno = 1; / * -1 - Cérebro não identificado 0 - Voltagem alterada para definir a corrente padrão 1 - Tudo certo. Você esta na corrente definida -10 - Voltagem desligada * / float outV = maxOutV; // Voltagem int debumped_state = 0; zeros_len int = 0; float smoothed_mA = 0;

String commandString = ""; // para CLI

// AJUDANTES DE FEEDBACK

float computeOutVoltage (float V, float new_mA) {if (abs (new_mA-target_mA) maxOutV) {state = -1; // resistência muito alta -> cérebro não encontrado? return maxOutV; // retorna maxOutV / 5.0; // para segurança} estado = 0; retornar 0,1 * novo_V + 0,9 * V; // return new_V; }

int convertVtoOutputValue (float V) {

restrição de retorno (int (V / maxOutV * 255), 0, 255); }

float sensorValue2mA (int sensorValue) {

float sensorVoltage = sensorValue / 1023.0 * maxRefInV; flutuante sensor_mA = sensorVoltage / R * 1000,0; return sensor_mA; }

int debumped_state_compute (int state) {

if (estado 5) retorna 0; } return 1; }

início longo sem sinal, fimc;

void process_feedback () {int sensorValue = analogRead (analogInPin); float new_mA = sensorValue2mA (sensorValue); smoothed_mA = 0,2 * new_mA + 0,8 * smoothed_mA; float V = outV; outV = computeOutVoltage (V, new_mA); analogWrite (analogOutPin, convertVtoOutputValue (outV)); debounce_state = debumped_state_compute (estado); // Exibir informações no CLI endc = (millis () - início) / 1000; String tv = "[", ttm = "mA /", tsm = "V,", ts = "mA] | Estado:", h = "| Tempo:", s = ":", leadM = "", leadS = "", plotT = "Alvo:", plotmA = "\ tSmoothed MA:", plotMin = "\ tMin:", tempo; tmin longo sem sinal = endc / 60 - ((endc / 60)% 1); // Formatação if (endc% 60 <10) leadS = "0"; se (tmin = 0) ts = ts + "+"; // Parar automaticamente if (tmin> maxmin) stop_device (); String txt; if (plotter) txt = plotT + target_mA + plotMin + "0" + plotmA + smoothed_mA; else txt = tv + V + tsm + smoothed_mA + ttm + target_mA + ts + debumped_state + h + tempo; if (massa) Serial.print ("\ r / e [? 25l" + txt); else Serial.println (txt);

// aguarde 2 milissegundos antes do próximo loop

// para o conversor analógico-digital estabilizar // após a última leitura: delay (5); }

void stop_device () {

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

// CLI HELPERS

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 (""); }

void help () {

Serial.println ("tDSC arduino, versão" + versão); 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' - atualiza a resistência do hardware (Ohm)"); Serial.println ("'massa' - muda a formatação de saída pro PuTTY"); Serial.println ("'parar' - para a estimulação"); Serial.println ("'reiniciar' - inicia / reinicia a estimulação & o cronômetro"); Serial.println ("'continuar' - 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 falso; String command = cmdString.substring (0, spacePos); String fval = cmdString.substring (spacePos + 1); if (command == "putty") if (fval == "true") {putty = true; return true; } else if (fval == "false") {putty = false; return true; } float val = fval.toFloat (); if (comando == "target_mA") {if (val100.0) {return false; } target_mA = val; clearAndHome (); ajuda(); } else if (command == "epsilon_mA") {if (val0.3) {return false; } epsilon_mA = val; clearAndHome (); ajuda(); } else if (command == "R") {R = val; clearAndHome (); ajuda(); } else if (command == "max_time") {maxmin = val; clearAndHome (); ajuda(); } else {return false; } return true; }

// CONFIGURAÇÃO E LOOP PRINCIPAL

void setup () {Serial.begin (115200); analogReference (INTERNAL); //1.1 V Serial.print ("Sessão explicada!"); início = milis (); } void loop () {if (state! = - 10) {process_feedback (); } if (Serial.available ()> 0) {char v = Serial.read (); if (byte (v) == 13) {// Retorno de carro bool aceito = verdadeiro; if (commandString == "?" || commandString == "stop") {stop_device (); } else if (commandString == "reiniciar") {clearAndHome (); estado = -1; outV = maxOutV / 5.0; início = milis (); aceito = falso; } else if (commandString == "continue") {clearAndHome (); estado = -1; outV = maxOutV / 5.0; aceito = falso; } else {bool ok = parse_param (commandString); if (! ok) {clearAndHome (); ajuda(); aceito = falso; Serial.println ("Comando desconhecido: '" + commandString + "'"); }} commandString = ""; if (aceito) {clearAndHome (); ajuda(); Serial.println ("Ok!"); }} else {commandString + = v; if (estado == - 10) {Serial.print (v); }}}}

Etapa 4: Uma UI Personalizada

Uma UI Personalizada
Uma UI Personalizada

Para melhor acompanhamento e segurança, utilizar uma ferramenta PuTTY, e definir no código fonte:

putty = true

Recomendações de definições:

  • Janela
    • 61 Colunas e 20 Linhas
    • Display scrollbar desativado
  • Janela> Aparência

    Fonte: Lucida Console, 28px

Etapa 5: Dúvidas?

Para abrir um guia de ajuda, digite:

?

e pressione [ENTER]

OBS: Caso o Estado seja:

-1 -> Cérebro não identificado (corrente aberta) +0 -> Ajustando voltagem + 1 -> Tudo certo, tDCS funcionando

Recomendado: