Mündəricat:
- Addım 1: Saiba Mais
- Addım 2: Monte O Circuito Abaixo
- Addım 3: O Código No Seu Arduino quraşdırın
- Addım 4: Uma UI Personalizada
- Addım 5: Duvidas?
Video: Arduino TDCS Super Simples. Transcranial Birbaşa Cərəyan Stimulyatoru (tDCS) DIY: 5 addım
2024 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2024-01-30 07:46
TDCS -in əvvəlcədən müəyyən edilmiş parametrləri, rezistor, kondansatör və elektrik qurğuları Komponentlər
-
Arduino
- P13 DW, PWM ilə birlikdə işləyir.
- P0 A0 analitik analizi (düzəliş üçün rəy).
- GND üçün GND məlumatları.
- Rezistor (~ 470 Ω, 300-1000 Ω funksiyası, əvvəlcədən yazılmış heç bir yazı yoxdur)
- Kondansatör (220 μF). PWM qurmaq üçün xidmət edin.
- Eletrodos de Esponja (Mülhá-lo água salina istifadə edin).
Como funciona
Arduino hesablamaları düzgün hesablamaq üçün bir hesablama aparmaq lazımdır. Hədəf_mA üçün CLI (Console) serialının dəyərini dəyişdirin.
Addım 1: Saiba Mais
TDCS -in ilk versiyasını hazırlayın. Nəzərə almaq lazımdır ki, FDA e -poçt xidməti heç bir problem yaratmayacaq, əsas səbəblər heç bir problem yaratmayacaq …
Addım 2: Monte O Circuito Abaixo
Növbəti məqalədə qeyd oluna bilər!
Addım 3: O Código No Seu Arduino quraşdırın
ƏDƏVİYYAT PARAMLARI və YAPILANDIRILABİLİR PARAMLAR üçün parametrləri konfiqurasiya etmək üçün seçim edin.
Serialın yüksək sürətini dəyişdirin: 115200 nəticə üçün.
İcraçı komanda, Carriage Return üçün Xəttin sonu yoxdur.
Yazı yazıları + heç bir məlumat mənbəyi olmayan təlimatlar:
Codigo:
const String ver = "2.0m"; // HARDWARE PARAMS const int analogInPin = A0; // Analogiko daxil edin analOutPin = 13 daxil edin; // Saida D13 padrão float maxOutV = 5.0; // Arduino üçün bir PWM proqramı hazırlamaq [V] maxRefInV = 1.1; // Referencia à voltagem analógica [V] float R = 470.0; // Resistencia da corrente [Ohm]
// YAPILANDIRILABİLİR PARAMLAR
bool plotter = yalan; // Defina: doğrudur, o, Serial plotter bool putty = false; // Defina: doğru, PuTTT istifadə etmək üçün (heç bir CLI yoxdur) int maxmin = 30; // Müddət (dəqiqələr) [min] float target_mA = 2.73; // Müvəqqəti məlumat əldə etmək üçün bir şey yazın !!! [mA] float epsilon_mA = 0.03; // Fərqli bir hədəfə çatdıqda, hədəfi dəyişdirə bilərsiniz (heç bir problem yoxdur!)
// GLOBALS İNIT
int vəziyyəti = 1; /* -1 - Şəxsi məlumat 0 - Şəxsi məlumat 1 -dən etibarən məlumatların dəyişdirilməsi ilə bağlı məlumatlar. Düzgün müəyyən etmək üçün -10 - Voltagem desligada */ float outV = maxOutV; // Voltagem int debounced_state = 0; int zeros_len = 0; float smoothed_mA = 0;
String commandString = ""; // CLI üçün
// ƏLAQƏ YARDIMCILARI
float computeOutVoltage (float V, float new_mA) {if (abs (new_mA -target_mA) maxOutV) {vəziyyət = -1; // resistência muito alta -> cérebro não encontrado? maxOutV qaytar; // maxOutV/5.0 qaytar; // para segurança} dövlət = 0; 0.1*yeni_V+0.9*V qaytar; // new_V qaytar; }
int convertVtoOutputValue (float V) {
qaytarma məhdudiyyəti (int (V/maxOutV*255), 0, 255); }
float sensorValue2mA (int sensorValue) {
float sensorVoltage = sensorValue/1023.0*maxRefInV; float sensor_mA = sensorVoltage/R*1000.0; sensor_mA qaytarma; }
int debounced_state_compute (int vəziyyəti) {
əgər (dövlət 5) 0 qaytarırsa; } qaytar 1; }
imzasız uzun başlanğıc, son;
void process_feedback () {int sensorValue = analogRead (analogInPin); float new_mA = sensorValue2mA (sensorValue); hamarlaşdırılmış_mA = 0,2*yeni_mA+0,8*hamarlanmış_mA; float V = outV; outV = computeOutVoltage (V, new_mA); analogWrite (analogOutPin, convertVtoOutputValue (outV)); debounced_state = debounced_state_cute (dövlət); // Exiber məlumatı yoxdur CLI endc = (millis ()-başlanğıc)/1000; String tv = "[", ttm = "mA/", tsm = "V,", ts = "mA] | Estado:", h = "| Tempo:", s = ":", leadM = "", leadS = "", plotT = "Hədəf:", plotmA = "\ tMa:", plotMin = "\ tMin:", temp; işarəsiz uzun tmin = endc/60-((endc/60)%1); // Formatação if (endc%60 <10) leadS = "0"; əgər (tmin = 0) ts = ts + " +"; // Parametrlər avtomatik olaraq if (tmin> maxmin) stop_device (); Simli txt; if (plotter) txt = plotT + target_mA + plotMin + "0" + plotmA + smoothed_mA; başqa txt = tv + V + tsm + hamarlaşdırılmış_mA + ttm + hədəf_mA + ts + dövlət + h + tempi; if (macun) Serial.print ("\ r / e [? 25l" + txt); başqa Serial.println (txt);
// növbəti döngədən əvvəl 2 milisaniyə gözləyin
// analoq-rəqəmsal çeviricinin yerləşməsi üçün // son oxunuşdan sonra: gecikmə (5); }
void stop_device () {
vəziyyət = -10; analogWrite (analogOutPin, 0); clearAndHome (); Serial.println ("Sessão tDCS interrompida"); Serial.println ("------------------------"); kömək (); }
// CLI YARDIMCILARI
void clearAndHome () {Serial.write (27); Serial.print ("[2J"); // limpa a tela Serial.write (27); // ESC Serial.print ("[H"); // / r if (! macun) üçün (int i = 0; i <= 30; i ++) Serial.println (""); }
etibarsız yardım () {
Serial.println ("tDSC arduino, ver"+ver); Serial.println ("'?' - ajuda"); Serial.println ("'max_time' - sürətləndirmək və ya sürətləndirmək (dəqiqələr)"); Serial.println ("'target_mA' - hədəf və ya hədəf (mA)"); Serial.println ("'epsilon_mA' - atualiza o epsilon_mA (mA)"); Serial.println ("'R' - avadanlıqların müqavimətini təmin etmək (Ohm)"); Serial.println ("'macun' - PuTTY formatında və ya formatında)"; Serial.println ("'dayan' - pul üçün hesablama"); Serial.println ("'yenidən başlat' - inicia/reinicia bir qiymətləndirmə və ya taymer"); Serial.println ("'davam et" - Continua a tahmin etmək "); Serial.print ("\ n / rEstado: / n / r * max_time:"); Serial. çap (maxmin); Serial.print ("minutos / n / r * target_mA:"); Serial.print (target_mA); Serial.print ("mA / n / r * epsilon_mA:"); Serial. çap (epsilon_mA); Serial.print ("mA / n / r * R:"); Serial. çap (R); Serial.println ("Ohms"); }
bool parse_param (String & cmdString) {
int spacePos = cmdString.indexOf (''); if (spacePos <= 0) false qaytar; String əmri = cmdString.substring (0, spacePos); String fval = cmdString.substring (spacePos+1); if (command == "macun") if (fval == "doğru") {macun = doğru; doğru qayıtmaq; } if if (fval == "false") {macun = false; doğru qayıtmaq; } float val = fval.toFloat (); if (command == "target_mA") {if (val100.0) {false false; } hədəf_mA = dəyər; clearAndHome (); kömək (); } if if (command == "epsilon_mA") {if (val0.3) {return false; } epsilon_mA = dəyər; clearAndHome (); kömək (); } if if (command == "R") {R = val; clearAndHome (); kömək (); } if if (command == "max_time") {maxmin = val; clearAndHome (); kömək (); } else {false false; } doğru qayıt; }
// AYARLAMA VƏ ƏSAS İLK
void setup () {Serial.begin (115200); analoq İstinad (Daxili); //1.1 V Serial.print ("Sessão iniciada!"); start = millis (); } void loop () {if (state! =-10) {process_feedback (); } əgər (Serial.available ()> 0) {char v = Serial.read (); if (bayt (v) == 13) {// Daşınma qaytarılması bool qəbul edildi = doğru; if (commandString == "?" || commandString == "stop") {stop_device (); } if if (commandString == "restart") {clearAndHome (); vəziyyət = -1; outV = maxOutV/5.0; start = millis (); qəbul edildi = yalan; } else if (commandString == "davam") {clearAndHome (); vəziyyət = -1; outV = maxOutV/5.0; qəbul edildi = yalan; } başqa {bool ok = parse_param (commandString); if (! tamam) {clearAndHome (); kömək (); qəbul edildi = yalan; Serial.println ("Comando desconhecido: '" + commandString + "'"); }} commandString = ""; əgər (qəbul olunarsa) {clearAndHome (); kömək (); Serial.println ("Ok!"); }} başqa {commandString+= v; if (vəziyyət ==-10) {Serial.print (v); }}}}
Addım 4: Uma UI Personalizada
Axtarış zamanı bir Ferramenta PuTTY istifadə edin və heç bir yazı tipini yazmayın:
macun = doğrudur
Təyinat qaydaları:
-
Pəncərə
- 61 Colunas və 20 Linhas
- Kaydırma çubuğunu göstərin
-
Pəncərə> Görünüş
Yazı Tipi: Lucida Konsolu, 28 piksel
Addım 5: Duvidas?
Başlanğıcda bir rəqəm yazın:
?
basın [ENTER]
OBS: Caso və ya Estado:
-1 -> Cérebro não identificado (düzəlişlər) +0 -> Ajustando voltagem+1 -> Tudo sertifikatı, tDCS funksiyası
Tövsiyə:
Birbaşa Rəqəmsal Sintez (DDS) Çipli MIDI nəzarətli Step Motor: 3 Addım
Birbaşa Rəqəmsal Sintez (DDS) Çipi ilə MIDI tərəfindən idarə olunan Step Motor: SADƏ mini layihəyə çevrilməyiniz lazım olduğu barədə pis bir fikir var? Yaxşı, AD9833 Birbaşa Rəqəmsal Sintez (DDS) modulu ilə musiqi hazırlamaq məqsədi ilə Arduino Due üçün hazırladığım bir eskizlə oynayırdım … və bir anda düşündüm ki
(Alternativ cərəyan və birbaşa cərəyan) arasındakı fərq: 13 addım
(Alternativ cərəyan və birbaşa cərəyan) arasındakı fərq: Hər kəs bilir ki, elektrik əsasən DC -dir, amma başqa bir elektrik növü necə? Ac -ı tanıyırsınızmı? AC nə deməkdir? DC -dən sonra istifadə etmək mümkündürmü? Bu işdə elektrik növləri, mənbələr, tətbiq arasındakı fərqi biləcəyik
Tam Bantlı Birbaşa Dönüşüm Alıcısı: 6 addım
Tam Bantlı Birbaşa Dönüşüm Alıcısı: a. məqalələr {şrift ölçüsü: 110.0%; yazı tipi çəkisi: qalın; şrift tərzi: italik; mətn bəzəyi: heç biri; background-color: red;} a.articles: hover {background-color: black;} Bu Təlimat eksperimental " Birbaşa Dönüşüm " a
RTL-SDR Birbaşa Nümunə Alma Modu: 3 addım
RTL-SDR Doğrudan Nümunə Alma Modu: Bir çox dongle 30 Mhz-dən aşağı tezliklərdən istifadə edə bilmir, lakin bunu etmək üçün bəzi cihazları Direct Sampling metodu ilə dəyişdirmək mümkündür. Birbaşa nümunə götürərkən, dongleların beyninə təsirli bir şəkildə təsir edən bir siqnal tətbiq edirik
Birbaşa Giriş Cib Telefonu Beşi: 10 addım
Birbaşa Giriş Cib Telefonu Beşiyi: Bilirəm. Başımda bir çuxura ehtiyacım olduğu qədər dünyanın başqa bir cib telefonu sahibinə ehtiyacı var. Təəccüblüdür ki, yük maşınım üçün ehtiyaclarıma uyğun bir mobil telefon tutacağı tapa bilmədim. Ehtiyaclarımın bu qədər ekzotik olduğunu düşünmədim, amma tapa bilmədim