Daftar Isi:
2025 Pengarang: John Day | [email protected]. Terakhir diubah: 2025-01-13 06:57
Para fazer este tDCS você precisará apenas de um arduino, resistor, kapasitor dan alguns cabosKomponen
-
Arduino
- Pino D13 como saída PWM (pode ser alterado).
- Pino A0 como entrada analógica (para feedback de corrente).
- Pino GND apenas untuk GND.
- Resistor (~470, mas provavelmente entre 300-1000 funciona, você precisará alterar no código fonte)
- Kapasitor (220 F). Melayani para estabilizar os pulsos melakukan PWM.
- Eletrodos de Esponja (Gunakan água salina para molhá-lo).
Fungsi como
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 (Konsol).
Langkah 1: Saiba Mais
Voca 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…
Langkah 2: Sirkuit Monte O Abaixo
Tidak ada esqueça das esponjas com água salina!
Langkah 3: Instal O Código No Seu Arduino
Lembre-se de alterar as configuraes e parametros na área de HARDWARE PARAMS e PARAMS CONFIGURABLE.
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:
Kodigo:
const String ver = "2.0m"; // PARAMS PERANGKAT KERAS const int analogInPin = A0; // Masuk ke Analogi const int analogOutPin = 13; // Saida D13 padrão float maxOutV = 5.0; // Tegangan untuk PWM padrão Arduino [V] float maxRefInV = 1.1; // Referensi voltagem analógica [V] float R = 470.0; // Resistencia da corrente [Ohm]
//PARAM YANG DAPAT DIKONFIGURASI
plotter bool = salah; // 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] float epsilon_mA = 0,03; // Diferença máxima entre a corrente real e o target_mA (No altere caso não saiba o que está fazendo!)
//INIT GLOBAL
keadaan int = 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 - Voltagem desligada */ float outV = maxOutV; // Tegangan int debounced_state = 0; int nol_len = 0; mengapung dihaluskan_mA=0;
String perintahString = ""; //untuk CLI
//UMPAN BALIK PEMBANTU
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? kembali maxOutV; //mengembalikan maxOutV/5.0; // para segurança } status = 0; kembalikan 0.1*new_V+0.9*V; //kembalikan new_V; }
int convertVtoOutputValue(float V){
kembali kendala(int(V/maxOutV*255), 0, 255); }
float sensorValue2mA(int sensorValue){
float sensorVoltage = sensorValue/1023.0*maxRefInV; float sensor_mA = sensorVoltage/R*1000.0; kembalikan sensor_mA; }
int debounced_state_compute(status int){
jika (status 5) mengembalikan 0; } kembali 1; }
unsigned long start, endc;
void process_feedback(){ int sensorValue = analogRead(analogInPin); float new_mA = sensorValue2mA(sensorValue); dihaluskan_mA = 0,2*mA_baru+0,8*dihaluskan_mA; mengapung V = keluarV; outV = computeOutVoltage(V, new_mA); analogWrite(analogOutPin, convertVtoOutputValue(outV)); debounced_state = debounced_state_compute(state); // Exibir menginformasikan tidak ada CLI endc = (millis()-start)/1000; String tv = "[", ttm = "mA/", tsm = "V, ", ts = "mA] | Estado: ", h = " | Tempo: ", s = ":", leadM = "", leadS = "", plotT = "Target: ", plotmA = "\tSmoothed MA: ", plotMin = "\tMin: ", tempo; tmin panjang yang tidak ditandatangani = endc/60-((endc/60)%1); // Formatação if (endc%60<10) leadS = "0"; jika (tmin=0) ts = ts + "+"; // Parar automaticamente if (tmin>maxmin) stop_device(); String.txt; if (plotter) txt = plotT + target_mA + plotMin + "0" + plotmA + smoothed_mA; else txt = tv + V + tsm + smoothed_mA + ttm + target_mA + ts + debounced_state + h + tempo; if (dempul) Serial.print("\r\e[?25l" + txt); lain Serial.println(txt);
// tunggu 2 milidetik sebelum loop berikutnya
// agar konverter analog-ke-digital menyelesaikan // setelah pembacaan terakhir: delay(5); }
batalkan stop_device(){
keadaan = -10; analogWrite(analogOutPin, 0); clearAndHome(); Serial.println("Seso tDCS interrompida"); Serial.println("------------------------"); Tolong(); }
//CLI BANTUAN
void clearAndHome() { Serial.write(27); Serial.print("[2J"); // limpa a tele Serial.write(27); // ESC Serial.print("[H"); // \r if (!putty) for (int i = 0; i<=30; i++) Serial.println(""); }
batalkan bantuan(){
Serial.println("arduino tDSC, ver "+ver); Serial.println("'?' - ajuda"); Serial.println("'max_time ' - aktualisasi tempo máximo (em minutos)"); Serial.println("'target_mA' - realisasi target (mA)"); Serial.println("'epsilon_mA ' - aktualisasi epsilon_mA (mA)"); Serial.println("'R ' - sebenarnya resistncia 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' - inicia/reinicia a estimulação & o timer"); Serial.println("'lanjutkan' - lanjutkan estimulação"); Serial.print("\n\rEstado:\n\r * max_time: "); Serial.print(maksimum); 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: "); Serial.print(R); Serial.println("Ohm"); }
bool parse_param(String &cmdString){
int spacePos = cmdString.indexOf(' '); if(spacePos<=0) mengembalikan false; Perintah string = cmdString.substring(0, spacePos); String fval = cmdString.substring(spasiPos+1); if(command=="putty") if (fval=="true"){ putty = true; kembali benar; }else if (fval=="false"){ putty = false; kembali benar; } float val = fval.toFloat(); if(command=="target_mA"){ if(val100.0){ return false; } target_mA = nilai; clearAndHome(); Tolong(); }else if(command=="epsilon_mA"){ if(val0.3){ return false; } epsilon_mA = val; clearAndHome(); Tolong(); }else if(perintah=="R"){ R = val; clearAndHome(); Tolong(); }else if(command=="max_time"){ maxmin = val; clearAndHome(); Tolong(); }else{ mengembalikan salah; } kembali benar; }
//SETUP DAN LOOP UTAMA
void setup() { Serial.begin(115200); analogReferensi(INTERNAL); //1.1 V Serial.print("Seso iniciada!"); mulai = mili(); } void loop(){ if(state!=-10){ process_feedback(); } if (Serial.available() > 0){ char v = Serial.read(); if (byte(v) == 13){ // Carriage return bool diterima = true; if (commandString == "?" || commandString == "stop"){ stop_device(); }else if (commandString == "restart"){ clearAndHome(); keadaan = -1; outV = maxOutV/5.0; mulai = mili(); diterima = salah; }else if (commandString == "lanjutkan"){ clearAndHome(); keadaan = -1; outV = maxOutV/5.0; diterima = salah; }else{ bool ok = parse_param(commandString); if(!ok){ clearAndHome(); Tolong(); diterima = salah; Serial.println("Perintah desconhecido: '" + commandString + "'"); } } commandString = ""; if (diterima){ clearAndHome(); Tolong(); Serial.println("Oke!"); } }else{ commandString+=v; if(state==-10){ Serial.print(v); } } } }
Langkah 4: Personalisasi Uma UI
Para melhor acompanhamento e segurança, gunakan ferramenta Putty, e defina no código fonte:
dempul = benar
Direkomendasikan de definies:
- Jendela
- 61 Coluna dan 20 Linhas
- Tampilkan bilah gulir desativado
-
Jendela > Penampilan
Fonte: Lucida Console, 28px
Langkah 5: Devidas?
Para abrir a guia de ajuda, angka:
?
epresi [ENTER]
OBS:Caso o Estado seja:
-1 -> Cérebro não identificado (corrente aberta)+0 -> Ajustando voltagem+1 -> Tudo certo, tDCS funcionando