Sommario:

Arduino TDCS Super Semplici. Stimolatore transcranico a corrente continua (tDCS) Fai da te: 5 passaggi
Arduino TDCS Super Semplici. Stimolatore transcranico a corrente continua (tDCS) Fai da te: 5 passaggi

Video: Arduino TDCS Super Semplici. Stimolatore transcranico a corrente continua (tDCS) Fai da te: 5 passaggi

Video: Arduino TDCS Super Semplici. Stimolatore transcranico a corrente continua (tDCS) Fai da te: 5 passaggi
Video: Can I Use Electricity to Make Her Dance? DIY SHOCK MACHINE 2024, Luglio
Anonim
Arduino TDCS Super Semplici. Stimolatore transcranico a corrente continua (tDCS) fai-da-te
Arduino TDCS Super Semplici. Stimolatore transcranico a corrente continua (tDCS) fai-da-te

Para fazer este tDCS você precisará apenas de um arduino, resistor, condensatore e alguns cabosComponentes

  1. Arduino

    • Pino D13 come 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ê precisará alterar no código fonte)
  3. Condensatore (220 μF). Serve para estabilizar os pulsos do PWM.
  4. Eletrodos de Esponja (Usa água salina para molhá-lo).

Como funzione

O Arduino calcola 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).

Fase 1: Saiba Mais

Saiba Mais
Saiba Mais

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

Fase 2: Monte O Circuito Abaixo

Monte O Circuito Abaixo
Monte O Circuito Abaixo

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

Passaggio 3: installare 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 do Serial para: 115200 para poder ver o resultado.

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

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

Codice:

const String ver = "2.0m"; //PARAMETRI HARDWARE const int analogInPin = A0; // Entrata in Analógico const int analogOutPin = 13; // Saida D13 padrão float maxOutV = 5.0; // Un voltaggio di questo PWM padrão do Arduino [V] float maxRefInV = 1.1; // Referencia à voltagem analógica [V] float R = 470.0; // Resistenza da corrente [Ohm]

//PARAMETRI CONFIGURABILI

bool plotter = falso; // Defina: true, caso esteja usando o Serial plotter bool putty = false; // Defina: true, caso esteja usando o PuTTT (pode ser alterado no CLI) int maxmin = 30; // Tempo (in minuti) 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 GLOBALI

int stato = 1; /* -1 - Cérebro não identificato 0 - Voltagem sendo alterada para definir a corrente padrão 1 - Tudo certo. Você esta na corrente definita -10 - Voltagem desligada */ float outV = maxOutV; // Tensionem int debounced_state = 0; int zeros_len = 0; float smoothed_mA=0;

String Stringa di comando = ""; //per CLI

// AIUTANTI 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? restituisce maxOutV; //restituisce maxOutV/5.0; // para segurança } stato = 0; restituisce 0.1*new_V+0.9*V; //restituisce new_V; }

int convertVtoOutputValue(float V){

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

float sensorValue2mA(int sensorValue){

sensore a galleggianteVoltage = sensorValue/1023.0*maxRefInV; galleggiante sensor_mA = sensorVoltage/R*1000.0; ritorno sensor_mA; }

int debounced_state_compute(int stato){

if(stato 5) restituisce 0; } restituisce 1; }

unsigned long start, endc;

void process_feedback(){ int sensorValue = analogRead(analogInPin); float new_mA = sensorValue2mA(sensorValue); livellato_mA = 0.2*nuovo_mA+0.8*smussato_mA; flottante V = outV; outV = computeOutVoltage(V, new_mA); analogWrite(analogOutPin, convertVtoOutputValue(outV)); debounced_state = debounced_state_compute(stato); // Mostra informazioni no CLI endc = (millis()-start)/1000; String tv = "[", ttm = "mA/", tsm = "V, ", ts = "mA] | Estado: ", h = " | Tempo: ", s = ":", leadM = "", leadS = "", plotT = "Obiettivo: ", plotmA = "\tMA levigata: ", plotMin = "\tMin: ", tempo; unsigned long tmin = endc/60-((endc/60)%1); // Formattazione if (endc%60<10) leadS = "0"; if (tmin=0) ts = ts + "+"; // Parar automaticamente if (tmin>maxmin) stop_device(); Stringa di testo; if (plotter) txt = plotT + target_mA + plotMin + "0" + plotmA + smoothed_mA; else txt = tv + V + tsm + smoothed_mA + ttm + target_mA + ts + debounced_state + h + tempo; if (putty) Serial.print("\r\e[?25l" + txt); altrimenti Serial.println(txt);

// aspetta 2 millisecondi prima del ciclo successivo

// affinché il convertitore analogico-digitale si stabilizzi // dopo l'ultima lettura: delay(5); }

void stop_device(){

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

//AIUTI CLI

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

aiuto vuoto(){

Serial.println("tDSC arduino, ver "+ver); Serial.println("'?' - ajuda"); Serial.println("'max_time ' - atualiza o tempo máximo (em minutos)"); Serial.println("'target_mA ' - aggiornamento del target (mA)"); Serial.println("'epsilon_mA ' - aggiornato o epsilon_mA (mA)"); Serial.println("'R ' - atualiza a resistência do hardware (Ohm)"); Serial.println("'putty' - muda a formatação de saída pro PuTTY"); Serial.println("'stop' - para una stima"); Serial.println("'restart' - inicia/reinicia a estimulação & o timer"); Serial.println("'continua' - continua a stimare"); 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(" Ohm"); }

bool parse_param(Stringa &cmdStringa){

int spacePos = cmdString.indexOf(' '); if(spacePos<=0) restituisce false; Comando stringa = cmdString.substring(0, spacePos); String fval = cmdString.substring(spacePos+1); if(comando=="putty") if (fval=="true"){ putty = true; restituire vero; }else if (fval=="false"){ putty = false; restituire vero; } float val = fval.toFloat(); if(comando=="target_mA"){ if(val100.0){ return false; } target_mA = val; clearAndHome(); aiuto(); }else if(comando=="epsilon_mA"){ if(val0.3){ return false; } epsilon_mA = val; clearAndHome(); aiuto(); }else if(comando=="R"){ R = val; clearAndHome(); aiuto(); }else if(comando=="max_time"){ maxmin = val; clearAndHome(); aiuto(); }else{ restituisce falso; } restituisce vero; }

//SETUP E LOOP PRINCIPALE

void setup() { Serial.begin(115200); analogReference(INTERNO); //1.1 V Serial.print("Sessão iniciada!"); inizio = millis(); } void loop(){ if(state!=-10){ process_feedback(); } if (Serial.available() > 0){ char v = Serial.read(); if (byte(v) == 13){ // Ritorno a capo bool accettato = true; if (CommandString == "?" || commandString == "stop"){ stop_device(); }else if (CommandString == "restart"){ clearAndHome(); stato = -1; outV = maxOutV/5.0; inizio = millis(); accettato = falso; }else if (CommandString == "continua"){ clearAndHome(); stato = -1; outV = maxOutV/5.0; accettato = falso; }else{ bool ok = parse_param(commandString); if(!ok){ clearAndHome(); aiuto(); accettato = falso; Serial.println("Comando desconhecido: '" + commandString + "'"); } } stringa di comando = ""; if (accettato){ clearAndHome(); aiuto(); Serial.println("Ok!"); } }else{ commandString+=v; if(stato==-10){ Serial.print(v); } } } }

Passaggio 4: personalizzazione dell'interfaccia utente di Uma

Uma UI Personalizzata
Uma UI Personalizzata

Para melhor acompanhamento e segurança, use a ferramenta PuTTY, e defina no código fonte:

mastice = vero

Raccomandazioni di definizione:

  • Finestra
    • 61 colonne e 20 linha
    • Visualizza barra di scorrimento disattivato
  • Finestra > Aspetto

    Fonte: Lucida Console, 28px

Passaggio 5: Duvidas?

Para abrir a guia de ajuda, digite:

?

e pressione [INVIO]

OBS: Caso o Estado seja:

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

Consigliato: