Inhaltsverzeichnis:
2025 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2025-01-13 06:56
Para fazer este tDCS você precisará apenas de um arduino, Widerstand, Kondensator und Alguns CabosComponentes
-
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.
- Widerstand (~470 Ω, mas provavelmente entre 300-1000 Ω funciona, você precisará alterar no código fonte)
- Kondensator (220 μF). Serve para estabilizar os pulsos tun PWM.
- Eletrodos de Esponja (Verwenden Sie água salina para molhá-lo).
Como-Funktion
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 serielle CLI (Konsole).
Schritt 1: 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…
Schritt 2: Monte O Circuito Abaixo
Não se esqueça das esponjas com água salina!
Schritt 3: Instale O Código No Seu Arduino
Lembre-se de alterar as configurações e parameteros na área de HARDWARE PARAMS e KONFIGURIERBARE PARAME.
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:
Codigo:
const String ver = "2.0m"; // HARDWAREPARAME const int analogInPin = A0; // Entrada do Analógico const int analogOutPin = 13; // Saida D13 padrão float maxOutV = 5.0; // Ein PWM-Padrão von Arduino [V] float maxRefInV = 1.1; // Referencia à voltagem analógica [V] float R = 470.0; // Resistencia da corrente [Ohm]
//KONFIGURIERBARE PARAME
bool Plotter = false; // 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] Schwimmer 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!)
//GLOBALE INITIEREN
int-Zustand = 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 - Spannungm desligada */ float outV = maxOutV; // Voltagem int debounced_state = 0; int zeros_len = 0; float smoothed_mA=0;
String commandString = ""; //für CLI
//FEEDBACK-HELFER
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? Rückgabe maxOutV; // maxOutV/5.0 zurückgeben; // para segurança } state = 0; Rückgabe 0,1*neu_V+0,9*V; //neues_V zurückgeben; }
int convertVtoOutputValue(float V){
Rückgabebeschränkung (int(V/maxOutV*255), 0, 255); }
float sensorValue2mA(int sensorValue){
float sensorVoltage = sensorValue/1023,0*maxRefInV; float sensor_mA = sensorVoltage/R*1000.0; Rücklaufsensor_mA; }
int debounced_state_compute(int state){
if(Zustand 5) 0 zurückgeben; } Rückgabe 1; }
vorzeichenloser langer Anfang, endc;
Void process_feedback () {int sensorValue = analogRead (analogInPin); float new_mA = sensorValue2mA(sensorValue); geglätteter_mA = 0,2*neuer_mA+0,8*geglätteter_mA; Schwimmer 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 = "Ziel: ", plotmA = "\tSmoothed MA: ", plotMin = "\tMin: ", tempo; unsigned long tmin = endc/60-((endc/60)%1); // Formatierung if (endc%60<10) LeadS = "0"; if (tmin=0) ts = ts + "+"; // Parar automaticamente if (tmin>maxmin) stop_device(); String-txt; if (Plotter) txt = plotT + target_mA + plotMin + "0" + plotmA + geglätteter_mA; else txt = tv + V + tsm + smoothed_mA + ttm + target_mA + ts + debounced_state + h + tempo; if (kitt) Serial.print("\r\e[?25l" + txt); sonst Serial.println (txt);
// warte 2 Millisekunden vor der nächsten Schleife
// damit sich der Analog-Digital-Wandler // nach dem letzten Lesen einschwingen kann: delay(5); }
void stop_device(){
Zustand = -10; analogWrite (analogOutPin, 0); clearAndHome(); Serial.println ("Sessão tDCS interrompida"); Serial.println("------------------------"); Hilfe(); }
//CLI-HELFER
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(""); }
Leere Hilfe(){
Serial.println ("tDSC arduino, ver" + ver); Serial.println("'?' - ajuda"); Serial.println ("'max_time ' - atualiza o tempo maximo (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 ("'Putty' - Muda a formatação de saída pro PuTTY"); Serial.println ("'stop' - para a estimulação"); Serial.println("'restart' - Initialisierung/Reinicia a Estimulação & o Timer"); Serial.println("'continue' - Continua a estimulação"); Serial.print("\n\rEstado:\n\r * max_time: "); Serial.print (maxmin); Serial.print(" Minuten\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(String &cmdString){
int spacePos = cmdString.indexOf(' '); if(spacePos<=0) Rückgabe falsch; String-Befehl = cmdString.substring(0, spacePos); String fval = cmdString.substring(spacePos+1); if(command=="putty") if (fval=="true"){ putty = true; true zurückgeben; }sonst if (fval=="false"){ putty = false; true zurückgeben; } float val = fval.toFloat(); if(command=="target_mA"){ if(val100.0){ return false; } Ziel_mA = Wert; clearAndHome(); Hilfe(); }sonst if(command=="epsilon_mA"){ if(val0.3){ return false; } Epsilon_mA = Wert; clearAndHome(); Hilfe(); }sonst if(command=="R"){ R = val; clearAndHome(); Hilfe(); }sonst if(command=="max_time"){ maxmin = val; clearAndHome(); Hilfe(); }sonst{ false zurückgeben; } true zurückgeben; }
//SETUP UND HAUPTSCHLEIFE
Void setup () { Serial.begin (115200); analogReferenz (INTERN); // 1,1 V Serial.print ("Sessão iniciada!"); start = millis(); aufrechtzuerhalten. Void Schleife () { if (Zustand! = -10) { process_feedback (); aufrechtzuerhalten. Wenn (Serial.available () > 0) { char v = Serial.read (); if (byte(v) == 13){// Wagenrücklauf bool akzeptiert = wahr; if (commandString == "?" || commandString == "stop"){ stop_device(); }sonst if (commandString == "restart"){ clearAndHome(); Zustand = -1; outV = maxOutV/5,0; start = millis(); akzeptiert = falsch; }sonst if (commandString == "weiter"){ clearAndHome(); Zustand = -1; outV = maxOutV/5,0; akzeptiert = falsch; }else{ bool ok = parse_param(commandString); if(!ok){ clearAndHome(); Hilfe(); akzeptiert = falsch; Serial.println ("Comando desconhecido: '" + commandString + "'"); } } commandString = ""; wenn (akzeptiert) {clearAndHome(); Hilfe(); Serial.println ("Ok!"); } }sonst{ commandString+=v; Wenn (Zustand ==-10) {Serial.print (v); } } } }
Schritt 4: Uma UI Personalizada
Para melhor acompanhamento e segurança, benutze eine Ferramenta PuTTY, und defina no código fonte:
kitt = wahr
Empfehlungen zur Definition:
-
Fenster
- 61 Spalten und 20 Linhas
- Scrollbar anzeigen desativado
-
Fenster > Aussehen
Schriftart: Lucida-Konsole, 28px
Schritt 5: Duvidas?
Para abrir a guia de ajuda, digite:
?
Druck [ENTER]
OBS:Caso oder Estado seja:
-1 -> Cérebro não identificado (corrente aberta)+0 -> Ajustando voltagem+1 -> Tudo certo, tDCS funcionando