Оглавление:

Arduino TDCS Super Simples. Транскраниальный стимулятор постоянного тока (tDCS) DIY: 5 шагов
Arduino TDCS Super Simples. Транскраниальный стимулятор постоянного тока (tDCS) DIY: 5 шагов

Видео: Arduino TDCS Super Simples. Транскраниальный стимулятор постоянного тока (tDCS) DIY: 5 шагов

Видео: Arduino TDCS Super Simples. Транскраниальный стимулятор постоянного тока (tDCS) DIY: 5 шагов
Видео: Simple DIY TENS and TDCS Example 2024, Ноябрь
Anonim
Arduino TDCS Super Simples. Транскраниальный стимулятор постоянного тока (tDCS) DIY
Arduino TDCS Super Simples. Транскраниальный стимулятор постоянного тока (tDCS) DIY

Para fazer este tDCS você Precisará apenas de um arduino, резистор, конденсатор и элементы cabos

  1. Ардуино

    • Pino D13 используется с ШИМ (Pode ser Alterado).
    • Pino A0 como entrada analógica (для обратной связи).
    • Pino GND apenas для GND.
  2. Резистор (~ 470 Ом, сопротивление в пределах 300-1000 Ом, точное изменение без использования фонового сигнала)
  3. Конденсатор (220 мкФ). Служит для создания импульсов с ШИМ.
  4. Eletrodos de Esponja (используйте água salina para molhá-lo).

Como funciona

О Arduino вычислить Corrente Padrão (Pode ser alterado) que passará pelo seu cérebro apenas por mudar a Voltagem de Saída. Воспользуйтесь альтернативным интерфейсом или доблестью target_mA через последовательный интерфейс командной строки (консоль).

Шаг 1: Сайба Майс

Сайба Майс
Сайба Майс

Você deve ler mais sobre tDCS primeiro. Не утверждено FDA и подано с предвзятым отношением к делу, принципам соблюдения требований по употреблению пищевых продуктов, мерам предосторожности и разрешению …

Шаг 2: Монте О Чиркуито Абайшо

Monte O Circuito Abaixo
Monte O Circuito Abaixo

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

Шаг 3: Установите O Código No Seu Arduino

Вы можете изменить настройки и параметры в области АППАРАТНЫЕ ПАРАМЕТРЫ и КОНФИГУРИРУЕМЫЕ ПАРАМЕТРЫ.

Você também deve alterar or boud rate do Serial para: 115200 для получения результата.

Для команд-исполнителей, команды или "Без окончания строки" для возврата каретки.

O código fonte + учебник também podem ser encontrados no repositório:

Кодиго:

const String ver = "2,0 м"; // АППАРАТНЫЕ ПАРАМЕТРЫ const int analogInPin = A0; // Аналоговый ввод const int analogOutPin = 13; // Saida D13 padrão float maxOutV = 5.0; // Напряжение, указанное в параметре ШИМ на Arduino [V] float maxRefInV = 1.1; // Ссылка на аналог напряжения [В] float R = 470.0; // Resistencia da corrente [Ом]

// КОНФИГУРИРУЕМЫЕ ПАРАМЕТРЫ

bool plotter = false; // Определение: true, если использовать последовательный плоттер bool putty = false; // Определено: true, если используется или используется PuTTT (при изменении интерфейса командной строки) int maxmin = 30; // Темп (в минуту), необходимый для указания [Мин] float target_mA = 2.73; // Essa é a corrente que passará pelo seu cérebro !!! [мА] 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 state = 1; / * -1 - Идентификатор не указан 0 - Напряжение будет изменено для определения поля 1 - Подтверждено. Você esta na corrente Definida -10 - Voltagem desligada * / float outV = maxOutV; // Voltagem int debounced_state = 0; int zeros_len = 0; float smoothhed_mA = 0;

Строка commandString = ""; // для CLI

// ПОМОЩНИКИ ОБРАТНОЙ СВЯЗИ

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? return maxOutV; // возврат maxOutV / 5.0; // para segurança} state = 0; return 0.1 * new_V + 0.9 * V; // вернуть new_V; }

int convertVtoOutputValue (float V) {

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

float sensorValue2mA (int sensorValue) {

float sensorVoltage = sensorValue / 1023.0 * maxRefInV; float sensor_mA = sensorVoltage / R * 1000.0; датчик возврата_mA; }

int debounced_state_compute (целое состояние) {

если (состояние 5) вернуть 0; } return 1; }

беззнаковый длинный старт, endc;

void process_feedback () {int sensorValue = analogRead (analogInPin); float new_mA = sensorValue2mA (sensorValue); Smoothed_mA = 0,2 * new_mA + 0,8 * Smoothed_mA; поплавок V = outV; outV = computeOutVoltage (В, новое_мА); analogWrite (analogOutPin, convertVtoOutputValue (outV)); debounced_state = debounced_state_compute (состояние); // Дополнительная информация отсутствует CLI endc = (millis () - start) / 1000; Строка tv = "[", ttm = "mA /", tsm = "V,", ts = "mA] | Estado:", h = "| Tempo:", s = ":", leadM = "", leadS = "", plotT = "Target:", plotmA = "\ tSmoothed MA:", plotMin = "\ tMin:", tempo; беззнаковое длинное время tmin = endc / 60 - ((endc / 60)% 1); // Форматирование if (endc% 60 <10) leadS = "0"; если (tmin = 0) ts = ts + "+"; // Параметр автоматического изменения if (tmin> maxmin) stop_device (); String txt; if (плоттер) txt = plotT + target_mA + plotMin + "0" + plotmA + Smoothed_mA; иначе txt = tv + V + tsm + smoothed_mA + ttm + target_mA + ts + debounced_state + h + tempo; if (замазка) Serial.print ("\ r / e [? 25l" + txt); иначе Serial.println (txt);

// ждем 2 миллисекунды перед следующим циклом

// чтобы аналого-цифровой преобразователь установился // после последнего чтения: delay (5); }

void stop_device () {

состояние = -10; analogWrite (analogOutPin, 0); clearAndHome (); Serial.println ("Sessão tDCS interrompida"); Serial.println ("------------------------"); помощь(); }

// ПОМОЩНИКИ CLI

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

void help () {

Serial.println ("tDSC arduino, ver" + ver); Serial.println ("'?' - аджуда"); Serial.println ("'max_time' - максимальное время (в минутах)"); Serial.println ("'target_mA' - значение цели (mA)"); Serial.println ("'epsilon_mA' - значение epsilon_mA (mA)"); Serial.println ("'R' - изменение сопротивления оборудования (Ом)"); Serial.println ("замазка" - формат информации о PuTTY "); Serial.println («стоп - для оценки»); Serial.println ("перезапуск - инициализация / повторный запуск оценки и таймера"); Serial.println ("продолжить" - продолжение оценки "); Serial.print ("\ n / rEstado: / n / r * max_time:"); Серийный. Печать (макс. Мин.); Serial.print ("минуты / n / r * target_mA:"); Serial.print (target_mA); Serial.print ("mA / n / r * epsilon_mA:"); Серийный. Отпечаток (epsilon_mA); Serial.print ("mA / n / r * R:"); Серийный принт (R); Serial.println («Ом»); }

bool parse_param (String & cmdString) {

интервал spacePos = cmdString.indexOf (''); если (spacePos <= 0) вернуть false; Строковая команда = cmdString.substring (0, spacePos); Строка fval = cmdString.substring (spacePos + 1); если (команда == "шпатлевка") если (fval == "истина") {шпатлевка = истина; вернуть истину; } иначе, если (fval == "false") {putty = false; вернуть истину; } float val = fval.toFloat (); if (command == "target_mA") {if (val100.0) {return false; } target_mA = val; clearAndHome (); помощь(); } else if (command == "epsilon_mA") {if (val0.3) {return false; } epsilon_mA = val; clearAndHome (); помощь(); } else if (command == "R") {R = val; clearAndHome (); помощь(); } else if (command == "max_time") {maxmin = val; clearAndHome (); помощь(); } else {вернуть ложь; } вернуть истину; }

// НАСТРОЙКА И ГЛАВНЫЙ ЦИКЛ

void setup () {Serial.begin (115200); analogReference (ВНУТРЕННИЙ); //1.1 V Serial.print ("Sessão iniciada!"); начало = миллис (); } void loop () {если (состояние! = - 10) {process_feedback (); } если (Serial.available ()> 0) {char v = Serial.read (); if (byte (v) == 13) {// Возврат каретки bool accept = true; если (commandString == "?" || commandString == "стоп") {stop_device (); } иначе, если (commandString == "перезапуск") {clearAndHome (); состояние = -1; outV = maxOutV / 5,0; начало = миллис (); принято = ложь; } иначе, если (commandString == "продолжить") {clearAndHome (); состояние = -1; outV = maxOutV / 5,0; принято = ложь; } еще {bool ok = parse_param (commandString); если (! ОК) {clearAndHome (); помощь(); принято = ложь; Serial.println ("Comando desconhecido: '" + commandString + "'"); }} commandString = ""; если (принято) {clearAndHome (); помощь(); Serial.println («Хорошо!»); }} еще {commandString + = v; если (состояние == - 10) {Serial.print (v); }}}}

Шаг 4. Персонализация Uma UI

Uma UI Personalizada
Uma UI Personalizada

Para melhor acompanhamento e segurança, используйте ferramenta PuTTY, e defina no código fonte:

шпатлевка = правда

Рекомендации по определению:

  • Окно

    • 61 Colunas e 20 Linhas
    • Отобразить полосу прокрутки desativado
  • Окно> Внешний вид

    Fonte: Lucida Console, 28 пикселей

Шаг 5: Двидас?

Para abrir a guia de ajuda, digite:

?

e нажмите [ENTER]

OBS: Caso o Estado seja:

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

Рекомендуемые: