İçindekiler:

Arduino TDCS Süper Basitleri. Transkraniyal Doğru Akım Stimülatörü (tDCS) Kendin Yap: 5 Adım
Arduino TDCS Süper Basitleri. Transkraniyal Doğru Akım Stimülatörü (tDCS) Kendin Yap: 5 Adım

Video: Arduino TDCS Süper Basitleri. Transkraniyal Doğru Akım Stimülatörü (tDCS) Kendin Yap: 5 Adım

Video: Arduino TDCS Süper Basitleri. Transkraniyal Doğru Akım Stimülatörü (tDCS) Kendin Yap: 5 Adım
Video: The tDCS Update - v2.0 (tDCS Tutorial Followup) 2024, Temmuz
Anonim
Arduino TDCS Süper Basitleri. Transkraniyal Doğru Akım Stimülatörü (tDCS) Kendin Yap
Arduino TDCS Süper Basitleri. Transkraniyal Doğru Akım Stimülatörü (tDCS) Kendin Yap

Para fazer este tDCS você precisará apenas de um arduino, direnç, kapasitör e alguns cabosBileşenler

  1. 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.
  2. Direnç (~470 Ω, mas provavelmente entre 300-1000 Ω funciona, você precisará alterar no código fonte)
  3. Kondansatör (220 μF). Para estabilizar os pulsos PWM yapın.
  4. 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

Saiba Mais
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

Monte O Circuito Abaixo
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

Uma Kullanıcı Arayüzü Kişiselleştirme
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

Önerilen: