Table des matières:

Arduino TDCS Super Simple. Stimulateur transcrânien à courant continu (tDCS) DIY : 5 étapes
Arduino TDCS Super Simple. Stimulateur transcrânien à courant continu (tDCS) DIY : 5 étapes

Vidéo: Arduino TDCS Super Simple. Stimulateur transcrânien à courant continu (tDCS) DIY : 5 étapes

Vidéo: Arduino TDCS Super Simple. Stimulateur transcrânien à courant continu (tDCS) DIY : 5 étapes
Vidéo: Simple DIY TENS and TDCS Example 2024, Juillet
Anonim
Arduino TDCS super simples. Stimulateur transcrânien à courant continu (tDCS) DIY
Arduino TDCS super simples. Stimulateur transcrânien à courant continu (tDCS) DIY

Para fazer este tDCS você precisará apenas de um arduino, résistance, condensateur et 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 apena pour GND.
  2. Résistance (~470 Ω, mas provavelmente entre 300-1000 Ω funciona, você precisará alterar no código fonte)
  3. Condensateur (220 F). Servez para estabilizar os pulsos do PWM.
  4. Eletrodos de Esponja (Utilisez água salina para molhá-lo).

Fonction de Côme

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).

Étape 1: Saiba Mais

Saiba Mais
Saiba 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…

Étape 2: Monte O Circuito Abaixo

Monte O Circuito Abaixo
Monte O Circuito Abaixo

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

Étape 3: Installer O Código No Seu Arduino

Lembre-se de alterar comme 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 commandos, troque o No Line Ending para Carriage Return.

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

Code:

const Chaîne ver = "2.0m"; //PARAMETRES MATERIELS const int analogInPin = A0; // Entrada do Analógico const int analogOutPin = 13; // Saida D13 padrão float maxOutV = 5.0; // Un voltagem de saída PWM padrão do Arduino [V] float maxRefInV = 1.1; // Reference à voltagem analógica [V] float R = 470,0; // Resistencia da corrente [Ohm]

//PARAMETRES CONFIGURABLES

traceur booléen = faux; // 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 (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 GLOBAUX

état int = 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; // Tensionm int debounced_state = 0; int zeros_len = 0; float lissé_mA=0;

String commandString = ""; //pour l'interface de ligne de commande

//AIDE DE RÉTROACTION

float computeOutVoltage(float V, float new_mA){ if(abs(new_mA-target_mA)maxOutV){ state = -1; // resistência muito alta -> cerebro não encontrado? renvoie maxOutV; //retourner maxOutV/5.0; // para segurança } état = 0; renvoie 0,1*nouveau_V+0,9*V; //retourne nouveau_V; }

int convertVtoOutputValue(float V){

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

float sensorValue2mA(int sensorValue){

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

int debounced_state_compute(int state){

si (état 5) renvoie 0; } renvoie 1; }

début long non signé, finc;

void process_feedback(){ int sensorValue = analogRead(analogInPin); float new_mA = sensorValue2mA(sensorValue); lissé_mA = 0,2*nouveau_mA+0,8*lissé_mA; flotteur V = outV; outV = calculateOutVoltage(V, new_mA); analogWrite(analogOutPin, convertVtoOutputValue(outV)); debounced_state = debounced_state_compute(state); // Exibir n'informe aucune CLI endc = (millis()-start)/1000; Chaîne tv = "[", ttm = "mA/", tsm = "V, ", ts = "mA] | Estado: ", h = " | Tempo: ", s = ":", leadM = "", leadS = "", plotT = "Cible: ", plotmA = "\tSmoothed MA: ", plotMin = "\tMin: ", tempo; tmin long non signé = endc/60-((endc/60)%1); // Formatage if (endc%60<10) leadS = "0"; si (tmin=0) ts = ts + "+"; // Paramétrer automatiquement if (tmin>maxmin) stop_device(); Chaîne txt; if (traceur) txt = plotT + target_mA + plotMin + "0" + plotmA + smoothed_mA; sinon txt = tv + V + tsm + smoothed_mA + ttm + target_mA + ts + debounced_state + h + tempo; if (putty) Serial.print("\r\e[?25l" + txt); else Serial.println(txt);

// attend 2 millisecondes avant la prochaine boucle

// pour que le convertisseur analogique-numérique se règle // après la dernière lecture: delay(5); }

void stop_device(){

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

//AIDE CLIENT

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

annuler l'aide (){

Serial.println("tDSC arduino, ver "+ver); Serial.println("'?' - ajuda"); Serial.println("'max_time ' - temporisation maximale (em minutos)"); Serial.println("'target_mA ' - atteindre la cible (mA)"); Serial.println("'epsilon_mA ' - ualiza o epsilon_mA (mA)"); Serial.println("'R ' - permet de résister au matériel (Ohm)"); Serial.println("'putty ' - permet de formater l'application pour PuTTY"); Serial.println("'stop' - pour une estimation"); Serial.println("'restart' - inicia/reinicia a estimulação & o timer"); Serial.println("'continue' - continue une estimation"); 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) renvoie faux; Commande de chaîne = cmdString.substring(0, spacePos); Chaîne fval = cmdString.substring(spacePos+1); if(commande=="putty") if (fval=="true"){ putty = true; renvoie vrai; } else if (fval=="false"){ putty = false; renvoie vrai; } float val = fval.toFloat(); if(command=="target_mA"){ if(val100.0){ return false; } cible_mA = val; clearAndHome(); aider(); } else if(command=="epsilon_mA"){ if(val0.3){ return false; } epsilon_mA = val; clearAndHome(); aider(); } else if(commande=="R"){ R = val; clearAndHome(); aider(); } else if(command=="max_time"){ maxmin = val; clearAndHome(); aider(); }autre{ renvoie faux; } renvoie vrai; }

//RÉGLAGE ET BOUCLE PRINCIPALE

void setup() { Serial.begin(115200); analogReference(INTERNE); //1.1 V Serial.print("Sessão iniciada!"); début = millis(); } void loop(){ if(state!=-10){ process_feedback(); } if (Serial.available() > 0){ char v = Serial.read(); if (byte(v) == 13){ // Retour chariot bool accepté = true; if (commandString == "?" || commandString == "stop"){ stop_device(); } else if (commandString == "restart"){ clearAndHome(); état = -1; outV = maxOutV/5,0; début = millis(); accepté = faux; } else if (commandString == "continue"){ clearAndHome(); état = -1; outV = maxOutV/5,0; accepté = faux; }else{ bool ok = parse_param(commandString); if(!ok){ clearAndHome(); aider(); accepté = faux; Serial.println("Comando desconhecido: '" + chaîne_commande + "'"); } } chaîne_commande = ""; if (accepté){ clearAndHome(); aider(); Serial.println("Ok!"); } }else{ commandString+=v; if(state==-10){ Serial.print(v); } } } }

Étape 4: Uma UI Personalizada

Uma UI Personalizada
Uma UI Personalizada

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

mastic = vrai

Définitions recommandées:

  • Fenêtre

    • 61 Colunas et 20 Linhas
    • Afficher la barre de défilement désactivée
  • Fenêtre > Apparence

    Fonte: Console Lucida, 28px

Étape 5: Duvidas ?

Pour ouvrir une guia de ajuda, digite:

?

e pressione [ENTRER]

OBS: Caso o Estado seja:

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

Conseillé: