Mundarija:
- 1 -qadam: Saiba Mais
- 2 -qadam: Monte O Circuito Abaixo
- 3 -qadam: O Codigo No Seu Arduino -ni o'rnating
- 4 -qadam: Uma UI Personalizada
- 5 -qadam: Duvidas?
Video: Arduino TDCS super oddiy. Transkranial to'g'ridan -to'g'ri oqim stimulyatori (tDCS) DIY: 5 qadam
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:25
TDCS parametrlari, shuningdek, rezistorlar, kondansatkichlar va kabellar uchun mo'ljallangan.
-
Arduino
- P13 Dino PWM (boshqa turdagi xizmatlar).
- P0 A0 - analogika (fikr -mulohazalar uchun).
- PND GND uchun GND.
- Rezistor (~ 470 Ω, 300-1000 Ω masofani bosib o'tish mumkin emas)
- Kondensator (220 mF). PWM -ni o'rnatish uchun xizmat qiling.
- "Eletrodos de Esponja" ("Mágua salina para molhá-lo" dan foydalaning).
Komo funciona
Arduino kalkulyatori hisob -kitoblarni amalga oshirishga yordam beradi. Maqsadli maqsadli_mA ketma -ket CLI (Console) ni tanlang.
1 -qadam: Saiba Mais
TDCS boshlang'ich versiyasini tanlang. Noma'lum sabablarga ko'ra, FDA elektron pochta xabarlarini noto'g'ri talqin qiladi, bu sizning savolingizga javob bermaydi, shuning uchun …
2 -qadam: Monte O Circuito Abaixo
Nimani eslab, bizni hammasini o'ylab ko'ring!
3 -qadam: O Codigo No Seu Arduino -ni o'rnating
Boshqa parametrlar-bu HARBATARLIK PARAMLARI va SIFATLANGAN PARAMLAR.
Ommaviy axborot almashinuvining tezligi seriyali: 115200 ta natija uchun.
Boshqaruv buyruqlari bajarilgan bo'lsa, aravani qaytarish uchun hech qanday chiziq tugamaydi.
Ovozli + o'quv qo'llanmalari hech qanday ma'lumot saqlamaydi:
Kodigo:
const String ver = "2,0 m"; // HARDWARE PARAMS const int analogInPin = A0; // Analogico const int analogOutPin = 13 ga kiring; // Saida D13 padrão float maxOutV = 5.0; // Arduino uchun PWM -ni ishga tushirish tezligi maxRefInV = 1.1; // Referencia à voltagem analógica [V] float R = 470.0; // Qarshilikka qarshilik [Ohm]
// Sozlanadigan parametrlar
bool plotter = noto'g'ri; // Ta'rif: rost, bu juda katta ketma -ketlik chizgichi = mac; // Ta'rif: haqiqiy, PuTTT (CLI yo'q) int maxmin = 30; // Vaqt (minutos) zarur [min] float target_mA = 2.73; // Mana, siz ham buni bilib olishingiz mumkin !!! [mA] suzuvchi epsilon_mA = 0,03; // Maqsadni aniqlashda aniq maqsadga erishish mumkin (hech qanday sabab yo'q!)
// GLOBALLARNI INIT
int holati = 1; /* -1 - aniq identifikator 0 - Vazifalar 1 -sonli ma'lumotni tasdiqlash uchun javob beradi. Ma'lumotni to'g'rilash -10 - Voltagem desligada */ float outV = maxOutV; // Voltagem int debounced_state = 0; int zeros_len = 0; float smoothed_mA = 0;
String commandString = ""; // CLI uchun
// YANGILARGA YARDIMCHILAR
float computeOutVoltage (float V, float new_mA) {if (abs (new_mA -target_mA) maxOutV) {holat = -1; // qarshilik ko'rsata olmadi -> nima? maxOutV -ni qaytarish; // maxOutV/5.0 qaytarish; // para segurança} holat = 0; qaytarish 0,1*yangi_V+0,9*V; // qaytish new_V; }
int convertVtoOutputValue (float V) {
qaytish cheklovi (int (V/maxOutV*255), 0, 255); }
float sensorValue2mA (int sensorValue) {
float sensorVoltage = sensorValue/1023.0*maxRefInV; float sensor_mA = sensorVoltaj/R*1000.0; sensor_mA qaytarish; }
int debounced_state_compute (int holati) {
agar (5 -holat) 0 qaytarilsa; } qaytarish 1; }
imzosiz uzoq boshlash, tugatish;
void process_feedback () {int sensorValue = analogRead (analogInPin); float new_mA = sensorValue2mA (sensorValue); silliq_mA = 0,2*yangi_mA+0,8*tekislangan_mA; suzuvchi V = chiqishV; outV = computeOutVoltage (V, new_mA); analogWrite (analogOutPin, convertVtoOutputValue (outV)); debounced_state = debounced_state_cute (holat); // Exiber ma'lumotlari CLI yo'q endc = (millis ()-boshlash)/1000; String tv = "[", ttm = "mA/", tsm = "V,", ts = "mA] | Estado:", h = "| Tempo:", s = ":", leadM = "", leadS = "", plotT = "Maqsad:", plotmA = "\ tMa:", plotMin = "\ tMin:", temp; belgisiz uzun tmin = endc/60-((endc/60)%1); // Formatlashtirish if (endc%60 <10) leadS = "0"; agar (tmin = 0) ts = ts + " +"; // Parametrlar avtomatik ravishda if (tmin> maxmin) stop_device (); String txt; if (plotter) txt = plotT + target_mA + plotMin + "0" + plotmA + smoothed_mA; else txt = tv + V + tsm + smoothed_mA + ttm + target_mA + ts + debuted_state + h + temp; if (macun) Serial.print ("\ r / e [? 25l" + txt); else Serial.println (txt);
// keyingi tsikldan oldin 2 millisekund kuting
// analog-raqamli konvertorning joylashishi uchun // oxirgi o'qishdan keyin: kechiktirish (5); }
void stop_device () {
holat = -10; analogWrite (analogOutPin, 0); clearAndHome (); Serial.println ("Sessão tDCS interrompida"); Serial.println ("------------------------"); Yordam(); }
// CLI YARDIMCILARI
void clearAndHome () {Serial.write (27); Serial.print ("[2J"); // limpa a tela Serial.write (27); // ESC Serial.print ("[H"); // / r if (! macun) uchun (int i = 0; i <= 30; i ++) Serial.println (""); }
yaroqsiz yordam () {
Serial.println ("tDSC arduino, ver"+ver); Serial.println ("'?' - ajuda"); Serial.println ("'max_time' - tezlikni o'lchash (minutos)"); Serial.println ("'target_mA' - maqsad yoki maqsad (mA)"); Serial.println ("'epsilon_mA' - atualiza yoki epsilon_mA (mA)"); Serial.println ("'R' - asbob -uskunalarga qarshilik ko'rsatish (Ohm)"); Serial.println ("'macun' - PuTTY formatidagi fayllar)"; Serial.println ("to'xtatish" - taxminiy qiymat uchun) "; Serial.println ("" qayta ishga tushirish " - inicia/reinicia va taxminiy taymer"); Serial.println ("" davom ettirish " - Continua a tahminlash"); 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:"); Ketma -ket chop etish (epsilon_mA); Serial.print ("mA / n / r * R:"); Ketma -ket chop etish (R); Serial.println ("Ohm"); }
bool parse_param (String & cmdString) {
int spacePos = cmdString.indexOf (''); if (spacePos <= 0) false qaytadi; String buyrug'i = cmdString.substring (0, spacePos); String fval = cmdString.substring (spacePos+1); if (buyruq == "macun") if (fval == "rost") {macun = rost; haqiqatga qaytish; } if if (fval == "false") {putty = false; haqiqatga qaytish; } float val = fval.toFloat (); if (command == "target_mA") {if (val100.0) {return false; } maqsad_mA = qiymat; clearAndHome (); Yordam(); } if if (command == "epsilon_mA") {if (val0.3) {return false; } epsilon_mA = qiymat; clearAndHome (); Yordam(); } if if (buyruq == "R") {R = val; clearAndHome (); Yordam(); } if if (command == "max_time") {maxmin = val; clearAndHome (); Yordam(); } else {return false; } rost qaytarish; }
// O'rnatish va asosiy halqa
void setup () {Serial.begin (115200); analog ma'lumotnoma (Ichki); //1.1 V Serial.print ("Sessão iniciada!"); boshlash = millis (); } void loop () {if (state! =-10) {process_feedback (); } agar (Serial.available ()> 0) {char v = Serial.read (); if (bayt (v) == 13) {// Aravani qaytarish bool qabul qilingan = rost; if (commandString == "?" || commandString == "stop") {stop_device (); } if if (commandString == "restart") {clearAndHome (); holat = -1; chiqishV = maxOutV/5.0; boshlash = millis (); qabul qilingan = noto'g'ri; } else if (commandString == "davom ettirish") {clearAndHome (); holat = -1; chiqishV = maxOutV/5.0; qabul qilingan = noto'g'ri; } else {bool ok = parse_param (commandString); if (! ok) {clearAndHome (); Yordam(); qabul qilingan = noto'g'ri; Serial.println ("Comando desconhecido: '" + commandString + "'"); }} commandString = ""; agar (qabul qilingan) {clearAndHome (); Yordam(); Serial.println ("OK!"); }} boshqa {commandString+= v; if (holat ==-10) {Serial.print (v); }}}}
4 -qadam: Uma UI Personalizada
Bir vaqtning o'zida bir qatorda PuTTY va boshqa harflar bilan yozib oling:
macun = rost
Ta'rif ta'riflari:
- Oyna
- 61 Kolunalar va 20 Linxalar
- O'tkazish panelini ko'rsatish
-
Oyna> Tashqi ko'rinish
Shrift: Lucida Console, 28 piksel
5 -qadam: Duvidas?
Abrid a guia de ajuda, digite:
?
bosing [ENTER]
OBS: Caso yoki Estado:
-1 -> Cérebro não identifikado (tuzatish) +0 -> Ajustando voltagem+1 -> Tudo sertifikati, tDCS funktsiyalari
Tavsiya:
To'g'ridan-to'g'ri raqamli sintez (DDS) chipli MIDI tomonidan boshqariladigan qadam dvigateli: 3 qadam
To'g'ridan-to'g'ri raqamli sintez (DDS) chipli MIDI tomonidan boshqariladigan qadamli dvigatel: Siz hech qachon mini-loyihaga aylanishingiz kerak degan yomon fikrga keldingizmi? Xo'sh, men AD9833 to'g'ridan -to'g'ri raqamli sintez (DDS) moduli yordamida musiqa yaratishga qaratilgan Arduino Due uchun chizgan eskiz bilan o'ynab yurardim … va bir paytlar men o'yladim
Oddiy quvvatli LED chiziqli oqim regulyatori, qayta ko'rib chiqilgan va aniqlangan: 3 qadam
Oddiy quvvatli LED chiziqli oqim regulyatori, qayta ko'rib chiqilgan va aniqlangan: bu ko'rsatma, asosan, Danning chiziqli oqim regulyatori sxemasining takrorlanishi. Uning versiyasi, albatta, juda yaxshi, lekin aniqlik nuqtai nazaridan nimadir etishmayapti. Bu men buni hal qilishga urinishim. Agar siz Dan versiyasini tushunsangiz va qura olsangiz
Muqobil oqim va to'g'ridan -to'g'ri oqim o'rtasidagi farq: 13 qadam
(Alternativ tok va to'g'ridan -to'g'ri oqim) o'rtasidagi farq: Har kim biladiki, elektr toki asosan DC, lekin boshqa turdagi elektr toki qanday? Ac ni bilasizmi? AC nimani anglatadi? DCdan keyin foydalanish mumkinmi? Ushbu tadqiqotda biz elektr energiyasi turlari, manbalari, qo'llanilishi o'rtasidagi farqni bilib olamiz
Geeetech kengashi Raspberry Pi orqali to'g'ridan -to'g'ri simli USB kabeli orqali: 4 qadam
Geeetech kengashi Raspberry Pi orqali to'g'ridan -to'g'ri maxsus USB kabeli orqali: Salom! Ushbu qo'llanmada JST XH 4-pinli maxsus USB-ni qanday qilish kerakligi ko'rsatilgan, shuning uchun siz Raspberry Pi yoki boshqa USB qurilmangizni Geeetech printeridagi A10 kabi Geeetech 2560 rev 3 kartasiga to'g'ridan-to'g'ri ulashingiz mumkin. Bu kabel qulay paralelga ulanadi
Quvvat LED'lari - doimiy oqim davridagi eng oddiy yorug'lik: 9 qadam (rasmlar bilan)
Quvvat LED'lari - doimiy oqim bilan oddiy yorug'lik: bu erda chindan ham oddiy va arzon (1 dollar) LED haydovchi sxemasi. O'chirish - bu "doimiy oqim manbai", ya'ni siz qaysi quvvat manbai yoki atrof -muhit sharoitidan qat'i nazar, LED yorug'ligini o'zgarmasligini bildiradi