Indholdsfortegnelse:
- Trin 1: Saiba Mais
- Trin 2: Monte O Circuito Abaixo
- Trin 3: Installer O Código No Seu Arduino
- Trin 4: Uma UI Personalizada
- Trin 5: Dúvidas?
Video: Arduino TDCS Super Simples. Transcranial Direct Current Stimulator (tDCS) DIY: 5 trin
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:28
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 som entrada analógica (for feedback de corrente).
- Pino GND åbner til GND.
- Modstand (~ 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 (Brug á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).
Trin 1: Saiba Mais
Você deve ler mais sobre tDCS primeiro. Não é aprovado pelo FDA e pode ser prejudicial a sua saúde, principmente se você não sabe nada sobre os efeitos colaterais, precauções and dentre outros …
Trin 2: Monte O Circuito Abaixo
Não se esqueça das esponjas com água salina!
Trin 3: Installer 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.
For execar comandos, troque o No Line Ending for Carriage Return.
O código fonte + tutorial também podem ser encontrados no repositório:
Kodning:
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 = falsk; // Defina: true, caso esteja usando o Seriel plotter bool kit = 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
// FEEDBACK HJÆLPERE
float computeOutVoltage (float V, float new_mA) {if (abs (new_mA -target_mA) maxOutV) {tilstand = -1; // resistência muito alta -> cérebro não encontrado? return maxOutV; // return maxOutV/5.0; // para segurança} tilstand = 0; return 0,1*new_V+0,9*V; // returner new_V; }
int convertVtoOutputValue (float V) {
returbegrænsning (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 -tilstand) {
hvis (tilstand 5) returnerer 0; } return 1; }
usigneret 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; flyde 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; usigneret 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; ellers txt = tv + V + tsm + smoothed_mA + ttm + target_mA + ts + debounced_state + h + tempo; hvis (kit) Serial.print ("\ r / e [? 25l" + txt); ellers Serial.println (txt);
// vent 2 millisekunder før den næste sløjfe
// for at analog-til-digital-konverteren kan afregnes // efter den sidste læsning: forsinkelse (5); }
ugyldig stop_enhed () {
tilstand = -10; analogWrite (analogOutPin, 0); clearAndHome (); Serial.println ("Sessão tDCS interrompida"); Serial.println ("------------------------"); Hjælp(); }
// CLI -HJÆLPERE
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 hjælp () {
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 ("'kit' - muda a formatação de saída pro PuTTY"); Serial.println ("'stop' - para a estimulação"); Serial.println ("'genstart' - inicia/reinicia a estimulação & o timer"); Serial.println ("'fortsæt' - continua a estimulação"); 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 ("Ohms"); }
bool parse_param (String & cmdString) {
int spacePos = cmdString.indexOf (''); hvis (spacePos <= 0) returnerer false; Stringkommando = cmdString.substring (0, spacePos); String fval = cmdString.substring (spacePos+1); hvis (kommando == "kitt") if (fval == "sand") {putty = true; vende tilbage sandt; } ellers hvis (fval == "false") {putty = false; vende tilbage sandt; } float val = fval.toFloat (); if (command == "target_mA") {if (val100.0) {return false; } target_mA = val; clearAndHome (); Hjælp(); } ellers hvis (kommando == "epsilon_mA") {hvis (val0.3) {return false; } epsilon_mA = val; clearAndHome (); Hjælp(); } ellers hvis (kommando == "R") {R = val; clearAndHome (); Hjælp(); } ellers hvis (kommando == "max_time") {maxmin = val; clearAndHome (); Hjælp(); } else {return false; } returner sandt; }
// OPSÆTNING OG MAIN LOOP
ugyldig opsætning () {Serial.begin (115200); analogReference (INTERN); //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) {// Transportretur bool accepteret = sandt; hvis (commandString == "?" || commandString == "stop") {stop_device (); } ellers hvis (commandString == "genstart") {clearAndHome (); tilstand = -1; outV = maxOutV/5.0; start = millis (); accepteret = falsk; } ellers hvis (commandString == "fortsæt") {clearAndHome (); tilstand = -1; outV = maxOutV/5.0; accepteret = falsk; } else {bool ok = parse_param (commandString); hvis (! ok) {clearAndHome (); Hjælp(); accepteret = falsk; Serial.println ("Comando desconhecido: '" + commandString + "'"); }} commandString = ""; hvis (accepteret) {clearAndHome (); Hjælp(); Serial.println ("Ok!"); }} else {commandString+= v; hvis (tilstand ==-10) {Serial.print (v); }}}}
Trin 4: Uma UI Personalizada
Para melhor acompanhamento e segurança, brug en ferramenta PuTTY, og defina no código fonte:
spartel = sandt
Anbefalinger af definitioner:
-
Vindue
- 61 Colunas e 20 Linhas
- Vis rullefeltet desativado
-
Vindue> Udseende
Fonte: Lucida -konsol, 28px
Trin 5: Dúvidas?
Para abrir a guia de ajuda, ciffer:
?
tryk på [ENTER]
OBS: Caso o Estado seja:
-1 -> Cérebro não identificado (corrente aberta) +0 -> Ajustando voltagem+1 -> Tudo certo, tDCS funcionando
Anbefalede:
Sådan laver du en HIGH Current Driver til en trinmotor: 5 trin
Sådan laver du en HØJ nuværende driver til en trinmotor: her vil vi se, hvordan du laver en trinmotor driver ved hjælp af Toshibas TB6560AHQ controller. Dette er en fuldt udstyret controller, der kun har brug for 2 variabler som input, og det gør alt arbejdet. Da jeg havde brug for to af disse, har jeg lavet dem begge ved hjælp af
All-Band Direct Conversion Receiver: 6 trin
All-Band Direct Conversion Receiver: a.articles {font-size: 110.0%; skrifttype-vægt: fed; skrifttype: kursiv; tekst-dekoration: ingen; baggrundsfarve: rød;} a.articles: svæve {baggrundsfarve: sort;} Denne instruktion beskriver en eksperimentel " Direkte konvertering " en
RTL-SDR Direct Sampling Mod: 3 trin
RTL-SDR Direct Sampling Mod: Mange dongler er ikke i stand til at gøre brug af frekvenser under 30Mhz, men det er muligt at ændre nogle enheder for at gøre det ved hjælp af et metodeopkald Direct Sampling. Ved direkte prøvetagning anvender vi et signal direkte til dongles 'hjerne', der effektivt omgår t
Direct Input Cell Phone Cradle: 10 trin
Direct Input Cell Phone Cradle: Jeg ved det. Verden har brug for en anden mobiltelefonholder omtrent lige så meget som jeg har brug for et hul i hovedet. Chokerende nok kunne jeg ikke finde en mobiltelefonholder til min lastbil, der passede til mine behov. Jeg troede ikke, at mine behov var så eksotiske, men jeg kunne ikke finde
DIY High Current Motor Driver (h-bridge): 5 trin
DIY High Current Motor Driver (h-bridge): Projektet er at opgradere motorerne og elektronikken i denne Power Wheels-quad til børn. vi planlagde at opgradere til et 24v system med 2 nye traxxis 775 børstede motorer efter at have undersøgt kommercielle