Inhaltsverzeichnis:
- Schritt 1: Saiba Mais
- Schritt 2: Monte O Circuito Abaixo
- Schritt 3: Instale O Código No Seu Arduino
- Schritt 4: Uma UI Personalizada
- Schritt 5: Duvidas?
Video: Arduino TDCS Super Simples. Transkranieller Gleichstromstimulator (tDCS) DIY - Gunook
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-30 07:18
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
Empfohlen:
DIY So zeigen Sie die Zeit auf dem M5StickC ESP32 mit Visuino an - Einfach zu tun: 9 Schritte
DIY So zeigen Sie die Zeit auf dem M5StickC ESP32 mit Visuino an - Einfach zu machen: In diesem Tutorial lernen wir, wie Sie den ESP32 M5Stack StickC mit Arduino IDE und Visuino programmieren, um die Zeit auf dem LCD anzuzeigen
Wie man Super Mario Bros. NES World 1 in 3 Minuten besiegt – wikiHow
Wie man Super Mario Bros. NES World 1 in 3 Minuten besiegt: Dies ist ein Tutorial, wie man Super Mario Bros. NES World 1 innerhalb von 3 Minuten besiegt. Wenn Sie Hilfe benötigen, sagen Sie dies in den Kommentaren. Schau dir auch das Video an, denn das erklärt einiges
ERSTELLE DEINEN EIGENEN MINECRAFT-SERVER! Super einfach, schnell und kostenlos! (KEIN KLICKEN KÖDER): 11 Schritte (mit Bildern)
ERSTELLE DEINEN EIGENEN MINECRAFT-SERVER! Super einfach, schnell und kostenlos! (NO CLICK BAIT): Minecraft ist ein äußerst unterhaltsames Spiel, in dem Sie praktisch alles tun können, was Sie wollen! Aber das Spielen mit Freunden über das Internet kann manchmal eine Qual sein. Leider sind die meisten Multiplayer-Server entweder voller Trolle, nicht die Spielerfahrung
DIY Batterie Arduino und Raspberry Pi 3: 4 Schritte (mit Bildern)
DIY Batterie Arduino und Raspberry Pi 3: Hallo Also in diesem anweisbaren zeige ich Ihnen, wie ich meine Batterie für meinen Roboter mache. Ich brauche Strom für mein Arduino-Board (mich Auriga Makeblock Board basierend auf ATmega2560) und mein Himbeer-Pi (mit PS-Auge; Festplatte 2g …) Also brauche ich:_output 7.4v für die Ar
Lötrauchabsaugung - Super einfach zu machen: 6 Schritte (mit Bildern)
Lötrauchabsaugung | Super einfach zu machen: Machen wir das! (High Five und Freeze Frame) Vielen Dank, dass Sie sich mein Projekt angesehen haben! Ich habe mehr auf meinem YouTube-Kanal youtube.com/c/3dsageWarum einen Dunstabzug verwenden? „Die Exposition gegenüber Kolophonium kann Augen-, Rachen- und Lungenreizungen, Nasenbluten und Kopfschmerz verursachen