جدول المحتويات:
2025 مؤلف: John Day | [email protected]. آخر تعديل: 2025-01-13 06:56
Para fazer este tDCS você precisará apenas de um arduino، resistor، capacitor e alguns cabos المكونات
-
اردوينو
- Pino D13 como saída PWM (pode ser alterado).
- Pino A0 como entrada analógica (الفقرة feedback de corrente).
- Pino GND apenas الفقرة GND.
- المقاوم (~ 470 Ω، mas provavelmente entre 300-1000 funciona، você precisará alterar no código fonte)
- مكثف (220 μF). تخدم الفقرة estabilizar os pulsos do PWM.
- Eletrodos de Esponja (استخدم água salina para molhá-lo).
وظيفة كومو
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).
الخطوة 1: Saiba Mais
Você deve ler mais sobre tDCS Primeiro. Não é aprovado pelo FDA e pode serjud a sua saúde، mainmente se você não sabe nada sobre os efeitos colaterais، precauções e dentre outros…
الخطوة 2: Monte O Circuito Abaixo
Não se esqueça das esponjas com água salina!
الخطوة 3: تثبيت O Código No Seu Arduino
Lembre-se de alterar as configurações e parametros na área de HARDWARE PARAMS e PARAMS القابلة للتهيئة.
Você também deve alterar o boud rate do Serial para: 115200 para poder ver o resultado.
قواعد تنفيذية ، توك ، لا خط ينتهي لعودة النقل.
O código fonte + تعليمي também podem ser encontrados no repositório:
كوديغو:
سلسلة نصية 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 [أوم]
// المعلمات القابلة للتهيئة
الراسمة المنطقية = خطأ ؛ // Defina: true ، caso esteja usando o معجون منطقي للرسام التسلسلي = خطأ ؛ // Defina: true، caso esteja usando o PuTTT (pode ser alterado no CLI) int maxmin = 30 ؛ // الإيقاع (em minutos) ضروري للفقرة desligar [Min] float target_mA = 2.73 ؛ // Essa é a corrente que passará pelo seu cérebro !!! [مللي أمبير] عائم 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 = 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؛ // Voltagem int debuted_state = 0 ؛ int zeros_len = 0 ؛ تعويم Smoothed_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؟ عودة maxOutV ؛ // إرجاع maxOutV / 5.0 ؛ // para segurança} state = 0 ؛ إرجاع 0.1 * new_V + 0.9 * V ؛ // إرجاع new_V ؛ }
int convertVtoOutputValue (float V) {
تقييد العودة (int (V / maxOutV * 255) ، 0 ، 255) ؛ }
تعويم الاستشعارValue2mA (int sensorValue) {
مستشعر تعويم الجهد = sensorValue / 1023.0 * maxRefInV ؛ تعويم sensor_mA = sensorVoltage / R * 1000.0 ؛ عودة sensor_mA ؛ }
int debuted_state_compute (حالة int) {
إذا (الحالة 5) إرجاع 0 ؛ } العودة 1؛ }
بداية طويلة بدون توقيع ، endc ؛
void process_feedback () {int sensorValue = analogRead (analogInPin) ؛ تعويم new_mA = sensorValue2mA (sensorValue) ؛ Smoothed_mA = 0.2 * new_mA + 0.8 * smoothed_mA ؛ تعويم V = outV ؛ outV = computeOutVoltage (V ، new_mA) ؛ analogWrite (analogOutPin ، convertVtoOutputValue (outV)) ؛ debuted_state = debuted_state_compute (حالة) ؛ // Exibir informações no CLI endc = (millis () - start) / 1000 ؛ String tv = "["، ttm = "mA /"، tsm = "V،"، ts = "mA] | Estado:"، h = "| Tempo:"، s = ":"، leadM = ""، LeadS = ""، plotT = "الهدف:"، plotmA = "\ t MA Smoothed:"، plotMin = "\ t Min:"، tempo؛ tmin طويل بدون توقيع = endc / 60 - ((endc / 60)٪ 1) ؛ // Formatação if (endc٪ 60 <10) leadS = "0" ؛ إذا (tmin = 0) ts = ts + "+" ؛ // Parar automaticamente if (tmin> maxmin) stop_device () ؛ سلسلة نصية ؛ إذا (الراسمة) txt = plotT + target_mA + plotMin + "0" + plotmA + smoothed_mA ؛ else txt = tv + V + tsm + smoothed_mA + ttm + target_mA + ts + debuted_state + h + tempo ؛ إذا (معجون) Serial.print ("\ r / e [؟ 25l" + txt) ؛ آخر Serial.println (txt) ؛
// انتظر ملي ثانية قبل الحلقة التالية
// للمحول التناظري إلى الرقمي لتسوية // بعد القراءة الأخيرة: تأخير (5) ؛ }
stop_device باطل () {
الدولة = -10 ؛ analogWrite (analogOutPin ، 0) ؛ clearAndHome () ، Serial.println ("Sessão tDCS interrompida") ؛ Serial.println ("------------------------") ؛ يساعد()؛ }
// مساعدو CLI
void clearAndHome () {Serial.write (27) ؛ Serial.print ("[2J") ؛ // limpa a tela Serial.write (27) ؛ // ESC Serial.print ("[H") ؛ // / r إذا (! المعجون) لـ (int i = 0 ؛ i <= 30 ؛ i ++) Serial.println ("") ؛ }
مساعدة باطلة () {
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 (أوم)")؛ Serial.println ("معجون" - muda a formatação de saída pro PuTTY ")؛ Serial.println ("'stop' - para a Estimulação")؛ Serial.println ("إعادة تشغيل" - inicia / reinicia a Estimulação & o timer ")؛ Serial.println ("'متابعة' - استمر في التقدير '')؛ 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 ("أوم") ؛ }
bool parse_param (String & cmdString) {
int spacePos = cmdString.indexOf ('') ؛ إذا كانت (spacePos <= 0) ترجع خطأ ؛ أمر السلسلة = cmdString.substring (0، spacePos) ؛ String fval = cmdString.substring (spacePos + 1) ؛ إذا (الأمر == "المعجون") إذا (fval == "صحيح") {المعجون = صحيح ؛ العودة صحيح } else if (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 () ، يساعد()؛ } آخر {إرجاع خطأ؛ } عودة صحيحة؛ }
// الإعداد والحلقة الرئيسية
إعداد باطل () {Serial.begin (115200) ؛ تمثيلي المرجع (داخلي) ؛ //1.1 V Serial.print ("Sessão iniciada!") ؛ البداية = ميلي () ؛ } حلقة فارغة () {if (state! = - 10) {process_feedback ()؛ } if (Serial.available ()> 0) {char v = Serial.read ()؛ if (byte (v) == 13) {// Carriage return bool Accept = true ؛ if (commandString == "؟" || commandString == "stop") {stop_device ()؛ } else if (commandString == "reset") {clearAndHome () ؛ الدولة = -1 ؛ outV = maxOutV / 5.0 ؛ البداية = ميلي () ؛ مقبول = خطأ ؛ } else if (commandString == "continue") {clearAndHome ()؛ الدولة = -1 ؛ outV = maxOutV / 5.0 ؛ مقبول = خطأ ؛ } else {bool ok = parse_param (commandString) ؛ إذا (! ok) {clearAndHome () ، يساعد()؛ مقبول = خطأ ؛ Serial.println ("Comando desconhecido: '" + commandString + "" ")؛ }} commandString = ""؛ إذا (تم قبوله) {clearAndHome () ؛ يساعد()؛ Serial.println ("حسنًا!") ؛ }} else {commandString + = v؛ إذا (الحالة == - 10) {Serial.print (v) ؛ }}}}
الخطوة 4: Uma UI Personalizada
Para melhor acompanhamento e segurança ، استخدم ferramenta PuTTY ، e defina no código fonte:
المعجون = صحيح
Recomendações de definições:
-
نافذة او شباك
- 61 Colunas e 20 Linhas
- عرض شريط التمرير desativado
-
نافذة> المظهر
فونتي: Lucida Console ، 28 بكسل
الخطوة 5: Dúvidas؟
Para abrir a guia de ajuda، digite:
?
الصحافة الإلكترونية [ENTER]
OBS: Caso o Estado seja:
-1 -> Cérebro não identificado (corrente aberta) +0 -> Ajustando voltagem + 1 -> Tudo certo، tDCS funcionando