Isi kandungan:

Arduino TDCS Super Simples. Transkranial Arus Arus Terangsang (tDCS) DIY: 5 Langkah
Arduino TDCS Super Simples. Transkranial Arus Arus Terangsang (tDCS) DIY: 5 Langkah

Video: Arduino TDCS Super Simples. Transkranial Arus Arus Terangsang (tDCS) DIY: 5 Langkah

Video: Arduino TDCS Super Simples. Transkranial Arus Arus Terangsang (tDCS) DIY: 5 Langkah
Video: Обновление tDCS – v2.0 (продолжение учебного пособия по tDCS) 2024, Julai
Anonim
Arduino TDCS Super Simples. Perangsang Arus Langsung Transkranial (tDCS) DIY
Arduino TDCS Super Simples. Perangsang Arus Langsung Transkranial (tDCS) DIY

Para fazer este tDCS você precisará apenas de um arduino, perintang, kapasitor dan alguns cabosComponentes

  1. Arduino

    • Pino D13 como saída PWM (pode ser alterado).
    • Pino A0 como entrada analógica (untuk maklum balas de corente).
    • Pino GND apenas para GND.
  2. Perintang (~ 470 Ω, mas provavelmente entre 300-1000 Ω funciona, você precisará alterar no código fonte)
  3. Kapasitor (220 μF). Layan para estabilizar os pulsos lakukan PWM.
  4. Eletrodos de Esponja (Gunakan água salina para molhá-lo).

Como funciona

O Arduino calcula a corente padrão (pode ser alterado) que passará pelo seu cérebro apenas por mudar sebuah voltagem de saída. Você também pode alterar o valor do target_mA pelo bersiri CLI (Konsol).

Langkah 1: Saiba Mais

Saiba Mais
Saiba Mais

Você deve ler mais sobre tDCS primeiro. Não é aprovado pelo FDA e pode ser prejudious a sua saúde, Principmente se vocênão sabe nada sobre os efeitos colaterais, tindakan awal dan pendedahan…

Langkah 2: Monte O Circuito Abaixo

Monte O Circuito Abaixo
Monte O Circuito Abaixo

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

Langkah 3: Instale O Código No Seu Arduino

Lembre-se de alterar sebagai configurações e parametros na área de PARAM HARDWARE dan PARAM KONFIGURABEL.

Você também deve alterar o boud rate do Serial para: 115200 para poder ver o resultado.

Para komando pelaksana, pasukan o No Line Ending untuk Carriage Return.

O código fonte + tutorial também podem ser encontrados no repositório:

Código:

const String ver = "2.0m"; // PARAM HARDWARE const int analogInPin = A0; // Entrada do Analógico const int analogOutPin = 13; // Saida D13 padrão float maxOutV = 5.0; // Sebuah 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]

// PARAM YANG SESUAI

bool plotter = palsu; // 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) Needário para desligar [Min] float target_mA = 2.73; // Essa adalah corente que passará pelo seu cérebro !!! [mA] apungan epsilon_mA = 0.03; // Diferença máxima mengemukakan bukti yang betul dan tepat (Não 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 corente padrão 1 - Tudo certo. Você esta na corrente definida -10 - Voltagem desligada * / float outV = maxOutV; // Voltagem int debounced_state = 0; int zeros_len = 0; terapung lancar_mA = 0;

String commandString = ""; // untuk CLI

// PEMBANTU MAKLUM BALAS

float computeOutVoltage (float V, float new_mA) {if (abs (new_mA-target_mA) maxOutV) {keadaan = -1; // resistência muito alta -> cérebro não encontrado? pulangkan maxOutV; // pulangan maxOutV / 5.0; // para segurança} keadaan = 0; pulangkan 0.1 * baru_V + 0.9 * V; // kembali baru_V; }

int convertVtoOutputValue (apungan V) {

kekangan pulangan (int (V / maxOutV * 255), 0, 255); }

sensor apunganValue2mA (int sensorValue) {

float sensorVoltage = sensorValue / 1023.0 * maxRefInV; float sensor_mA = sensorVoltage / R * 1000.0; kembali sensor_mA; }

int debounced_state_compute (keadaan int) {

jika (nyatakan 5) pulangkan 0; } kembali 1; }

permulaan panjang yang tidak ditandatangani, endc;

void process_feedback () {int sensorValue = analogRead (analogInPin); float new_mA = sensorValue2mA (sensorValue); smoothed_mA = 0.2 * new_mA + 0.8 * smoothed_mA; terapung V = outV; outV = computeOutVoltage (V, new_mA); analogWrite (analogOutPin, convertVtoOutputValue (outV)); debounced_state = debounced_state_compute (keadaan); // Exibir informações no CLI endc = (milis () - mula) / 1000; Rentetan 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 automatik sekiranya (tmin> maxmin) stop_device (); Rentetan txt; jika (plotter) txt = plotT + target_mA + plotMin + "0" + plotmA + smoothed_mA; lain txt = tv + V + tsm + lancar_mA + ttm + target_mA + ts + debounced_state + h + tempo; jika (putty) Serial.print ("\ r / e [? 25l" + txt); lain Serial.println (txt);

// tunggu 2 milisaat sebelum gelung seterusnya

// agar penukar analog-ke-digital dapat diselesaikan // selepas bacaan terakhir: kelewatan (5); }

batal stop_device () {

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

// PEMBANTU CLI

kosongkanAndHome () {Serial.write (27); Cetakan bersiri ("[2J"); // limpa a tela Serial.write (27); // ESC Serial.print ("[H"); // / r jika (! putty) untuk (int i = 0; i <= 30; i ++) Serial.println (""); }

membatalkan pertolongan () {

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 ("'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 ("'sambung' - Continua a estimulação"); Serial.print ("\ n / rEstado: / n / r * max_time:"); Cetakan bersiri (maks.); 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:"); Cetakan bersiri (R); Serial.println ("Ohms"); }

bool parse_param (Rentetan & cmdString) {

int spacePos = cmdString.indexOf (''); jika (spacePos <= 0) kembali palsu; Perintah rentetan = cmdString.substring (0, spacePos); String fval = cmdString.substring (spacePos + 1); if (command == "putty") if (fval == "true") {putty = benar; kembali benar; } lain jika (fval == "false") {putty = false; kembali benar; } float val = fval.toFloat (); if (perintah == "target_mA") {if (val100.0) {return false; } target_mA = val; clearAndHome (); pertolongan (); } lain jika (perintah == "epsilon_mA") {if (val0.3) {return false; } epsilon_mA = val; clearAndHome (); pertolongan (); } lain jika (perintah == "R") {R = val; clearAndHome (); pertolongan (); } lain jika (perintah == "max_time") {maxmin = val; clearAndHome (); pertolongan (); } lain {kembali palsu; } kembali benar; }

// PENYEDIAAN DAN LOOP UTAMA

persediaan tidak sah () {Serial.begin (115200); analogReference (DALAMAN); //1.1 V Serial.print ("Sessão iniciada!"); permulaan = milis (); } gelung void () {if (state! = - 10) {process_feedback (); } if (Serial.available ()> 0) {char v = Serial.read (); if (byte (v) == 13) {// Bool pengembalian kereta diterima = benar; jika (commandString == "?" || commandString == "stop") {stop_device (); } lain jika (commandString == "restart") {clearAndHome (); nyatakan = -1; outV = maxOutV / 5.0; permulaan = milis (); diterima = palsu; } lain jika (commandString == "teruskan") {clearAndHome (); nyatakan = -1; outV = maxOutV / 5.0; diterima = palsu; } lain {bool ok = parse_param (commandString); jika (! ok) {clearAndHome (); pertolongan (); diterima = palsu; Serial.println ("Comando desconhecido: '" + commandString + "'"); }} commandString = ""; jika (diterima) {clearAndHome (); pertolongan (); Serial.println ("Ok!"); }} lain {commandString + = v; jika (nyatakan == - 10) {Serial.print (v); }}}}

Langkah 4: Uma UI Personalizada

Uma UI Personalizada
Uma UI Personalizada

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

dempul = benar

Recomendações de definições:

  • Tingkap

    • 61 Colunas e 20 Linhas
    • Paparkan scrollbar desativado
  • Tetingkap> Rupa

    Fonte: Lucida Console, 28 piksel

Langkah 5: Dúvidas?

Para abrir a guia de ajuda, digit:

?

e pressione [ENTER]

OBS: Caso o Estado seja:

-1 -> Cérebro não identificado (corrente aberta) +0 -> Ajustando voltagem + 1 -> Tudo certo, tDCS funcionando

Disyorkan: