Inhoudsopgave:
2025 Auteur: John Day | [email protected]. Laatst gewijzigd: 2025-01-13 06:57
Para fazer este tDCS você precisará apenas de um arduino, weerstand, condensator en 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 voor GND.
- Weerstand (~470, mas provavelmente entre 300-1000 Ω funciona, você precisará alterar no código fonte)
- Condensator (220 F). Serveer para estabilizar en pulsen do PWM.
- Eletrodos de Esponja (Gebruik água salina para molhá-lo).
Como functie
O Arduino rekent een corrente padrão (pode ser alterado) uit om te zien welke apenas of mudar a voltagem de saída. Você também pode alterar o valor do target_mA pelo serial CLI (Console).
Stap 1: Saiba Mais
Você deve ler mais sobre tDCS primeiro. Geen enkele goedkeuring van de FDA en een mogelijke nadelige invloed van de wet op de mogelijke gevolgen van de schade…
Stap 2: Monte O Circuito Abaixo
Geen esqueça das esponjas com água salina!
Stap 3: Installeer O Código No Seu Arduino
Dit is een alternatief voor configuraties en parameters voor HARDWARE-PARAMES en CONFIGUREERBARE PARAMS.
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:
Code:
const String ver = "2.0m"; //HARDWAREPARAMES const int analogInPin = A0; // Entrada do Analógico const int analogOutPin = 13; // Saida D13 padrão float maxOutV = 5.0; // Een voltage van de PWM padro do Arduino [V] float maxRefInV = 1.1; // Referencia à voltagem analógica [V] float R = 470,0; // Weerstand van corrente [Ohm]
// CONFIGUREERBARE PARAMES
bool plotter = onwaar; // 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) noodzakelijk voor het instellen [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 (No altere caso não saiba o que está fazendo!)
//INIT GLOBALS
int-status = 1; /* -1 - Cerebro não identificado 0 - Voltagem sendo alterada para definir a corrente padrão 1 - Tudo certo. Você esta corrente definida -10 - Voltagem desligada */ float outV = maxOutV; // Voltagem int debounced_state = 0; int nullen_len = 0; float smoothed_mA=0;
String commandString = ""; //voor CLI
//FEEDBACK HELPERS
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? retour maxOutV; // retour maxOutV/5.0; // para segurança } staat = 0; retourneer 0.1*new_V+0.9*V; // retourneer nieuwe_V; }
int convertVtoOutputValue(float V){
retourbeperking (int(V/maxOutV*255), 0, 255); }
vlottersensorWaarde2mA(int sensorWaarde){
vlottersensorVoltage = sensorValue/1023,0*maxRefInV; vlottersensor_mA = sensorVoltage/R*1000,0; retour sensor_mA; }
int debounced_state_compute(int staat){
als (status 5) retourneert 0; } retour 1; }
niet ondertekend lange start, endc;
void process_feedback () {int sensorValue = analogRead (analogInPin); float new_mA = sensorValue2mA (sensorValue); smoothed_mA = 0.2*new_mA+0.8*smoothed_mA; vlotter V = uitV; outV = computeOutVoltage (V, nieuwe_mA); analogWrite(analogOutPin, convertVtoOutputValue(outV)); debounced_state = debounced_state_compute(staat); // Exibir informações no CLI endc = (millis()-start)/1000; String tv = "[", ttm = "mA/", tsm = "V, ", ts = "mA] | Estado: ", h = " | Tempo: ", s = ":", leadM = "", leadS = "", plotT = "Doel: ", plotmA = "\tSmoothed MA: ", plotMin = "\tMin:", tempo; unsigned long tmin = endc/60-((endc/60)%1); // Formatação if (endc%60<10) leadS = "0"; als (tmin=0) ts = ts + "+"; // Parar automatisch als (tmin>maxmin) stop_device(); Tekenreeks txt; if (plotter) txt = plotT + target_mA + plotMin + "0" + plotmA + smoothed_mA; anders txt = tv + V + tsm + smoothed_mA + ttm + target_mA + ts + debounced_state + h + tempo; if (putty) Serial.print("\r\e[?25l" + txt); anders Serial.println(txt);
// wacht 2 milliseconden voor de volgende lus
// voor de analoog-naar-digitaal omzetter om te regelen // na de laatste lezing: vertraging (5); }
ongeldig stop_device(){
staat = -10; analogWrite(analogOutPin, 0); clearAndHome(); Serial.println("Sessão tDCS interrompida"); Serial.println ("------------------------"); helpen(); }
//CLI HELPERS
void clearAndHome() { Serial.write(27); Serial.print("[2J"); // limpa een tela Serial.write(27); // ESC Serial.print ("[H"); // \r if (!putty) for (int i = 0; i<=30; i++) Serial.println(""); }
ongeldige hulp(){
Serial.println("tDSC arduino, ver "+ver); Serial.println("'?' - ajuda"); Serial.println("'max_time' - atualize of tempo max (em minutos)"); Serial.println("'target_mA' - atualize of target (mA)"); Serial.println("'epsilon_mA ' - atualiza of epsilon_mA (mA)"); Serial.println ("'R ' - atualiza a resistência do hardware (Ohm)"); Serial.println("'putty ' - een opmaak voor de pro PuTTY"); Serial.println("'stop' - voor een schatting"); Serial.println("'restart' - inicia/reinicia a estimulação & o timer"); Serial.println("'doorgaan' - wordt geschat"); Serial.print("\n\rEstado:\n\r * max_time: "); Seriële.afdruk (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: "); Serieafdruk(R); Serial.println ("Ohm"); }
bool parse_param(String &cmdString){
int spacePos = cmdString.indexOf(' '); if(spacePos<=0) retourneer false; Tekenreeksopdracht = cmdString.substring (0, spacePos); String fval = cmdString.substring(spacePos+1); if(command=="putty") if (fval=="true"){ putty = true; retourneer waar; }else if (fval=="false"){ putty = false; retourneer waar; } float val = fval.toFloat(); if(command=="target_mA"){ if(val100.0){ return false; } doel_mA = waarde; clearAndHome(); helpen(); }else if(command=="epsilon_mA"){ if(val0.3){ return false; } epsilon_mA = waarde; clearAndHome(); helpen(); }else if(command=="R"){ R = val; clearAndHome(); helpen(); }else if(command=="max_time"){ maxmin = val; clearAndHome(); helpen(); }els{ retourneer false; } retourneer waar; }
//SETUP EN HOOFDLUS
void setup() { Serial.begin(115200); analogeReferentie (INTERN); //1.1 V Serial.print ("Sessão iniciada!"); start = millis(); } void loop(){ if(state!=-10){ process_feedback(); } if (Serial.available() > 0){ char v = Serial.read(); if (byte (v) == 13) { // Carriage return bool geaccepteerd = waar; if (commandString == "?" || commandString == "stop"){ stop_device(); }else if (commandString == "herstart"){ clearAndHome(); staat = -1; outV = maxOutV/5,0; start = millis(); geaccepteerd = onwaar; }else if (commandString == "doorgaan"){ clearAndHome(); staat = -1; outV = maxOutV/5,0; geaccepteerd = onwaar; }else{ bool ok = parse_param(commandString); if(!ok){ clearAndHome(); helpen(); geaccepteerd = onwaar; Serial.println ("Commando desconhecido: '" + commandString + "'"); } } commandString = ""; if (geaccepteerd){ clearAndHome(); helpen(); Serial.println("Ok!"); } }anders{ commandString+=v; if(state==-10){ Serial.print(v); } } } }
Stap 4: Uma UI Personalizada
Gebruik een ferramenta PuTTY, e definia no código fonte:
stopverf = waar
Definitieve aanbevelingen:
-
Raam
- 61 Colunas en 20 Linhas
- Toon schuifbalk desativado
-
Venster > Uiterlijk
Lettertype: Lucida-console, 28px
Stap 5: Duvidas?
Para abrir a guia de ajuda, digite:
?
e druk [ENTER]
OBS:Caso of Estado zie:
-1 -> Cerebro não identificado (corrente aberta)+0 -> Ajustando voltagem+1 -> Tudo certo, tDCS funcionando