Innholdsfortegnelse:
- Trinn 1: Saiba Mais
- Trinn 2: Monte O Circuito Abaixo
- Trinn 3: Installer O Código No Seu Arduino
- Trinn 4: Uma UI Personalizada
- Trinn 5: Dúvidas?
Video: Arduino TDCS Super Simples. Transcranial Direct Current Stimulator (tDCS) DIY: 5 trinn
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:23
Para fazer este tDCS você precisará apenas de um arduino, resistor, capacitor e alguns cabosComponentes
-
Arduino
- Pino D13 som PWM (pode ser alterado).
- Pino A0 como entrada analógica (for feedback of corrente).
- Pino GND åpner for GND.
- Motstand (~ 470 Ω, mas provavelmente entre 300-1000 Ω funciona, você precisará alterar no código fonte)
- Kondensator (220 μF). Server para estabilizar os pulsos do PWM.
- Eletrodos de Esponja (Bruk água salina para molhá-lo).
Como funciona
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 (Console).
Trinn 1: 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 and dentre outros …
Trinn 2: Monte O Circuito Abaixo
Não se esqueça das esponjas com água salina!
Trinn 3: Installer O Código No Seu Arduino
Lembre-se de alterar as configurações and parametros na área de HARDWARE PARAMS e CONFIGURABLE PARAMS.
Você também deve alterar or boud rate do Serial para: 115200 for poder ver or resultado.
Para executar comandos, troque o No Line Ending for Carriage Return.
O código fonte + tutorial também podem ser encontrados no repositório:
Informasjon:
const String ver = "2.0m"; // HARDWARE PARAMS const int analogInPin = A0; // Entrada do Analógico const int analogOutPin = 13; // Saida D13 padrão float maxOutV = 5.0; // A voltagem de saída PWM padrão do Arduino [V] float maxRefInV = 1.1; // Referencia à voltagem analógica [V] float R = 470,0; // Resistencia da corrente [Ohm]
// KONFIGURERBARE PARAMER
bool plotter = false; // Defina: true, caso esteja usando o Seriell plotter bool kitt = false; // Defina: true, caso esteja usando o PuTTT (pode ser alterado no CLI) int maxmin = 30; // Tempo (em minutos) nødvendá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 GLOBALS
int tilstand = 1; /* -1 - Cérebro não identifierado 0 - Voltagem sendo alterada para definir a corrente padrão 1 - Tudo certo. Você esta na corrente definida -10 - Voltagem desligada */ float outV = maxOutV; // Voltagem int debounced_state = 0; int nuller_len = 0; float smoothed_mA = 0;
String commandString = ""; // for CLI
// TILBAKEHJELPER
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? returner maxOutV; // return maxOutV/5.0; // para segurança} state = 0; retur 0,1*new_V+0,9*V; // returner new_V; }
int convertVtoOutputValue (float V) {
returbegrensning (int (V/maxOutV*255), 0, 255); }
float sensorValue2mA (int sensorValue) {
float sensorVoltage = sensorValue/1023.0*maxRefInV; float sensor_mA = sensorVoltage/R*1000.0; retur sensor_mA; }
int debounced_state_compute (int state) {
hvis (tilstand 5) returnerer 0; } return 1; }
usignert lang start, endec;
void process_feedback () {int sensorValue = analogRead (analogInPin); float new_mA = sensorValue2mA (sensorValue); smoothed_mA = 0,2*new_mA+0,8*smoothed_mA; flyte V = outV; outV = computeOutVoltage (V, new_mA); analogWrite (analogOutPin, convertVtoOutputValue (outV)); debounced_state = debounced_state_compute (tilstand); // Exibir informações no 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; usignert lang tmin = endc/60-((endc/60)%1); // Formatação if (endc%60 <10) leadS = "0"; hvis (tmin = 0) ts = ts + " +"; // Parar automaticamente if (tmin> maxmin) stop_device (); String txt; hvis (plotter) txt = plotT + target_mA + plotMin + "0" + plotmA + smoothed_mA; annet txt = tv + V + tsm + smoothed_mA + ttm + target_mA + ts + debounced_state + h + tempo; hvis (kitt) Serial.print ("\ r / e [? 25l" + txt); ellers Serial.println (txt);
// vent 2 millisekunder før neste sløyfe
// for at analog-til-digital-omformeren skal avgjøre // etter den siste avlesningen: forsinkelse (5); }
void stop_device () {
tilstand = -10; analogWrite (analogOutPin, 0); clearAndHome (); Serial.println ("Sessão tDCS interrompida"); Serial.println ("------------------------"); hjelp(); }
// CLI HJELPERE
void clearAndHome () {Serial.write (27); Serial.print ("[2J"); // limpa a tela Serial.write (27); // ESC Serial.print ("[H"); // / r if (! kitt) for (int i = 0; i <= 30; i ++) Serial.println (""); }
ugyldig hjelp () {
Serial.println ("tDSC arduino, ver"+ver); Serial.println ("'?' - ajuda"); Serial.println ("'max_time' - atualiza o tempo máximo (em minutos)"); Serial.println ("'target_mA' - atualiza o target (mA)"); Serial.println ("'epsilon_mA' - atualiza o epsilon_mA (mA)"); Serial.println ("'R' - atualiza a resistência do hardware (Ohm)"); Serial.println ("'kitt' - 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 ("'fortsett' - continua a estimulação"); Serial.print ("\ n / rEstado: / n / r * max_time:"); Serial.print (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:"); Serial.print (R); Serial.println ("Ohms"); }
bool parse_param (String & cmdString) {
int spacePos = cmdString.indexOf (''); hvis (spacePos <= 0) returnerer false; String -kommando = cmdString.substring (0, spacePos); String fval = cmdString.substring (spacePos+1); if (kommando == "kitt") if (fval == "sant") {kitt = sant; returner sant; } annet hvis (fval == "false") {putty = false; returner sant; } float val = fval.toFloat (); if (command == "target_mA") {if (val100.0) {return false; } target_mA = val; clearAndHome (); hjelp(); } annet hvis (kommando == "epsilon_mA") {if (val0.3) {return false; } epsilon_mA = val; clearAndHome (); hjelp(); } annet hvis (kommando == "R") {R = val; clearAndHome (); hjelp(); } annet hvis (kommando == "max_time") {maxmin = val; clearAndHome (); hjelp(); } annet {return false; } returner sant; }
// SETUP OG MAIN LOOP
ugyldig oppsett () {Serial.begin (115200); analogReference (INTERNAL); //1.1 V Serial.print ("Sessão iniciada!"); start = millis (); } void loop () {if (state! =-10) {process_feedback (); } hvis (Serial.available ()> 0) {char v = Serial.read (); hvis (byte (v) == 13) {// Vognretur bool akseptert = true; if (commandString == "?" || commandString == "stop") {stop_device (); } annet hvis (commandString == "restart") {clearAndHome (); tilstand = -1; outV = maxOutV/5.0; start = millis (); akseptert = usant; } annet hvis (commandString == "fortsett") {clearAndHome (); tilstand = -1; outV = maxOutV/5.0; akseptert = usant; } annet {bool ok = parse_param (commandString); hvis (! ok) {clearAndHome (); hjelp(); akseptert = usant; Serial.println ("Comando desconhecido: '" + commandString + "'"); }} commandString = ""; hvis (godtatt) {clearAndHome (); hjelp(); Serial.println ("Ok!"); }} annet {commandString+= v; if (state ==-10) {Serial.print (v); }}}}
Trinn 4: Uma UI Personalizada
Para melhor acompanhamento e segurança, bruk en ferramenta PuTTY, og defina no código fonte:
kitt = sant
Anbefalinger av definisjoner:
-
Vindu
- 61 Colunas e 20 Linhas
- Vis rullefeltet desativado
-
Vindu> Utseende
Fonte: Lucida Console, 28px
Trinn 5: Dúvidas?
Para abrir a guia de ajuda, digite:
?
Trykk på [ENTER]
OBS: Caso o Estado seja:
-1 -> Cérebro não identifierado (corrente aberta) +0 -> Ajustando voltagem+1 -> Tudo certo, tDCS funcionando
Anbefalt:
Hvordan lage en HIGH Current Driver for en trinnmotor: 5 trinn
Hvordan lage en HIGH Current Driver for en Stepper Motor: her vil vi se hvordan du lager en stepmotor driver ved hjelp av Toshibas TB6560AHQ kontroller. Dette er en fullverdig kontroller som bare trenger 2 variabler som input, og den gjør alt arbeidet. Siden jeg trengte to av disse, har jeg laget dem begge med
All-Band Direct Conversion Receiver: 6 trinn
All-Band Direct Conversion Receiver: a.articles {font-size: 110.0%; font-weight: fet skrift; skriftstil: kursiv; tekst-dekorasjon: ingen; background-color: red;} a.articles: hover {background-color: black;} Denne instruksen beskriver en eksperimentell " Direkte konvertering " en
RTL-SDR Direct Sampling Mod: 3 trinn
RTL-SDR Direct Sampling Mod: Mange dongler kan ikke bruke frekvenser under 30Mhz, men det er mulig å modifisere noen enheter for å gjøre det ved hjelp av en metodeanrop Direct Sampling. Ved direkte prøvetaking bruker vi et signal direkte til dongles 'hjerne' som effektivt omgår t
DIY Over-Current Protection: 4 trinn
DIY overstrømsbeskyttelse: introduksjon Som nybegynner innen elektronikk er du ganske begrenset når det gjelder strømforsyning av de nylig produserte kretsene. Det ville ikke være et problem hvis du absolutt ikke gjør noen feil. Men la oss innse at det er en sjeldenhet. Så uansett om det er
DIY High Current Motor Driver (h-bridge): 5 trinn
DIY High Current Motor Driver (h-bridge): Prosjektet er å oppgradere motorene og elektronikken i denne Power Wheels-firhjulingen for barn. Overveldet over ytelsen til denne 12V mini-quad. Vi planla å oppgradere til et 24v system med 2 nye traxxis 775 børstede motorer etter å ha undersøkt kommersiell