Software pentru masini cu control numeric (CNC)

Controlul numeric (eng. NC – Numerical Control) reprezinta un mod de operare al unor masini-unelte sau roboti industriali, prin automatizarea intregului proces cu ajutorul unui set de instructiuni ce controleaza miscarile masinii. In mod frecvent, setul de instructiuni este interpretat de un computer, de unde si denumirea de CNC (Computer Numerically Controlled).
Sarcinile masinilor-unelte sunt foarte variate, de taiere, gaurire, frezare etc., totul facandu-se automat, dupa o schema (model) prestabilita si incarcata in software-ul de pe computerul care comanda.
Masina dispune de obicei de 2 axe de deplasare (XY) pe care se deplaseaza un cursor (care reprezinta unealta ce indeplineste sarcina efectiva (taiere, decupare etc). Cursorul poate avea 2 stari (sus/jos sau activ/inactiv): in starea activa se produce operatia efectiva asupra materialului, pe cand starea inactiva reprezinta doar o stare de tranzitie intre doua stari active (cursorul este deplasat catre urmatoarea pozitie utila).
Controlul cursorului se face in mod riguros, cu o viteza precisa de inaintare si pe un anumit traseu. Deasemenea, miscarile individuale ale cursorului sunt controlate precis. De exemplu, in cazul in care cursorul reprezinta o scula de gaurire sau frezare, viteza sa de rotatie este deasemena controlata; daca in schimb, taierea se face prin laser, jet de apa sau termic, se va controla intensitatea jetului.
Mai multe despre masinile CNC, aici.

Detalii de implementare
Proiectul este inca in faza de dezvoltare, implementarea a fost facuta in C++ (Microsoft Visual Studio 2010)  si contine doar partea de incarcare de fisiere PLT (generate din Corel Draw) si modulul de randare si afisare a modelului incarcat.

Pentru randarea (desenarea) modelului am folosit un engine grafic minimal (pe care l-am implementat separat, ca librarie DLL), ce suporta operatii de transformare de baza: trasare model, translatie, zoom.
Pentru mecanica si deplasarea efectiva a cursorului masinii, programul trimite serial comenzi catre un cip ce comanda doua motoare tip stepper (unul pentru fiecare din cele doua axe). Comanda facandu-se la nivel de pas, fiecare directie de deplasare (la nivel de model, directia de deplasare reprezinta o linie dreapta intre doua puncte) trebuie descompusa in punctele componente. Pentru asta, am utilizat algoritmul Bresenham.
Totodata, pe langa informatiile despre deplasarea celor doua steppere, programul trimite si informatia despre pozitia cursorului (sus/jos sau activ/inactiv) in timpul deplasarii (liniile rosii care se observa in filmulet reprezinta starea inactiva iar cele albastre, starea activa).

In loc de nota de subsol

Pendulul invers. Roata de reactie

In domeniul spatial, rotile volante (roti de reactie sau in engleza “reaction wheels“) sunt dispozitive de stabilizare si orientare atasate vehiculelor spatiale (nave spatiale, sateliti etc) folosite la pozitionarea acestora in conditii de mediu speciale (cum ar fi lipsa gravitatiei). In componenta rotii volante intra un motor electric, a carui variatie de viteza produce momentul dorit (cauzand nava sa se miste in contra-rotatie, pentru conservarea momentului unghiular), rezultand in final deplasarea (rotirea) ansamblului pe o anumita directie, cu o anumita velocitate si sub un anumit unghi. Intregul sistem e controlat de un microprocesor (printre care viteza motorului), incat scopul final sa fie indeplinit (rotatia navei, mentinerea navei orientata intr-o anumita directie etc). Mai multe detalii despre reaction wheel aici.

Pendulul invers (“inverted pendulum” in engleza) este una dintre aplicatiile rotii de reactie. Avand centrul de masa deasupra punctului de rotatie (pivot), acesta se gaseste intr-o continua stare de instabilitate. Asadar, pentru mentinerea pozitiei verticale, e necesara folosirea unui sistem cu feedback ajustat continuu (roata de reactie). Un exemplu de pendul invers este chiar omul (si mentinerea sa in pozitie verticala).

La constructia unui astfel de pendul am participat (impreuna cu Vali), sistem pe care vi-l prezint in filmuletul de mai jos.

Componente
Motor:     1 x 50:1 Metal Gearmotor 37Dx54L (controlat de driverul in punte H L298N)
Senzori:   2 x HEDL 5540 encoder de rotatie optic (unul pentru determinarea vitezei motorului si altul pentru bratul pendulului)
Schelet:    Suport din platbanda de aluminiu, lingouri de plumb pentru contragreutatile rotii, plexiglas pentru suportul modulului electronic.
Control:   Arduino Duemilanove (microcontroller ATmega168)

Sistem controlat la distanta prin tonuri multifrecventa (DTMF)

Tonurile multifrecventa (dual tone multi-frequency sau DTMF) reprezinta un mijloc de semnalizare in banda de voce a retelelor de telefonie analogice, fiind foarte des utilizate in sistemele tip IVR (interactive voice response) pentru transmiterea de comenzi dinspre terminale catre centralele de telefonie. Cu alte cuvinte, centrala este capabila ca in timpul unui apel telefonic de voce sa recunoasca tonuri ce se regasesc in anumite intervale de frecventa. De exemplu, in retelele GSM de azi, un apel catre numarul de relatii cu clientii al retelei rezulta intr-o comunicatie cu un astfel de sistem IVR automat: “discutia” cu robotul de la celalalt capat se face prin apasarea tastelor corespunzatoare meniului oferit. Apasarea tastelor are ca efect generarea de tonuri DTMF, ce vor fi interpetate de catre robot ca si comenzi, si va raspunde in consecinta.

In articolul de fata va prezint un sistem capabil de interpretarea tonurilor DTMF transmise intre doua terminale mobile. Pentru constructie aveti nevoie de doua telefoane (in acest caz mobile, dar sistemul se adapteaza usor si pentru retelele fixe): un telefon are rolul de apelant si celalat rolul de apelat. Telefonul apelat va raspunde apelului de voce initiat de apelant si va transmite semnalul catre sistemul de decodificare a tonurilor multifrecventa.

SMS control cu Arduino via PC

Proiectul face parte din categoria “Smart-Home” sau “Home-Automation” si va prezinta o solutie simpla si ieftina de a controla la distanta deschiderea/inchiderea usilor casei dvs, aprinderea/stingerea luminilor, in general controlul oricarui fel de dispozitive, la cerere, cu ajutorul telefonului mobiul personal.
Intregul sistem este compus din:
- Un PC
- Un microcontroller (de exemplu Arduino)
- Un telefon mobil cu suport de modem (majoritatea terminalelor actuale corespund)
- O cartela/abonament valabil intr-o retea GSM (pentru a putea primi/trimite mesaje SMS)

Mod de functionare

Telefonul mobil se va conecta la PC in modul modem/dial-up si reprezinta sistemul de comanda. La conectarea la calculator, modemului i se va atribui automat – de catre sistemul de operare – a un port serial virtual (COMx) care poate fi folosit pentru initierea conexiunii/ transmiterea de comenzi. Setul de instructiuni acceptate este cunoscut ca set de comenzi AT (compatibil Hayes). Detalii aici.

Softul pentru PC in principiu va ‘asculta’ primirea de SMS-uri cu ajutorul telefonului. Interogarea se poate face in bucla/pooling – la intervale de timp (pop),sau printr-un sistem de evenimente (push). Pentru a testa capabilitatile modemului/telefonului, acesta se poate testa prin crearea unei conexiuni seriale cu ajutorul unui client ce permite acest lucru (precum PuTTY sau HyperTerminal in Windows). De exemplu, trimiterea
instructiunii “ATI” pe un device Sony Ericsson k310 va avea ca raspuns un text de identificare a modelului, tipului, reviziei telefonului. Setul de instructiuni AT poate fi gasit aici.

Prin rutarea mesajelor sosite direct catre terminal (AT+CNMI), ele vor putea fi parsate/interpretate direct. Atentie insa ca mesajul nu este in cleartext, ci se prezinta codificat in formatul PDU, continand, pe langa informatia utila si un header pentru metadate precum centrul de servicii al retelei GSM, stampa de timp, expeditor etc. De asemenea, reprezentarea caracterelor se poate face pe 7, 8 sau 16 biti (mesajele SMS clasice sunt de obicei reprezentate pe caractere de 7 biti, mesajele EMS – imagini sau sunete prin SMS – pe 8 biti, iar mesajele cu caractere internationale, pe 16 biti). Mai multe despre formatul PDU, aici.

Scenariul clasic de utilizare a sistemului de control este urmatorul: posesorul/persoana avizata in sistem detine un telefon mobil pe care compune un mesaj scurt SMS, continand o comanda simpla, pre-stabilita in sistem (de exemplu: “Aprinde lumina”). Mesajul il va trimite catre numarul de telefon asociat cartelei SIM existente in modemul sistemului. Conectat la PC, telefonul/modemul se asigura de rutarea mesajului catre terminal (sau va fi citit in bucla de catre programul instalat pe PC). In continuare, programul va decodifica mesajul din format PDU in cleartext si va extrage informatia utila, anume textul mesajului si expeditorul. Textul mesajului reprezinta comanda in sine iar de expeditor avem nevoie pentru a permite blocarea expeditorilor falsi sau fraudulosi. Avand o mica baza de date cu lista de comenzi permise si actiunile asociate, programul va efectua in continuare o cerere catre microcontrollerul conectat.

Sistemul de actiune este reprezentat de un microcontroller (in cazul de fata Arduino), care, pe baza unor comenzi este capabil sa execute anumite actiuni (care se reduc la actionarea LOW/HIGH a anumitor iesiri). Asadar, dupa primirea si interpretarea mesajului SMS, programul instalat pe PC trimite mai departe catre Arduino o anumita cerere (care in memoria microcontrollerului are o anumita semnificatie, in speta actionarea anumitor iesiri). Detalii despre Arduino si modalitati de comunicare seriala cu acesta se gasesc pe pagina sa oficiala.

LPT Port Switch

LPT Port Switch – permite controlul on/off a 8 relee conectate pe portul paralel (LPT1). Controlul se face independent pe cele 8 iesiri, asadar softul e ideal atat pentru teste, cat si pentru utilizarea in aplicatii de tip home automation.

Download

Controlul motoarelor pas cu pas cu Arduino

Arduino este o platforma de dezvoltare foarte simplu de utilizat dar totusi cu multe aplicabilitati pentru pasionatii de electronica si robotica. Este vorba de o solutie open-source ce include atat un modul hardware cat si interfatarea software cu acesta, anume un IDE proprietar ce foloseste limbajul Wiring, foarte asemanator cu C. Platforma foloseste un microprocesor ATMega328 la 16MHz, dispune de 14 intrari+iesiri TTL (dintre care 6 PWM), 6 intrari analog, memorie flash de 32 KB si SRAM de 2KB. Mai multe detalii pe situl oficial.

In exemplul de mai jos, am folosit un motor pas cu pas unipolar la 12v/1A, rezolutie de 1,8 grade/pas, comandat in modul full-step. Functie de aplicatie, se poate comanda si in modurile microstepping si half-step (detalii aici). Pentru protectia microcontrollerului, am izolat galvanic cele 2 parti ale circuitului, prin optocuploare. Proiectia in Multisim a circuitului electronic de control:

Ca optocuploare, se pot folosi integratele 4n35. Rezistentele se vor ajusta in functie de consumul motorului, pentru a permite “deschiderea” totala a tranzistoarelor Darlington din driverul ULN2003 (Nota: in schema apare integratul ULN2004, care e varianta CMOS a driverului, din motive ce tin de Multisim; se va folosi TTL, ULN2003).

Cuplarea celor 4 pini de intrare ai circuitului (J1 in schema) se face pe pinii 2, 3, 4, 5 ai placii Arduino, iar catodul LED-urilor optocuploarelor (in schema, cel mai de jos pin al J1) se vor lega la masa Arduino (pinul GND). Daca se doreste folosirea altor pini, se modifica cele 4 linii de cod (#define pinX Y). In orice caz, integratul ULN2003 se va incalzi puternic chiar si la lucrul cu motorul in gol, asa ca este nevoie de un radiator pentru disiparea caldurii. Daca stepperul este de putere mare, este necesar ca iesirile ULN2003 sa fie cuplate la baza unor tranzistoare de putere, sau MOSFET, deoarece acest integrat suporta pana la 500mA pentru toate iesirile (ceea ce inseamna destul de putin pentru un motor). Alimentarea motorului – daca e de 12v – se poate face de la o sursa obicnuita de PC, de 350-400W.

//============ Stepper Motor control ==============
#include <Stepper.h>

#define rezolutieMotor 200     //numarul de pasi pentru o rotatie
                               //completa; se modifica in functie
                               //de rezolutia motorului
#define pin1 2
#define pin2 3
#define pin3 4
#define pin4 5

//se foloseste libraria speciala pentru steppere
//din compilatorul Arduino
Stepper Motor(rezolutieMotor, pin1,pin2,pin3,pin4);   

void setup()
{
  //seteaza viteza motorului la 80 RPM
  Motor.setSpeed(80);   
}

void loop()
{
  //deplasare 200 pasi in fata, adica 360 grade
  //pentru un motor cu rezolutia de 200 de pasi
  Motor.step(200);  
  delay(100);

  //deplasare 200 pasi in spate, adica 360 grade
  //pentru un motor cu rezolutia de 200 de pasi
  Motor.step(-200);
  delay(100);
}
//==================================.

Detector de “spirite”

Mai jos este prezentat un circuit foarte simplu, dar pot spune “de efect”. Este vorba despre un detector de energie electrostatica, care poate fi cu usurinta folosit ca detector de prezenta: circuitul este sensibil la electricitatea statica a corpului uman si nu numai. Si, ca sa exagerez un pic (sau nu?!), acest “detector de spirite” va poate da niste raspunsuri, in cazul in care simtiti ca nu sunteti singuri in casa. Si nu ma refer la membrii familiei :)

schema

In functie de sensibilitatea dorita, tranzistorii npn pot fi BC547 (200 gain) sau BC 517 (30000 gain). Personal am folosit BC 517 pentru gradul de amplificare mai mare.

Surse:

http://talkingelectronics.com/projects/200TrCcts/200TrCcts.html

http://letsmakerobots.com/node/18933?page=2

Soft pentru controlul motoarelor pas-cu-pas

Stepper Motor Controller permite controlul motoarelor pas cu pas, interfatate cu calculatorul prin portul paralel. Aplicatia permite selectarea sensului si a vitezei motorului

Download

Conectarea infasurarilor motorului se face pe pinii D0-D3 ai portului si un pin de masa

arhitectura portului paralel

CardioRitm – Sistem medical pentru monitorizarea cardiaca

Proiectul isi propune realizarea unui sistem medical informatizat, folosind echipamente pentru monitorizarea ritmului cardiac; datele achizitionate sunt centralizate pe un server pentru utilizari ulterioare.

Utilizari:

- In domeniul medical, pentru pocientii suferinzi de boli cardiace (insuficienta cardiaca, aritmii, tahicardie, bradicardie etc)

- In cadrul programelor de fitness, pentru determinarea ritmului “cardio”

Sistemul este format dintr-o aplicatie server, o aplicatie client si un dispozitiv electronic periferic ce se conecteaza la un calculator (pulsoximetru); acesta din urma este elementul-cheie in cadrul sistemului. Medicii utilizeaza dispozitivul numit pulsoximetru pentru a face ca lumina rosie/alba sau radiatia emisa in domeniul infrarosu apropiat, sa strabata degetul pacientului. Acesta permite medicilor determine frecventa pulsului, si de multe ori, sa masoare si nivelul de oxigen din sange. Pulsoximetrul a dus la scaderea in mod spectaculos a risului de decese datorate insuficientei cardiace in cazul pacientilor aflati pe masa de operatie.

Caracteristici tehnice ale sistemului

  • Principiul de detectie: pletismografia degetului (variatiile pulsului sunt inregistrate prin explorarea circulatiei periferice)
  • Accesorii: alimentator (curent continuu), senzor cleste, cablu de date paralel
  • Sursa alimentare: 5-9 V cc
  • Interval detectie: 0-300 batai pe minut (BPM)
  • Platforma OS: Windows
  • Nr. maxim de clienti conectati simultan la server: 100
  • Server baze de date: MySQL
  • Conexiune retea: LAN, WLAN, PAN, Internet
  • Cerinte preinstalare: Microsoft Visual C++ 2005/2008 Redistributable

Conectarea la serverul de baze de date se face doar de catre aplicatia server, care se ocupa de monitorizarea si stocarea datelor. Baza de date utilizata cuprinde trei tabele si stocheaza datele referitoare la pacienti si analizele medicale ale acestora:

Interfatarea dispozitivului hardware cu PC-ul

Portul paralel a fost folosit pentru a se introducele datele din exterior – de la senzorul de ritm cardiac – in calculator. Asadar este utilizat portul paralel ca port de intrare. Pentru acest lucru, a fost utilizat pinul cu numarul 13 al conectorului DB25, corespunzator bitului S4 al portului de stare (a se vedea figura de mai jos). Semnalul primit de la senzor este dreptunghiular, in logica negativa, si se aplica pe acest pin 13.  Deasemenea, un pin de masa este necesar pentru completarea circuitului. Pentru acest lucru a fost ales pinul cu numarul 23.

Spatiul de adrese utilizat de portul paralel:

Numele portului Numarul intreruperii Adresa de start I/O Adresa de sfarsit I/O
LPT1 IRQ 7 0×378 0x37F
LPT2 IRQ 5 0×278 0x27F

Dupa cum se observa din tabel, adresa de baza (BASE_ADDRESS) a portului paralel LPT1 este 0×378. Pentru scriere in registrul de date se poate folosi aceasta adresa. In continuare, registrului de stare ii este alocata adresa BASE_ADDRESS + 1 adica 0×379, iar registrului de control BASE_ADDRESS + 2, adica 0x37A. Asadar, in aplicatie vom folosi adresa 0×379 pentru a “citi” datele de la portul paralel.

Un port fizic poate fi “citit” prin mai multe metode:

- aplicatia interogheaza periodic dispozitivele, citind registrele de stare pentru a determina aparitia unui eveniment (metoda polling)

- dispozitivele periferice intrerup procesorul pentru executia unor proceduri specifice de comunicare (metoda intreruperilor externe)

In cadrul aplicatiei este folosita prima metoda: un fir de executie dedicat scaneaza in bucla, la un interval mic de timp – stabilit in program (200 ms) registrul de stare al portului paralel. Cand se detecteaza o anumita valoare, adica unul din bitii registrului a fost modificat, se considera ca a aparut evenimentul de puls cardiac si se efectueaza actiunea necesara.

Functia care se ocupa de scanarea portului poate fi implementata in urmatorul mod (C++):

void CSenzorParalel::AscultaPort(void)
{
//citeste permanent intrarile portului
int value;
while(true){
value=(Inp32(0×379))>>3;
if(value==13){
Simuleazapuls();
Sleep(200);
}
if(pornit==false) AfxEndThread(0,true);
}

}

Functia Sleep(200) induce sistemului un blocaj timp de 200 ms, perioada minima intre doua “batai” (beat-uri) consecutive. Acest fapt stabileste si rezolutia sistemului, de 300 BPM:

unde F reprezinta frecventa (cardiaca).

Deoarece incepand cu sistemele de operare WinNT si WinXP accesul la porturile fizice este protejat in modul client, functiile clasice inportb() si outportb(…) din mediul C nu pot fi folosite pentru citirea respectiv scrierea intr-un port. Pentru a putea totusi efectua aceste actiuni, portul trebuie accesat din modul sistem (sau kernel) unde nu mai sunt aceste restrictii de securitate. Pentru aceasta, a fost folosita libraria gratuita inpout32.dll, care pune la dispozitia functia Out32(int adresa, int data) pentru scriere respectiv Inp32(int adresa) pentru citire.

In functia AscultaPort() prezentata mai sus se observa operatia de deplasare cu 3 biti la dreapta a valorii citite din port, cu ajutorul operatorului la nivel de bit “>>”. Aceasta deplasare este necesara pentru a “sari” peste primii cei mai putin semnificativi 3 biti ai registrului de stare, care sunt implicit setati pe 0 logic.  Mai jos sunt prezentati pasii si modificarile asupra registrului de stare:

Nr.

pas

Denumire _

S7

S6 S5 S4 S3 S2 S1 S0 Valoare

zecimala

1 Port in standby 0 1 1 1 1 0 0 0 120
2 Semnal pe S4 0 1 1 0 1 0 0 0 104
3 Depl. dr. 1 bit 0 0 1 1 0 1 0 0 52
4 Depl. dr. 1 bit 0 0 0 1 1 0 1 0 26
5 Depl. dr. 1 bit 0 0 0 0 1 1 0 1 13
6 Asignare val. 0 0 0 0 1 1 0 1 13
7 Port in standby 0 1 1 1 1 0 0 0 120

In primul pas, portul se afla in standby (nici un semnal extern nu este pe nici un bit). Se observa ca bitul S7 este din constructie in modul inversat fata de restul bitilor. Bitii S0,S1 si S2 sunt implicit setati pe 0. Valoarea intreaga in baza 10 citita in acesta caz este 120.

In pasul al doilea, apare un semnal nou pe bitul S4. Cu alte cuvinte, a fost detectat evenimentul (semnalul transmis de senzorul de ritm cardiac). Valoarea zecimala citita este 104.

In pasii 3,4,5 se efectueaza o deplasare la dreapta cu un bit de fiecare data (pentru a sari peste bitii neimportanti S2,S1,S0). Se observa ca o deplasare la dreapta se face cu pierderea valorii bitului extrem dreapta si inserarea de 0 prin partea din stanga a registrului. Deplasarea la dreapta este echivalenta cu o impartire cu 2.

In pasul 6 valoarea 13 rezultata in urma deplasarilor este asignata unei variabile, aceasta valoare fiind cea care ne intereseaza.

In pasul 7 semnalul de pe S4 dispare si portul revine la starea initiala.

Asadar, in aplicatie, o trecere de la valoarea 120 la valoarea 13 a variabilei citita semnifica aparitia evenimentului pe bitul S4 (schimarea lui din starea HIGH in starea LOW). Electronic, acest lucru se face prin aducerea unui semnal de masa LOW de fiecare data cand se doreste schimbarea starii bitului.

Protectia portului paralel. Circuit de conditionare a semnalelor.

Deoarece portul paralel este foarte sensibil la curentul de care este strabatut, este obligatoriu ca acesta sa fie izolat electric de circuitul perifericului, pentru a preveni aparitia unor tensiuni care ar putea sa-l deterioreze.

Izolarea electrica, in general, se poate face cu ajutorul unor circuite electrice diverse, cum ar fi releele, transformatoarele sau optocuploarele. In cazul de fata a fost folosita ultima varianta, de izolare optica cu ajutorul optocuploarelor. Optocuplorul (sau optoizolator) este un dispozitiv ce foloseste o cale optica scurta de transmitere a unui semnal intre elementele unui circuit, mentinandu-le in acelasi timp izolate electric. Din moment ce se trece dintr-un semnal electric intr-un semnal optic si inapoi intr-un semnal electric, contactul electric de-a lungul transformarilor se pierde.

O implementare des intalnita consta dintr-un led si un senzor de lumina, separate in asa fel incat lumina sa poata parcurge distanta, dar curentul electric nu. Cand un semnal electric este aplicat la intrarea optocuplorului, ledul se aprinde, senzorul de lumina se activeaza, si un semnal electric corespunzator este generat la iesire. Spre deosebire de un transformator, optocuplorul permite lucrul in curent continuu si de obicei ofera protectie mai buna în condiţii de supratensiune, astfel încat un circuit sa nu il afecteze pe celalalt.

Optocuploarele se prezinta, in general, sub forma unor circuite integrate cu 6 pini. Exista multe variante fabricate de diverse firme. Optocuplorul utilizat in lucrarea de fata este identificat prin seria 4N35 si are urmatoarea structura interna:

In partea stanga in schema (pinii 1 si 2) se afla dioda luminiscenta si acolo trebuie aplicat semnalul de intrare. In partea dreapta (pinii 5 si 4) se afla colectorul respectiv emitorul fototranzistorului, si reprezinta iesirea circuitului.

Optocuplorul impreuna cu doua intrerupatoare formeaza circuitul de conditionare a semnalului.

Pe intrarea In (input) se conecteaza iesirea de la circuitul de amplificare al senzorului de ritm cardiac, iar G1 reprezinta masa dispozitivului periferic.Iesirea Out se conecteaza la pinul de intrare al portului paralel (pinul cu numarul 13) iar G2 se leaga la masa portului paralel (pinul 23).Astfel, la aparitia unui semnal pozitiv pe pinul In (semnal ce reprezinta pulsul detectat al inimii), ledul se va aprinde si va ilumina baza fototranzistorului, care lasa potentialul masei portului (0 logic) sa ajunga la pinul de intrare, anuntand astfel aparitia evenimentului.

In schema mai sunt prezente si doua intrerupatoare:

-Intrerupatorul J1 cu 2 poli cu revenire are rol de tester, si actioneaza intocmai ca iesirea optocuplorului, scurtciruitand cei 2 pini ai portului paralel.

-Intrerupatorul J2 cu 3 poli fara revenire are rolul de a activa/bloca comunicarea perifericului cu calculator.

Senzorul de lumina

Senzorul de lumina este componenta cea mai importanta a dispozitivului de ritm cardiac, el fiind responsabil de detectarea variatiilor de lumina, in speta variatia de lumina din deget. Este format dintr-o componenta de emisie (o dioda luminiscenta – LED) si o componenta de receptie (fotorezistenta), separate de un mediu. Mediul, in cazul de fata este reprezentat de sangele care iriga degetul. Variatia de lumina din sange este cauzata de discontinuitatea fluxului cu care sangele este pompat in compul uman, sub forma de pulsatii.

Clestele din imagine are pozitionat pe un brat LED-ul si pe celalat brat fotorezistorul. Intre ele se plaseaza degetul pacientului.

Circuitul de amplificare a semnalului

Semnalul variabil primit de la senzorul de ritm cardiac (in speta fotorezistenta) este dus catre intrarea neinversoare a primului canal. Aici micile variatii sunt  amplificate proportional cu rezistenta de pe rezistorul variabil R5. Iesirea primului canal este legata la intrarea neinversoare a canalului al doilea, ce functioneaza in regim de comparator. Aici se separa pulsurile mici de unda principala ce va fi luata in considerare. Pe iesirea fiecarui canal a fost introdus si un LED, pentru vizualizarea variatiilor pulsului.

Amplificatorul audio LM358

Circuitul integrat LM358 este un amplificator operational de putere mica, cu doua etaje de amplificare. A fost proiectat pentru a putea opera cu alimentare de la o singura sursa de tensiune, si suporta un interval mare de tensiuni. Seria LM158 din care face parte poate opera cu o alimentare standard de +5V, furnizand interfata electronica fara a necesita tensiunea suplimentara de +/-15V.

Avantajele amplificatorului LM358:

- integreaza 2 amplificatoare operationale independente
- elimina nevoia alimentarii de la 2 surse
- compatibil cu toate formele de logica
- poate fi alimentat si de la baterii

Configuratia pinilor
1 – Iesirea canalului A
2 – Intrarea inversoare a canalului A
3 – Intrarea neinversoare a canalului A
4 – Masa
5 – Intrarea neinversoare pentru canalul B
6 – Intrarea inversoare pentru canalul B
7 – Iesirea canalului B
8 – Borna pozitiva (Vcc)

Caracteristici
Castig de tensiune in curent continuu: 100 dB
Banda larga: 1 MHz
Intervale de tensiune de alimentare: cu o singura sursa: 3V pana la 32V; cu doua surse: +/-1.5V pana la +/-16V
Curent absorbit foarte mic: 500 uA
Intervale de tensiune de intrare comune, inclusiv masa

Combinarea modulelor. Circuitul electronic final

Prin combinarea intrarilor si iesirilor modulelor electronice discutate mai sus se obtine circuitul electronic final, gata de utilizare. Alimentarea circuitului se face de la o sursa clasica de tensiune intre 5-9V. (ex. Incarcatorul achizitionat de la un telefon mobil)

Senzorul de lumina ofera la iesire un semnal variabil (variatie functie de opacitatea mediului). Semnalul este trimis circuitului de amplificare, unde este amplificat de cca. 70-80 de ori si filtrat. La iesirea circuitului de amplificare se obtine un semnal dreptunghiular in impulsuri, care este transmis catre circuitul de conditionare; acesta genereaza la iesire un semnal proportional cu cel de la intrare, oferind izolatie electrica. In final semnalul in impulsuri ajunge la portul calculatorului.

Interfata cu utilizatorul

La pornirea aplicatiei client, pe ecran apare fereastra principala, in modul de asteptare (stand-by). In figura de mai jos este prezentata interfata aplicatiei in timpul efectuarii unei investigatii medicale:

In graficul aplicatiei, este reprezentata asteptarea unui beat cardiac, printr-un cursor culisant ce isi schimba forma cand se detecteaza pulsul. In graficul de jos, este reprezentat istoricul evolutiei ritmului cardiac, printr-o reprezentare de tip line chart , sau diagrama de linii. In coltul dreapta-sus al interfetei este reprezentata valoarea ritmului cardiac detectata la un moment dat, precum si perioada de timp de la ultimul beat. Urmeaza informatiile despre pacient, stabilite in cadrul meniului Setari. Limitele cardiace calculate sunt deasemenea reprezentate, precum si diagnosticul automat stabilit pe baza acestor limite. In coltul stanga-jos este reprezentata starea conexiunii cu serverul.

Optiunile disponibile in meniul aplicatiei

Aplicatia pune la dispozitia utilizatorului un numar de 4 optiuni in cadrul meniului principal, fiecare dintre ele cu mai multe optiuni, sau submeniuri.

Meniul Sistem – ofera operatiile de baza asupra sistemului medical. In cadrul acestui meniu se poate selecta optiunea de incepere a unei consultatii noi, de finalizare cu confirmare a consultatiei in curs, sau de anulare a consultatiei in curs.

Inainte de inceperea unei consultatii, sistemul solicita introducerea de date referitoare la consultatia medicala ce urmeaza a se efectua: datele pacientului (nume, varsta, cnp) precum si informatiile despre sistem (adresa IP a serverului, seria echipamentului utilizat, numele medicului ce efectueaza investigatia). Deasemena utilizatorul este intrebat daca doreste conectarea la server sau lucrul in modul izolat.

In timpul consultatiei medicale, aceasta poate fi stopata, la alegerea medicului, cu confirmare de reusita sau fara confirmare (anulare). In cazul oricarei optiuni, serverul este anuntat printr-un mesaj special in functie de care va stoca in baza de date datele primite pana in momentul respectiv, sau le va ignora. Daca investigatia este incheiata cu confirmare, medicului i se va solicita introducerea de concluzii proprii ale investigatiei, informatie ce va fi deasemenea transmisa la server.

Meniul Vizualizare – permite utilizatorului sa acceseze setarile sistemului, si sa modifice datele, printr-o fereastra de dialog:

Informatiile despre pacient includ si cateva optiuni comportamentale ale acestuia, in functie de care se induce in sistem o anumita toleranta la calcularea limitelor critice (daca pacientul practica spor frecvent) sau restrictii de limita (in caz ca pacientul are anumite vicii).

Meniul Test Monitorizare – este folosit pentru depanarea sistemului si testarea unor functii ale sale. Testele ce se pot efectua sunt teste de retea (conectare/deconectare server) sau teste de monitorizare (lucrul cu senzorul).

In figura urmatoare este prezentata interfata grafica a aplicatiei server. In cadrul interfetei, exista doua sectiuni distincte: o sectiune unde se afiseaza comunicatia in timp real cu clientii (in partea de sus a ferestrei) si o sectiune de administrare a bazei de date, unde se pot obtine informatii despre pacienti.

Jurnalul in timp real este reprezentat in list-box dar este si stocat intr-un fisier local, pentru vizualizari ulterioare.

Un administrator al serverului poate sa porneasca serverul fie in modul doar monitorizare (datele primite de la client sunt doar afisate, nu si stocate) sau in modul monitorizare si stocare date. Administratorul poate deasemena sa vizualizeze informatiile despre clienti, sau sa emita rapoarte.

Un raport poate fi emis pentru orice pacient ale carui informatii sunt stocate in baza de date. In raport se prezinta informatiile detaliate despre analizele medicale ale acestuia, si cuprinde diagrame de tip bar-chart.

Raportul este are o structura formatata, folosind standardul HTML. La apasarea butonului dedicat vizualizarii raportului, fisierul este generat si deschis automat in browserul Web Internet Explorer. Aspectul unui astfel de raport este prezentat in figura urmatoare:

Avantaje ale sistemului

  • Un avantaj al sistemului este faptul ca permite stocarea datelor achizitionate, astfel incat se poate urmari evolutia starii de sanatate a unui pacient.
  • Mai multe echipamente pot fi conectate simultan la server, fapt care reduce atat timpul cat si costul sistemului.
  • Posibilitatea de monitorizare in timp real a ritmului cardiac

Sistemul utilizeaza dispozitivul numit pulsoximetru (de la puls+oxigen), care utilizeaza tehnica inregistrarii variatiilor pulsului prin explorarea circulatiei periferice, tehnica denumia pletismografie.

Sistemul poate fi utilizat cu succes atat in domeniul medical, cat si sportiv si fitness, unde tinerea sub observatie a ritmului cardiac este o necesitate.

Se poate spune ca principalul “actor” al sistemului de fata, sau inima sistemului, este chiar inima pacientului. Se demonstreaza astfel interactiunea om-masina de calcul, si rolul tot mai important pe care il castiga calculatoarele pentru omenire.

RobotEye

RobotEye este un sistem real-time hibrid, ce are ca scop urmarirea punctelor luminoase. Pe scurt, robotul “observa” o sursa de lumina, ii analizeaza traiectoria, si in functie de cum a fost programat, reactioneaza ca atare. Pentru observarea punctului luminos am folosit o camera web obisnuita, plasata pe un sistem mobil cu 2 grade de libertate (RobotHead). Fluxul de imagini preluat de camera web este transmis la un PC, unde se proceseaza si se decide actiunea (motorie): deplasarea sistemului intr-una din pozitiile sus, jos, stanga, dreapta; acest fapt simuleaza reactia robotului la lumina: el se va indrepta in directia indicata de punctul luminos. Pentru generarea punctului luminos e de preferat sa se utilizeze lumina laser, pentru o cat mai buna detectie a spotului luminos.

Asadar, RobotEye este format din 3 componente:

  • sistemul hardware de deplasare (RobotHead)
  • programul software de procesare a imaginii
  • circuit electronic de conditionare a semnalului (driver)

Sistemul hardware de deplasare trebuie sa permita deplasari atat in planul orizontal (pentru directiile stanga-dreapta) cat si in planul vertical (sus-jos); de acest lucru se ocupa 2 motorase, eventual trecute printr-un angrenaj. Personal am utilizat 2 motorase extrase din casetofoane vechi. Angrenajul este util atat pentru reducerea vitezei motorului cat si pentru cresterea fortei de lucru. Si da, este nevoie de un pic de forta: daca motorul planului vertical are doar sarcina deplasarii senzorului optic(a camerei web), motorul de jos – pentru planul orizontal – trebuie sa roteasca intreg planul motorului vertical, incluzand camera web. Sistemul hardware nu este greu de realizat, e
nevoie doar de rabdare.

Programul software de procesare a imaginii utilizat in proiect este tip Motion Detector (open-source) pe care l-am modificat, introducand partea de reactie a robotului (directia de deplasare functie de directia spotului luminos). Mai jos este linkul de download al programului executabil, cat si al codului sursa.

[RobotEye_bin],
[RobotEye_src]

Principiul pe care se bazeaza interpretorul e simplu: imaginile primite de la camera web sunt analizate color, se ignora fundalul si se retine traiectoria luminoasa a punctului luminos (care la un moment dat devine o linie <rosie, daca se utilizeaza lumina laser>); aceasta este parametrizata, cunoscandu-i-se punctul de inceput si cel de sfarsit. Daca linia parametrizata este de la Nord la Sud de exemplu, este generata o miscare in jos capului robotului. Idem pentru celelalte directii. Generarea miscarii presupune furnizarea unui impuls de iesire circuitului electronic driver. Pentru cele 4 directii este nevoie de un registru de 4 biti: in acest scop a fost utilizat portul paralel al PC-ului, anume primii 4 biti din registrul de date (D0-D3). La fiecare directie a spotului detectata, programul raspunde, deci, prin “aprinderea” unuia din cei 4 biti.

Circuit electronic driver are rolul de a prelua comanda transmisa de PC prin portul paralel, si de a o transforma in miscare fizica (va actiona motorul corespunzator in directia corespunzatoare). Circuitul este format din 2 circuite in punte H si eventual circuite de izolare electrica. (pentru izolare se poate folosi circuitul prezentat in cadrul articolului Controler GSM pentru actionari la distanta). In functie de puterea motoraselor, circuitele in punte difera prin tipul de tranzistori utilizati. Pentru motorase de putere mica se poate utiliza schema de aici

Bolt_smokeless_Hbridge

Pentru fiecare din cele 2 motoare se va construi un astfel de circuit. Aplicarea unui potential 5v (’1′ logic) pe una din intrarile A sau B si potentialul masei (’0′ logic) pe cealalta echivaleaza cu rotirea motorului intr-o directie; inversarea potentialelor inverseaza si directia de deplasare a motorului. Asadar, daca notam A1,B1 intrarile pentru primul motor (A1-stanga, B1-dreapta) si A2, B2 intrarile pentru al doilea motor, combinatiile de 4 biti pentru A1 B1 A2 B2 au urmatoarea insemnatate:

0 0 0 0 – stationare totala
0 0 0 1 – motorul 1 stationeaza, motorul 2 se misca la dreapta
0 0 1 0 – motorul 1 stationeaza, motorul 2 se misca la stanga
0 0 1 1 – stationare totala
0 1 0 0 – motorul 1 se misca la dreapta, motorul 2 stationeaza
0 1 0 1 – ambele motoare se misca la dreapta
0 1 1 0 – motorul 1 se misca la dreapta iar motorul 2 la stanga
0 1 1 1 – motorul 1 se misca la dreapta, motorul 2 stationeaza
1 0 0 0 – motorul 1 se misca la stanga, motorul 2 stationeaza
1 0 0 1 – motorul 1 se misca la stanga iar motorul 2 la dreapta
1 0 1 0 – ambele motoare se misca la stanga
1 0 1 1 – motorul 1 se misca la stanga, motorul 2 stationeaza
1 1 0 0 – stationare totala
1 1 0 1 – motorul 1 stationeaza, motorul 2 se misca la dreapta
1 1 1 0 – motorul 1 stationeaza, motorul 2 se misca la stanga
1 1 1 1 – stationare totala

Ex. Daca dorim deplasarea oblica SV-NE, copiem in registrul paralel de date valoarea 5 (z) = 0101 (b)

Follow

Get every new post delivered to your Inbox.

%d bloggers like this: