İçindekiler:
2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-13 06:58
Para fazer este tDCS você precisará apenas de um arduino, direnç, kapasitör e alguns cabosBileşenler
-
Arduino
- Pino D13 como saída PWM (pode ser alterado).
- Pino A0 como entrada analógica (para geri bildirimi de corrente).
- Pino GND apenas para GND.
- Direnç (~470 Ω, mas provavelmente entre 300-1000 Ω funciona, você precisará alterar no código fonte)
- Kondansatör (220 μF). Para estabilizar os pulsos PWM yapın.
- Eletrodos de Esponja (água salina para molhá-lo kullanın).
Como işlevi
O Arduino hesapları bir doğrultu (pode ser alterado) que passará pelo seu cérebro apenas por mudar a voltajm de saída. Você também pode alterar veya valor do target_mA pelo seri CLI (Konsol).
Adım 1: Saiba Mais
En iyi ve en ciddi tDCS primeiro. Önemsiz FDA e pode ser önyargılı bir sua saúde, esasa se você não sabe nada sobre os efeitos colaterais, precauções ve dentre outros…
Adım 2: Monte O Circuito Abaixo
Daha fazla bilgi edinin!
Adım 3: O Código No Seu Arduino'yu Kurun
DONANIM PARAMLARI ve YAPILANDIRILABİLİR PARAMS'ların yapılandırılması ve parametrelerinin değiştirilmesi.
Você também deve alterar o boud rate do Seri para: 115200 para poder ver o resultado.
Yürütücü komandolar, troque o Satırsız Bitiş, Satır Başı.
O código fonte + öğretici também podem ser encontrados depo yok:
Codigo:
const String ver = "2.0m"; //DONANIM PARAMS const int analogInPin = A0; // Entrada yapmak Analógico const int analogOutPin = 13; // Saida D13 padrão float maxOutV = 5.0; // Arduino için bir voltaj PWM padrão [V] float maxRefInV = 1.1; // Gerilim ve analógica referansları [V] kayan nokta R = 470.0; // Resistencia da corrente [Ohm]
// YAPILANDIRILABİLİR PARAMLAR
bool çizici = yanlış; // Tanım: true, caso esteja usando o Seri çizici bool macun = yanlış; // Tanımlama: doğru, PuTTT'yi (pode ser alterado no CLI) doğru, caso esteja usando int maxmin = 30; // Tempo (em minutos) necessário para desligar [Min] kayan noktalı hedef_mA = 2,73; // Doğru ve doğru bir geçiştir, pelo seu cérebro!!! [mA] yüzer epsilon_mA = 0.03; // Doğru bir gerçek e o hedef_mA girişinin farklı olması (Yanlış bir yerde değil!)
// GLOBALLERİ BAŞLAT
int durum = 1; /* -1 - Tanımlama bilgisi 0 - Gerilim değişikliği, doğru bir şekilde değiştirilmiştir. 1 - Sertifika sertifikası. Tanımlama bilgileri -10 - Gerilim desligada */ float outV = maxOutV; // Voltagem int debounced_state = 0; int sıfırlar_len = 0; float smoothed_mA=0;
String komutuString = ""; //CLI için
//GERİ BİLDİRİM YARDIMCILARI
float hesaplamaOutVoltage(float V, float yeni_mA){ if(abs(new_mA-target_mA)maxOutV){ durum = -1; // direnencia muito alta -> cérebro não encontrado? maxOutV döndür; // maxOutV/5.0 döndür; // para segurança } durum = 0; 0,1*yeni_V+0,9*V döndür; //yeni_V döndür; }
int convertVtoOutputValue(float V){
dönüş kısıtlaması(int(V/maxOutV*255), 0, 255); }
kayan sensörDeğeri2mA(int sensörDeğeri){
float sensörVoltage = sensorValue/1023.0*maxRefInV; float sensor_mA = sensorVoltage/R*1000.0; sensör_mA dönüş; }
int debounced_state_compute(int durum){
if(durum 5) 0 döndürür; } dönüş 1; }
imzasız uzun başlangıç, bitişc;
void process_feedback(){ int sensorValue = analogRead(analogInPin); float new_mA = sensorValue2mA(sensorValue); düzleştirilmiş_mA = 0,2*yeni_mA+0,8*düzleştirilmiş_mA; kayan nokta V = çıkışV; outV = hesaplamaOutVoltage(V, yeni_mA); analogWrite(analogOutPin, convertVtoOutputValue(outV)); debounced_state = debounced_state_compute(durum); // Exibir bilgileri yok CLI endc = (millis()-start)/1000; String tv = "[", ttm = "mA/", tsm = "V, ", ts = "mA] | Estado: ", h = " | Tempo: ", s = ":", leadM = "", leadS = "", plotT = "Hedef: ", plotmA = "\tDüzeltilmiş MA: ", plotMin = "\tMin: ", tempo; unsigned long tmin = endc/60-((endc/60)%1); // Formatação if (endc%60<10) leadS = "0"; if (tmin=0) ts = ts + "+"; // Parar otomatikamente if (tmin>maxmin) stop_device(); dize txt'si; if (çizici) txt = plotT + hedef_mA + plotMin + "0" + plotmA + düzleştirilmiş_mA; else txt = tv + V + tsm + smoothed_mA + ttm + target_mA + ts + debounced_state + h + tempo; if (macun) Serial.print("\r\e[?25l" + txt); başka Serial.println(txt);
// sonraki döngüden önce 2 milisaniye bekleyin
// analogdan dijitale dönüştürücünün son okumadan sonra oturması için //: delay(5); }
void stop_device(){
durum = -10; analogWrite(analogOutPin, 0); clearAndHome(); Serial.println("Sessão tDCS interrompida"); Serial.println("------------------------"); Yardım(); }
//CLI YARDIMCILARI
void clearAndHome() { Serial.write(27); Seri.print("[2J"); // limpa a tela Serial.write(27); // ESC Seri.print("[H"); // \r if (!putty) for (int i = 0; i<=30; i++) Serial.println(""); }
geçersiz yardım(){
Serial.println("tDSC arduino, sürüm "+ver); Serial.println("'?' - ajuda"); Serial.println("'max_time ' - tempo maksimo atualiza (en minutos)"); Serial.println("'target_mA' - hedefin gerçeklenmesi (mA)"); Serial.println("'epsilon_mA ' - atualiza veya epsilon_mA (mA)"); Serial.println("'R' - bir direnç donanımına atualiza (Ohm)"); Serial.println("'macun' - PuTTY için bir formata dönüştürülebilir"); Serial.println("'dur' - para bir tahmin"); Serial.println("'yeniden başlat' - inicia/reinicia bir tahmin ve o zamanlayıcı"); Serial.println("'devam' - bir tahminin devamı"); Serial.print("\n\rEstado:\n\r * max_time: "); Seri.baskı(maksmin); 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: "); Seri.print(R); Serial.println(" Ohm"); }
bool parse_param(Dize &cmdString){
int spacePos = cmdString.indexOf(' '); if(spacePos<=0) false döndürür; Dize komutu = cmdString.substring(0, spacePos); String fval = cmdString.substring(spacePos+1); if(command=="putty") if (fval=="true"){ macun = true; true döndür; }else if (fval=="yanlış"){ macun = yanlış; true döndür; } float val = fval.toFloat(); if(command=="target_mA"){ if(val100.0){ false döndür; } target_mA = değer; clearAndHome(); Yardım(); }else if(command=="epsilon_mA"){ if(val0.3){ false döndür; } epsilon_mA = değer; clearAndHome(); Yardım(); }else if(command=="R"){ R = val; clearAndHome(); Yardım(); }else if(command=="max_time"){ maxmin = val; clearAndHome(); Yardım(); }else{ false döndür; } true döndür; }
//KURULUM VE ANA DÖNGÜ
geçersiz kurulum() { Serial.begin(115200); analogReferans(DAHİLİ); //1.1 V Serial.print("Sessão iniciada!"); başlangıç = millis(); } void loop(){ if(durum!=-10){ process_feedback(); } if (Serial.available() > 0){ char v = Seri.read(); if (byte(v) == 13){ // Satır başı bool kabul edildi = true; if (commandString == "?" || commandString == "stop"){ stop_device(); }else if (commandString == "restart"){ clearAndHome(); durum = -1; outV = maxOutV/5.0; başlangıç = millis(); kabul edildi = yanlış; }else if (commandString == "devam"){ clearAndHome(); durum = -1; outV = maxOutV/5.0; kabul edildi = yanlış; }else{ bool tamam = parse_param(commandString); if(!ok){ clearAndHome(); Yardım(); kabul edildi = yanlış; Serial.println("Desconhecido: '" + komutDizesi + "'"); } } commandString = ""; if (kabul edildi){ clearAndHome(); Yardım(); Serial.println("Tamam!"); } }else{ commandString+=v; if(durum==-10){ Serial.print(v); } } } }
4. Adım: Uma Kullanıcı Arayüzü Kişiselleştirme
Para melhor acompanhamento e segurança, bir ferramenta PuTTY, e defina no código fonte kullanın:
macun = doğru
Tanımlama önerileri:
-
pencere
- 61 Sütunlar ve 20 Linhas
- Kaydırma çubuğunu göster
-
Pencere > Görünüm
Yazı Tipi: Lucida Konsolu, 28 piksel
Adım 5: Dúvidas?
Para abrir a guia de ajuda, digite:
?
e basın [ENTER]
OBS: Caso veya Estado sejası:
-1 -> Cérebro não identificado (korrente aberta)+0 -> Ajustando voltajım+1 -> Tudo certo, tDCS funcionando