Cuprins:

Arduino TDCS Super Simples. Stimulator de curent direct transcranian (tDCS) DIY: 5 pași
Arduino TDCS Super Simples. Stimulator de curent direct transcranian (tDCS) DIY: 5 pași

Video: Arduino TDCS Super Simples. Stimulator de curent direct transcranian (tDCS) DIY: 5 pași

Video: Arduino TDCS Super Simples. Stimulator de curent direct transcranian (tDCS) DIY: 5 pași
Video: Tens (Transcutaneous Electrical Nerve Stimulation) device DIY 2024, Noiembrie
Anonim
Arduino TDCS Super Simples. Stimulator de curent direct transcranian (tDCS) DIY
Arduino TDCS Super Simples. Stimulator de curent direct transcranian (tDCS) DIY

Pentru a face acest tDCS vocea precisă apenas de um arduino, rezistor, condensator și unele cabosComponentes

  1. Arduino

    • Pino D13 ca saída PWM (se poate modifica).
    • Pino A0 como entrada analógica (pentru feedback de curent).
    • Pino GND apenas para GND.
  2. Resistor (~ 470 Ω, mai provavelmente între 300-1000 Ω funcționează, se precizează modificarea codului sursă)
  3. Condensator (220 μF). Serve pentru a stabiliza os pulsos do PWM.
  4. Eletrodos de Esponja (Use água salina para molhá-lo).

Como works

O Arduino calculează un curent padron (poate fi modificat) care va trece părul său cérebro apenas por mudar a voltagem de saída. Vocați și voi să modificați valoarea valorii target_mA pelo serial CLI (Console).

Pasul 1: Saiba Mais

Saiba Mais
Saiba Mais

Você deve ler mais despre tDCS primul. Nu este aprovizionat cu părul FDA și poți fi prejudiciat pentru sănătatea sa, în principal, nu știi nimic despre efeitos colaterais, precauções e dentre outros …

Pasul 2: Monte O Circuito Abaixo

Monte O Circuito Abaixo
Monte O Circuito Abaixo

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

Pasul 3: Instalați O Cod No Seu Arduino

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

Voce prea trebuie să schimbați sau să ratați seria pentru: 115200 pentru puterea ver rezultatului.

Pentru executarea comenzilor, troque o No Line Ending pentru Carriage Return.

O cod font + tutorial putem fi găsite și fără depozit:

Cod:

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]

// PARAMURI CONFIGURABILE

plotter bool = fals; // Defina: true, caso esteja using o Serial plotter bool putty = false; // Defina: true, caso esteja using o PuTTT (pode ser alterado no CLI) int maxmin = 30; // Tempo (em minutos) necesário para desligar [Min] float target_mA = 2.73; // Essa é a corrente care passará pelo seu cérebro !!! [mA] floare epsilon_mA = 0,03; // Diferența maximă între curent real și o target_mA (Nu altere caz nu saiba o că este fazând!)

// INIT GLOBALS

int state = 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 * / float outV = maxOutV; // Voltagem int debowed_state = 0; int zeros_len = 0; float smoothed_mA = 0;

String commandString = ""; // pentru CLI

// AJUTORII 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 found? returnează maxOutV; // returnează maxOutV / 5.0; // para segurança} state = 0; returnează 0,1 * nou_V + 0,9 * V; // returnează nou_V; }

int convertVtoOutputValue (float V) {

return constrain (int (V / maxOutV * 255), 0, 255); }

float sensorValue2mA (int sensorValue) {

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

int debowed_state_compute (int state) {

if (stare 5) returnează 0; } returnează 1; }

inceput lung nesemnat, endc;

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)); debounced_state = debounced_state_compute (state); // 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 = "\ tSmoothed MA:", plotMin = "\ tMin:", tempo; nesemnat tmin lung = endc / 60 - ((endc / 60)% 1); // Formatação if (endc% 60 <10) leadS = "0"; if (tmin = 0) ts = ts + "+"; // Parar automat if (tmin> maxmin) stop_device (); String txt; if (plotter) txt = plotT + target_mA + plotMin + "0" + plotmA + smoothed_mA; else txt = tv + V + tsm + smooth_mA + ttm + target_mA + ts + debounced_state + h + tempo; if (chit) Serial.print ("\ r / e [? 25l" + txt); else Serial.println (txt);

// așteptați 2 milisecunde înainte de următoarea buclă

// pentru ca convertorul analog-digital să se stabilească // după ultima citire: delay (5); }

void stop_device () {

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

// AJUTORII CLI

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

anulați ajutorul () {

Serial.println ("tDSC arduino, ver" + ver); Serial.println ("'?' - ajuda"); Serial.println ("'max_time' - atualiza o tempo maxim (em minutos)"); Serial.println ("'target_mA' - atualiza o target (mA)"); Serial.println ("'epsilon_mA' - atualiza o epsilon_mA (mA)"); Serial.println ("'R' - atualiza o rezistență la hardware (Ohm)"); Serial.println ("'putty' - muda a formatação de saída pro PuTTY"); Serial.println ("'stop' - pentru o estimare"); Serial.println ("'restart' - inicia / reinicia a estimulação & o timer"); Serial.println ("'continue' - continuă o estimare"); 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) returnează false; Comanda șir = cmdString.substring (0, spacePos); String fval = cmdString.substring (spacePos + 1); if (comanda == "chit") if (fval == "adevărat") {chit = adevărat; întoarce-te adevărat; } else if (fval == "false") {chit = false; întoarce-te adevărat; } float val = fval.toFloat (); if (comanda == "target_mA") {if (val100.0) {return false; } target_mA = val; clearAndHome (); Ajutor(); } else if (comanda == "epsilon_mA") {if (val0.3) {return false; } epsilon_mA = val; clearAndHome (); Ajutor(); } else if (comanda == "R") {R = val; clearAndHome (); Ajutor(); } else if (comanda == "max_time") {maxmin = val; clearAndHome (); Ajutor(); } else {return false; } returnează adevărat; }

// CONFIGURARE ȘI BUCLĂ PRINCIPALĂ

void setup () {Serial.begin (115200); analogReference (INTERN); //1.1 V Serial.print ("Sesiunea inițiată!"); start = milis (); } bucla void () {if (state! = - 10) {process_feedback (); } if (Serial.available ()> 0) {char v = Serial.read (); if (octet (v) == 13) {// Bool return car acceptat = adevărat; if (commandString == "?" || commandString == "stop") {stop_device (); } else if (commandString == "restart") {clearAndHome (); stare = -1; outV = maxOutV / 5.0; start = milis (); acceptat = fals; } else if (commandString == "continuare") {clearAndHome (); stare = -1; outV = maxOutV / 5.0; acceptat = fals; } else {bool ok = parse_param (commandString); if (! ok) {clearAndHome (); Ajutor(); acceptat = fals; Serial.println ("Comando desconhecido: '" + commandString + "'"); }} commandString = ""; if (acceptat) {clearAndHome (); Ajutor(); Serial.println („Ok!”); }} else {commandString + = v; if (state == - 10) {Serial.print (v); }}}}

Pasul 4: Uma UI Personalizată

Uma UI Personalizada
Uma UI Personalizada

Pentru o mai bună acompaniație și siguranță, utilizați un instrument PuTTY, și definiți un cod sursă:

chit = adevărat

Recomandări de definiții:

  • Fereastră

    • 61 Colune și 20 Linhas
    • Afișați bara de derulare desativado
  • Fereastră> Aspect

    Fonte: Lucida Console, 28px

Pasul 5: Dúvidas?

Pentru a deschide o guia de ajută, digite:

?

e pressione [ENTER]

OBS: Caso o Estado seja:

-1 -> Cérebro não identificado (corrente aberta) +0 -> Ajustando voltagem + 1 -> Tudo certo, tDCS funcționând

Recomandat: