Turinys:
2025 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2025-01-13 06:57
Para fazer este tDCS você precisará apenas de um arduino, rezistorius, kondensatorius ir alguns cabosComponentes
-
Arduino
- „Pino D13“yra PWM (pode ser alterado).
- Pino A0 como entrada analógica (para feedback de corrente).
- Pino GND apenas para GND.
- Rezistorius (~ 470 Ω, masinis provavelmente entre 300-1000 Ω funciona, vokê precisará alterar no código fonte)
- Kondensatorius (220 μF). Patiekite pagal PWM nustatytą pulsą.
- Eletrodos de Esponja (Naudokite á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 serial CLI (Console).
1 žingsnis: Saiba Mais
Você deve ler mais sobre tDCS primeiro. Não é aprovado pelo FDA e pode ser prejudic a sua saúde, principmente se você não sabe nada sobre os efeitos colaterais, prepuações e dentre outros…
2 žingsnis: „Monte O Circuito Abaixo“
Não se esqueça das esponjas com água salina!
3 žingsnis: „Instale O Código No Seu Arduino“
Naudokite kitus įrankius, kaip konfigūracijas ir parametrus, skirtus HARDWARE PARAMS ir CONFIGURABLE PARAMS.
Você também deve alterar arba boud rate do Serial para: 115200 para poder ver o resultado.
Pagal vykdomuosius komendus, „No Line Ending“pagal „Carriage Return“.
O código fonte + pamoka também podem ser encontrados no repositório:
Kodis:
const String ver = "2.0m"; // Aparatūros PARAMOS const int analogInPin = A0; // Entrada do Analógico const int analogOutPin = 13; // Saida D13 padrão float maxOutV = 5.0; // A įtampos įtampa PWM padrão do Arduino [V] float maxRefInV = 1.1; // Referencia à voltagem analógica [V] plūdė R = 470.0; // Resistencia da corrente [Ohm]
// KONFIGURUOJAMOS PARAMOS
bool ploteris = klaidingas; // Defina: true, caso esteja usando o Serial plotter bool putty = false; // Apibrėžimas: true, caso esteja usando o PuTTT (pode ser alterado no CLI) int maxmin = 30; // Tempo (em minutos) requiredário para desligar [Min] float target_mA = 2.73; // Essa é a corrente que passará pelo seu cérebro !!! [mA] plūdė 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 GLOBALS
int būsena = 1; /* -1 - Cherebro não identifado 0 - Voltagem sendo alterada para definir a corrente padrão 1 - Tudo certo. Você esta na corrente definida -10 - Voltagem desligada */ float outV = maxOutV; // Įtampa int debounced_state = 0; int zeros_len = 0; plūdė išlyginta_mA = 0;
Eilutės komandaString = ""; // CLI
// PAGALBOS PAGALBOS
float computeOutVoltage (float V, float new_mA) {if (abs (new_mA -target_mA) maxOutV) {būsena = -1; // resistência muito alta -> cérebro não encontrado? return maxOutV; // grąžinti maxOutV/5.0; // para segurança} state = 0; grįžti 0,1*naujas_V+0,9*V; // return new_V; }
int convertVtoOutputValue (plūdė V) {
grąžinimo apribojimas (int (V/maxOutV*255), 0, 255); }
float sensorValue2mA (int sensorValue) {
float sensorVoltage = sensorValue/1023.0*maxRefInV; plūdės jutiklis_mA = sensorVoltage/R*1000.0; grąžinimo jutiklis_mA; }
int debounced_state_compute (int būsena) {
jei (5 būsena) grąžinkite 0; } grįžti 1; }
nepasirašyta ilga pradžia, pabaiga;
void process_feedback () {int sensorValue = analogRead (analogInPin); float new_mA = sensorValue2mA (sensorValue); išlygintas_mA = 0,2*naujas_mA+0,8*išlygintas_mA; plūdė V = outV; outV = computeOutVoltage (V, new_mA); analogWrite (analogOutPin, convertVtoOutputValue (outV)); debounced_state = debounced_state_compute (būsena); // Exibir informationções no CLI endc = (milis ()-pradžia)/1000; Eilutės tv = "[", ttm = "mA/", tsm = "V", ts = "mA] | Estado:", h = "| Tempo:", s = ":", leadM = "", leadS = "", plotT = "Target:", plotmA = "\ tSmoothed MA:", plotMin = "\ tMin:", tempo; nepasirašytas ilgas tmin = endc/60-((endc/60)%1); // Formatas, jei (endc%60 <10) leadS = "0"; jei (tmin = 0) ts = ts + " +"; // Parar automaticamente if (tmin> maxmin) stop_device (); Styginių txt; jei (braižytuvas) txt = plotTT + target_mA + plotMin + "0" + plotmA + išlygintas_mA; else txt = tv + V + tsm + išlyginta_mA + ttm + target_mA + ts + atšaukta_stata + h + tempas; if (glaistas) Serial.print ("\ r / e [? 25l" + txt); else Serial.println (txt);
// palaukite 2 milisekundes iki kitos kilpos
// kad analoginis-skaitmeninis keitiklis nusistovetu // po paskutinio skaitymo: delay (5); }
void stop_device () {
būsena = -10; analogWrite (analogOutPin, 0); clearAndHome (); Serial.println („Sessão tDCS interrompida“); Serial.println ("------------------------"); padėti (); }
// CLI HELPERS
void clearAndHome () {Serial.write (27); Serijinis atspaudas ("[2J"); // limpa a tela Serial.write (27); // ESC Serial.print ("[H"); // / r if (! glaistas) for (int i = 0; i <= 30; i ++) Serial.println (""); }
niekinė pagalba () {
Serial.println ("tDSC arduino, ver"+ver); Serial.println ("'?' - ajuda"); Serial.println ("'max_time' - atualiza o tempo máximo (em minutes)"); Serial.println ("'target_mA' - aktualizavimas arba tikslas (mA)"); Serial.println ("'epsilon_mA' - aktualizuojama arba epsilon_mA (mA)"); Serial.println ("'R' - galutinis ir atsparus aparatinei įrangai (Ohm)"); Serial.println ("'glaistas' - muda a formatação de saída pro PuTTY"); Serial.println ("'stop' - para a aprēķinis"); Serial.println ("'restart' - inicia/reinicia a appreulação & o timer"); Serial.println ("'tęsti' - Continua a tāmė"); Serial.print ("\ n / rEstado: / n / r * max_time:"); Serijinis atspaudas (maks. Min.); Serial.print ("minutės / n / r * target_mA:"); Serial.print (target_mA); Serial.print ("mA / n / r * epsilon_mA:"); Serial.print (epsilon_mA); Serial.print ("mA / n * r:"); Serijinis atspaudas (R); Serial.println („omai“); }
bool parse_param (String & cmdString) {
int spacePos = cmdString.indexOf (''); if (spacePos <= 0) return false; Styginių komanda = cmdString.substring (0, spacePos); String fval = cmdString.substring (tarpasPos+1); if (komanda == "glaistas") if (fval == "tiesa") {glaistas = tiesa; grįžti tiesa; } else if (fval == "false") {putty = false; grįžti tiesa; } plūdė val = fval.toFloat (); if (komanda == "target_mA") {if (val100.0) {return false; } target_mA = val; clearAndHome (); padėti (); } else if (komanda == "epsilon_mA") {if (val0.3) {return false; } epsilon_mA = val; clearAndHome (); padėti (); } else if (komanda == "R") {R = val; clearAndHome (); padėti (); } else if (komanda == "max_time") {maxmin = val; clearAndHome (); padėti (); } else {return false; } return true; }
// Sąranka ir pagrindinis kilpas
void setup () {Serial.begin (115200); analogReference (INTERNAL); //1.1 V Serial.print ("Sessão iniciada!"); pradžia = milis (); } void loop () {if (state! =-10) {process_feedback (); } if (Serial.available ()> 0) {char v = Serial.read (); if (baitas (v) == 13) {// Vežimo grąžinimo boolis priimtas = tiesa; if (commandString == "?" || commandString == "stop") {stop_device (); } else if (commandString == "restart") {clearAndHome (); būsena = -1; outV = maxOutV/5.0; pradžia = milis (); priimta = klaidinga; } else if (commandString == "tęsti") {clearAndHome (); būsena = -1; outV = maxOutV/5.0; priimta = klaidinga; } else {bool ok = parse_param (commandString); if (! gerai) {clearAndHome (); padėti (); priimta = klaidinga; Serial.println ("Comando desconhecido: '" + commandString + "'"); }} commandString = ""; jei (priimta) {clearAndHome (); padėti (); Serial.println („Gerai!“); }} else {commandString+= v; if (būsena ==-10) {Serial.print (v); }}}}
4 žingsnis: „Uma UI Personalizada“
Norėdami palydėti akompanimentą ir mišinį, naudokite „PuTTY“ferramentą, o ne apibrėžimą:
glaistas = tiesa
Apibrėžimų rekomendacijos:
-
Langas
- 61 Colunas ir 20 Linhas
- Rodyti slinkties juostos desativado
- Langas> Išvaizda
Fontai: „Lucida Console“, 28 piks
5 žingsnis: Dúvidas?
Para abrir a guia de ajuda, digite:
?
ir paspauskite [ENTER]
OBS: „Caso“arba „Estado“:
-1 -> Cérebro não identifado (corrente aberta) +0 -> Ajustando įtampa m+1 -> Tudo certo, tDCS funcionando