Spisu treści:

Arduino TDCS Super proste. Przezczaszkowy stymulator prądu stałego (tDCS) Zrób to sam: 5 kroków
Arduino TDCS Super proste. Przezczaszkowy stymulator prądu stałego (tDCS) Zrób to sam: 5 kroków

Wideo: Arduino TDCS Super proste. Przezczaszkowy stymulator prądu stałego (tDCS) Zrób to sam: 5 kroków

Wideo: Arduino TDCS Super proste. Przezczaszkowy stymulator prądu stałego (tDCS) Zrób to sam: 5 kroków
Wideo: Грег Гейдж: Как своим мозгом контролировать чужую руку 2024, Listopad
Anonim
Arduino TDCS Super Simples. Przezczaszkowy stymulator prądu stałego (tDCS) DIY
Arduino TDCS Super Simples. Przezczaszkowy stymulator prądu stałego (tDCS) DIY

Para fazer este tDCS você precisará apenas de um arduino, rezystor, kondensator e alguns cabosComponentes

  1. Arduino

    • Pino D13 como saída PWM (pode ser alterado).
    • Pino A0 como entrada analógica (para feedback de corrente).
    • Pino GND apenas dla GND.
  2. Rezystor (~470 Ω, mas provavelmente entre 300-1000 Ω funciona, você precisará alterar no código fonte)
  3. Kondensator (220 μF). Podawać para estabilizar os pulsos do PWM.
  4. Eletrodos de Esponja (Użyj água salina para molhá-lo).

Funkcja 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 (konsola).

Krok 1: Saiba Mais

Saiba Mais
Saiba Mais

Você 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…

Krok 2: Monte O Circuito Abaixo

Monte O Circuito Abaixo
Monte O Circuito Abaixo

Não se esqueça das esponjas com água salina!

Krok 3: Zainstaluj O Código No Seu Arduino

Lembre-se de alterar as configurações e parametrys na área de HARDWARE PARAMS e CONFIGURING PARAMS.

Você também deve alterar lub 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:

Kodygo:

const String ver = "2.0m"; //PARAMETRY SPRZĘTU const int analogInPin = A0; // Entrada do Analógico const int analogOutPin = 13; // Saida D13 padrão float maxOutV = 5.0; // Napięcie PWM do Arduino [V] float maxRefInV = 1,1; // Referencia à voltagem analógica [V] float R = 470,0; // Opór rzeczywisty [Ohm]

//PARAMETRY KONFIGUROWALNE

bool ploter = fałsz; // 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 minut) necessário para desligar [Min] float target_mA = 2.73; // Essa é a corrente que passará pelo seu cérebro!!! [mA] pływak 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!)

//POCZĄTEK GLOBALNE

stan 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; // Napięciem int debounced_state = 0; int długość_zerów = 0; pływak wygładzony_mA=0;

Ciąg polecenieString = ""; //dla CLI

//POMOCNICY INFORMACYJNI

float obliczyćNapięcieWyj(float V, float nowe_mA){ if(abs(nowe_mA-docelowe_mA)maxOutV){ stan = -1; // Resistência muito alta -> cérebro não encontrado? zwróć maxOutV; //zwróć maxOutV/5.0; // para segurança } stan = 0; zwróć 0,1*nowy_V+0,9*V; //zwróć nowe_V; }

int konwertujVnaWyjściowąWartość(zmiennoprzecinkowa V){

return contrain(int(V/maxOutV*255), 0, 255); }

float sensorValue2mA(int sensorValue){

czujnik pływakowyNapięcie = czujnikValue/1023,0*maxRefInV; pływak czujnik_mA = czujnikNapięcie/R*1000.0; czujnik powrotu_mA; }

int debounced_state_compute(stan int){

if(stan 5) zwraca 0; } return 1; }

długi początek bez znaku, koniec;

void process_feedback(){ int sensorValue = analogRead (analogInPin); float new_mA = sensorValue2mA(sensorValue); wygładzone_mA = 0,2*nowe_mA+0,8*wygładzone_mA; pływak V = outV; outV = obliczyćNapięcieWyj(V, nowe_mA); analogWrite(analogOutPin, przekształćVnaOutputValue(outV)); debounced_state = debounced_state_compute(stan); // Exibir informações no CLI endc = (millis()-start)/1000; String tv = "[", ttm = "mA/", tsm = "V, ", ts = "mA] | Stan: ", h = " | Tempo: ", s = ":", leadM = "", leadS = "", plotT = "Cel: ", plotmA = "\tSmoothed MA: ", plotMin = "\tMin: ", tempo; unsigned long tmin = endc/60-((endc/60)%1); // Formatowanie if (endc%60<10) leadS = "0"; jeśli (tmin=0) ts = ts + "+"; // Parar Automaticamente if (tmin>maxmin) stop_device(); ciąg tekstowy; if (ploter) txt = plotT + target_mA + plotMin + „0” + plotmA + smoothed_mA; w przeciwnym razie txt = tv + V + tsm + smoothed_mA + ttm + target_mA + ts + debounced_state + h + tempo; if (putty) Serial.print("\r\e[?25l" + txt); jeszcze Serial.println(txt);

// odczekaj 2 milisekundy przed następną pętlą

// aby konwerter analogowo-cyfrowy ustabilizował się // po ostatnim odczycie: delay(5); }

nieważne urządzenie stop_() {

stan = -10; analogWrite(analogOutPin, 0); clearAndHome(); Serial.println("Sessão tDCS interrompida"); Serial.println("----------------------------"); Wsparcie(); }

//POMOCY CLI

void clearAndHome() { Serial.write(27); Serial.print("[2J"); // skasuj numer Serial.write(27); // ESC Serial.print("[H"); // \r if (!putty) for (int i = 0; i<=30; i++) Serial.println(""); }

nieważna pomoc (){

Serial.println("tDSC arduino, ver "+ver); Serial.println("'?' - ajuda"); Serial.println("'max_time' - atualiza o tempo max (w minutach)"); Serial.println("'target_mA' - analiza celu (mA)"); Serial.println("'epsilon_mA' - analiza o epsilon_mA (mA)"); Serial.println("'R' - atualiza a Resistance 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("'kontynuuj' - continua a estimulação"); Serial.print("\n\rEstado:\n\r * max_time: "); Serial.print(maxmin); Serial.print(" minut\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(Ciąg &cmdString){

int spacePos = cmdString.indexOf(' '); if(spacjaPoz<=0) zwraca false; Polecenie ciągu = cmdString.substring(0, spacePos); Ciąg fval = cmdString.substring(spacePos+1); if(polecenie=="putty") if (fval=="true"){ putty = true; zwróć prawdę; }else if (fval=="false"){ putty = false; zwróć prawdę; } float val = fval.toFloat(); if(polecenie=="target_mA"){ if(val100.0){ return false; } cel_mA = wart; clearAndHome(); Wsparcie(); }else if(command=="epsilon_mA"){ if(val0.3){ return false; } epsilon_mA = wart; clearAndHome(); Wsparcie(); } w przeciwnym razie (polecenie=="R"){ R = wartość; clearAndHome(); Wsparcie(); }else if(command=="max_time"){ maxmin = val; clearAndHome(); Wsparcie(); }else{ return false; } zwróć prawdę; }

//USTAWIENIA I PĘTLA GŁÓWNA

void setup() { Serial.begin(115200); analogReference(WEWNĘTRZNY); //1.1 V Serial.print("Rozpoczęcie sesji!"); początek = mili(); } void loop(){ if(stan!=-10){ process_feedback(); } if (Serial.available() > 0){ char v = Serial.read(); if (byte(v) == 13){ // Zwrot karetki bool zaakceptowany = true; if (CiągPoleceń == "?" || Ciąg_Poleceń == "stop"){ stop_device(); }else if (commandString == "uruchom ponownie"){ clearAndHome(); stan = -1; outV = maxOutV/5,0; początek = mili(); akceptowane = fałszywe; }else if (commandString == "continue"){ clearAndHome(); stan = -1; outV = maxOutV/5,0; akceptowane = fałszywe; }else{ bool ok = parse_param(commandString); if(!ok){ clearAndHome(); Wsparcie(); akceptowane = fałszywe; Serial.println("Comando desconhecido: '" + CommandString + "'"); } } CiągPoleceń = ""; jeśli (zaakceptowane){ clearAndHome(); Wsparcie(); Serial.println("Ok!"); } }else{ CiągPoleceń+=v; if(stan==-10){ Serial.print(v); } } } }

Krok 4: Personalizacja interfejsu użytkownika Uma

Personalizacja interfejsu użytkownika Uma
Personalizacja interfejsu użytkownika Uma

Para melhor acompanhamento e segurança, użyj ferramenta PuTTY, e defina no código fonte:

kit = prawda

Recomendações de definições:

  • Okno

    • 61 Colunas i 20 Linhas
    • Wyświetl pasek przewijania desativado
  • Okno > Wygląd

    Czcionka: konsola Lucida, 28px

Krok 5: Duvidas?

Para brir a guia de ajuda, digite:

?

wciśnięcie [ENTER]

OBS:Caso o Estado seja:

-1 -> Cérebro não identificado (corrente aberta)+0 -> Regulacja napięcia +1 -> Tudo certo, tDCS funcionando

Zalecana: