Sommario:
- Fase 1: Saiba Mais
- Fase 2: Monte O Circuito Abaixo
- Passaggio 3: installare O Código No Seu Arduino
- Passaggio 4: personalizzazione dell'interfaccia utente di Uma
- Passaggio 5: Duvidas?
Video: Arduino TDCS Super Semplici. Stimolatore transcranico a corrente continua (tDCS) Fai da te: 5 passaggi
2024 Autore: John Day | [email protected]. Ultima modifica: 2024-01-30 10:02
Para fazer este tDCS você precisará apenas de um arduino, resistor, condensatore e alguns cabosComponentes
-
Arduino
- Pino D13 come saída PWM (pode ser alterado).
- Pino A0 como entrada analógica (para feedback de corrente).
- Pino GND apenas para GND.
- Resistor (~470 Ω, mas provavelmente entre 300-1000 Ω funciona, você precisará alterar no código fonte)
- Condensatore (220 μF). Serve para estabilizar os pulsos do PWM.
- Eletrodos de Esponja (Usa água salina para molhá-lo).
Como funzione
O Arduino calcola 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).
Fase 1: Saiba Mais
Você deve ler mais sobre tDCS primeiro. Não é aprovado pelo FDA e pode ser pregiudizial a sua saúde, principalmente se você não sabe nada sobre os efeitos colaterais, precauções e dentre outros…
Fase 2: Monte O Circuito Abaixo
Não se esqueça das esponjas com água salina!
Passaggio 3: installare O Código No Seu Arduino
Lembre-se de alterar as configurações e parametros na área de HARDWARE PARAMS e CONFIGURABLE PARAMS.
Você também deve alterar o boud rate do Serial para: 115200 para poder ver o resultado.
Para executar comandi, troque o No Line Ending para Carriage Return.
O código fonte + tutorial também podem ser encontrados no repositório:
Codice:
const String ver = "2.0m"; //PARAMETRI HARDWARE const int analogInPin = A0; // Entrata in Analógico const int analogOutPin = 13; // Saida D13 padrão float maxOutV = 5.0; // Un voltaggio di questo PWM padrão do Arduino [V] float maxRefInV = 1.1; // Referencia à voltagem analógica [V] float R = 470.0; // Resistenza da corrente [Ohm]
//PARAMETRI CONFIGURABILI
bool plotter = falso; // 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 (in minuti) 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 (Não altere caso não saiba o que está fazendo!)
//INIT GLOBALI
int stato = 1; /* -1 - Cérebro não identificato 0 - Voltagem sendo alterada para definir a corrente padrão 1 - Tudo certo. Você esta na corrente definita -10 - Voltagem desligada */ float outV = maxOutV; // Tensionem int debounced_state = 0; int zeros_len = 0; float smoothed_mA=0;
String Stringa di comando = ""; //per CLI
// AIUTANTI FEEDBACK
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? restituisce maxOutV; //restituisce maxOutV/5.0; // para segurança } stato = 0; restituisce 0.1*new_V+0.9*V; //restituisce new_V; }
int convertVtoOutputValue(float V){
return constrain(int(V/maxOutV*255), 0, 255); }
float sensorValue2mA(int sensorValue){
sensore a galleggianteVoltage = sensorValue/1023.0*maxRefInV; galleggiante sensor_mA = sensorVoltage/R*1000.0; ritorno sensor_mA; }
int debounced_state_compute(int stato){
if(stato 5) restituisce 0; } restituisce 1; }
unsigned long start, endc;
void process_feedback(){ int sensorValue = analogRead(analogInPin); float new_mA = sensorValue2mA(sensorValue); livellato_mA = 0.2*nuovo_mA+0.8*smussato_mA; flottante V = outV; outV = computeOutVoltage(V, new_mA); analogWrite(analogOutPin, convertVtoOutputValue(outV)); debounced_state = debounced_state_compute(stato); // Mostra informazioni no CLI endc = (millis()-start)/1000; String tv = "[", ttm = "mA/", tsm = "V, ", ts = "mA] | Estado: ", h = " | Tempo: ", s = ":", leadM = "", leadS = "", plotT = "Obiettivo: ", plotmA = "\tMA levigata: ", plotMin = "\tMin: ", tempo; unsigned long tmin = endc/60-((endc/60)%1); // Formattazione if (endc%60<10) leadS = "0"; if (tmin=0) ts = ts + "+"; // Parar automaticamente if (tmin>maxmin) stop_device(); Stringa di testo; 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 (putty) Serial.print("\r\e[?25l" + txt); altrimenti Serial.println(txt);
// aspetta 2 millisecondi prima del ciclo successivo
// affinché il convertitore analogico-digitale si stabilizzi // dopo l'ultima lettura: delay(5); }
void stop_device(){
stato = -10; analogWrite(analogOutPin, 0); clearAndHome(); Serial.println("Sessão tDCS interrompida"); Serial.println("--------------------------------------"); aiuto(); }
//AIUTI CLI
void clearAndHome() { Serial.write(27); Serial.print("[2J"); // limpa su tela Serial.write(27); // ESC Serial.print("[H"); // \r if (!putty) for (int i = 0; i<=30; i++) Serial.println(""); }
aiuto vuoto(){
Serial.println("tDSC arduino, ver "+ver); Serial.println("'?' - ajuda"); Serial.println("'max_time ' - atualiza o tempo máximo (em minutos)"); Serial.println("'target_mA ' - aggiornamento del target (mA)"); Serial.println("'epsilon_mA ' - aggiornato o epsilon_mA (mA)"); Serial.println("'R ' - atualiza a resistência do hardware (Ohm)"); Serial.println("'putty' - muda a formatação de saída pro PuTTY"); Serial.println("'stop' - para una stima"); Serial.println("'restart' - inicia/reinicia a estimulação & o timer"); Serial.println("'continua' - continua a stimare"); Serial.print("\n\rEstado:\n\r * max_time: "); Serial.print(maxmin); 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(Stringa &cmdStringa){
int spacePos = cmdString.indexOf(' '); if(spacePos<=0) restituisce false; Comando stringa = cmdString.substring(0, spacePos); String fval = cmdString.substring(spacePos+1); if(comando=="putty") if (fval=="true"){ putty = true; restituire vero; }else if (fval=="false"){ putty = false; restituire vero; } float val = fval.toFloat(); if(comando=="target_mA"){ if(val100.0){ return false; } target_mA = val; clearAndHome(); aiuto(); }else if(comando=="epsilon_mA"){ if(val0.3){ return false; } epsilon_mA = val; clearAndHome(); aiuto(); }else if(comando=="R"){ R = val; clearAndHome(); aiuto(); }else if(comando=="max_time"){ maxmin = val; clearAndHome(); aiuto(); }else{ restituisce falso; } restituisce vero; }
//SETUP E LOOP PRINCIPALE
void setup() { Serial.begin(115200); analogReference(INTERNO); //1.1 V Serial.print("Sessão iniciada!"); inizio = millis(); } void loop(){ if(state!=-10){ process_feedback(); } if (Serial.available() > 0){ char v = Serial.read(); if (byte(v) == 13){ // Ritorno a capo bool accettato = true; if (CommandString == "?" || commandString == "stop"){ stop_device(); }else if (CommandString == "restart"){ clearAndHome(); stato = -1; outV = maxOutV/5.0; inizio = millis(); accettato = falso; }else if (CommandString == "continua"){ clearAndHome(); stato = -1; outV = maxOutV/5.0; accettato = falso; }else{ bool ok = parse_param(commandString); if(!ok){ clearAndHome(); aiuto(); accettato = falso; Serial.println("Comando desconhecido: '" + commandString + "'"); } } stringa di comando = ""; if (accettato){ clearAndHome(); aiuto(); Serial.println("Ok!"); } }else{ commandString+=v; if(stato==-10){ Serial.print(v); } } } }
Passaggio 4: personalizzazione dell'interfaccia utente di Uma
Para melhor acompanhamento e segurança, use a ferramenta PuTTY, e defina no código fonte:
mastice = vero
Raccomandazioni di definizione:
- Finestra
- 61 colonne e 20 linha
- Visualizza barra di scorrimento disattivato
-
Finestra > Aspetto
Fonte: Lucida Console, 28px
Passaggio 5: Duvidas?
Para abrir a guia de ajuda, digite:
?
e pressione [INVIO]
OBS: Caso o Estado seja:
-1 -> Cérebro não identificatodo (corrente aberta)+0 -> Ajustando voltagem+1 -> Tudo certo, tDCS funcionando
Consigliato:
LED USB fai-da-te super semplici e economici (e altre cose): 16 passaggi
LED USB fai-da-te super semplici e economici (e altre cose): ciao e benvenuto al mio primo istruttore :) tutti abbiamo imparato a creare le nostre USB piuttosto che dipendere da batterie facilmente scaricabili
La differenza tra (corrente alternativa e corrente continua): 13 passaggi
La differenza tra (corrente alternativa e corrente continua): tutti sanno che l'elettricità è principalmente CC, ma che ne dici di un altro tipo di elettricità? Conosci Ac? Cosa significa AC? È utilizzabile quindi DC? In questo studio conosceremo la differenza tra i tipi di elettricità, fonti, applicazioni
Aereo con motore a corrente continua con bottiglia di plastica: 13 passaggi
Aeroplano a motore CC con bottiglia di plastica: alla ricerca di un modo creativo per combinare il volo e il lavoro elettrico di base? Questo aeroplano a motore CC con bottiglia di plastica è un ottimo modo per praticare le abilità elettriche di base pur divertendo un po' di arti e mestieri
Realizzare un generatore di corrente continua a magnete da un motore di miscelazione guasto Fai da te: 3 passaggi (con immagini)
Realizzare un generatore di corrente continua a magnete da un motore di miscelazione guasto Fai da te: Ciao! Nota: questo metodo è applicabile solo se le bobine di campo di un motore Universal si bruciano
Accoppiamento magnetico fai-da-te per laptop con motore a corrente continua di piccole dimensioni: 5 passaggi
Accoppiamento magnetico fai-da-te per laptop con un piccolo motore a corrente continua: alcuni mesi fa la batteria del mio laptop si è scaricata, quindi devo essere collegato 24 ore su 24, 7 giorni su 7, altrimenti il mio laptop si spegne. Quindi, stanco di essere scollegato dai leggeri movimenti del mio laptop, ho deciso di creare un accoppiatore magnetico per farlo rimanere al suo posto