Cov txheej txheem:

Arduino TDCS Super Simples. Transcranial Ncaj Ncees Tam Sim No (tDCS) DIY: 5 Cov Kauj Ruam
Arduino TDCS Super Simples. Transcranial Ncaj Ncees Tam Sim No (tDCS) DIY: 5 Cov Kauj Ruam

Video: Arduino TDCS Super Simples. Transcranial Ncaj Ncees Tam Sim No (tDCS) DIY: 5 Cov Kauj Ruam

Video: Arduino TDCS Super Simples. Transcranial Ncaj Ncees Tam Sim No (tDCS) DIY: 5 Cov Kauj Ruam
Video: Transcranial Direct Current Stimulation (tDCS) explained | Neuroscience Methods 101 2024, Lub Xya hli ntuj
Anonim
Arduino TDCS Super Simples. Transcranial Direct Current Stimulator (tDCS) DIY
Arduino TDCS Super Simples. Transcranial Direct Current Stimulator (tDCS) DIY

Para fazer este tDCS você precisará apenas 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 rau GND.
  2. Resistor (~ 470 Ω, mas provavelmente entre 300-1000 Ω funciona, você precisará alterar no código fonte)
  3. Capacitor (220 μF). Ua hauj lwm rau cov neeg ua haujlwm PWM.
  4. Eletrodos de Esponja (Siv água salina para molhá-lo).

Kev ua si

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 ua target_mA pelo serial CLI (Console).

Kauj Ruam 1: Saiba Mais

Saib Mais
Saib Mais

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

Kauj Ruam 2: Monte O Circuito Abaixo

Monte O Circuito Abaixo
Monte O Circuito Abaixo

Tsis muaj qhov tshwj xeeb tshaj li cov esponjas com água salina!

Kauj Ruam 3: Txhim Kho O Código No Seu Arduino

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

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

Para executar comandos, troque o Tsis Muaj Kab Kawg Para Carriage Return.

O código fonte + tutorial também podem ser encontrados tsis muaj chaw cia khoom:

Caj dab:

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

// CONFIGURABLE PARAMS

bool plotter = tsis tseeb; // Defina: tseeb, caso esteja usando o Serial plotter bool putty = cuav; // Defina: tseeb, caso esteja usando o PuTTT (pode ser alterado no CLI) int maxmin = 30; // Tempo (em minutos) necessário para desligar [Min] ntab target_mA = 2.73; // Essa é a corrente que passará pelo seu cérebro !!! [mA] ntab 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 ntiaj teb

int xeev = 1; /* -1 - Cérebro não identificado 0 - Voltagem sendo alterada para definir a corrente padrão 1 - Tudo certo. Você esta na corrente definida -10 - Voltagem desligada */ ntab tawmV = maxOutV; // Voltagem int debounced_state = 0; int zeros_len = 0; ntab smoothed_mA = 0;

Txoj hlua commandString = ""; // rau CLI

// FEEDBACK HELPERS

ntab computeOutVoltage (ntab V, ntab new_mA) {yog (abs (new_mA -target_mA) maxOutV) {xeev = -1; // resistência muito alta -> cérebro não encontrado? rov maxOutV; // rov maxOutV/5.0; // para segurança} xeev = 0; rov qab 0.1*new_V+0.9*V; // rov tshiab_V; }

int convertVtoOutputValue (ntab V) {

rov qab txwv (int (V/maxOutV*255), 0, 255); }

ntab sensorValue2mA (int sensorValue) {

ntab sensorVoltage = sensorValue/1023.0*maxRefInV; ntab sensor_mA = sensorVoltage/R*1000.0; rov sensor_mA; }

int debounced_state_compute (int xeev) {

yog (xeev 5) rov qab 0; } rov qab 1; }

unsigned ntev pib, endc;

void process_feedback () {int sensorValue = analogRead (analogInPin); ntab new_mA = sensorValue2mA (sensorValue); smoothed_mA = 0.2*new_mA+0.8*smoothed_mA; float V = outV; outV = computeOutVoltage (V, new_mA); analogWrite (analogOutPin, hloov VtoOutputValue (tawmV)); debounced_state = debounced_state_compute (xeev); // Exibir informações no CLI endc = (millis ()-pib)/1000; String tv = "[", ttm = "mA/", tsm = "V,", ts = "mA] | Estado:", h = "| Tempo:", s = ":", leadM = "", leadS = "", plotT = "Target:", plotmA = "\ tSmoothed MA:", plotMin = "\ tMin:", tempo; unsigned ntev tmin = endc/60-((endc/60)%1); // Formatação yog (endc%60 <10) leadS = "0"; if (tmin = 0) ts = ts + " +"; // Parar automaticamente yog (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 + debuted_state + h + tempo; yog (putty) Serial.print ("\ r / e [? 25l" + txt); lwm Serial.println (txt);

// tos 2 milliseconds ua ntej lub voj tom ntej

// rau qhov hloov pauv analog-rau-digital los daws teeb meem // tom qab nyeem kawg: ncua (5); }

tsis muaj dabtsis stop_device () {

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

// CLI Pab

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

void pab () {

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 phiaj (mA)"); Serial.println ("'epsilon_mA' - atualiza o epsilon_mA (mA)"); Serial.println ("'R' - atualiza a resistência do hardware (Ohm)"); Serial.println ("'putty' - muab cov ntaub ntawv pov thawj los ntawm PuTTY"); Serial.println ("'nres' - rau qhov kwv yees '); Serial.println ("'rov pib dua' - inicia/reinicia kwv yees kwv yees & timer"); Serial.println ("'txuas ntxiv' - txuas ntxiv kev kwv yees"); 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 (Txoj hlua & cmdString) {

int spacePos = cmdString.indexOf (''); yog (spacePos <= 0) rov tsis tseeb; Txoj hlua hais kom ua = cmdString.substring (0, spacePos); Txoj hlua fval = cmdString.substring (spacePos+1); if (command == "putty") if (fval == "true") {putty = tseeb; rov muaj tseeb; } lwm yog (fval == "cuav") {putty = cuav; rov muaj tseeb; } ntab val = fval.toFloat (); yog (hais kom == "target_mA") {yog (val100.0) {rov tsis tseeb; } target_mA = npib; clearAndHome (); pab (); } lwm yog (hais kom ua == "epsilon_mA") {yog (val0.3) {rov tsis tseeb; } epsilon_mA = np. clearAndHome (); pab (); } lwm yog (hais kom ua == "R") {R = val; clearAndHome (); pab (); } lwm yog (hais kom ua == "max_time") {maxmin = val; clearAndHome (); pab (); } lwm {xa rov qab tsis tseeb; } rov tseeb; }

// Teeb tsa thiab Qhib LOOP

teeb tsa tsis muaj dab tsi () {Serial.begin (115200); analogReference (sab hauv); //1.1 V Serial.print ("Sessão iniciada!"); pib = millis (); } void loop () {yog (xeev! =-10) {process_feedback (); } yog (Serial.available ()> 0) {char v = Serial.read (); yog (byte (v) == 13) {// Carriage return bool txais = muaj tseeb; yog (commandString == "?" || commandString == "stop") {stop_device (); } lwm yog (commandString == "restart") {clearAndHome (); xeev = -1; outV = maxOutV/5.0; pib = millis (); lees txais = tsis tseeb; } lwm yog (commandString == "txuas ntxiv") {clearAndHome (); xeev = -1; outV = maxOutV/5.0; lees txais = tsis tseeb; } lwm {bool ok = parse_param (commandString); yog (! ok) {clearAndHome (); pab (); lees txais = tsis tseeb; Serial.println ("Comando desconhecido: '" + commandString + "'"); }} commandString = ""; yog (txais) {clearAndHome (); pab (); Serial.println ("Ok!"); }} lwm {commandString+= v; yog (xeev ==-10) {Serial.print (v); }}}}

Kauj Ruam 4: Uma UI Tus Kheej

Uma UI Tus Kheej
Uma UI Tus Kheej

Txhawm rau ua kom tau txais txiaj ntsig zoo hauv kev siv, siv ferramenta PuTTY, thiab txiav txim siab tsis muaj código fonte:

putty = muaj tseeb

Cov ntsiab lus ntawm cov ntsiab lus:

  • Qhov rai

    • 61 Colunas thiab 20 Linhas
    • Zaub scrollbar desativado
  • Qhov rai> Tshwm Sim

    Fonte: Lucida Console, 28px

Kauj Ruam 5: Puas yog?

Txhawm rau txhawm rau txhawm rau txhawm rau, digitize:

?

e pressione [ENTER]

OBS: Caso lossis Estado seja:

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

Pom zoo: