תוכן עניינים:
2025 מְחַבֵּר: John Day | [email protected]. שונה לאחרונה: 2025-01-13 06:57
Para fazer este tDCS você precisará apenas de um arduino, resist, capacitor e alguns cabos Componentes
-
ארדואינו
- פינו D13 כמו PWM (pode ser alterado).
- Pino A0 como entrada analógica (עבור משוב מהקורנט).
- פינו GND apenas para GND.
- נגד (~ 470 Ω, mas provavelmente entre 300-1000 Ω funciona, você precisará alterar no código fonte)
- קבלים (220 μF). מגישים לאפשרויות הפעלה של PWM.
- Eletrodos de Esponja (השתמש água salina para molhá-lo).
Como funciona
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 CLI serial (Console).
שלב 1: סייבה מייס
Você deve ler mais sobre tDCS primeiro. Não é aprovado pelo FDA e pode ser prejudicial a sua saud, principalmente se você não sabe nada sobre os efeitos colaterais, precauções and dentre outros …
שלב 2: Monte O Circuito Abaixo
Não se esqueça das esponjas com água salina!
שלב 3: Instale O Código No Seu Arduino
Lembre-se de alterar כמגדרות ופרמטרים של חלונות HARDWARE ו- PARAMS CONFIGURABLE.
אפשר לשנות את התעריף או את שיעור הבודדים לפי סדרה: 115200 פודר לאתר.
Para executor comandos, troque o No Line Ending for Carriage Return.
O código fonte + tutorial também podem ser encontrados no repositório:
קודיגו:
const String ver = "2.0m"; // HARDWARE PARAMS const int analogInPin = A0; // Entrada do Analógico const int analogOutPin = 13; // Saida D13 padrão float maxOutV = 5.0; // A voltagem de saída PWM padrão do Arduino [V] float maxRefInV = 1.1; // Referencia à voltagem analógica [V] float R = 470.0; // Resistencia da corrente [אוהם]
// פארמים ניתנים להגדרה
בורר פלוטר = שקר; // Defina: true, caso esteja usando o plotter boutt putty = false; // Defina: true, caso esteja usando o PuTTT (pode ser alterado no CLI) int maxmin = 30; // Tempo (em minutos) nødvendário para desligar [Min] float target_mA = 2.73; // Essa é a corrente que passará pelo seu cérebro !!! [mA] epsilon_mA float = 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 GLOBALS
int int = 1; /* -1 - זיהוי נגינה 0 - ניתן לשלוח שינויים בשורה אחת לתקן 1 - Tudo certo. Você esta na corrente definida -10 - Voltagem desligada */ float outV = maxOutV; // Voltagem int debounced_state = 0; int zeros_len = 0; float smoothed_mA = 0;
String commandString = ""; // עבור CLI
// עוזרי פידבקים
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? החזר maxOutV; // החזר maxOutV/5.0; // para segurança} state = 0; החזר 0.1*new_V+0.9*V; // החזר new_V; }
int convertVtoOutputValue (float V) {
אילוץ החזרה (int (V/maxOutV*255), 0, 255); }
sensor floatValue2mA (int sensorValue) {
float sensorVoltage = sensorValue/1023.0*maxRefInV; float sensor_mA = sensorVoltage/R*1000.0; החזר sensor_mA; }
int debounced_state_compute (int int) {
אם (מדינה 5) החזר 0; } החזר 1; }
התחלה ארוכה ללא סימן, סיום;
void process_feedback () {int sensorValue = analogRead (analogInPin); float new_mA = sensorValue2mA (sensorValue); smoothed_mA = 0.2*new_mA+0.8*smoothed_mA; לצוף V = outV; outV = computeOutVoltage (V, new_mA); analogWrite (analogOutPin, convertVtoOutputValue (outV)); debounced_state = debounced_state_compute (מצב); // Exibir informações no CLI endc = (millis ()-start)/1000; מחרוזת tv = "[", ttm = "mA/", tsm = "V,", ts = "mA] | Estado:", h = "| Tempo:", s = ":", leadM = "", leadS = "", plotT = "Target:", plotmA = "\ tSmoothed MA:", plotMin = "\ tMin:", קצב; tmin ארוך לא חתום = endc/60-((endc/60)%1); // Formatação if (endc%60 <10) leadS = "0"; אם (tmin = 0) ts = ts + " +"; // Parar automaticamente if (tmin> maxmin) stop_device (); Txt מחרוזת; אם (plotter) txt = plotT + target_mA + plotMin + "0" + plotmA + smoothed_mA; אחרת txt = tv + V + tsm + smoothed_mA + ttm + target_mA + ts + debounced_state + h + tempo; אם (מרק) Serial.print ("\ r / e [? 25l" + txt); אחרת Serial.println (txt);
// המתן 2 אלפיות השנייה לפני הלולאה הבאה
// לממיר האנלוגי לדיגיטלי להתיישב // לאחר הקריאה האחרונה: עיכוב (5); }
void stop_device () {
מצב = -10; analogWrite (analogOutPin, 0); clearAndHome (); Serial.println ("Sessão tDCS interrompida"); Serial.println ("------------------------"); עֶזרָה(); }
// עוזרי CLI
void clearAndHome () {Serial.write (27); Serial.print ("[2J"); // limpa a tela Serial.write (27); // ESC Serial.print ("[H"); // / r if (! מרק) עבור (int i = 0; i <= 30; i ++) Serial.println (""); }
עזרה בטלה () {
Serial.println ("tDSC arduino, ver"+ver); Serial.println ("'?' - ajuda"); Serial.println ("'max_time' - atualiza o tempo máximo (em minutos)"); Serial.println ("'target_mA' - אטואליזה o יעד (mA)"); Serial.println ("'epsilon_mA' - atualiza o epsilon_mA (mA)"); Serial.println ("'R' - atualiza a resistência do hardware (Ohm)"); Serial.println ("'מרק' - muda a formatação de saída pro PuTTY"); Serial.println ("'stop' - para a estimulação"); Serial.println ("'הפעלה מחדש' - inicia/reinicia a estimulação & o timer"); Serial.println ("'המשך' - continua a estimulação"); Serial.print ("\ n / rEstado: / n / r * max_time:"); Serial.print (maxmin); Serial.print ("דקות / 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 ("אוהם"); }
bool parse_param (String & cmdString) {
int spacePos = cmdString.indexOf (''); אם (spacePos <= 0) החזר false; פקודת מחרוזת = cmdString.substring (0, spacePos); מחרוזת fval = cmdString.substring (spacePos+1); if (command == "מרק") if (fval == "true") {מרק = נכון; להחזיר נכון; } אחרת אם (fval == "false") {putty = false; להחזיר נכון; } float val = fval.toFloat (); if (command == "target_mA") {if (val100.0) {return false; } target_mA = val; clearAndHome (); עֶזרָה(); } אחרת אם (command == "epsilon_mA") {if (val0.3) {return false; } epsilon_mA = val; clearAndHome (); עֶזרָה(); } אחרת אם (command == "R") {R = val; clearAndHome (); עֶזרָה(); } אחרת אם (command == "max_time") {maxmin = val; clearAndHome (); עֶזרָה(); } else {return false; } להחזיר נכון; }
// הגדרה ולולאה עיקרית
הגדרת חלל () {Serial.begin (115200); analogReference (INTERNAL); //1.1 V Serial.print ("Sessão iniciada!"); התחל = מילי (); } לולאת חלל () {אם (מצב! =-10) {process_feedback (); } if (Serial.available ()> 0) {char v = Serial.read (); אם (בייט (v) == 13) {// החזרת עגלה בול התקבל = נכון; if (commandString == "?" || commandString == "stop") {stop_device (); } אחרת אם (commandString == "הפעלה מחדש") {clearAndHome (); מצב = -1; outV = maxOutV/5.0; התחל = מילי (); מקובל = שקר; } אחרת אם (commandString == "המשך") {clearAndHome (); מצב = -1; outV = maxOutV/5.0; מקובל = שקר; } אחר {bool ok = parse_param (commandString); אם (! בסדר) {clearAndHome (); עֶזרָה(); מקובל = שקר; Serial.println ("Comando desconhecido: '" + commandString + "'"); }} commandString = ""; אם (מקובל) {clearAndHome (); עֶזרָה(); Serial.println ("בסדר!"); }} else {commandString+= v; if (state ==-10) {Serial.print (v); }}}}
שלב 4: Uiz UI Personalizada
על מנת להבחין ולהשתמש, השתמשו ב- PuTTY פרמנטה, והמשמעות היא:
מרק = נכון
המלצות על הגדרות:
-
חַלוֹן
- 61 Colunas e 20 Linhas
- הצג סרגל גלילה desativado
-
חלון> מראה
מקור: קונסולת Lucida, 28 פיקסלים
שלב 5: Dúvidas?
Para abrir a guia de ajuda, digite:
?
לחץ על [ENTER]
OBS: Caso o Estado seja:
-1 -> Cebre não identificado (corrente aberta) +0 -> Ajustando voltagem+1 -> Tudo certo, tDCS funcionando