Documente Academic
Documente Profesional
Documente Cultură
LUCRARE DE DIPLOMĂ
Alexandru JONI
COORDONATOR ŞTIINŢIFIC:
Şl. ing. Mihai V. MICEA
2003
Sistem robotizat mobil teleoperat Alexandru JONI
Cuprins
Lista figurilor.............................................................................................................................. 4
Lista secvenţelor de cod ............................................................................................................. 7
1 Introducere ......................................................................................................................... 8
1.1 Teleoperarea în domeniul roboticii ............................................................................ 8
1.2 Domeniile de aplicare ale teleoperării; exemple ........................................................ 9
1.2.1 Teleoperarea în medii ostile omului................................................................... 9
1.2.2 Teleoperarea în zone inaccesibile omului ........................................................ 19
1.3 Obiectivele proiectului ............................................................................................. 23
1.4 Cadrul general al proiectului .................................................................................... 24
1.5 Structura lucrării....................................................................................................... 24
4 Subsistemul de alimentare................................................................................................ 51
4.1 Bateria plumb-acid ................................................................................................... 51
4.2 Energia solară........................................................................................................... 51
4.2.1 Avantajele energiei solare ................................................................................ 51
4.2.2 Energia de dislocare ......................................................................................... 54
4.2.3 Conversia luminii în electricitate ..................................................................... 55
4.2.4 Principiul de funcţionare: Tip P, Tip N şi câmpul electric............................... 58
4.2.5 Materialele celulei solare ................................................................................. 60
4.2.6 Utilizare............................................................................................................ 61
4.3 Convertizorul 12V DC – 220V AC.......................................................................... 62
5 Subsistemul de comunicaţii.............................................................................................. 64
5.1 Reţeaua wireless WLAN (Wi-Fi)............................................................................. 64
5.1.1 Prezentare generală WLAN ............................................................................. 64
5.1.2 Ce este tehnologia wireless? ............................................................................ 65
11 Bibliografie................................................................................................................... 99
Anexa 5 – Cablajul sistemului de comandă a punţii „H“. Faţa superioară ............................ 111
Anexa 6 – Cablajul sistemului de comandă a punţii „H“. Faţa inferioară ............................. 112
Anexa 8 – Codul sursă al aplicaţiei server, care rulează pe sistemul de comandă al robotului
................................................................................................................................................ 123
Lista figurilor
Figura 1 - Detectarea / distrugerea de mine în fosta Iugoslavie................................................. 9
Figura 2 - Robot mobil detector de mine ................................................................................. 10
Figura 3 - Robot mobil folosit la inspecţii în urma dezastrelor nucleare................................. 10
Figura 4 - Jet de apă folosit la distrugerea bombelor (disruptor) ............................................. 11
Figura 5 - Exemplu de robot mobil folosit la ameninţări cu bombe ........................................ 11
Figura 6 - Inspectarea unui autovehicul de către un robot mobil............................................. 12
Figura 7 - Robot mobil folosit la detectarea dispozitivelor explozive capcană ....................... 12
Figura 8 - Robot mobil echipat cu dispozitiv de distrugere a bombelor (disruptor)................ 13
Figura 9 - Robot mobil teleoperat din anii ‘60......................................................................... 13
Figura 10 - Comparaţie între roboţi mobili (în fundal Apollo 15 LRV anii 70, în plan apropiat
Sojourner – 1997)............................................................................................................. 14
Figura 11 - Şasiu experimental de robot mobil ........................................................................ 14
Figura 12 - Robot mobil Sojourner - roţile din faţă ................................................................. 15
Figura 13 - Depăşirea unui obstacol......................................................................................... 15
Figura 14 - Sojourner pregătit pentru transport........................................................................ 16
Figura 15 - Sojourner pregătit de funcţionare .......................................................................... 16
Figura 16 - Robot mobil experimental ..................................................................................... 16
Figura 17 - Pathfinder şi Sojourner .......................................................................................... 17
Figura 18 - Versiunea a doua a lui Sojourner........................................................................... 17
Figura 19 - Robotul mobil Sojourner preluând o mostră de rocă............................................. 18
Figura 20 - Design experimental de robot mobil ..................................................................... 18
Figura 21 - Detaliu al subsitemului video la un robot mobil ................................................... 19
Figura 22 - Robot mobil folosit la inspecţia ţevilor ................................................................. 19
Figura 23 - Exemplu de robot mobil folosit la inspecţia conductelor...................................... 20
Figura 24 - Robot mobil pentru inspecţia conductelor verticale.............................................. 20
Figura 25 - Robot mobil pentru zone greu accesibile .............................................................. 21
Figura 26 - Modificarea formei în timpul operării................................................................... 21
Figura 27 - Robot subacvatic teleoperat................................................................................... 21
Figura 28 - Robot subacvatic de recunoaştere ......................................................................... 22
Figura 29 - Robot mobil militar multifuncţional...................................................................... 22
Figura 30 - Robot mobil militar folosit la aprovizionarea cu medicamente ............................ 23
Figura 31 - Robot mobil folosit la decontaminări / înlăturarea obstacolelor ........................... 23
Figura 32 - Arhitectura sistemului ........................................................................................... 26
Figura 33 - Acţionarea unui motor de curent continuu ............................................................ 29
Figura 34 - Acţionare în sens invers......................................................................................... 29
Figura 35 - Schemă bloc a unei punţi tip „H“ .......................................................................... 30
Figura 36 - Deschiderea unei părţi a punţii .............................................................................. 30
Figura 37 - Deschidere inversă a punţii ................................................................................... 31
Figura 38 - Punte „H“ cu tranzistori......................................................................................... 31
Figura 39 - Diode de protecţie.................................................................................................. 32
Figura 40 - Tranzistor MOS-FET............................................................................................. 32
Figura 41 - Tranzistor P-MOS ................................................................................................. 33
Figura 42 - Tranzistori N-MOS................................................................................................ 33
Figura 43 - Detaliu constructiv a unui encoder ........................................................................ 36
Figura 44 - Semnale de la un encoder incremental .................................................................. 36
Figura 45 - Disc codor a unui encoder incremental ................................................................. 37
Figura 46 - Semnale ale unui encoder incemental cu semnale de comutaţie pentru un motor
trifazic............................................................................................................................... 37
Figura 47 - Disc codor a unui encoder incremental cu semnale de comutaţie......................... 38
Figura 48 - Disc codor a unui encoder absolut (cod Grey) ...................................................... 38
Figura 49 - Disc codor a unui encoder absolut (cod binar)...................................................... 39
Figura 50 - Ordinograma sistemului de comandă .................................................................... 41
Figura 51 - Configuraţia pinilor – P89C51RC+....................................................................... 42
Figura 52 - Configuraţia pinilor – 74HC193............................................................................ 43
Figura 53 - Diagrama logică – 74HC193 ................................................................................. 43
Figura 54 - Configuraţia pinilor – TL7705 .............................................................................. 44
Figura 55 - Diagrama funcţională – TL7705 ........................................................................... 44
Figura 56 - Configuraţia pinilor – ADS7822 ........................................................................... 44
Figura 57 - Diagrame de timp – comunicaţie serială cu ADS7822 ......................................... 45
Figura 58 - Forma de undă a mărimii controlate cu factor de umplere de A. 95% B. 50% C.
5%..................................................................................................................................... 46
Figura 59 - Exemplu de semnale PWM ................................................................................... 46
Figura 60 - Ordinograma reglajului automat al vitezei ............................................................ 49
Figura 61 - Aplicare a tehnologiei solare ................................................................................. 52
Figura 62 - Panou solar ............................................................................................................ 52
Figura 63 - Energia solară ........................................................................................................ 53
Figura 64 - Procese în cadrul materialului ............................................................................... 54
Figura 65 - Energia absorbată de diferite materiale ................................................................. 55
Figura 66 - Celulă, modul, matrice .......................................................................................... 55
Figura 67 - Celula solară .......................................................................................................... 56
Figura 68 - Pământul ................................................................................................................ 57
Figura 69 - Spectrul radiaţiei solare ......................................................................................... 57
Figura 70 - Secţiune prin celula fotovoltaică ........................................................................... 58
Figura 71 - Procesul de fabricaţie al siliciului.......................................................................... 59
Figura 72 - Procesul de fabricaţie al siliciului.......................................................................... 59
Figura 73 - Aranjarea cristalelor de siliciu............................................................................... 60
Figura 74 - Exemple de aplicare a tehnologiei solare .............................................................. 61
Figura 75 - Exemple de aplicare a tehnologiei solare .............................................................. 61
Figura 76 - Ieşiri a diferitor tipuri de invertoare (semnal sinusoidal, cvasi-sinusoidal şi
rectangular)....................................................................................................................... 62
Figura 77 - Convertizor sinusoidal 12V DC - 220 V AC......................................................... 63
Figura 78 - Reţea wireless cu conexiune simplă punct la punct .............................................. 64
Figura 79 - Reţea wireless cu conexiuni multi-punct cu securitate.......................................... 65
Figura 80 - Comunicaţii prin infraroşu .................................................................................... 67
Figura 81 - Spectrul de emisie.................................................................................................. 68
Figura 82 - Câştig în domeniul 2.4 GHz .................................................................................. 69
Figura 83 - Antenă omnidirecţională ....................................................................................... 71
Figura 84 - Echipamente Wireless ........................................................................................... 72
Figura 85 - Stâlp BTS (Base Tranceiver Station) .................................................................... 73
Figura 86 - Antenă direcţională................................................................................................ 74
Figura 87 - Tower..................................................................................................................... 75
Figura 88 - Antenă satelit ......................................................................................................... 76
Figura 89 - Antenă direcţională................................................................................................ 77
Figura 90 - Modelare 3D a sistemului de acţionare. ................................................................ 84
Figura 91 - Prototip şasiu simulat ............................................................................................ 85
Figura 92 - Wireframe prototip. ............................................................................................... 85
Figura 93 - Modelare 3D a prototipului ................................................................................... 86
1 Introducere
Lucrarea de faţă îşi propune abordarea domeniului teleoperării. Teleoperarea este un
concept inovator care a fost recent introdus în practica curentă a domeniului automatizărilor.
Teleoperarea se poate aplica pe o gamă largă de echipamente, de la cei mai complecşi roboţi
industriali până la aplicaţii locale extrem de simple.
Teleoperarea necesită anumite particularităţi ale aplicaţiei tratate, printre care amintim:
• aplicaţia trebuie să suporte comanda prin acest procedeu, adică să nu existe restricţii
specifice;
• aplicaţia trebuie să fie compatibilă cu comanda prin teleoperare;
• aplicaţia trebuie să prezinte avantaje evidente în urma aplicării teleoperării.
Având în vedere aceste aspecte, putem conchide afirmând că teleoperarea nu a adus decât
îmbunătăţiri ale modului de lucru în domeniul industrial, că simplifică extrem de mult unele
procese de comandă, că este nu doar oportună ci chiar indispensabilă în anumite condiţii de
exploatare.
Din acest motiv există în prezent mai multe proiecte ce încearcă rezolvarea acestei
probleme. Soluţiile alese constau de obicei dintr-un robot mobil (ca unitate de execuţie) un
algoritm de scanare a suprafeţei ce trebuie eliberată de mine, un element pentru detonarea sau
dezamorsarea minelor reperate. Reperarea se face în funcţie de tipul minelor folosite cu
diferiţi senzori: detector de metale, senzor infraroşu, electro-optic, multi spectral, cu
1. Introducere Pagina 9 din 151
Sistem robotizat mobil teleoperat Alexandru JONI
dispozitive radar cu diferite lungimi de undă, senzori cu unde acustice, detectarea particulelor
cu sarcini, rezonanţă, senzori chimic, biologici, câini, etc.
În urma unui accident nuclear trebuie inspectată zona accidentului şi evaluate daunele.
Datorită faptului că de obicei nu se cunoaşte starea nucleului, a radiaţiilor sau a posibilelor
urmări se preferă trimiterea unui robot mobil pentru evaluarea daunelor.
Acest tip de robot trebuie să fie proiectat să facă faţă unei astfel de situaţii, să fie imun
la radiaţii ridicate, să poată depăşi obstacole de diferite forme (obstacole ce rezultă în urma
unei explozii), să fie capabili să furnizeze date corecte şi în aceste situaţii personalului de
teleoperare.
În cazul unei amenţări cu bombe este encesară evacuarea zonei în cauză. Pentru a
preveni pierderea de vieţi umane şi pentru a putea relua activităţile normale cât mai repede se
folosesc şi în aceste cazuri tot mai des roboţi mobili.
În domeniul protecţiei civile, roboţii mobili sunt folosiţi pentru a interveni în locuri
aglomerate (aeroporturi, gări, pieţe etc.) pentru a detecta şi neutraliza unele dispozitive
explozive capcană (colete, genţi diplomat etc.).
Figura 10 - Comparaţie între roboţi mobili (în fundal Apollo 15 LRV anii 70, în plan apropiat Sojourner –
1997)
Poate că unul dintre cei mai cunoscuţi roboţi mobili teleoperaţi este Sojourner.
Sojourner a fost conceput de către JPL (Jet Propulsion Laboratory, laborator NASA) în
cadrul proiectului Mars Pathfinder. Probabil unul dintre cei mai mediatizaţi roboţi mobili,
Sojourner este un robot cu 6 roţi motoare pe un şasiu inovativ introdus de către NASA.
Acest tip de şasiu ales de către NASA a fost special conceput pentru a face faţă
problemelor apărute datorită suprafeţei plenetei marte. Aceasta este cunoscută pentru
multitudinea de obstacole de diferite dimensiuni întălnite. Datorită faptului că viteza de
deplasare a robotului mobil Sojourner este relativ mică (câţiva centimetri pe secundă) un
algoritm de evitare a tuturor obstacolelor s-a dovedit a fi foarte neproductiv.
Una din problemele cela mai mari întâlnite în cazul robotului mobil Sojourner a fost
diferenţa foarte mare de temperatură ambiantă ce poate apare. Noaptea temperatura scade
până la cca. -96 de grade Celsius, ziua atingând temperaturi destul de ridicate. Din această
cauză a fost necesară crearea unui microclimat în interiorul robotului pentru a proteja
electronica de fluctuaţiile de temperatură şi pentru a o menţine funcţională.
Robotul mobil a fost echipat şi cu un element acţionator numit IDD (Instrument
Deplyment Device). Acesta este un braţ robotizat, ce permite utilizarea echipamentelor de
cercetare din dotare, cum ar fi: un ansamblu pentru preluare de imagini (format dintr-un
microscop şi o cameră de înaltă rezoluţie), un spectrometru Mössbauer, un spectrometru cu
raze X şi un dispozitiv pentru preluarea de mostre de rocă.
Sistemele de inspecţie a conductelor sunt formate uzual din mai multe părţi: robotul
mobil ce oferă platforma locomotorie, o cameră video uzual montată pe un dispozitiv ce
permite rotirea şi înclinarea acesteia şi unelte necesare efectuarea altor teste sau reparaţii.
Dintre testele ce pot fi efectuate amintim cele de natură nedistructivă, cum ar fi probe
cu lichide penetrante, scanări ultrasonice, cu raze x. Acestea se efectuează periodic pentru a
verifica parametrii conductei în cauză.
Sistemele folosite în practică sunt de obicei izolate etanş astfel încât este posibilă
operarea lor şi în conducte cu lichid, atâta timp cât lichidul permite efectuarea testelor
propuse.
Pentru a permite inspecţia conductelor verticale s-au dezvoltat roboţi mobili cu trei
şenile dispuse la o distanţă de 120 de grade, astfel asigurându-de o aderenţă maximă şi în
cazul operării pe verticală.
Pentru a putea pătrunde în zone greu accesibile este nevoie de roboţi mobili de
dimensiuni foarte reduse. Aceste dimensiuni reduse au însă un impact asupra calităţii
teleprezenţei. În special calitatea imaginilor video teletransmise este scăzută datorită distanţei
la sol foarte mici. Pentru a depăşi acest inconvenient au fost concepuţi roboţi mobili ce îşi
modifică forma în timpul operării.
Printre aplicaţiile cele mai importante pentru acest tip de roboţi mobili enumerăm:
descoperirea de victime în cazul cutremurilor sau a unor explozii, inspecţia clădirilor (în
special inspecţia fundaţiilor), etc.
În cadrul militar folosirea roboţilor mobili aduce numeroase avantaje. Se pot efectua
operaţiuni de recunoaştere, de spionaj fără riscul pierderilor de trupe (sau de divulgare a
informaţiilor la capturarea acestora), suport logistic (transport de muniţie, medicamente,
combustibil), evacuare medicală a soldaţilor răniţi, operaţiuni de căutare şi salvare, etc.
Înfiinţat în anii 1980 de prof. Dr. ing. Voicu GROZA laboratorul DSPLabs a cunoscut o
dezvoltare puternică în ultimii ani, atât din punct de vedere al dotării cât şi al numărului de
membri activi, componente esenţiale ce au contribuit la statutul său actual. În momentul de
faţă laboratorul DSPLabs condus de către şl. ing. Mihai V. MICEA şi coordonat de către prof.
Dr. ing. Ştefan HOLBAN şi prof. Dr. ing. Vladimir CREŢU a contribuit la finalizarea a peste
27 de contracte şi granturi majore de cercetare cu parteneri din ţară şi din străinătate,
dispunând de o puternică echipă de cercetare compusă din studenţi, masteranzi şi doctoranzi.
Participarea unor membri ai acesteia la concursuri internaţionale de calculatoare ( hard şi soft
) cu rezultate excepţionale ( locurile I şi II ) reprezintă o dovadă a calităţii resurselor umane de
care dispune laboratorul.
Primul capitol este o introducere, care îsi propune să contureze obiectivele acestei
lucrări de diplomă şi cadrul general în care s-a născut. Sunt prezentate pe scurt posibilităţile
actuale în cadrul teleoperării, precum şi câteva aplicaţii semnificative.
În cel de-al doilea capitol este prezentată întreaga aplicaţie de teleoperare fără a se intra
însă în detalii constructive. Este prezentată componenţa sistemului, modul de operare precum
şi specificaţiile tehnice ale acestuia.
Capitolul al treilea prezintă întreg susbsistemul de acţionare, realizarea unei punţi de tip
“H”, realizarea unui sistem cu microcontroler pentru comanda acesteia, precum şi folosirea
unor encodere pentru măsurarea poziţiei şi a vitezei de deplasare.
În cel de-al patrulea capitol este prezentat subsistemul de alimentare, bateria de 12V
125 Ah, panoul solar (împreună cu o descriere a tehnologiei solare), precum şi convertizorul
necesar pentru alimentarea PC-ului de pe robot.
Următorul capitol prezintă aspecte legate de comunicaţii, tehnologia WLAN folosită la
comanda robotului precum şi la realizarea teleprezenţei, folosirea socket-urilor pentru
comunicaţia interproces şi transmisia video a imaginilor de la cele două camere prin
streaming MPEG4.
Capitolul al şaselea prezintă realizarea practică a robotului împreună cu realizarea
virtuală a acestuia.
Următorul capitol prezintă aspecte legate de furnizarea imaginilor. Se prezintă camerele
folosite, împreună cu placa de captură folosită la digitizarea semnalului analogic. Se mai
prezintă şi dispozitivul ales pentru realizarea înclinării şi rotirii camerelor.
Cel de-al optulea capitol descrie sistemul de comandă. Este prezentată interfaţa
aplicaţiei de teleoperare, precum şi posibilitatea de comandă a robotului prin intermediul unui
joystick.
În următorul capitol este descrisă aplicaţia software ce stă la baza acestui robot, la baza
întregului sistem de teleoperare.
În cele ce urmează sunt descrise concluziile şi perspectivele acestei lucrări, posibilităţi
de îmbunătăţire ulterioară. Menţionăm că sistemul a fost astfel dimensionat, ca să permită
folosirea sa drept platformă experimentală pentru testarea mai multor senzori.
Aplicaţia de teleoperare este compusă din mai multe subsisteme prezentate schematic în
figura ce urmează.
RS232
Semnal video complex RS232
Sistemul de Sistemul de
Subsistemul acţionare a orientare a
video robotului camerelor
Cum reiese şi din figură aplicaţia de teleoperare este compusă din mai multe subsisteme:
• platforma robotului mobil şi sistemul de acţionare,
• sistemul video,
• sistemul de orientare a camerelor,
• subsistemul de comunicaţie,
• aplicaţiile software
Sistemul video este compus dintr-o placă de achiziţie video, două camere alb/negru cu
senzor CCD şi un server soft, care realizează encodarea semnalelor video în format MPEG2 şi
teletransmiterea acestora la clientul ce realizează teleoperarea.
Pentru a îmbunătăţi calităţile de teleprezenţă, camerele video au fost montate pe un
dispozitiv de rotire / înclinare, comandat tot de către utilizatorul de teleoperare. Astfel de la
distanţă se pot roti şi orienta cele două camere.
Următoarele sisteme sunt implementate software. Acestea realizează intercomunicarea
între calculatorul gazdă al teleoperatorului şi calculatorul de pe platforma robotizată.
Interfaţa de teleoperare a fost realizată ţinându-se cont în primul rând de un proces de
învăţare cât mai scurt. Interfaţa a fost proiectată cât mai intuitiv, pentru a scuti utilizatorii de
teleoperare de o perioadă lungă de şcolarizare, acomodare.
Platforma mobilă
Dimensiuni: 1010x830x1600 mm
Greutate: aprox. 80 kg
Baterie: 124 Ah
Panou solar: 50 Wh
Convertizor 220V: 200 W
Subsistemul de acţionare
Motoare: 2 x 150 W DC
Punte tip “H”: 2 x 10 A (DA 100%), cu limitare electronică
Siguranţe: F 15A
Camere video
Lentilă: 3.6 mm F 2.0 focus fix
WLAN
Viteză: 22 Mbps
Acoperire: 300 m câmp deschis
Antenă: 2 dBi
Pentru a antrena un motor de curent continuu este suficient să-l conectăm la o sursă de
tensiune. Astfel motorul începe o mişcare de rotire. Pentru a schimba sensul de rotaţie este
suficient să inversăm polaritatea.
Pentru a comanda un motor de către un microcontroler este necesar un element de
comutaţie care este capabil să pornească şi să întrerupă curentul ce trece prin motor.
În cele ce urmează prezentarea se face cu relee, ulterior acestea vor fi substituite cu
tranzistoare.
În prima figură este schema de conectare pentru acţionarea unui motor de curent continuu.
Dacă la intrarea A se aplică un nivel logic „1” (Obs. nivelul de tensiune trebuie să fie suficient
de mare pentru a putea acţiona releul) se va aclanşa releul, fapt ce va determina trecerea unui
curent prin spirele motorului, lucru care va duce la o mişcare de rotaţie a axului său.
Figura următoare arată posibilitatea de rotire a motorului în sens invers.
Similar cu cele discutatea anterior, dacă se aplică o tensiune logică la intrarea B motorul
va fi acţionat corespunzător.
3.1.1 Puntea tip “H” pentru acţionarea unui motor de curent continuu
Pentru a putea însă modifica direcţia de rotire a motorului şi în timpul funcţionării este
nevoie de o punte de tip „H“ ca în figura următoare.
Pentru a controla mai bine comportamentul motorului, şi pentru a putea regla viteza în
locul releelor se folosesc tranzistori.
Astfel schema devine:
Există două tipuri de bază de tranzistori MOSFET. Tranzistori MOSFET cu canal P (P-
MOSFET sau PMOS) şi tranzistori cu canal N (N-MOSFET sau NMOS). În aplicaţii se mai
foloseşte şi aşa numitul CMOS (MOSFET complementar) care este de fapt o combinaţie a
celor doi. În momentul de faţă CMOS este elementul cel mai folosit în proiectarea VLSI,
deoarece consumă mult mai puţin faţă de alte tehnologii.
Este un tranzistor cu canal indus de tip P. Prin acest canal circulă goluri ca purtătoare de
curent. Sursa şi drena, precum se poate observa din figura următoare, sunt fabricate din
material dopat P, iar grila este dintr-un strat de polisilicon ce se află deasupra stratului de
oxid.
În figura din dreapta se observă stratul format din goöuri în imediata apropiere a stratului
de oxid al grilei în momentul aplicării unei tensiuni negative grilei. Dacă sursei i se aplică o
tensiune pozitivă va apărea o scurgere de goluri dinspre sursă spre drenă.
Similar cu tranzistorii P-MOS cei N-MOS sunt formaţi din material dopat de tip N (la
sursă şi drenă) şi dintr-un strat de polisilicon deasupra stratului de oxid al grilei.
Este un tranzistor MOSFET de tip N. În tabelul următor sunt prezentate câteva din
caracteristicile acestuia.
În cele ce urmează vom face câteva clarificări legate de modelul folosit pentru a alege
tranzistorul şi pentru a determina cantitatea de energie disipată, precum şi calităţile
radiatorului.
Tranzistorul este ambalat într-o capsulă de tip TO-220AB, care permite un transfer de
aprox. 75A, astfel nu s-a ales un tranzistor cu ID > 70A (IRF1405 are un ID=169A, dar care
din cauza capsulei nu se poate atinge).
P = I2R
(175-25) = 1.19 * W
Pentru a calcula valoarea curentului ce poate trece prin tranzistor fără răcire
suplimentară folosim RθJA. La o temperatură a joncţiunii de 175°C şi o temperatură a
ambientului de 25°C (temperatura camerei) puterea disipată va fi:
P = 150 / RθJA
P = 2.4 W
dar
P = I2R,
rezultă curentul I = sqrt(P/R)
I = 10A
Din acest motiv s-a ales utilizarea unui radiator de aproximativ 3W, pentru a nu pune
în pericol eventuale persoane ce ating din greşeală carcasa vreunui tranzistor. Al doilea motiv
este faptul că, deşi curentul de aproape 10A ar fi suficient pentru motorul ales, în cazul unei
probleme neprevăzute s-ar putea ajunge la un curent mai mare, lucru care ar duce cu siguranţă
la deteriorarea tranzistorilor.
Este un tranzistor MOSFET de tip P. În tabelul următor sunt prezentate câteva din
caracteristicile acestuia.
Pentru a putea măsura distanţa parcursă, respectiv derivata acesteia viteza este necesar
un dispozitiv ce transformă mişcarea motorului şi a roţilor într-un semnal digital.
Un encoder este format, precum reiese şi din figura următoare, dintr-o sursă de lumină
(uzual un LED) ce luminează printr-un disc (care prezinte un număr binedefinit de fante) un
detector de lumină, care cu ajutorul unei circuistici generează un semnal digital (sau analogic)
ce este trimis la sistemul de comandă a acţionării.
Foarte multe modele de la diferiţi producători sunt în momentul actual de acest tip.
Prezintă o precizie foarte bună, cu până la 5000 de impulsuri pe rotaţie. Este foarte facilă
adăugarea de semnale speciale cum ar fi o referinţă de zero a motorului.
Foarte folosit în prezent mai ales în Statele Unite şi în Japonia. Din păcate nu
beneficiază de un standard industrial, lucru care nu sporeşte răspândirea acestei metode.
Configuraţiile de montare, tipurile de semnal şi tensiunile de alimentare diferă foarte mult.
Precizia este de până la 8000 de impulsuri per rotaţie. Acest tip de encoder este folosit la
motoare cu 2, 4, 6 sau 8 poli, şi din acest motiv alimentarea fazelor trebuie făcută intermitent
pentru a se obţine o rotaţie. Semnalele de comutaţie sunt folosite pentru a schimba
alimentarea fazelor. Cum reiese din figura următoare acestea determină momentul când o fază
trebuie alimentată şi când alimentarea trebuie întreruptă.
Figura 46 - Semnale ale unui encoder incemental cu semnale de comutaţie pentru un motor trifazic
Folosit mai ales în Europa, acest tip de encoder prezintă o ieşire sinusoidală cu o
amplitudine (vârf la vârf) de 1 volt.
Mai puţin folosit la aplicaţii de acţionare, de obicei sunt prezintă o rezoluţie de 10 sau
12 biţi. Există şi în variante cu rezoluţie mai bună, dar de obicei sunt folosite doar în aplicaţii
foarte specializate.
Acest tip de encoder este compus de obicei dintr-un encoder cu o singură tură cu 12 sau
13 biţi de precizie la care s-a adăugat un numărător de rotaţii pe 12 biţi, astfel ajungându-se la
24 sau 25 de biţi precizie. Cu toate că există de ceva vreme, nu au fost foarte folosiţi datorită
costului relativ ridicat. În ultima vreme însă, datorită cercetărilor avansate, preţul a început să
scadă şi folosirea lor în aplicaţii practice a început să ia amploare.
Encoderele de acest tip prezintă de obicei ieşiri incrementale de tip A, B şi impuls de
referinţă, o interfaţă serială pentru transferul poziţiei absolute (de obicei RS485 sau RS422) şi
ieşiri de comutaţie. Din LSB-ul poziţiei absolute se generează un semnal incremental cu 2048
sau 4096 impulsuri pe rotaţie pentru folosirea în sisteme rapide de reglaj de tip servo.
Pentru comanda punţii s-a ales o soluţie dedicată bazată pe un sistem cu microcontroler.
Sistemul este compus dintr-un microcontroler Phillips P89C51RC+, un generator de semnal
de reset de tipul TL7705, trei canale de numărătoare pe 24 de biţi descrise amănunţit în cele
ce urmează, un convertor analog-numeric de tipul ADS7822, trei ieşiri directe separate
galvanic, opt ieşiri cu încărcare într-un registrul paralel de tipul 74HC574 separate galvanic,
două intrări directe separate galvanic, opt intrări cu încărcare într-un registru paralel separate
galvanic, un conector şi circuistica necesară conectării unui afişaj cu cristale lichide şi un
circuit de tipul MAX232 pentru conversia semnalului serial din nivele de tensiune TTL în
nivele EIA.
Sistemul a fost conceput pentru a putea fi utilizat la comanda unui centru de prelucrare
cu comandă numerică, cu trei grade de libertate. Din acest motiv sistemul prezintă trei canale
de numărare cu o precizie pe 24 de biţi. Pe fiecare canal sunt preluate, prin intermediul unui
optocuplor de viteză mare, semnalele de la un encoder de tip incremental, acestea sunt
prelucrate pentru a se diferenţia direcţia de rotaţie şi apoi sunt conectate la numărătoare de
tipul 74HC193. Acestea sunt numărătoare pe 4 biţi cascadate câte 6 pe fiecare canal, pentru a
se asigura precizia de 24 de biţi.
Pe fiecare dintre canale informaţia din numărătoare trebuie încărcată în câte trei registre
pe 8 biţi, conectate la magistala de date. Aceste registre sunt accesate prin intermediul a două
circuite decodificatoare 74HC138 conectate la magistrala de adrese.
Circuitul ADS7822, un convertor analog numeric cu o precizie de 12 biţi, descris în
subcapitolul 3.3.4 la pagina 44, este folosit la citirea tensiunii bateriei şi astfel la determinarea
gradului de încărcare a acesteia.
Pe acest sistem rulează un program, codul sursă se găseşte în Anexa 7 – Codul sursă al
sistemului de comandă a punţii „H“ la pagina 113, care se comportă conform ordinogramei
următoare.
La pornire se vor configura porturile de intrare / ieşire, timerele, interfaţa serială cu
calculatorul gazdă, interfaţa serială cu convertorul analog numeric.
Timer 0 odată pornit va tot genera semnale de tip PWM cu condiţia ca sistemul de
acţionare să fie validat, pentru fiecare dintre gradele de libertate. Timer 1 va compara viteza
momentană cu cea prescrisă şi dacă constată o diferenţă între cele două va opera asupra
factorului de umplere pentru a compensa această diferenţă.
După ce configurările au fost efectuate sistemul aşteaptă comenzi de la calculatorul
gazdă.
START
Lansare rutine timer
Iniţializare sistem descrise în 3.4.2
Configurare pini,
timere, port serial
da Comandă nu
validă?
Comandă da
acţionare?
Se furnizează
informaţiile necesare,
care pot fi: distanţa
parcursă, parametrii de
funcţionare, încărcarea
bateriei, etc.
Caracteristici P89C51RC+:
• compatibil cu familia MCS-51;
• 32 KB de memorie Flash reprogramabilă; anduranţă 1000 de cicluri scriere / ştergere;
• programabil ISP (“In System Programming”);
• operare total statică: 0 Hz la 33 MHz;
• 512 x 8 biţi memorie RAM internă;
• 4 porturi de intrare / ieşire pe 8 biţi;
• 3 registre timer / counter pe 16 biţi;
• 7 surse de întrerupere;
• canal serial UART programabil;
• timer watchdog;
• comparator analogic on-chip;
• moduri de operare: cu consum redus şi suspend.
circuitul furnizează rezultatul conversiei, iar CS/SHDN este linia prin care microcontrolerul
cere o conversie nouă.
Pentru a regla viteza motoarelor este nevoie de două componente descrise în cele ce
urmează. Prima componentă este cea decizională, cea care realizează autoreglajul efectiv.
Aceasta este o rutină software descrisă în 3.4.2. A doua componentă este cea executantă. Un
semnal rectangular de tip PWM generat de către microcontroler acţionează asupra punţii şi
implicit asupra vitezei de rotaţie a motorului.
În cele ce urmează este descris semnalul de tip PWM, împreună cu avantajele acestei
soluţii.
Pentru a controla un motor de curent continuu este nevoie de o sursă de alimentare
reglabilă. Totuşi, dacă se ia un motor de 12 V şi se alimentează, se observă că motorul
accelerează, până ajunge la viteza nominală: motoarele de curent continuu nu răspund
instantaneu. Dacă se opreşte alimentarea motorul va începe să decelereze. Dacă repetăm
aceste două operaţii destul de des, motorul se va învârti cu o anume viteză, viteză ce poate fi
variată între 0 şi viteza maximă.
Exact aceste operaţiuni le face şi un sistem de acţionare cu PWM. PWM este
alternativa la comanda analogică, prin tensiune. PWM, prescurtarea de la Pulse Width
Modulation, reprezintă un semnal rectangular cu factor de umplere variabil.
Tensiunea analogică rezultată este valoarea medie a tensiunii la ieşire. Astfel dacă
creştem factorul de umplere al semnalului rectangular, creştem valoarea medie a tensiunii şi
astfel creştem viteza de rotaţie a motorului de curent continuu.
Totuşi nu este suficientă pornirea şi oprirea curentului către motor, acest lucru trebuie
făcut cu o anumită frecvenţă. Dacă frecvenţa este prea mică, motorul va funcţiona într-un
regim cu întreruperi, lucru ce va duce la încălzirea lui. El va genera căldură pe perioada
activă, dar şi o căldură datorită frânării pe durata în care semnalul rectangular prezintă
valoarea logică „0”. Datorită acestui lucru uzual frecvenţa de lucru este undeva între 1 şi 20
de kHz. Teoretic o valoare cât mai mare este avantajoasă, deoarece scade stresul motorului
(constanta de timp a motorului devine mult mai mare decât perioada, astfel încât motorul
„vede” o tensiune analogică la borne), scade consumul şi dispar efectele sonore, deoarece ne
îndepărtăm de domeniul auzului uman. Din păcate frecvenţa maximă este limitată de
elementele de comutaţie, tranzistoare MOS-FET în cazul nostru, astfel încât nu este indicat să
se treaca de 15 kHz. Peste această frecvenţă tranzistoarele nu au destul timp să se satureze
complet, şi lucrând într-un regim de conducţie nesaturat, se vor încălzi prea tare. Din acelaşi
motiv, va creşte şi consumul, dacă nu sunt saturate rezistenţa drenă sursă este mult mai mare.
#define PWM_CASE_NONE 0
#define PWM_CASE_X_FIRST 1
#define PWM_CASE_Y_FIRST 2
#define PWM_CASE_EQUAL 3
Secvenţă cod 2 - Definiţii cazuri PWM
switch (period) {
case 1 :
TL0=TL0_reload_1;
TH0=TH0_reload_1;
if (PWM_X_CHANNEL_ENABLED)
X_CHANNEL_OUTPUT=OFF;
if (PWM_Y_CHANNEL_ENABLED)
Y_CHANNEL_OUTPUT=OFF;
if (PWM_CASE==PWM_CASE_EQUAL) period++; //sarim
//peste 2 la urmatoarea executie
break;
case 2 :
TL0=TL0_reload_2;
TH0=TH0_reload_2;
switch (PWM_CASE) {
case PWM_CASE_X_FIRST:
if (PWM_X_CHANNEL_ENABLED)
X_CHANNEL_OUTPUT=ON;
if (PWM_Y_CHANNEL_ENABLED)
Y_CHANNEL_OUTPUT=OFF;
break;
case PWM_CASE_Y_FIRST:
if (PWM_X_CHANNEL_ENABLED)
X_CHANNEL_OUTPUT=OFF;
if (PWM_Y_CHANNEL_ENABLED)
Y_CHANNEL_OUTPUT=ON;
break;
}
break;
case 3 :
TL0=TL0_reload_3;
TH0=TH0_reload_3;
if (PWM_X_CHANNEL_ENABLED)
X_CHANNEL_OUTPUT=ON;
if (PWM_Y_CHANNEL_ENABLED)
Y_CHANNEL_OUTPUT=ON;
period=0;
break;
}
period++;
}
Secvenţă cod 3 - Rutină timer 0 PWM
Se observă faptul că pentru fiecare dintre subintervalele perioadei există nişte variabile
din care se reîncarcă numărătorul aferent timerului 0. Aceste variabile TL0_reload_1,
TL0_reload_2, TL0_reload_3 respectiv TH0_reload_1, TH0_reload_2, TH0_reload_3 sunt
calculate în cadrul rutinei de reglaj automat al vitezei.
Pentru a putea menţine şi regla viteza impusă de către utilizator este necesară
informaţia despre viteza actuală. Odată ce mişcarea de rotaţie a fost transformată conform
capitolului 3.2 într-un semnal rectangular de frecvenţă variabilă, frecvenţă direct
proporţională cu viteza, este destul de simplu de aflat viteza de deplasare pe fiecare din axele
robotului.
se reia procedura
Calcularea vitezei
momentane a axei
Se comandă o Se comandă o
scădere a factorului creştere a factorului
de umplere al mai mare Compararea mai mică de umplere al
semnalului PWM vitezei cu cea semnalului PWM
direct proporţională prescrisă direct proporţională
cu diferenţa între cu diferenţa între
viteza prescrisă şi viteza prescrisă şi
cea momentană cea momentană
egală
// get x speed
P10=0; //activate LdA
P10=1; //deactivate LdA
//se încarcă din numărătoare în reg. pe 8 biţi
tempA1=*buf4;
tempA2=*buf5;
x_pos=tempA2*256+tempA1;
//se încarcă valoarea din numărătoare
După ce a fost calculată viteza momentană, aceasta este comparată cu viteza prescrisă.
Dacă se observă o abatere, pozitivă sau negativă, se intervine asupra semnalului PWM de
comandă a punţii ce acţionează motorul. Intervenţia constă în modificarea factorului de
umplere. Acest lucru nu se realizează static, ci dinamic, în sensul că la o diferenţă mare între
viteza prescrisă şi cea momentană corecţia aplicată este mai mare, astfel modificarea
factorului de umplere al semnalului PWM este direct proporţională cu diferenţa între cele
două viteze. Acest lucru reiese şi din secvenţa de cod ce urmează.
PWM_X_OFF-=SPEED_PAS;
}
case 0: break;
}
}
Secvenţă cod 5 - Reglaj dinamic al vitezei
Lucrurile stau la fel şi în cazul invers, în care viteza momentană este mai mică decât
cea prescrisă. Aceleaşi corecţii se vor face şi pentru cealaltă parte de acţionare a robotului.
După ce au fost calculate perioadele de timp aferente celor două semnale PWM,
trebuie compuse cele două semnale şi trebuie determinate cazul de PWM precum şi valoarea
înscrisă în variabilele TL0_reload_1, TL0_reload_2, TL0_reload_3 respectiv TH0_reload_1,
TH0_reload_2, TH0_reload_3 (vezi subcapitolul anterior).
PWM_CASE = PWM_CASE_X_FIRST;
TL0_reload_1 = (uchar) ((MAX_INT-PWM_X_ON) & 0xFF);
TH0_reload_1 = (uchar) ((MAX_INT-PWM_X_ON) >> 8);
PWM_CASE = PWM_CASE_Y_FIRST;
TL0_reload_1 = (uchar) ((MAX_INT-PWM_Y_ON) & 0xFF);
TH0_reload_1 = (uchar) ((MAX_INT-PWM_Y_ON) >> 8);
4 Subsistemul de alimentare
4.1 Bateria plumb-acid
Doar o mică fracţiune din radiaţia totală produsă atinge Pământul. Radiaţia ce atinge
suprafaţa terestră este indirect sursa a aproape fiecărei forme de energie utilizată în prezent.
Excepţiile sunt energia geotermală, fisiunea şi fuziunea nucleară. Chiar şi combustibilii fosili
îşi datorează originea soarelui; cu mult timp în urmă, aceştia erau plante şi animale vii care
depindeau de energia soarelui.
Colectorii plani sunt cei mai răspândiţi. Sunt de fapt matrici de panouri solare pe o
suprafaţă dreaptă. Pot avea aproape orice dimensiune iar energia produsă depinde direct de
variabile precum dimensiune, orientare şi grad de curăţenie. Aceste variabile afectează
cantitatea de radiaţii incidente pe colector. De multe ori, aceste panouri colectoare dispun de
dispozitive automate de orientare spre soare. Energia suplimentară câştigată din repoziţionare
este cu mult mai mare decât energia necesară acţionării motoarelor pentru corectarea
orientării panourilor.
Când fotoni proveniţi din lumină se lovesc de celula solară, doar fotonii cu un anumit
nivel de energie pot elibera electroni din legăturile atomice şi genera astfel un curent electric.
Acest nivel de energie, cunoscut sub numele de energie de dislocare, se defineşte ca fiind
cantitatea de energie necesară eliberării electronului din legătura covalentă şi introducerea sa
într-un circuit electric.
Energia de care dispun fotonii se numeşte „energia fotonului”. Această energie trebuie să
fie cel puţin la fel de mare ca şi energia de dislocare, pentru ca un foton să poată elibera un
electron. Însă fotoni cu o energie mai mare vor emana restul de energie sub formă de căldură
în momentul eliberării electronilor. Din acest motiv este important ca o celulă fotovoltaică să
fie „reglată” (prin modificări minore în structura moleculară a semiconductorului) pentru a
maximiza energia fotonilor. În final, cheia spre o celulă fotovoltaică eficientă este convertirea
unei cantităţi cât mai mari de energie solară în energie electrică.
Un modul constă în general din mai multe celule solare, deşi materiale foarte subţiri precum
silicon amorf şi aliaj de cadmiu cu telur pot fi concepute direct în formă modulară, evitând
stadiul de celule. Aceste două module siliconice produc aprox. 50W fiecare, generând
suficientă putere pentru iluminarea stradală utilizând o baterie de 12V. Acest tip de module
pot fi conectate şi în formă matricială.
Matricile sunt marile producătoare de putere, fiind compuse din multiple module. Ele pot
produce până la câţiva megawaţi de putere.
Figura 68 - Pământul
Energia solară este vitală pentru viaţa pe Pământ. Ea determină temperatura de la
suprafaţa pământului, asigurând energia necesară pentru a pune în mişcare ecosistemul global.
Deşi alte stele reprezintă surse imense de energie sub forma razelor X şi semnale radio,
soarele nostru emană majoritatea energiei sale sub forma luminii. Totuşi, lumina reprezintă
doar o fracţiune din totalul spectrului radiant; razele ultraviolete şi infraroşii sunt şi ele o parte
semnificativă a spectrului solar.
Deplasarea luminii de la o poziţie la alta poate fi cel mai simplu descrisă cercetând
comportamentul unei unde, diferitele tipuri de radiaţii având lungimi de undă diferite (o
lungime de undă este distanţa de la vârful unei unde până la vârful următoarei unde). Aceste
lungimi de undă indică iradierea cu diferite cantităţi de energie, cu cât lungimea de undă fiind
mai mare, cu atât energia este mai mică. Lumina roşie are o lungime de undă mai mare şi
energia mai mică decât lumina violetă.
Pentru a induce un câmp electric într-o celulă fotovoltaică, sunt necesare 2 tipuri de
semiconductori separaţi, lipiţi împreună. Semiconductorii de tip „p” şi „n” corespund
denumirilor „pozitiv” şi „negativ” datorită abundenţei de goluri şi respectiv electroni
(cantitatea de electroni suplimentari formează un semiconductor de tip „n”, deoarece
electronii sunt încărcaţi negativ).
Siliciul este încă cel mai popular material utilizat la celulele solare în aplicaţiile
comerciale datorită faptului că este atât de răspândit (este pe locul doi în lume ca şi abundenţă
în crusta terestră, depăşit doar de oxigen!). Pentru a putea fi utilizat în celule solare, trebuie
rafinat la o puritate de 99,9999%.
Chiar şi mici cristale de siliciu pot forma celule solare, efectuându-se cercetări în domeniul
siliciului policristalin, în speranţa obţinerii unor celule mai economice. Materialul policristalin
conţine multiple cristale individuale cam de grosimea unui păr uman, sau aproximativ 1/1000
din grosimea materialului semi-cristalin.
4.2.6 Utilizare
necesare defrişări pe mari suprafeţe, singura bucată de pământ ce trebuie distrusă pentru a
produce energia solară este suprafaţa pe care sunt montate panourile.
Dintre toate resursele de energie disponibile, cea solară este probabil cea mai promiţătoare.
Din punct de vedere numeric, este capabilă să producă cantitatea de energie necesară întregii
planete. Din punct de vedere ecologic, este non-distructivă. Practic, poate fi adaptată pentru
alimentarea unor diverşi consumatori, cu excepţia transporturilor, şi poate chiar şi în
transporturi, prin modificări ale modului curent de deplasare. În mod clar, energia solară este
resursa viitorului.
5 Subsistemul de comunicaţii
5.1 Reţeaua wireless WLAN (Wi-Fi)
antene de până la 24 dB câştig, poate inteconecta două LAN-uri clasice pe distanţe până la opt
km. Prin implementarea unui protocol CSMA/CA şi prin mecanisme RTS/CTS (request-to-
send/clear-to-send) se obţin rate de transfer mai mari decât în cazul reţelelor clasice.
În mod normal, comunicaţiile prin satelit nu sunt disponibile entităţilor mici pentru
conexiuni de reţea. Preţul de cumpărare al unui transponder este secret. Cu toate acestea, o
excepţie viabilă este utilizarea sateliţilor pentru conectarea utilizatorilor la reţeaua Internet.
Mai multe companii oferă acces Internet la viteză mare pentru clienţi particulari şi pentru
agenţi economici prin instalarea unor antene parabolice mici.
În timp ce acest tip de conectivitate oferă o viteză de download de peste 400Kbps, el
este un mediu strict unidirecţional. Pentru a beneficia de aceste servicii, utilizatorii trebuie să
menţină o conexiune fizică ( de viteză mică ) la reţeaua Internet. În acest scenariu, cererile
sunt transmise la site-urile web prin conexiunea fizică şi sunt recepţionate prin conexiunea
prin satelit.
Pe de altă parte sunt explorate noi tehnologii satelit. Un nou satelit este acela numit
Low-Earth-orbiting(LEO). Cu sute de astfel de sateliţi disponibili în următorii câţiva ani,
costul capacităţii de transmitere/recepţionare prin tehnologie satelit ar putea scădea. Proiecte
cum ar fi Iridium şi Teledesic sunt deja în plină dezvoltare. Iridium este folosit ca o
alternativă la serviciul de telefonie wireless. Teledesic, cu porecla “Internet pe cer”, este setat
să ofere servicii Internet wireless pentru firme, şcoli şi utilizatori. Spectrul electromagnetic
complet include mai multe tipuri de lungimi de undă cu care am devenit familiari, cel puţin cu
numele lor. Primul din acestea este lumina vizibilă. Alte două tipuri de lungimi de undă,
situate chiar la de un capăt şi de altul al spectrului vizibil, sunt lumina infraroşie şi
ultravioletă. Acestea sunt lungimile de undă care ne oferă tehnologia de vizibilitate noaptea. O
altă porţiune a spectrului electromagnetic cu care vom deveni familiari sunt frecvenţele
numite microunde. Acestea există sub frecvenţele infraroşu, dar peste frecvenţele radio
normale. Multe servicii de comunicaţii de date oferite de marile companii de telecomunicaţii
sunt suportate de tehnologiile de microunde. Deşi este o alternativă viabilă chiar şi în
comunicaţiile private, are două dezavantaje. În primul rând comunicaţiile prin microunde
necesită o licenţă. În al doilea rând preţul de implementare a unei tehnologii cu microunde (
infrastructură de tip turn/farfurie ) este mai mare decât cel al celorlalte opţiuni.
Pe de altă parte, comunicaţiile prin microunde sunt foarte rezistente la interferenţe.
Tehnologiile de calcul care utilizează spectrul infraroşu devin din ce în ce mai comune.
De exemplu, tastaturile wireless şi receptorii sunt distribuite cu calculatoare care servesc ca
bază pentru sisteme de distracţie pentru acasă. Un transmiţător infraroşu operează la o
anumită frecvenţă ( fiecare producător de tastatură wireless utilizează o frecvenţă diferită )
traduce codul tastei apăsate într-un semnal infraroşu pe care îl transmite către receptor. De
asemenea, unele calculatoare sunt dotate în ziua de azi cu port infraroşu care permite ca
informaţia de la un PC de „buzunar” să fie transmise la PC-ul desktop.
Există şi bridge-uri de reţea / router-e care utilizează frecvenţele infraroşu pentru a
transmite date. Ca şi tehnologia cu microunde, cea cu infraroşu oferă o conectivitate de viteză
mare. Dar soluţiile de comunica prin infraroşu sunt cam scumpe de implementat.
În majoritatea cazurilor de infrastructură, echipamentele radio şi infraroşu oferă cele
mai eficiente forme de comunicaţii wireless.
Chiar dacă fraza “reţea wireless prin radio frecvenţă” poate părea misterioasă, această
tehnologie este foarte comună. Ea utilizează unde radio, aceaşi sursă de energie utilizată în
transmisia radio şi TV. Radiourile cu 2 canale şi walkie-talkie-urile utilizează de asemenea
această tehnologie. Programul spaţial utilizează undele radio pentru a controla calculatoarele
de la bordul capsulelor spaţiale şi probelor, şi recepţionează semnale de la alte dispozitive.
Vă mai amintiţi transmisiile video de pe suprafaţa lunii? Fotografiile color ale suprafeţei
lui Marte? Toate acestea au fost transformate în unde radio şi transmise către Pământ utilizând
tehnologia radio. Dacă ne gândim la radiouri şi televizoare, putem să identificăm unele din
componentele care fac ca reţeaua wireless cu radio frecvenţă să funcţioneze: un transmiţător
radio, un receptor radio, un cablu de la antenă la transmiţător sau receptor. Se adaugă şi două
componente pentru a proteja echipamentele – cum ar fi protecţie împotriva fulgerelor şi filtre
de zgomot – şi astfel am alcătuit o listă cu necesarul de dispozitive.
conductor, ca un fir electric. Curentul crează un camp magnetic. Fluctuaţiile curentului produc
modificări în câmpul magnetic, creând unde de energie electromagnetică sau radiaţii. Alte
forme de radiaţii electromagnetice sunt produse prin alte procese atomice.
Aceste modificări ale câmpului magnetic se numesc unde pentru că energia oscilează –
creşte în intensitate până la un vârf, scade până la minim, şi apoi creşte iar până la vârf.
Toate aceste forme de energie călătoresc cu aceiaşi viteză – viteza luminii. Singura
diferenţă dintre ele o reprezintă lungimile lor de undă. Undele radio sunt cele mai lungi.
Razele gama sunt cele mai scurte. Deoarece razele gama sunt mai scurte, şi călătoresc cu
aceiaşi viteză ca undele radio, mai multe raze pot trece printr-un anumit punct într-o secundă.
Numărul de unde care trece printr-un punct într-o secundă se numeşte frecvenţa energiei.
Razele gama au frecvenţe mult, mult mai înalte decât undele radio.
Frecvenţa este măsurată într-o unitate numită Hertz, după Heinrich Hertz, unul dintre
primii experimentatori ai undelor radio ( numite iniţial unde Herziene ). Hertz-ul este definit
în mod ca un ciclu pe secundă sau o undă pe secundă. Spectrul undelor electromagnetice sunt
descrise în hertzi, abreviat Hz.
Ca şi rata de transfer de date, frecvenţele pot fi foarte largi, astfel încât unităţi standard
mari sunt utilizate pentru a le nota: kilo (K), mega (M), şi giga (G). Undele radio au frecvenţe
de la 150kHz la 300GHz. În contrast, undele de lumină sunt mult mai scurte şi au frecvenţe
mult mai înalte. Frecvenţele undelor de lumină sunt în domeniul de 100 trilioane de Hz, sau
100THz (terahertz).
radio care poartă numele de benzi publice. Nu este necesară nici o licenţă pentru a folosi
echipamentul de transmisie la aceste frecvenţe. Acestea sunt numite benzi ISM, prescurtarea
de la benzi: Industrial, Ştiinţific şi Medical.
Lungimea de bandă disponibilă creşte la limitele înalte de frecvenţă. Aceste frecvenţe
înalte vor suporta rate de transfer de date mari. Multe wireless bridge-uri operează la
frecvenţele de 2,4GHz şi 5,7GHz. Cu cât creşte capacitatea de trecere, reţelele de calculatoare
devin o posibilitate din ce în ce mai reală. Cu cât apar mai multe firme care produc produse de
reţea wireless cu radio frecvenţă, cu atât preţurile vor continua să scadă, făcând reţelele
wireless o alternativă viabilă la liniile de telefonie fixă în zonele locale.
Ce face ca benzile ISM nelicenţiate să devină supra-utilizate în mod egal? Există două
diferenţe primare între cum sunt implementate reţelele wireless cu radio frecvenţă astfel încât
să minimizeze interferenţele şi dorinţa de a folosi lungimea de bandă disponibilă. Prima
diferenţă se leagă de metoda utilizată pentru transmisia semnalelor de date prin unde radio. A
doua diferenţă se leagă de tipurile de antene utilizate pentru a radia şi recepţiona semnalele
radio.
acelaşi cod şi caută semnătura unică dea lungul spectrului de frecvenţe. Apoi decodează
semnalul înapoi la data originală.
Avantajul este acela că tehnologia împrăştierii spectrului permite ca mai multe semnale
radio să opereze într-un mediu deschis, pe o bandă nelicenţiată cu un minim de interferenţe.
De asemenea oferă securitate transmisiei.
Pentru a creea o conexiune de reţea de calculatoare prin unde radio, este nevoie de două
componente. Primul ar fi un dispozitiv de reţea ca un bridge sau un router. Bridge-ul / router-
ul de reţea se ocupă cu traficul de date. Rutează cel mai potrivit semnal de date legat de reţeua
de calculatoare dintr-o clădire la reţeaua de la celălat capăt a conexiunii radio. În al doilea
rând este nevoie de un transmiţător şi receptor radio, numit transceiver radio. Transceiver-ul
radio se ocupă cu comunicaţiile prin semnale radio dintre locaţii. Partea interesantă a acestei
căsătorii de tehnologii este aceea că radiourile au avut de- a face întotdeauna cu semnalele
electrice. Transmiţătorul radio modulează, sau modifică, un semnal electric astfel încât
frecvenţa lui este crescută până la o frecvenţă potrivită comunicaţiilor radio.
Apoi semnalul este trimis către o antenă radio. La celălalt capăt al transmisiei, partea de
recepţie a transceiver-ului radio ia semnalul radio şi îl demodulează înapoi la frecvenţa lui
normală. Apoi semnalul electric rezultat este trimis la partea de bridge/ router pentru
procesare de către reţea. În timp ce procesul actual de modulare/demodulare este tehnic,
conceptul de transmisie radio este foarte simplu. Când este transmis un răspuns înapoi la site-
ul originar, transceiver-ul radio comută de pe modul de recepţie pe modul de transmitere.
Transceiver-ul radio de la fiecare capăt are aceste caracterictici. Transmisie-recepţie,
transmisie-recepţie. El schimbă modul de oridul miilor de ori pe secundă. Aceste caracterictici
duc la o întârziere în comunicaţie numită latenţă.
Componenta cheie al unui link al reţelei wireless este un dispozitiv numit un wireless
bridge. O combinaţie între un bridge de reţea şi un radio transmiţător, bridge-ul este o
componentă al unei reţele locale. Ea examinează tot traficul de date. Transmite orice dată
legată de reţea de cealaltă parte a link-ului wireless către transmiţătorul radio. Transmiţătorul
alterează apoi semnalul şi îl transmite către antenă, unde este transmisă la antena aflată de
cealaltă parte a link-ului. Unii pot spune că se comportă ca un agent de trafic pentru datele din
reţea. În timp ce funcţia tuturor wireless bridge este aceiaşi – obţinerea datelor de la o reţea
prin unde radio de la o altă reţea – nu toate wireless brigde-urile sunt identice. Caracteristicile
setate sunt uşor diferite. Pentru unii clienţi preţul este cel care contează, în timp ce pentru alţii
contează securitatea. Pentru majoritatea contează perfomanţa transferării datelor. Producătorii
au muncit foarte mult pentru a face bridge-uri uşor de configurat şi întreţinut.
5.1.3.2 Antene
Cel mai costisitor aspect al instalării antenelor este mast-ul sau tower-ul necesar pentru
a obţine o vizibilitate directă. În cazurile rare, de obicei la distanţe foarte mici, vizibilitatea
directă poate fi stabilită cu antene montate direct pe acoperişurile celor două clădiri. Dar, în
mod obişnuit, unele forme de mast-uri sunt necesare pentru a ridica antenele la o înălţime
suficientă pentru a obţine o vizibilitate directă. În cazuri mult mai dificile sunt necesare sau
sunt mai indicate turnurile radio. Aceste probleme vor fi rezolvate în timpul survolării
locaţiilor.
Figura 87 - Tower
5.1.3.4 Accesoriile
Tehnologia wireless oferă câteva avantaje. Pe departe cel mai important este costul
redus. Va fi necesară actualizarea configuraţiei echipamentelor, sau problemele electrice vor
duce la pierderea configuraţiei. Pentru router-e şi bridge-uri, costul întreţinerii lor va fi similar
cu cel pentru orice conectivitate. Cu toate acestea, dacă se foloseşte un comutator bazat pe
fibră, ne putem aştepta să aibă nevoie de mai puţină întreţinere. Pe de altă parte, vânturi
puternice sau alţi factori pot cauza nealinieri sau defecte la antenele necesare pentru
conectivitatea wireless.
Când conectivitatea prin fibră optică se dovedeşte a fi prea scumpă pentru instalarea
iniţială, conectivitatea wireless oferă o conectivitate de bază foarte bună.
5.1.4.4 Mobilitatea
5.1.4.5 Redundanţa
În multe cazuri, o reţea wireless poate fi stabilită ca o tehnologie mixtă. Cu cât este
necesară mai multe infrastructură de cablu în viitor, cu atât va deveni mai necesară sau
efectivă din punct de vedere al costului instalarea fibrei optice ca “backup” al reţelei
tradiţionale. Când conexiunea wireless este actualizată cu cabluri de fibră optică, conexiunea
wireless tot va juca un rol important. Dacă lăsăm legătura wireless la locul ei, aceasta va
asigura conectivitatea de bază dacă legătura de fibră optică se defectează. Traficul de urgenţă
poate fi în continuare rutat. Utilizarea unei legături wireless cu costurile de astăzi va oferi o
legătură de „backup” în cazul unor probleme tehnice.
5.1.5 Dezavantajele
Când mai multe antene radio sunt amplasate una în apropierea celeilalte, sau când mai
multe surse puternice de spectrum larg se află într-o regiune mică, undele radio îşi pierd din
eficacitate. Semnalele pot interfera una cu cealaltă, cauzând retransmiterea semnalelor sau
pierderea capacităţii de trecere. Dar asemenea surse sunt neobişnuite în comunităţile rurale.
În timp ce conectivitatea wireless oferă o rată cost/transfer mai bună în timp decât
circuitele de date, conectivitatea cu fibră optică oferă o soluţie mai bună. Are potenţial mai
mare pentru capacitatea de trecere. În multe cazuri, este soluţia cea mai bună.
Pe de altă parte, dacă unica resursă care va fi folosită în comun de mai multe comunităţi
este accesul Internet, capacitatea de trecere a link-ului WAN de peste 2Mbps nu este
importantă. Link-ul folosit în comun pentru Internet va fi nodul de gâtuire al reţelei. În mod
normal va fi restrâns la una sau două canale de acces ( 1,5 până la 3Mbps ). În aceste cazuri,
conectivitate cu fibră va fi depăşită cu excepţia cazului în care aceasta va fi fundaţia unor
proiecte viitoare.
În stadiul iniţial al proiectării socket-urilor (în sistemul de operare UNIX) s-a plecat de
la ideea implementării lor ca operaţii de I/O (Input/Output) obişnuite. Se ştie că, in Sistemele
tip UNIX, toate operaţiile I/O cu diverse obiecte (fişiere de pe harddisk, imprimante, unităţi
de bandă, etc.) au la bază acelaşi principiu: deschide-citeşte-scrie-închide. Ca urmare, pentru a
comunica cu o reţea TCP/IP, programul deschide mai întâi o conexiune cu reţeaua, apoi
citeşte şi scrie date prin conexiune. La sfârşit, programul închide conexiunea.
Dezvoltarea funcţiilor API pentru socket-uri, aşa cum sunt ele în forma actuală, a fost
făcută de un grup de cercetători de la Berkeley. Pe măsură ce proiectarea avansa, se
"descopereau" noi probleme şi în cele din urmă s-a constatat că operaţiile I/O de reţea erau
mult mai complexe decât alte tipuri de I/O. De exemplu: pentru scrierea unui program client a
fost uşor de adaptat funcţiile API existente pentru fişiere. Problemele au apărut când s-a trecut
la scrierea unor funcţii care să definească un program server. Serverul trebuie să aştepte, în
mod pasiv, să fie contactat de programe client. Ori în UNIX funcţiile I/O normale nu
încorporează prea multe facilităţi legate de operaţii I/O pasive. De aceea s-au creat noi funcţii
sistem pentru a gestiona operaţiile pasive.
O altă problemă apărută a fost aceea că prin funcţiile sistem existente se puteau crea
socket-uri orientate spre conexiune dar pentru socket-uri fără conexiune nu existau funcţii
sistem echivalente.
Interfaţa Berkeley este doar una dintre implementările unui API pe baza modelului
socket. Windows Socket (denumită şi Winsock) este o altă API bazată pe paradigma socket,
inspirată, totuşi, din interfaţa Berkeley. Chiar dacă sistemele de operare Windows (Windows
9x, Windows NT) sunt proprietate a firmei Microsoft, la dezvoltarea Winsock au contribuit
mulţi alţi cercetători şi programatori de la alte firme.
4. Închiderea socket-ului.
Familii de protocoale:
AF_UNSPEC 0
AF_UNIX 1
AF_INET 2
AF_APPLETALK 16
AF_NETBIOS 17
Secvenţă cod 8 - Familii de protocoale
Când programul apelează funcţia socket(), winsock alocă memorie pentru structura de
date internă, care stochează informaţii despre socket. Simpla apelare a funcţiei nu
completează câmpurile structurii de date. Acest lucru îl fac alte funcţii care vor fi prezentate
ulterior.
Configurarea socket-ului. Modul de configurare depinde de tipul legăturii pe care o
stabileşte programul în reţea (orientată pe conexiune sau fără conexiune) şi de scopul
programului (proces client sau server). Fiecare socket necesită cinci elemente:
• adresa IP a host-ului local,
• portul de protocol pentru procesul local,
• adresa IP a hostului de la distanţă,
• portul de protocol pentru procesul de la distanţă,
• un protocol.
Funcţiile winsock API utilizate, de programe, pentru configurarea unui socket sunt
prezentate în tabelul de mai jos. Ele completează primele patru câmpuri din structura de date,
ultimul, protocolul, fiind completat de apelul funcţiei socket().
în care:
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
Secvenţă cod 10 - Structura sockaddr_in
memset((char *) &addr_Dest, 0,
sizeof(addr_Dest));
addr_Dest.sin_family
= AF_INET;
addr_Dest.sin_addr.s_addr
= inet_addr(szDestIP);
addr_Dest.sin_port
= htons(destport);
if (connect(sock_Send, (sockaddr*)
&addr_Dest, sizeof(addr_Dest)) < 0)
AfxMessageBox("Eroare: functia connect() .");
Secvenţă cod 11 - Deschidere conexiune
Interfaţa Berkeley socket include zece funcţii (cinci pentru transmiterea datelor şi cinci
pentru recepţionarea datelor). Winsock dispune doar de patru funcţii (două de transmitere şi
două de recepţie), prezentate pe scurt în tabelul 3.
Programele cu socket-uri fără conexiune pot utiliza doar funcţiile sendto() şi recvfrom().
Aceasta deoarece ele pot specifica adrese de reţea. Programele ce utilizează socket-uri cu
conexiune pot utiliza toate cele patru funcţii dar sunt recomandate funcţiile send() şi recv(). În
cazul utilizării funcţiilor sendto() şi recvfrom(), winsock ignoră parametrii de adresă incluşi în
apelul lor.
Există cazuri când se impune scrierea unor programe care să utilizeze ambele tipuri de
transfer de date (cu şi fără conexiune). În acest caz se pot scrie funcţii generice pentru
executarea acestor operaţii, funcţii ce vor utiliza sendto() şi recvfrom(). În acest mod se pot
utiliza funcţiile scrise pentru a transmite şi/sau recepţiona date indiferent de tipul socket-ului
pe care programul îl pasează funcţiei.
Când programele apelează funcţia send(), winsock preia informaţia legată de destinaţie
(adresa IP şi port de protocol) din structura de date socket internă identificată de
socket_handle. Apoi, funcţia transmite datele din buffer-ul de mesaj (message_buffer).
5. Subsistemul de comunicaţii Pagina 81 din 151
Sistem robotizat mobil teleoperat Alexandru JONI
Se observă că cele două funcţii nu oferă informaţii despre host-ul distant. Deci,
programul trebuie, mai întâi, să conecteze socket-ul la host-ul distant, apoi să-l utilizeze.
Celelalte două funcţii winsock specifică, în apelul lor, informaţii despre host-ul distant:
struct sockaddr {
u_short sa_family;
char sa_data[14];
};
Secvenţă cod 15 - Structura sockaddr
result = closesocket(sock_Send);
Secvenţă cod 17 - Închidere socket
Facem precizarea că variabila result (valoare returnată de funcţiile de mai sus) este de tipul
int.
6 Platforma experimentală
6.1 Proiectarea, modelarea 3D
Pe baza desenului prezentat în Figura 92 s-a realizat şi practic prototipul de către secţia
de prelucrări metalice.
7 Subsistemul video
7.1 Camerele video cu semnal-video-complex
Camerele folosite în cadrul acestui proiect sunt nişte camere CCD cu ieşire analogică.
Modelul ales este Navigator CCD-318. Camerele au un senzor CCD alb-negru produs de
SOny, ce prezintă o rezoluţie suficientă pentru aplicaţia curentă. S-au ales nişte camere alb-
negru deoarece pierderea de informaţie datorită lipsei culorilor este nesemnificativă, în
schimb se diminuează semnificativ cantitatea de date ce trebuie teletransmisă. Astfel pe
aceeiaşi interfaţă WLAN se pot obţine îmbunătăţiri legate de numărul de cadre pe secundă,
respectiv se poate reduce gradul de comprimare, astfel îmbunătăţiindu-se semnificativ
calitatea imaginilor.
Camerele sunt alimentate direct din bateria plumb-acid. Datorită faptului că sunt camere
de 12V dispare necesitatea unei adaptări a tensiunii de intrare (de ex. cu un convertor DC-
DC).
Dispozitivul este în aşa fel construit ca să permită montarea a două camere video într-o
configuraţie paralelă. Acest lucru va permite ulterior implementarea unor algoritmi de stereo-
viziune. Aceştia împreună cu alţi algoritmi de viziune artificială şi cu algoritmi de inteligenţă
artificială vor permite modificarea robotului mobil, şi transformarea acestuia într-unul
autonom.
S-a ales folosirea acestui dispozitiv de rotire/înclinare a camerelor, dispozitiv realizat în
cadrul Departamentului de Ştiinţa şi Ingineria Calculatoarelor reprezentat de laboratorul
DSPLabs. Alternativa o constituia folosirea unui produs comercial, lucru ce ar fi prezentat
două dezavantaje. Primul dezavantaj ar fi fost cel economic, dispozitivele ce se găsesc în
acest moment pe piaţă sunt mult mai scumpe. Al doilea dezavantaj ar fi fost imposibilitatea de
a monta două camere video. Dispozitivele Pan/Tilt sau Pan/Tilt/Zoom sunt de obicei
dimensionate pentru rotirea/înclinarea unei singure camere.
Pentru capturarea semnalurilor video de la cele două camere analogice s-a folosit o
placă de captură de tip Geovision GV250. Aceasta este o placă specializată pentru aplicaţii de
supraveghere. Nu va fi descrisă mai pe larg în cele ce urmează datorită faptului că depăşeşte
cadrul acestei lucrări, şi datorită faptului că dispune de un manual în limba română foarte bine
structurat.
Placa se livrează împreună cu o aplicaţie specializată. Aceasta permite pe lângă
supravegherea propriu-zisă şi o supraveghere de la distanţă. Aplicaţia oferă utilizatorului
posibilitatea ca prin intermediul unui browser web să acceseze şi să observe în timp real
semnalul de la camerele conectate.
De această posibilitate s-a făcut uz şi în cadrul proiectului curent. Datorită faptului că
imaginile sunt transmise sub forma unui flux de date de tip MPEG4, datorită faptului că
acesta prezintă o compresie destul de ridicată a fost posibil să se realizeze transmisia prin
intermediul interfeţei radio de tip WLAN.
8 Subsistemul de comandă
8.1 Componenţa
Subsistemul de comandă este compus din mai multe aplicaţii soft, ce vor fi descrise în
cele ce urmează.
La nivelul sistemului de acţionare rulează o aplicaţie, ce primeşte comenzi de la un
calculator gazdă şi livrează informaţii despre starea sistemului pe o interfaţă serială.
Sistemul de rotire/înclinare a camerelor are la bază a aplicaţie soft ce execută o
operaţiune de polling asupra unei interfeţe seriale. În momentul când primeşte o comandă, o
analizează şi o execută.
Comenzile de mişcare şi de poziţionare a camerelor, le dă un PC (localizat pe platforma
mobilă a robotului) pe care rulează o aplicaţie server. Aceasta are rolul de a autentifica
utilizatori din reţeaua internet. După o autentificare reuşită, aceştia au posibilitatea de a
manipula robotul mobil. Aplicaţia server primeşte comenzi printr-un socket şi le trimite mai
departe către subsistemul de acţionare sau către sistemul de mişcare a camerelor.
Utilizatorul foloseşte o aplicaţie de teleoperare, cu o interfaţă descrisă în cele ce
urmează.
Precum se vede din imaginea de mai sus, utilizatorului este prezentată o interfaţă
intuitivă. S-a încercat realizarea acestui lucru, pentru a permite folosirea sistemului de către
câţi mai mulţi utilizatori, fără nevoia unei pregătiri intense.
În partea de sus a imaginii sunt prezentate în timp real imaginile de la cele două camere
video montate pe robot. În imagine este prezentat un exemplu în care cele două camere sunt
orientate în aceeiaşi direcţie. Acest lucru poate fi modificat pentru a obţine un câmp vizual
mai mare, sau pentru a obţine diferite alte informaţii (se poate imagina un scenariu de
navigare prin spaţii strâmte în care este folositoare o cameră la nivelul robotului mobil
orientată spre înainte).
Pentru a reţine momente importante ambele camere sunt prevăzute cu mecanisme de
capturare de instantanee, sau de înregistrare video. Acestea se realizează pe calculatorul
utilizatorului de teleoperare şi nu influenţează aplicaţia în sine.
Mai este prezentă şi posibilitatea alegerii unei camere pentru afişare pe întreg ecranul.
Acest lucru este util, când se doreşte inspectarea mai atentă a unei anumite zone. Datorită
faptului că în acest mod nu mai sunt vizibile celelalte elemente de control, nu va fi posibilă
comanda sistemului de teleoperare.
În partea din stânga jos a imaginii este prezentată o interfaţă de conectare cu aplicaţia
server ce rulează pe robot. Această parte este responsabilă de transmiterea de mesaje prin
socketuri. Mesajele transmise pot fi comenzi către dispozitivul de rotire/înclinare a camerelor
sau către sistemul de acţionare. În plus cu ajutorul acestui sistem, mai mulţi utilizatori
conectaţi la server pot comunica între ei (similar altor aplicaţii chat uzuale).
Cele mai uzuale joystickuri sunt cele digitale de tip Atari. Acestea sunt denumite Atari,
deoarece acst tip de joystick a fost prima dată folosit la jocul Atari 2600 şi apoi adaptat şi
folosit la calculatoare personale.
Au apărut ca o combinaţie a amânduror modele prezentate mai sus. Ideea de bază este că
se măsoară mişcarea cu ajutorul unor potenţiometre, iar butoanele aferente sunt realizate tot
cu întrerupătoare.
Cu ajutorul joystickurilor analogice s-a putut mări acurateţia de control, care era necesară
la programe de simulare.
Joystickurile analogice nu au mai fost aşa de standardizate ca cele digitale. Fiecare
producător are modelele proprii şi conectorul propriu.
În ziua de azi cel mai uzual joystick analogic este cel de tip PC. Acest model a fost
prezentat de IBM odată cu primul IBM PC. Joystickul este unul simplu analogic, cu două
butoane. Interfaţa originală avea posibilitatea cuplării a două joystickuri, dar datorită faptului
că exista un singur conector era nevoie de un cablu Y pentru a putea conecta ambele
joystickuri simultan. Ulterior unii producători au echipat placa de interfaţă cu doi conectori,
iar alţii au ales să echipeze interfaţa pentru un singur joystick. Din fericire în ziua de azi toate
plăcile de interfaţă au opţiunea de conectare a două joystickuri, la fel ca şi interfaţa originală.
Placa de interfaţă a fost gândită să fie cât mai simplă şi mia ieftină. Placa constă din
electronica de interfaţare cu bus-ul precum şi patru multivibratori monostabili. Aceste circuite
erau simple circuite Timer care generau un impuls cu lăţime direct proporţională cu rezistenţa
potenţiometrului. Lăţimea acestui puls era măsurată cu ajutorul unei bucle soft. Acest lucru
genera o mulţime de probleme programatorilor. Pe maşini mai rapide rutina joystick nu citea
semnalele în mod corespunzător, generând probleme de timing.
Joystickul constă din două potenţiometre cu rezistenţă variabilă între 0 şi 100 kohm.
Valoarea este minimă când joystickul este poziţionat în partea din stânga sus. Un capăt al
potenţiometrului este conectat la +5V iar centrul potenţiometrului este conectat la ieşirea
analogică a joystickului. Celălalt capăt este lăsat liber.
1 XY1 (+5v)
2 Switch 1
3 X1
4 Ground (for switch 1)
5 Ground (for switch 2)
6 Y1
7 Switch 2
8 N.C.
9 XY2 (+5v)
10 Switch 3
11 X2
12 Ground (for switch 3&4) *
13 Y2
14 Switch 4
15 N.C. *
La unele interfeţe echiparea este doar pentru un singur joystick (până la pinul 7). Mai există şi
unele variante unde şi la pinul 8 găsim alimentare cu 5V.
În zilele noastre cel mai uzual interfaţa joystick o găsim pe plăcile de sunet împreună cu
interfaţa MIDI.
pin purpose
1 potentiometer common (Joy A)
2 button 1 (Joy A)
3 X coordinate potentiometer (Joy A)
4 button common (Joy A)
5 button common (Joy B)
6 Y coordinate potentiometer (Joy A)
7 button 2 (Joy A)
8 unused
9 potentiometer common (Joy B)
10 button 1 (Joy B)
11 X coordinate potentiometer (Joy B)
12 MIDI TXD (transmit) (computer -> midi)
13 Y coordinate potentiometer (Joy B)
14 button 2 (Joy B)
15 MIDI RXD (midi -> computer)
10 Concluzii şi perspective
Lucrarea de faţă abordează o temă de interes în momentul de faţă: teleoperarea,
respectiv teleprezenţa. În general în momentul de faţă trendul este spre distribuirea sistemelor,
spre globalizarea aplicaţiilor. Acest lucru este posibil datorită dezvoltării tehnicii de calcul, a
reţelelor de calculatoare, etc.
Implementarea practică a fost realizată punăndu-se accent pe blocuri standard, uşor
accesibile, ca de exemplu elementul de comandă de pe platforma robotizată (un PC standard),
dar şi elemente specifice acestei aplicaţii, cum ar fi partea de electronică de putere, logica de
comandă a acţionărilor. Acestea au fost dezvoltate specific, din motive economice.
11 Bibliografie
<1.> “Imaginea in sistemele multimedia“, Ing. Mihai MICEA
<2.> “PC analogue joystick interface“, ePanorama.net,
http://www.epanorama.net/documents/joystick/pc_joystick.html
<3.> “PC joystick interface circuits“, ePanorama.net,
http://www.epanorama.net/documents/joystick/ps_circuits.html
<4.> “Bidirectional H-Bridge DC-Motor Motion Controller”, W. S. WOODWARD,
J. PETERSON; Electronic design 26 July 1999
<5.> “Brief H-Bridge Theory Of Operation”, J. Brown; DPRG.org;
http://dprg.org/tutorials/1998-04a.html
<6.> “MOSFET H-Bridge Schematic & Theory Of Operation”; E. Blanchard;
http://www.cs.uwa.edu.au/~mafm/robot/blanch-h-bridge.html
<7.> "Resolvers vs. Rotary Encoders", Manolis, Steve; Motion Control, March 1993
Vol. 4, No. 3
<8.> “Pulse Width Modulation”, Michael Adler and Tim Surtell
<9.> “Programare socket în Windows”, Radu Stanciulescu
<10.> “Turning Sunlight Into Electricity”, U.S. Department of Energy Photovoltaics
Program
<11.> Constantine A. Balanis. Antenna theory: analysis and design. Wiley, 1997.
<12.> Wireless Community Wireless Community Networks, Robert L. Williams,
Texas State Library and Archives Commission Library Development Division,
1999
Figura 106 - Ax
#define FALSE 0
#define TRUE 1
#define OFF 1
#define ON 0
#define FORWARD 0
#define BACKWARD 1
//#define DEBUG
//#define DEBUGLEVEL2
#define PWM_CASE_NONE 0
#define PWM_CASE_X_FIRST 1
#define PWM_CASE_Y_FIRST 2
#define PWM_CASE_EQUAL 3
switch (period) {
case 1 :
TL0=TL0_reload_1;
TH0=TH0_reload_1;
if (PWM_X_CHANNEL_ENABLED)
X_CHANNEL_OUTPUT=OFF;
if (PWM_Y_CHANNEL_ENABLED)
Y_CHANNEL_OUTPUT=OFF;
if (PWM_CASE==PWM_CASE_EQUAL) period++; //sarim peste 2
//la urmatoarea executie
break;
case 2 :
TL0=TL0_reload_2;
TH0=TH0_reload_2;
switch (PWM_CASE) {
case PWM_CASE_X_FIRST:
if (PWM_X_CHANNEL_ENABLED)
X_CHANNEL_OUTPUT=ON;
if (PWM_Y_CHANNEL_ENABLED)
Y_CHANNEL_OUTPUT=OFF;
break;
case PWM_CASE_Y_FIRST:
if (PWM_X_CHANNEL_ENABLED)
X_CHANNEL_OUTPUT=OFF;
if (PWM_Y_CHANNEL_ENABLED)
Y_CHANNEL_OUTPUT=ON;
break;
}
break;
case 3 :
TL0=TL0_reload_3;
TH0=TH0_reload_3;
if (PWM_X_CHANNEL_ENABLED)
X_CHANNEL_OUTPUT=ON;
if (PWM_Y_CHANNEL_ENABLED)
Y_CHANNEL_OUTPUT=ON;
period=0;
break;
}
period++;
}
// get x speed
P10=0; //activate LdA
P10=1; //deactivate LdA
tempA1=*buf4;
tempA2=*buf5;
x_pos=tempA2*256+tempA1;
old_x_pos=x_pos;
// get y speed
P11=0; //activate LdB
P11=1; //deactivate LdB
tempB1=*buf1;
tempB2=*buf2;
y_pos=tempB2*256+tempB1;
old_y_pos=y_pos;
#endif
#endif
if (y_speed_get > y_speed_set)
// we must decrease the speed
if (PWM_Y_OFF > SPEED_PAS) {
#ifdef DEBUG
putchar('d');
#endif
PWM_Y_ON+=SPEED_PAS;
PWM_Y_OFF-=SPEED_PAS;
switch ((y_speed_set-y_speed_get)/10) {
default:
if (PWM_Y_OFF > SPEED_PAS) {
PWM_Y_ON+=SPEED_PAS;
PWM_Y_OFF-=SPEED_PAS;
}
case 2:
if (PWM_Y_OFF > SPEED_PAS) {
PWM_Y_ON+=SPEED_PAS;
PWM_Y_OFF-=SPEED_PAS;
}
case 1:
if (PWM_Y_OFF > SPEED_PAS) {
PWM_Y_ON+=SPEED_PAS;
PWM_Y_OFF-=SPEED_PAS;
}
case 0: break;
}
}
if (y_speed_get < y_speed_set)
// we must increase the speed
if (PWM_Y_ON > SPEED_PAS) {
#ifdef DEBUG
putchar('i');
#endif
PWM_Y_ON-=SPEED_PAS;
PWM_Y_OFF+=SPEED_PAS;
switch ((y_speed_get-y_speed_set)/10) {
default:
if (PWM_Y_ON > SPEED_PAS) {
PWM_Y_ON-=SPEED_PAS;
PWM_Y_OFF+=SPEED_PAS;
}
case 2:
if (PWM_Y_ON > SPEED_PAS) {
PWM_Y_ON-=SPEED_PAS;
PWM_Y_OFF+=SPEED_PAS;
}
case 1:
if (PWM_Y_ON > SPEED_PAS) {
PWM_Y_ON-=SPEED_PAS;
PWM_Y_OFF+=SPEED_PAS;
}
case 0: break;
}
#ifdef DEBUG
#ifdef DEBUGLEVEL2
putchar('-');
putchar(PWM_CASE);
putchar('-');
#ifdef DEBUGLEVEL3
putchar(TL0_reload_1);
putchar(TH0_reload_1);
putchar(TL0_reload_2);
putchar(TH0_reload_2);
putchar(TL0_reload_3);
putchar(TH0_reload_3);
#endif
#endif
#endif
TL1=TL1_RELOAD;
TH1=TH1_RELOAD;
}
temp=PWM_X_CHANNEL_ENABLED;
PWM_X_CHANNEL_ENABLED=FALSE;
X_CHANNEL_OUTPUT=1;
x_speed_set=0;
temp=PWM_Y_CHANNEL_ENABLED;
PWM_Y_CHANNEL_ENABLED=FALSE;
Y_CHANNEL_OUTPUT=1;
y_speed_set=0;
void init(void){
/*serial init*/
SCON=0x50; /*Enable receive*/
PCON=0x0;
TCON&=0xFB;
TL0=0;
TH0=0x0D;
T2MOD=0x00; /*Timer1 mode 2 */
// TH1=0xFD; /*9600 baud 11.059MHz */
T2CON=0x34; /*Start baud Clock*/
ET2=0;
TR2=1;
TL2=0xDC; //*AdrSerial19200;
TH2=0xFF;
RC2L=0xF5; //*AdrSerial19200;
RC2H=0xFF;
REN=1;
EX1=0;
TR0=1;
EA=1;
EX0=1;
IT0=1;
TMOD=0x11; // Timer 0 16 bit, Timer 1 16 bit
TR0=1;
TR1=1;
ET0=1; //Timer 0 interrupt
ET1=1;
TH0=0x59; // pt. T=100.2 microsecunde /0x59
CMOD=0x05;
CCON=0x40;
IPH=0x42;
IP=0x02;
PPCH=1;
}
void main(void){
unsigned char command;
unsigned char spd_x,spd_y;
init();
printf("Init ok");
P12=0;
P13=0;
while(1){
if (RI){
command=getc();
//putchar(command);
switch (command){
case SET_PWM:
printf("Waiting for PWM settings\n");
TL0_reload_1=getc();
TH0_reload_1=getc();
TL0_reload_2=getc();
TH0_reload_2=getc();
PWM_X_ON=(int)TH0_reload_1*256+(int)TL0_reload_1;
PWM_X_OFF=(int)TH0_reload_2*256+(int)TL0_reload_2;
printf("Settings are: %d %d %d
%d\n",(int)TL0_reload_1,(int)TH0_reload_1,(int)TL0_reload_2,(int)TH0_reload
_2);
break;
case DOWNLOAD:
break;
case GET_X_POS:
P10=0; //activate LdA
P10=1; //deactivate LdA
temp1=*buf4;
temp2=*buf5;
printf("t1=%d t2=%d\n",(int)temp1,(int)temp2);
break;
case GET_Y_POS:
P11=0; //activate LdB
P11=1; //deactivate LdB
temp1=*buf1;
temp2=*buf2;
printf("t1=%d t2=%d\n",(int)temp1,(int)temp2);
break;
case SET_X_SPEED:
printf("Waiting for X speed\n");
spd_x=getc();
#ifdef DEBUG
printf("got speed %c",spd_x);
#endif
if (spd_x < 128)
{
x_speed_set=128-spd_x;
if (X_CHANNEL_DIRECTION==BACKWARD) {
#ifdef DEBUG
printf("negative X speed = -%d ,
reversing\n",x_speed_set);
#endif
set_X_dir(FORWARD);
}
}
else
{
if (X_CHANNEL_DIRECTION==FORWARD) {
#ifdef DEBUG
printf("positive X speed,
reversing\n");
#endif
set_X_dir(BACKWARD);
}
else
x_speed_set=spd_x-128;
}
break;
case SET_Y_SPEED:
printf("Waiting for Y speed\n");
spd_y=getc();
printf("got speed %d",spd_y);
if (spd_y < 128)
{
if (Y_CHANNEL_DIRECTION==BACKWARD) {
#ifdef DEBUG
printf("negative Y speed, reversing\n");
#endif
y_speed_set=128-spd_y;
set_Y_dir(FORWARD);
}
}
else
{
if (Y_CHANNEL_DIRECTION==FORWARD) {
#ifdef DEBUG
printf("negative Y speed, reversing\n");
#endif
set_Y_dir(BACKWARD);
}
else
y_speed_set=spd_y;
}
break;
case START_X:
#ifdef DEBUG
printf("Channel X activated\n");
#endif
PWM_X_CHANNEL_ENABLED=TRUE;
x_speed_set=0;
break;
case START_Y:
#ifdef DEBUG
printf("Channel Y activated\n");
#endif
PWM_Y_CHANNEL_ENABLED=TRUE;
y_speed_set=0;
break;
case STOP_X:
#ifdef DEBUG
printf("Channel X disabled\n");
#endif
PWM_X_CHANNEL_ENABLED=FALSE;
X_CHANNEL_OUTPUT=1;
x_speed_set=0;
break;
case STOP_Y:
#ifdef DEBUG
printf("Channel Y disabled\n");
#endif
PWM_Y_CHANNEL_ENABLED=FALSE;
Y_CHANNEL_OUTPUT=1;
y_speed_set=0;
break;
case test_INC_SPEED_X:
x_speed_set+=5;
break;
case test_DEC_SPEED_X:
x_speed_set-=5;
break;
case test_INC_SPEED_Y:
y_speed_set+=5;
break;
case test_DEC_SPEED_Y:
y_speed_set-=5;
break;
case test_INC_SPEED_GET_Y:
y_speed_get+=5;
break;
case test_DEC_SPEED_GET_Y:
y_speed_get-=5;
break;
case test_PRINT_SPEEDS_X:
printf("x_speed_set=%d x_speed_get=%d PWM_X_ON=%ld
PWM_X_OFF=%ld\n",x_speed_set,x_speed_get,PWM_X_ON,PWM_X_OFF);
break;
case test_PRINT_SPEEDS_Y:
printf("y_speed_set=%d y_speed_get=%d PWM_Y_ON=%ld
PWM_Y_OFF=%ld\n",y_speed_set,y_speed_get,PWM_Y_ON,PWM_Y_OFF);
break;
}
} else;
};
}
#include "stdafx.h"
#include "Server.h"
#include "ServerDlg.h"
#include "UserMessage.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// CServerDlg dialog
BEGIN_MESSAGE_MAP(CServerDlg, CDialog)
//{{AFX_MSG_MAP(CServerDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_START_STOP, OnButtonStartStop)
ON_BN_CLICKED(IDC_BUTTON1, OnButtonSocketClear)
ON_BN_CLICKED(IDC_BUTTON2, OnButtonControlClear)
ON_BN_CLICKED(IDC_BUTTON3, OnButtonCom1Clear)
ON_BN_CLICKED(IDC_BUTTON4, OnButtonCom2Clear)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////
//
// CServerDlg message handlers
BOOL CServerDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this
automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
m_portCom1 = initcomm("COM1",9600);
m_portCom2 = initcomm("COM2",57600);
this->OnButtonStartStop();
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code
below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CServerDlg::OnPaint()
{
if (IsIconic())
{
// The system calls this to obtain the cursor to display while the user
drags
// the minimized window.
HCURSOR CServerDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
// Called when a user tries to connect to the server. Return TRUE to accept
// the connection or FALSE otherwise. The derived class must override this
// method.
BOOL CServerDlg::OnIsConnectionAccepted()
{
// Accept only 20 users as an example, you can change this number or
always
// return TRUE;
ASSERT(GetNbUsers() < 20);
// Called when a user is connected to the server. The derived class must
// override this method.
void CServerDlg::OnConnect(long /*lUserId*/)
{
// OnMessage: ChatUserJoin adds the user in the map, so nothing to do here
}
switch (message.GetId())
{
case ChatUserJoin:
{
CString strNickname;
message.GetAt(0, strNickname);
AddUser(lUserId, strNickname);
CString strUserJoin;
strUserJoin.Format(IDS_USER_JOIN, strNickname);
AddSystemText(strUserJoin);
SendMessageToAllUsersExceptFor(lUserId, message);
}
break;
case ChatText:
{
CString strText;
message.GetAt(0, strText);
message.SetAt(0, strNickname);
message.SetAt(1, strText);
case SpeedCommand:
{
CString strText;
message.GetAt(1, strText);
g_strCom2 = strText;
WriteCom2((LPVOID)m_portCom2);
message.SetAt(0, strNickname);
message.SetAt(1, strText);
}
break;
case PTCommand:
{
CString strText;
message.GetAt(1, strText);
g_strCom1 = strText;
WriteCom1((LPVOID)m_portCom1);
message.SetAt(0, strNickname);
message.SetAt(1, strText);
break;
case ChatBigMessage:
{
}
break;
}
}
// Called whenever a user is disconnected (the the user might have closed
// the connection or an error occurs when sending a message, for example).
// OnDisconnect callback isn't called when DisconnectUser or
// DisconnectAllUsers is used. DisconnectUser don't
// need to be called when OnDisconnect callback is called.
void CServerDlg::OnDisconnect(long lUserId, NDKServerDisconnection
disconnectionType)
{
CString strNickname;
m_mapIdsNicknames.Lookup(lUserId, strNickname);
CNDKMessage message(ChatUserQuit);
message.Add(strNickname);
UINT unResId = 0;
switch (disconnectionType)
{
case NDKServer_NormalDisconnection:
unResId = IDS_SERVER_CLOSE_USER;
break;
case NDKServer_ClientCloseConnection:
unResId = IDS_USER_QUIT;
break;
case NDKServer_ErrorSendingMessage:
unResId = IDS_ERROR_SENDING_MESSAGE;
break;
case NDKServer_ErrorReceivingMessage:
unResId = IDS_ERROR_SENDING_MESSAGE;
break;
default:
break;
}
CString strUserQuit;
strUserQuit.Format(unResId, strNickname);
//AddSystemText(strUserQuit);
DeleteUser(lUserId);
}
// Called when the ping from the user is received. The number of
// milliseconds is returned since PingUser was called.
void CServerDlg::OnPing(long lUserId, long lNbMilliseconds)
{
CString strNickname;
m_mapIdsNicknames.Lookup(lUserId, strNickname);
CString strPingReceived;
strPingReceived.Format(IDS_PING_RECEIVED, strNickname,
lNbMilliseconds);
//AddSystemText(strPingReceived);
}
m_mapIdsNicknames.Lookup(lUserId, strNickname);
m_mapIdsNicknames.RemoveKey(lUserId);
}
void CServerDlg::OnButtonStartStop()
{
if (UpdateData(TRUE))
{
if (IsStarted())
{
Stop();
UpdateUI();
AddSystemText((LPCSTR)IDS_STOPPED);
}
else
{
if (StartListening(m_lPort))
{
UpdateUI();
AddSystemText((LPCSTR)IDS_STARTED);
g_dlg = this;
//AfxBeginThread(ReadCom1, (LPVOID)m_portCom1);
}
else
{
AfxMessageBox(IDS_CANNOT_START, MB_ICONSTOP);
}
}
}
}
void CServerDlg::UpdateUI()
{
BOOL bEnable = IsStarted();
if (bEnable)
m_buttonConnect.SetWindowText(_T("&Stop"));
else
m_buttonConnect.SetWindowText(_T("&Start"));
}
//m_listBoxUsers.SetCurSel(nPos);
}
// EscapeCommFunction(comport,SETRTS);
}
UINT CServerDlg::ReadCom1(LPVOID p)
{
while(1)
{
char sir[1000] = {0};
int i=0;
char c = readcomm( (HANDLE)p );
while (c!='1')
{
sir[i++] = c;
c = readcomm( (HANDLE)p ) ;
}
CString str;
str.Format("-->> %s", _T(sir) );
g_dlg->m_listCom1.AddString(_T(str));
CNDKMessage message(ChatText);
message.SetAt(0, _T("Server") );
message.SetAt(1, _T(str) );
try
{
g_dlg->SendMessageToAllUsers(message);
}
catch(...)
{
AfxMessageBox("Eroare");
}
break;
}
return 0;
}
UINT CServerDlg::ReadCom2(LPVOID p)
{
while(1)
{
char sir[1000] = {0};
int i=0;
char c = readcomm( (HANDLE)p );
while (c!='1')
{
sir[i++] = c;
c = readcomm( (HANDLE)p ) ;
}
CString str;
str.Format("-->> %s", _T(sir) );
g_dlg->m_listCom2.AddString(_T(str));
CNDKMessage message(ChatText);
message.SetAt(0, _T(sir) );
message.SetAt(1, _T(sir) );
try
{
g_dlg->SendMessageToAllUsers(message);
}
catch(CException e)
{
AfxMessageBox("Eroare");
}
}
return 0;
}
void CServerDlg::OnButtonSocketClear()
{
m_listSocket.ResetContent();
}
void CServerDlg::OnButtonControlClear()
{
m_listControl.ResetContent();
}
void CServerDlg::OnButtonCom1Clear()
{
m_listCom1.ResetContent();
}
void CServerDlg::OnButtonCom2Clear()
{
m_listCom2.ResetContent();
}
UserMessage.h
#pragma once
#include "stdafx.h"
#include "try.h"
#include "tryDlg.h"
#include "livex.h"
#include "NDKMessage.h"
#include "ChatMessage.h"
#include "SpeedCommands.h"
#include "PTCommands.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// CTryDlg dialog
BEGIN_MESSAGE_MAP(CTryDlg, CDialog)
//{{AFX_MSG_MAP(CTryDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButtonStartVideo)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_BUTTON3, OnButtonConnect)
ON_BN_CLICKED(IDC_BUTTON2, OnButtonSend)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON4, OnButtonConfig)
ON_BN_CLICKED(IDC_BUTTON_STOP_1, OnButtonStop1)
ON_BN_CLICKED(IDC_BUTTON_FULL_1, OnButtonFull1)
ON_BN_CLICKED(IDC_BUTTON_REC_1, OnButtonRec1)
ON_BN_CLICKED(IDC_BUTTON_SNAP_1, OnButtonSnap1)
ON_BN_CLICKED(IDC_BUTTON_FULL_2, OnButtonFull2)
ON_BN_CLICKED(IDC_BUTTON_STOP_2, OnButtonStop2)
ON_BN_CLICKED(IDC_BUTTON_REC_2, OnButtonRec2)
ON_BN_CLICKED(IDC_BUTTON_SNAP_2, OnButtonSnap2)
ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
ON_BN_CLICKED(IDC_BUTTON6, OnButton6)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////
//
// CTryDlg message handlers
BOOL CTryDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_livex_started=FALSE;
m_livex2_started=FALSE;
m_iLastRSent=0;
m_iLastLSent=0;
m_slider1.SetRange(-100,100,FALSE);
m_slider2.SetRange(-100,100,FALSE);
m_slider1.SetPos(100);
m_slider2.SetPos(100);
UpdateData(TRUE);
poll_count=0;
//com1=initcomm("COM1");
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code
below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CTryDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
HCURSOR CTryDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CTryDlg::OnButtonStartVideo()
{
CString m_strIp,m_strUsername,m_strPasswd;
long m_lDataPort, m_lCommandPort;
m_livex.CreateX();
m_livex.SetIpAddress(m_strIp);
m_livex.SetCommandPort(m_lCommandPort);
m_livex.SetDataPort(m_lDataPort);
m_livex.SetAutoLogin(TRUE);
m_livex.SetUserName(m_strUsername);
if (m_strUsername=="guest")
{
m_livex.SetDisablePWD(TRUE);
}
else
{
m_livex.SetDisablePWD(FALSE);
m_livex.SetPassword(m_strPasswd);
}
m_livex.SetDefaultCam(1);
m_livex.PlayX();
m_livex_started=TRUE;
m_livex2.CreateX();
m_livex2.SetIpAddress(m_strIp);
m_livex2.SetCommandPort(m_lCommandPort);
m_livex2.SetDataPort(m_lDataPort);
m_livex2.SetAutoLogin(TRUE);
m_livex2.SetUserName(m_strUsername);
if (m_strUsername=="guest")
{
m_livex2.SetDisablePWD(TRUE);
}
else
{
m_livex2.SetDisablePWD(TRUE);
m_livex2.SetPassword(m_strPasswd);
}
m_livex2.SetDefaultCam(2);
m_livex2.PlayX();
m_livex2_started=TRUE;
}
void CTryDlg::OnOK()
{
CDialog::OnOK();
}
void CTryDlg::OnDestroy()
{
m_livex.StopX();
m_livex.DestroyX();
m_livex2.StopX();
m_livex2.DestroyX();
CDialog::OnDestroy();
}
message.GetAt(0, strNickname);
CString strUserJoin;
strUserJoin.Format(IDS_USER_JOIN, strNickname);
AddSystemText(strUserJoin);
}
break;
case ChatText:
{
CString strNickname;
CString strText;
message.GetAt(0, strNickname);
message.GetAt(1, strText);
case ChatUserQuit:
{
CString strNickname;
message.GetAt(0, strNickname);
CString strUserQuit;
strUserQuit.Format(IDS_USER_QUIT, strNickname);
AddSystemText(strUserQuit);
}
break;
}
}
switch (disconnectionType)
{
case NDKClient_NormalDisconnection:
unResId = IDS_DISCONNECTED;
break;
case NDKClient_ServerCloseConnection:
unResId = IDS_SERVER_CLOSE_CONNECTION;
break;
case NDKClient_ServerStop:
unResId = IDS_SERVER_STOPPED;
break;
case NDKClient_ErrorSendingMessage:
unResId = IDS_ERROR_SENDING_MESSAGE;
break;
case NDKClient_ErrorReceivingMessage:
unResId = IDS_ERROR_RECEIVING_MESSAGE;
break;
default:
break;
}
AddSystemText((LPCSTR)unResId);
if (disconnectionType==NDKClient_ErrorSendingMessage) if
(AfxMessageBox("Disconnected. Reconnect?",MB_RETRYCANCEL) == IDRETRY)
OnButtonConnect();
}
// Called when the ping from the server is received. The number of
// milliseconds is returned since PingServer was called.
void CTryDlg::OnPing(long lNbMilliseconds)
{
}
void CTryDlg::OnButtonConnect()
{
// TODO: Add your control notification handler code here
BOOL connected;
CString m_strNickname,m_strIp;
long m_lPort;
if (UpdateData(TRUE))
{
if (connected=IsConnected())
{
CloseConnection();
}
else
{
configDlg.GetSettings(m_strNickname,m_strIp, m_lPort);
if (OpenConnection(m_strIp, m_lPort))
{
AddSystemText((LPCSTR)IDS_CONNECTED);
CNDKMessage message(ChatUserJoin);
message.Add(m_strNickname);
SendMessageToServer(message);
}
else
{
AfxMessageBox(IDS_CANNOT_CONNECT,
MB_ICONSTOP);
}
}
connected=IsConnected();
if (connected)
m_buttonConnect.SetWindowText(_T("&Disconnect"));
else
m_buttonConnect.SetWindowText(_T("&Connect"));
}
}
void CTryDlg::OnButtonSend()
{
if (IsConnected()) {
if (UpdateData(TRUE))
{
CNDKMessage message(ChatText);
message.Add(m_strChat);
SendMessageToServer(message);
AddText(m_strChat);
m_strChat.Empty();
UpdateData(FALSE);
}
}
else AfxMessageBox("Not connected",MB_OK+MB_ICONSTOP);
CDialog::OnTimer(nIDEvent);
CString m_strCommand;
char m_strPTCommand;
int axis_x,axis_y,mot_r,mot_l,i;
unsigned char spd_x,spd_y;
BOOL stopped=TRUE;
char buffer[20];
axis_y=-m_joy.GetAxis(1)/10;
axis_x=-m_joy.GetAxis(2)/10;
itoa(axis_x,buffer,10);
m_axis_x.SetWindowText(buffer);
itoa(axis_y,buffer,10);
m_axis_y.SetWindowText(buffer);
m_chkButton1.SetCheck(m_joy.GetPressed(0));
m_chkButton2.SetCheck(m_joy.GetPressed(1));
// calculating speed_presets
if ((abs(axis_x) > 20) || (abs(axis_y) > 20))
{
if (axis_x > 0)
{
if (axis_y > 0)
{
mot_r=axis_x-axis_y;
mot_l=__max(axis_x,axis_y);
}
else
{
mot_r=__max(axis_x,abs(axis_y));
mot_l=axis_x+axis_y;
}
}
else //if (axis_x <= 0)
{
if (axis_y > 0)
{
mot_r=-__max(abs(axis_x),abs(axis_y));
mot_l=axis_y+axis_x;
}
else
{
mot_r=abs(axis_y)+axis_x;
mot_l=-__max(abs(axis_x),abs(axis_y));
}
}
stopped=FALSE;
}
else
{
mot_r=0;
mot_l=0;
stopped=TRUE;
}
spd_x=(mot_l/3)+128;
spd_y=(mot_r/3)+128;
if (stopped) {
m_strCommand=STOP_X;
m_strCommand+=STOP_Y;
}
else {
m_slider1.SetPos(-mot_l);
m_slider2.SetPos(-mot_r);
itoa(mot_l,buffer,10);
m_Mot_L.SetWindowText(buffer);
itoa(mot_r,buffer,10);
m_Mot_R.SetWindowText(buffer);
}
}
void CTryDlg::OnButtonConfig()
{
configDlg.DoModal();
void CTryDlg::OnButtonStop1()
{
CString stat;
if (m_livex_started)
{
m_stop_1.GetWindowText(stat);
if (stat=="Stop")
{
m_livex.PauseX();
m_stop_1.SetWindowText("Start");
}
else
{
m_livex.PlayX();
m_stop_1.SetWindowText("Stop");
}
}
}
void CTryDlg::OnButtonFull1()
{
if (m_livex_started) m_livex.FullScreenX();
}
void CTryDlg::OnButtonRec1()
{
CString stat;
if (m_livex_started)
{
m_rec_1.GetWindowText(stat);
if (stat=="Rec")
{
m_livex.SaveFileX("cam1.out");
m_rec_1.SetWindowText("Stop");
}
else
{
m_livex.StopFileSaveX();
m_rec_1.SetWindowText("Rec");
}
}
}
void CTryDlg::OnButtonSnap1()
{
if (m_livex_started)
{
m_livex.SnapShotX();
}
}
void CTryDlg::OnButtonFull2()
{
if (m_livex2_started) m_livex2.FullScreenX();
}
void CTryDlg::OnButtonStop2()
{
CString stat;
if (m_livex2_started)
{
m_stop_2.GetWindowText(stat);
if (stat=="Stop")
{
m_livex2.PauseX();
m_stop_2.SetWindowText("Start");
}
else
{
m_livex2.PlayX();
m_stop_2.SetWindowText("Stop");
}
}
}
void CTryDlg::OnButtonRec2()
{
CString stat;
if (m_livex2_started)
{
m_rec_2.GetWindowText(stat);
if (stat=="Rec")
{
m_livex2.SaveFileX("cam2.out");
m_rec_2.SetWindowText("Stop");
}
else
{
m_livex2.StopFileSaveX();
m_rec_2.SetWindowText("Rec");
}
}
}
void CTryDlg::OnButtonSnap2()
{
if (m_livex_started)
{
m_livex.SnapShotX();
}
}
void CTryDlg::OnButton5()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
CString command=START_X;
command+=SET_X_SPEED;
command+=m_strEdit3.GetAt(0)-'0';
SendSerial2(command);
}
configDlg.GetSettings(m_strNickname,m_strIp, m_lPort);
CNDKMessage ptcommand;
ptcommand.SetId(PTCommand);
ptcommand.SetAt(0,m_strNickname);
ptcommand.SetAt(1,chr);
SendMessageToServer(ptcommand);
}
configDlg.GetSettings(m_strNickname,m_strIp, m_lPort);
CNDKMessage sercommand;
sercommand.SetId(SpeedCommand);
sercommand.SetAt(0,m_strNickname);
sercommand.SetAt(1,chr);
SendMessageToServer(sercommand);
}
void CTryDlg::OnButton6()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
SendSerial1(m_strEdit3);
}
LPDWORD lpModemStat=(LPDWORD)malloc(sizeof(PDWORD));
fSuccess = WriteFile( hCom, &item, 1, &ni, NULL);
}
SpeedCommands.h
PTCommands.h
Joystick.cpp
#include "tryDlg.h"
#include "stdafx.h"
#include "try.h"
#include "Joystick.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
LPDIRECTINPUT8 g_pDI;
LPDIRECTINPUTDEVICE8 g_pJoystick;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Joystick::Joystick()
{
g_pDI=NULL;
g_pJoystick=NULL;
axis_x=0;
axis_y=0;
}
Joystick::~Joystick()
{
HRESULT Joystick::InitDirectInput()
{
HRESULT hr;
// Look for a simple joystick we can use for this sample program.
if( FAILED( hr = g_pDI->EnumDevices( DI8DEVCLASS_GAMECTRL,
EnumJoysticksCallback,
NULL, DIEDFL_ATTACHEDONLY ) ) )
return hr;
// Set the cooperative level to let DInput know how this device should
// interact with the system and with other DInput applications.
if( FAILED( hr = g_pJoystick->SetCooperativeLevel( base_Dlg-
>GetSafeHwnd(), DISCL_EXCLUSIVE |
DISCL_FOREGROUND ) ) )
return hr;
return S_OK;
}
// Stop enumeration. Note: we're just taking the first joystick we get.
You
// could store all the enumerated joysticks and let the user pick.
return DIENUM_STOP;
}
// For axes that are returned, set the DIPROP_RANGE property for the
// enumerated axis in order to scale min/max values.
if( pdidoi->dwType & DIDFT_AXIS )
{
DIPROPRANGE diprg;
diprg.diph.dwSize = sizeof(DIPROPRANGE);
diprg.diph.dwHeaderSize = sizeof(DIPROPHEADER);
diprg.diph.dwHow = DIPH_BYID;
diprg.diph.dwObj = pdidoi->dwType; // Specify the enumerated
axis
diprg.lMin = -1000;
diprg.lMax = +1000;
return DIENUM_CONTINUE;
}
hr = g_pJoystick->Poll();
if( FAILED(hr) )
{
// DInput is telling us that the input stream has been
// interrupted. We aren't tracking any state between polls, so
// we don't have any special reset that needs to be done. We
// just re-acquire and try again.
hr = g_pJoystick->Acquire();
while( hr == DIERR_INPUTLOST )
hr = g_pJoystick->Acquire();
axis_x=(axis_x+js.lX) / 2;
axis_y=(axis_y+js.lY) / 2;
// Axes
if (ax_Nr==1)
return axis_x;
else return axis_y;
hr = g_pJoystick->Poll();
if( FAILED(hr) )
{
// DInput is telling us that the input stream has been
// interrupted. We aren't tracking any state between polls, so
// we don't have any special reset that needs to be done. We
// just re-acquire and try again.
hr = g_pJoystick->Acquire();
while( hr == DIERR_INPUTLOST )
hr = g_pJoystick->Acquire();
config.cpp
LiveX.h
// Attributes
public:
CString GetIpAddress();
void SetIpAddress(LPCTSTR);
long GetCommandPort();
void SetCommandPort(long);
long GetDataPort();
void SetDataPort(long);
BOOL GetFixSize();
void SetFixSize(BOOL);
long GetFixWidth();
void SetFixWidth(long);
long GetFixHeight();
void SetFixHeight(long);
BOOL GetDisablePWD();
void SetDisablePWD(BOOL);
CString GetPassword();
void SetPassword(LPCTSTR);
CString GetUserName();
void SetUserName(LPCTSTR);
short GetDefaultCam();
void SetDefaultCam(short);
BOOL GetAutoLogin();
void SetAutoLogin(BOOL);
// Operations
public:
void PlayX();
void StopX();
void SaveX();
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately
before the previous line.
#endif //
!defined(AFX_LIVEX_H__188ED032_77BD_4757_82D9_1CED512AE4BE__INCLUDED_)