Simularea Unui Autovehicul

1. INTRODUCERE

2. Fundamentare teoretică

2.1 Modulul Bluetooth

2.2 Comunicația serială

2.2.1 Sincronizare – frecvența și faza

2.2.2 Codificarea datelor și controlul erorilor

2.3 Microcontrolerul PIC18F4431

2.4 Circuitul integrat TLE4276

2.5 Mediul de dezvoltare “Visual Studio 2010”

3. Partea practică a lucrării

3.1 Imaginea de ansamblu a lucrării

3.2 Implementarea HARDware

3.3 Implementarea SOFTware

3.3.1 Software microcontroler

3.3.2 Software Interfață grafică

3.3.2.1 Blocul Connection

3.3.2.2 Blocul Race MODE

3.3.2.3 Blocul Test MODE

3.3.2.4 Blocul Manual MODE (fereastra secundară)

3.3.2.5 Blocul Car Info

4. Rezumat

5. Concluzii

INDEX IMAGINI

Fig. 1 – Banda de frecvență de 2.4GHz și benzile alăturate 5

Fig. 2 – FHSS (Modulația cu spectru împrăștiat prin salt de frecvență) 6

Fig. 3 – Rețea piconet (PICOREȚEA) 6

Fig. 4 – Rețea Scatternet 7

Fig. 5 – Structura semnalului în standardul RS-232 12

Fig. 6 – Eșantioane de date asincrone: a. – ideale și b. – corupte 13

Fig. 7 – Arhitectura de tip Harvard 17

Fig. 8 – Diagrama pinilor pentru PIC18F4431 18

Fig. 9 – Conexiune transmițător-receptor 19

Fig. 10 – Schema regulatorului cu divizorul de tensiune extern 20

Fig. 11 – Robotul 23

Fig. 12 – Schema bloc 24

Fig. 13 – Conectarea fizică 25

Fig. 14 – Implementarea schemei pentru simularea modulului UART 26

Fig. 15 – Simularea protocolului UART, caracterul B exprimând biții de date 26

Fig. 16 – Regiștrii TXSTA, RCSTA, BAUDCTL (imagini preluate din foaia de catalog) 27

Fig. 17 – Fereastra principală 31

Fig. 18 – Căsuță text – acțiunile utilizatorului 32

Fig. 19 – Tastele din blocul numeric pentru controlul direcției 36

Fig. 20 – Exemplu de informare când se virează spre dreapta în fereastra secundară 36

Fig. 21 – Căsuța text cu un exemplu de date recepționare 38

Fig. 22 – Nivelele de detectare a senzorului din dreapta 39

Fig. 23 – Reprezentarea modurilor de operare 41

Fig. 24 – Imaginile informative dacă mașina este ridicată 43

INTRODUCERE

De la începutul revoluției industriale, oamenii mereu au visat la mașini mai performante, cu cât mai multe funcții, și să execute sarcini ce nu au putut fi efectuate la momentul respectiv. De-a lungul evoluției tehnologiei, oamenii și-au imaginat cât mai multe funcționalități a acestora, de exemplu, cand au apărut calculatoarele la fel de mari cât o cameră, s-a pus întrebarea dacă poate să facă și altceva să fie de dimensiuni mai mici, mai rapide și mai inteligente, și iată că tehnologia a evoluat foarte mult, și s-a ajuns la calculatoare de dimensiuni foarte reduse și mult mai performante. În ceea ce privește mașinile, ne-am imaginat dacă mașinile ar putea zbura, sau dacă într-o zi mașinile se vor conduce singure, fără intervenția omului. În zilele noastre, mașinile sunt capabile să se parcheze singure, dar mașinile autonome sunt deja în dezvoltare de către marii producători și mai ține doar de o chestiune de perfecționare a tehnologiei. Se optează pentru mașini autonome pentru reducerea accidentelor rutiere și de a elimina erorile umane.

În această lucrare se dorește să se simuleze un autovehicul asemănător cu cele din lumea reală la o scară mai mică cu propulsie electrică controlat de la distanță, dar care să parcurgă un traseu autonom care ocolește obstacole întâlnite pe parcursul acestuia, și să se oprească la detectarea unui metal. De altfel, mașina mai poate fi controlată și manual de la consolă în exemple de aplicații în scopuri militare, unde se poate trimite mașina în locul omului pentru a nu pune în pericol viața acestuia, sau în locuri greu accesibile omului și să ofere anumite informații.

Acest proiect a reușit să fie funcțional prin împărțirea sarcinilor între cei trei membri care au contribuit la construirea acestui proiect în felul următor:

– prima parte a acestui proiect a fost realizată de Răzlog Beatrice – Nicoleta implementând partea hardware (proiectare circuite, cablaj) și controlul autonom de la distanță prin procesare de imagini

– a doua parte a proiectului a fost realizată de Vlad Azoiței dezvoltând software-ul pentru microcontroler

– a treia parte a proiectului este cea care va fi descrisă în această lucrare și constă în realizarea comunicării dintre mașină și consolă (Laptop) dezvoltând o aplicație grafică (Graphical User Interface) ce controlează mașina de la distanță și afișează diferite informații primite de la robot pentru a le afișa utilizatorului în mod grafic pentru o interpretare mai ușoară.

Acest proiect a participat la două concursuri obținând următoarele premii:

– Locul I – Concursul “Microcontrolere și aplicații” – Mihail Konteschweller 2014

– Locul II – Competiția studențească Electromobility3 organizată de firma Continental Automotive IAȘI

2. Fundamentare teoretică

2.1 Modulul Bluetooth

Tehnologia Bluetooth a ajuns cea mai cunoscută soluție de conectare fără fire între două dispozitive asemănătoare sau diferite pentru o piață în continuă dezvoltare de dispozitive predominând cele portabile precum telefoane mobile, camere digitale foto și video, calculatoare, -uri, imprimante, televizoare, periferice (mouse, tastatură, căști) etc.

Avantajele acestei tehnologii ce permit operarea fără intervenția utilizatorilor la un consum foarte mic de putere (de ordinul miliwatti-lor 1 – 100mW), determină ca fiind potrivită pentru în utilizarea dispozitivelor de mici dimensiuni, portabile, ce sunt alimentate îndeosebi cu baterii sau acumulatori.

În această tehnologie Bluetooth, comunicația este realizată în radiofrecvență, fiind folosită o bandă de frecvențe de 2.4 GHz (mai exact între 2.402 GHz și 2.480 GHz ) care nu necesită licență și poate fi folosită astfel aproape oriunde în lume. Banda este împărțită în 79 de canale radio, fiecare canal având o lărgime de bandă de 1 MHz.

Utilizând această bandă de frecvență ce nu necesită cost pentru licență, întâmpinăm dezavantaje precum interferența radio pentru că în această bandă mai operează și alte tehnologii de comunicație de radiofrecvență din domenii diferite de activitate cum ar fi telefoane cordless (“fixe” fără fir), uși de garaj și bariere automate, rețelele fără fir 802.11 (Wi-Fi), dispozitive de monitorizare a nou născuților etc.

Această aglomerație de dispozitive ce utilizează aproximativ aceeași bandă provoacă interferențe, iar acest lucru conduc dispozitivele care sunt în starea de “transmisie”, în starea “waiting in line”, rezultând încetinirea ratei de transfer. Pentru a reduce problemele create de interferență, tehnologia Bluetooth utilizează tehnica denumită FHSS (Frequency-Hopping Spread Spectrum). Spectrul împrăștiat se referă la diferite tehnici ce presupun împărțirea benzii radio disponibilă în diferite frecvențe sau canale. “Frequency hopping” (Saltul în frecvență) este o tehnică des utilizată pentru spectrul împrăștiat, în cadrul căreia un semnal sare de pe o frecvență pe alta în cadrul aceleiași transmisii (Fig. 2).

Din acest punct de vedere, putem spune ca Bluetooth-ul își schimbă aleator frecvența de-a lungul unui spectru de frecvență, comutând pe o altă frecvență după finalizarea recepției sau transmisiei fiecărui pachet de date. Așadar, transmisia Bluetooth nu se realizează pe o singură frecvență pentru o perioadă prea lungă de timp pentru a evita interferența. Ținând cont de faptul că dispozitivele radio Bluetooth lucrează conform unui model FHSS descris anterior, această cale de comunicație constă dintr-o secvență bine definită de frecvențe la care se face transmisiunea, selectate pseudo-aleator dintr-un set posibil de valori (79 de frecvențe între 2.402GHz și 2.480GHz, cu pasul de 1 MHz) și care se schimbă de 1600 de ori pe secundă, fapt pentru care spunem că se face un salt al frecvenței (frequency hop).

În facilitarea procesului de transmisie, datele sunt împărțite în entități mai mici, numite pachete. Saltul în frecvență nu e o tehnologie nouă, dar comparativ cu alte dispozitive ce utilizează banda de 2.4GHz, pentru dispozitivele cu Bluetooth, acesta este rapid și utilizează pachete mici.

Când două dispozitive stabilesc o legătură Bluetooth, unul activează în rolul de master iar celălalt ca slave, existând posibilitatea ca un dispozitiv oarecare să funcționeze ca master într-o legătură și ca slave într-o altă legătură. La un master se pot lega până la 7 slave-uri active, sau încă 255 de slave-uri dacă acestea sunt în modul park, rețeaua formată numindu-se piconet (picorețea Fig.3). Rolul de master nu conferă unui dispozitiv nici un fel de privilegii sau autoritate, masterul fiind responsabil de sincronizarea dispozitivelor legate la el. Toate slave-urile care comunică cu un același master își schimbă frecvența în același timp cu masterul.

Un dispozitiv se poate lega la un piconet în două moduri:

1) Un dispozitiv poate intra în starea de interogare pentru a descoperi alte dispozitive. În cadrul acestei stări este furnizată și informația legată de serviciile de care are nevoie dispozitivul. Dispozitivul care oferă unul sau mai multe din aceste servicii cerute, va răspunde dacă se află în modul activ. Procesul de stabilire a canalului între unul sau mai multe dispozitive va depinde și de nivelul de securitate folosit.

2) Masterul poate căuta dispozitive și dacă găsește, le introduce automat în piconet, în funcție de nivelul de securitate definit pe dispozitive.

Două sau mai multe picorețele se pot intersecta și la rândul lor formează o rețea scatternet (Fig. 4), fiind posibil ca unul dintre dispozitive să aibă rol de master într-un piconet și de slave în alt piconet.

Distanța între două dispozitive în care se poate stabili un canal de comunicație depinde de clasa de putere. Tabelul de mai jos afișează cele trei clase de putere și distanța de conectare maximă specifică fiecăreia.

Tabel 1 – Clase de putere a modulelor Bluetooth

Specificațiile pentru Bluetooth au fost scrise cu intenția simplității conectării între două dispozitive astfel că majoritatea producătorilor de dispozitive aleg varianta configurării lor fără setări de securitate.

Standardul Bluetooth permite setarea a trei nivele de securitate descrise mai jos :

Nivelul 1 – No security. Dispozitivul permite conectarea oricărui alt dispozitiv.

Nivelul 2 – Service level security. Măsurile de securitate sunt inițiate după ce canalul de comunicație a fost stabilit. Suportă autentificare, criptare și autorizare.

Nivelul 3 – Link level security. Măsurile de securitate sunt inițiate înainte de stabilirea comunicației. Suportă autentificare și criptare.

Dispozitivele configurate cu nivelul 1 de securitate nu implică nici un mecanism de securitate. Nivelul 2 este cel mai flexibil. După ce o comunicație a fost stabilită, se pot aplica diferite tipuri de securitate pe fiecare aplicație sau serviciu. Este util în cazul în care spre exemplu se dorește autentificare, autorizare și criptare pentru o aplicație ce gestionează o bază de date importantă iar pe același dispozitiv nu se dorește securitate pentru agenda cu cărți de vizită. Nivelul 3 este cel mai securizat dar e mai puțin flexibil. Cand se dorește un canal de comunicație în nivelul 3, autentificarea si criptarea se produc înaintea stabilirii canalului de comunicație. Toată informația schimbată între cele două dispozitive este criptată. Autorizarea nu este necesară pentru că se presupune că două dispozitive conectate în nivelul 3, ar trebui să poată accesa toate aplicațiile si serviciile disponibile pe fiecare dispozitiv.

Riscurile de a lăsa dispozitivele în modul activ (vizibil ) și de a nu implementa cel puțin nivelul 2 de securitate pot expune dispozitivele la:

date importante disponibile oricui

inițierea de apeluri telefonice de la telefoane compromise

instalare de malware cu scopul de infectare ulterioară a altor dispozitive sau cu intenția de a obține controlul dispozitivului

O politică minimă de securitate ar trebui să includă:

configurarea dispozitivelor astfel încât utilizatorul să poată aproba orice cerere de comunicație
presupune că două dispozitive conectate în nivelul 3, ar trebui să poată accesa toate aplicațiile si serviciile disponibile pe fiecare dispozitiv.

Riscurile de a lăsa dispozitivele în modul activ (vizibil ) și de a nu implementa cel puțin nivelul 2 de securitate pot expune dispozitivele la:

date importante disponibile oricui

inițierea de apeluri telefonice de la telefoane compromise

instalare de malware cu scopul de infectare ulterioară a altor dispozitive sau cu intenția de a obține controlul dispozitivului

O politică minimă de securitate ar trebui să includă:

configurarea dispozitivelor astfel încât utilizatorul să poată aproba orice cerere de comunicație

dezactivarea Bluetooth atunci când nu se folosește

alegerea nivelului 2 sau 3 de securitate

minimizarea distanței până la care să poată comunica dispozitivul (ideal clasa 3 de putere)

Dacă standardele actuale permit transferuri teoretice de 3 Mbit/s, viitorul prezintă scenarii foarte promițătoare pentru iPods, camere video/digitale, PCs, etc.:

posibilitatea transferului unui album MP3 sau a sute de imagini în doar o secundă

streaming video de pe o camera video sau telefon mobil direct pe un televizor

conectarea a două telefoane mobile pentru jocuri multi-player

Viziunea Motorola asupra High Speed Bluetooth merge chiar mai departe și propune un scenariu în care filmele vor putea fi transferate prin Bluetooth din mall-uri sau aeroporturi pe telefoane mobile, PDA sau laptop pentru a fi apoi vizionate în avion sau acasă.

Profilurile Bluetooth

Un profil Bluetooth este proiectat ca un set de funcționalități pentru aceste dispozitive. De exemplu, un telefon mobil și un PDA trebuie să suporte profilul de sincronizare pentru a-și sincroniza date între ele. În vederea trimiterii unor obiecte de date, ca de exemplu fișiere “.vcf” , de pe PDA pe telefon, ambele dispozitive trebuie să aibă implementat profilul Object Push. În final, ambele dispozitive ar trebui să suporte profilul Dial-Up Networking în vederea accesării de către PDA printr-o conexiune wireless a Internetului de pe telefon. Aceste dispozitive trebuie să aibă implementat același profil. Folosind aceste profiluri se asigură și interoperabilitatea între dispozitive de la diferiți producători. Voi prezenta câteva dintre aceste profiluri împreună cu o scurtă descriere:

Generic Access Profile (GAP) – Este profilul de bază pentru toate celelalte. El definește funcționalitatea Bluetooth de bază ca de exemplu setarea conexiunilor L2CAP, asigură aspectul securității și al descoperirii dispozitivelor.

Serial Port Profile (SPP) – Asigură conexiune serială bazată pe RFCOMM din stiva de protocoale Bluetooth. Acest profil este folosit și în funcționarea acestui proiect.

Dial Up Networking Profile (DUNP) – Definește funcționalitatea dispozitivelor pentru Dial Up Networking gateway.

FAX Profile – Definește funcționalitatea dispozitivelor Bluetooth folosite ca FAX gateway.

Headset Profile – Definește funcționalitatea cerută la transferul audio cu dispozitive Bluetooth.

LAN Access Point Profile – Definește funcționalitatea pentru dispozitivele Bluetooth folosite ca punct de acces în LAN.

Generic Object Exchange Profile (GOEP) – Asigură pentru protocolul OBJECT Exchange (OBEX)

The Cordless Telephony Profile – Oferă posibilitatea dispozitivelor Bluetooth de a acționa ca dispozitive mobile (fără fir)

File Transfer Profile – Oferă funcționalitatea de a naviga prin foldere (copiere / ștergere / creare fișiere în dispozitivele Bluetooth)

Object Push Profile – Oferă funcționalitate pentru schimbarea de obiecte vCard (cărți de vizită / contacte) și vCalendar (note din calendar)

Synchronization Profile – Oferă funcționalitate pentru sincronizarea obiectelor stocate

Intercom Profile – Oferă posibilitatea dispozitivelor Bluetooth să-și stabilească o legatură directă de comunicație similară intercom

Serial Port Profile (SPP) – Acest profil definește cerințele dispozitivelor cu Bluetooth necesare pentru crearea unei conexiuni seriale fără cabluri utilizând comunicația în radio frecvență (RFCOMM) între două dispozitive împerecheate. Cerințele sunt exprimate în ceea ce privește serviciile oferite de aplicații, precum și prin definirea caracteristicilor și procedurile care sunt necesare pentru interoperabilitatea între dispozitive Bluetooth.

Profilul Serial port definește protocoalele si procedurile care vor fi utilizate de către dispozitive ce utilizează Bluetooth-ul pentru emularea cablului serial RS-232. Scenariul pentru care este destinat acest profil este acela de a înlocui cablurile între două dispozitive ce vor să comunice, ceea ce se potrivește și în scenariul nostru cele două dispozitive fiind PC-ul și robotul. Despre comunicația serială și tipuri de comunicație serială voi detalia în următorul capitol.

2.2 Comunicația serială

Comunicația serială reprezintă o metodă de transmisie a datelor care trimite informațiile bit cu bit de la un dispozitiv la altul. Caracteristica principală a acestei modalități de comunicație este transmiterea bit cu bit a informației, pe un număr redus de linii de transmisie, la o viteză mai mică decât transmisia în paralel a biților de date, dar cu posibilitatea de transmitere pe o distanță mai mare comparativ cu comunicația paralelă.

După modul în care se face comunicarea serială avem comunicare serială sincronă și comunicare serială asincronă. Comunicarea serială sincronă folosește un semnal de ceas care indică când o anumită dată este validă. Comunicarea serială asincronă se folosește de structura informației transmise pentru a realiza sincronizarea între emitor și receptor.

Pentru a realiza compatibilitatea între echipamente produse de diverși producători au fost introduse niște standarde pentru comunicarea serială. Cele mai cunoscute standarde de comunicare serială sunt RS 232 și RS 485.

RS 232 este un standard de comunicare serială asincronă, bidirecțională, folosit pentru transmiterea caracterelor codului ASCII. Codificarea bitului de informație se face prin nivele de tensiune mai mari de 3 V pentru „0” logic și nivele de tensiune mai mici de -3 V pentru „1” logic. Valorile cuprinse în intervalul -3V – +3V nu sunt compatibile cu standardul RS 232. Valorile tensiunilor pot ajuge până la ± 25 V.

În Figura de mai jos (Fig.5) este prezentată structura unui pachet de informație transmis de prin standardul RS 232.

Cu toate că transferul paralel este mai rapid, majoritatea transmisiilor de date între calculatoare sunt făcute pe cale serială pentru a reduce costul cablului și conectorilor. Există și limitări fizice de distanță, care nu pot fi depășite de magistrale paralele. Toate comunicațiile sunt caracterizate de trei elemente principale:

Date – înțelegerea lor, scheme de codificare, cantitate

Temporizări – sincronizarea între receptor și emițător, frecvența și faza

Semnale – tratarea erorilor, controlul fluxului și rutare

2.2.1 Sincronizare – frecvența și faza

Este necesar un mecanism care să permită receptorului să citească corect bitul curent de intrare la jumătatea duratei lui. Receptorul trebuie să știe durata unui bit și de unde începe bitul respectiv, adică trebuie să cunoască frecvența și faza secvenței de date. Dacă emițătorul și receptorul au același semnal de tact, sincronizarea este perfectă; emițătorul scrie bitul pe frontul crescător al tactului, iar receptorul citește bitul pe frontul coborâtor al tactului. Problemele apar când receptorul și emițătorul nu au un semnal de tact comun. Dacă duratele celor două semnale de tact, pentru emițător si receptor, nu sunt egale, apare o decalare, care după un anumit număr de biți rezultă într-o eroare. Pentru a evita aceasta, receptorul trebuie resincronizat regulat la nivel de bit. Din alte motive, trebuie resincronizate și începutul unui caracter, pachet sau mesaj.

În figura următoare (Fig. 6), în primul caz, fiecare bit este citit la mijlocul duratei lui, iar în cazul al doilea, bitul 4 se pierde deoarece tactul receptorului este prea încet.

Dacă emițătorul și receptorul au același semnal de tact atunci se spune că lucrează în mod Sincron. Altfel, dacă au semnale de tact separate, atunci lucrează în mod Asincron.

Transmisiunea Asincronă este folosită, de regulă, atunci când datele care trebuie transmise sunt generate la intervale aleatoare, spre exemplu de la o tastatură. În acest caz, între caractere vor fi pauze mari și receptorul trebuie să aibă posibilitatea de a determina începutul fiecărui caracter nou recepționat. În modul asincron, emițătorul nu trimite un tact deodată cu datele, ci inserează un pseudo-impuls de tact, cunoscut ca Bit de Start, în fața fiecărui octet transmis. Astfel, pentru fiecare caracter ASCII avem o transmisie independentă, cu adăugarea biților de Start, Stop și Paritate (poate lipsi). Viteza de lucru se stabilește manual la începutul transmisiei. Pentru informația de fază, receptorul trebuie să detecteze începutul bitului de Start. Pentru ca această metodă să funcționeze, trebuie să existe, o perioadă de pauză între caractere, realizată cu bitul de Stop.

În modul Sincron, caracterele sunt transmise rapid, unul după altul, fără biți de Start și de Stop. Pentru sincronizare, mesajul transmis este precedat de caractere speciale de sincronizare, detectabile de circuitul receptorului. Acestea sunt transmise încontinuu și când nu sunt date de transmis. Daca baza de timp nu este sincronizata, datele vor fi reconstituite cu erori. Deci, prin intermediul acelor simboluri de sincronizare, receptorul delimiteaza corect caracterele.

Transmisiile în mod sincron pot folosi scheme inteligente de modulare, care se bazează pe circuite suplimentare, iar semnalele de date și tact folosesc aceeași pereche de fire. Această metodă, cunoscută sub numele de codificare Manchester, este folosită în rețelele Ethernet.

O metodă sincronă alternativă este folosită pentru transmisii seriale rapide non-caracter, orientate pe bit. Protocoale care folosesc această metodă permit transferul de date la viteze mari.

Este preferată transmisiunea sincronă deoarece nu este eficient să se adauge, fiecărui caracter sau octet, elementele de start și de stop atunci când se transmit blocuri mari de date și la debite mari. Se pot transmite combinațiile de cod care corespund acestor caractere una după alta fără pauze și fără elementele de start și de stop.

2.2.2 Codificarea datelor și controlul erorilor

Erorile pot apărea când circuitele folosite pentru conexiune sunt afectate de zgomot (interferențe electrice) cum ar fi: lămpi fluorescente, comutarea unor motoare mari, etc. Aceste vârfuri sunt induse în firele de comunicație care se comportă ca niște antene. Deoarece tensiunile cu care se lucrează în calculatoare sunt mici, efectul generat de acest zgomot este important. Circuitele respective trebuie să fie imune la aceste zgomote.

Canalele moderne de comunicație sunt din ce în ce mai fiabile. Metodele de detecție și corecție a erorilor se îndreaptă spre domeniile CD-ROM-urilor si DVD-urilor. Toate aceste metode implică introducerea de informație neesențială, pe lângă datele utile, în transmisia datelor. Există mai multe metode care merită să fie studiate:

Biți de paritate – simplu de aplicat , nu oferă siguranță mare

Sume de control la nivel de bloc – simplu de aplicat, nu ajută prea mult

Împărțire polinomială – mai complicat de calculat, dar oferă securitate

De exemplu, receptorul trimite înapoi o copie a datei primite. Acest mecanism înjumătățește lățimea de bandă folosită. O alternativă ar fi ca emițătorul să trimită data urmată de o copie a acesteia. Toate metodele de tratare a erorilor folosesc informație redundantă. De cele mai multe ori, aceste informații sunt codificate înainte de transmisie.

Paritatea este cea mai discutată metodă de detecție a erorilor pentru protecția transmisiilor seriale de caractere ASCII. La oricare din metode, emițătorul prelucrează o parte din date și generează un fel de semnătură pe care apoi o transmite împreună cu date utile. Când mesajul ajunge la receptor, acesta prelucrează datele primite și generează o semnătură pe care o compară cu cea primită. Dacă cele două semnături nu coincid, atunci s-a produs o eroare. Metoda bitului de paritate se poate aplica pentru date binare de orice lungime. Pentru fiecare cuvânt este adăugat un bit de paritate (semnătura). Paritatea poate fi pară (cuvântul conține un număr par de 1) sau impară (cuvântul conține un număr impar de 1). Calcularea parității se poate face cu operatorul XOR (SAU Exclusiv ) între biții cuvântului. Prin această metodă este posibilă doar detecția erorii singulare, când sunt afectați un număr impar de biți. O eroare dublă (afectează un număr par de biți) nu poate fi detectată prin acest mecanism. Prin urmare, această metodă nu oferă prea multă securitate. Un singur bit de paritate nu oferă informații despre poziția erorii.

În schimb, codurile Hamming reprezintă o altă metodă care permite și localizarea erorii prin adăugarea a mai mult de un bit de paritate după biții utili. Este astfel posibilă detecția si corecția erorii. Problema este "unde sunt poziționați biții de paritate între biții utili?" Răspuns: pentru biții de paritate se alocă pozițiile care sunt puteri ale lui 2 în cuvântul dat. De exemplu, pentru 4 biți utili avem următoarea așezare:

Tabel 2 – Așezarea biților de paritate între biții utili

Unde D1, D2, D3, D4 sunt biți utili și P1, P2, P3, P4 sunt biți de paritate. Cu formula se poate calcula numărul de biți utili acoperiți de un număr de biți de paritate.

Suma de control la nivel de bloc este alt mecanism de detecție a erorilor de transmisie. Prima dată este necesar ca datele să fie împărțite in blocuri, care apoi se însumează și se obține o sumă care va fi trunchiată, inversată și adăugată la sfârșit. La recepție, blocurile primite, care includ și suma de la sfârșit, se adună pe măsură ce sosesc, și dacă suma obținută nu este 0 atunci înseamnă că datele sunt eronate și secvența trebuie retransmisă. Nu este posibilă corecția erorii.

O altă metodă de detecție a erorilor este CRC (Cyclic Redundant Check). Și în acest caz se calculează o sumă de control, dar prin împărțire aritmetică. Secvența de biți este împărțită cu un număr special ales. Împărțirea se face în modulo 2, adică folosind operatorul XOR. Restul împărțirii reprezintă semnătura care va fi adăugată la sfârșit, după biții utili. Divizorul se obține cu algoritmul folosit la codurile Hamming. La recepție, se recalculează restul împărțirii și dacă nu coincide cu cel primit, atunci secvența este eronată. Performanțele acestei metode sunt impresionante. Un CRC care generează un rest de 16 biți poate detecta:

toate erorile în rafală de maxim 16 biți

toate numerele impare de biți din eroare

99.998 % din toate erorile de orice lungime

CRC-ul se poate calcula mai ușor prin metode hardware, folosind registre cu deplasare și porți logice XOR.

Controlul fluxului de date este utilizat pentru a preveni erorile de depășire atunci când receptorul nu este capabil să prelucreze datele care vin cu viteză prea mare. La început, datele sunt recepționate corect, dar nu pot fi prelucrate cu viteza cu care alte date sosesc și astfel se umple buffer-ul de recepție, rezultând o eroare de depășire. În acest caz, datele vechi din buffer vor fi înlocuite de date noi, înainte de a fi prelucrate. Pentru a evita această eroare, receptorul trebuie să poată să-i ceară emițătorului să oprească transmisia până când sunt prelucrate toate datele din buffer-ul de recepție (golire). Această facilitate se numește controlul fluxului de date și este un element esențial pentru toate legăturile de comunicație.

Mecanismul poate fi implementat în mai multe moduri:

Cu ecou – receptorul trimite înapoi la emițător fiecare caracter primit

Hardware – folosind liniile de control RTS/CTS (RequestToSend/ClearToSend)

Software – prin coduri de control ^S/^Q (Stop/Continuare)

La nivel de cadru – prin codurile ACK/NAK (Acknowledge/Negativeacknowledge)

2.3 Microcontrolerul PIC18F4431

Un microcontroler îl putem defini ca fiind un computer mic care înglobează într-o singură structură un microprocesor, diferite tipuri memorie și periferice programabile de intrare / ieșire ce ajută la comunicarea acestuia cu mediul exterior. Microcontrolerele sunt destinate sistemelor încapsulate-integrate (“embedded systems”) și sunt folosite în aplicații pentru automatizarea unor procese sau interacțiuni cu mediul exterior fără să fie necesară intervenția omului.

Utilizarea lor în zilele noastre este răspândită în foarte multe domenii printre care se pot menționa: în industria de automobile (controlul aprinderii (motorului), direcția, climatizare, diagnoză, sisteme de alarmă, reglarea oglinzilor etc.), în așa zisa electronică de consum (sisteme audio, televizoare, camere video și videocasetofoane, telefonie mobilă, GPS-uri, jocuri electronice etc.), în aparatura electrocasnică (mașini de spălat, frigidere, cuptoare cu microunde, aspiratoare), în controlul mediului și climatizare (sere, locuințe, hale industriale), în industria aerospațială, în mijloacele moderne de măsurare – instrumentație (aparate de măsură, senzori și traductoare inteligente), la realizarea de periferice pentru calculatoare, în medicină ș.a. Faptul că sunt folosite pe scară largă într-o diversitate mare de domenii și în industrii mari îi determină pe producători (ex: Microchip, Atmel, Fujitsu, Texas Instruments, Motorola, Infineon etc.) să producă microcontrolere la costuri reduse, și cu tehnologii noi an de an.

Microcontrolerul folosit în această aplicație este unul pe 8 biți din familia PIC18F produs de firma Microchip, acesta fiind construit pe o arhitectură Harvard (Fig.7) ceea ce înseamnă că există spații de memorie separate pentru program și date. În consecință există și magistrale separate de adrese și date (săgețile reprezentate în figura de mai jos) pentru codul instrucțiunilor și respectiv pentru date, instrucțiunile microcontrolerului se pot executa într-un singur ciclu mașină datorită acestui tip de arhitectură.

În figura de mai jos este prezentată diagrama pinilor microcontrolerului PIC18F4431 în cazul capsulei de 40 de pini de tip PDIP.

După cum observăm din diagrama pinilor, microcontrolerul dispune de 40 de pini grupați pe porturi astfel: PORTA (8 pini RA0->RA7), PORTB (8 pini RB0->RB7), PORTC (8 pini RC0->RC7), PORTD (8 pini RD0->RD7) și PORTE (3 pini RE0->RE2). Pentru alimentarea microcontrolerului folosim pinii VDD și VSS cu o tensiune cuprinsă între 4.2V – 5.5V, iar AVDD și AVSS pot fi folosiți pentru a seta valoarea pragurilor de referință ale convertorului analog numeric.

Acest microcontroler are un oscilator intern de 8MHz, dar dacă aplicația necesită frecvențe de lucru mai mari, pe pinii OSC1 și OSC2 se poate atașa un oscilator extern (Quartz) de 10MHz și cu ajutorul circuitului PLL (Phase Lock Loop) inclus în microcontroler ce permite multiplicarea frecvenței de oscilație de 4 ori, microcontrolerul poate atinge frecvența maximă de 40MHz. De altfel, microcontrolerul poate funcționa și pe frecvențe mai mici divizând frecvența oscilatorului intern atingând valorile de 4MHz, 2MHz, 1MHz, 500KHz, 250KHz, 125KHz și respectiv 31 KHz.

Cum și alte circuite de procesare permit lucrul în întreruperi, și acest microcontroler dispune de multiple surse de întrerupere atât interne (Timer, Convertor analog numeric) cât și externe (pe pini dedicați întreruperilor). După denumirea de “întrerupere” înțelegem oprirea (sau întreruperea) din execuție a programului principal tratând întreruperea într-o rutină specială, deoarece întreruperile într-un microcontroler sunt văzute ca niște evenimente speciale (prioritare față de programul ciclic).

Pentru a face legătura cu exteriorul unde întâlnim mărimi analogice, microcontrolerul transformă aceste mărimi analogice în mărimi digitale cu ajutorul convertorului analog-numeric pe 10 biți prescurtat ADC disponibil pe 9 canale. Valoarea de intrare în acest convertor trebuie să fie cuprinsă între 0V și 5V, astfel, întreg domeniul de variație este divizat într-un număr finit de „cuante” (trepte elementare) de mărime determinată de rezoluția sistemului (în cazul nostru 10 biți) și astfel pentru valoare de 0V avem la ieșire valoarea 0, iar pentru valoarea de 5V avem la ieșire valoarea 1023.

Pentru comunicarea cu alte dispozitive, microcontrolerul dispune de modulul EUSART (Enhanced Universal Syncronous Asyncronous Receiver Transmitter) sau sub altă denumire Interfață de comunicare serială (SCI). Acest modul are implementate funcții adiționale precum detectarea și calibrarea automată a ratei de transfer (baudrate) și auto-trezire la recepția unui caracter.

Schimbul de date se reazlizează prin cei doi pini ai microcontrolerului și anume, pe pinul RC7 (RX) se primesc datele de la pinul TX de la celălalt dispozitiv, iar pe pinul RC6 (TX) se transmit datele către pinul RX celuilalt dispozitiv. Un exemplu de conexiune este prezentat în figura de mai jos:

2.4 Circuitul integrat TLE4276

TLE4276 este un regulator de tensiune joasă într-o capsulă de tip TO220-5-3 produs de firma Infineon. Integratul stabilizează o tensiune de intrare de până la 40V la o tensiune nominală de 5V, 8.5V, 10V dar și o tensiune reglabilă. Curentul maxim de ieșire este de 400mA. Acest integrat poate fi oprit prin intrarea de inhibare, care determină consumul de curent să scadă sub 10 µA și are protecție la scurt circuit incluzând și protecție la temperatură oprind circuitul depășind un anumit prag.

Amplificatorul de control compară o tensiune de referință la o tensiune care este proporțională cu tensiunea de ieșire și conduce baza tranzistorilor în serie printr-un buffer. Controlul saturației în funcție de curentul de sarcină previne orice suprasaturare a elementului de alimentare. Integratul include de asemenea o serie de circuite interne de protecție împotriva:

– suprasarcinii

– supraîncălzirii

– inversarea polarității

Tensiunea de ieșire a regulatorului TLE4276 poate fi reglată între 2.5V și 20V cu ajutorul unui divizor de tensiune de ieșire extern inchizând bucla de control prin pinul VA. Tensiunea la pinul VA este comparată cu tensiunea de referință internă tipică de 2.5V într-un amplificator de eroare. Tensiunea de ieșire este calculată după urmatoarea formulă:

, considerând

Astfel, tensiunea de ieșire de care avem nevoie pentru alimentarea modulului Bluetooth de 3.3 V, avem nevoie ca rezistența R1 să fie de 3,2kΩ, iar R2 de 10kΩ conform formulei de mai sus.

2.5 Mediul de dezvoltare “Visual Studio 2010”

Un mediu de dezvoltare integrat (IDE) sau mediul de dezvoltare interactiv, este o aplicație software care oferă facilități complete pentru programatori în dezvoltarea de aplicații. Un IDE are înglobate toate elementele necesare creării unui program, precum editarea codului sursă, compilarea, depanarea, testarea, generearea de documentație care, de regulă, oferă o interfață grafică cu utilazatorul, prietenoasă.

Principalele componente ale unui mediu de dezvoltare sunt editorul de cod sursă și depanatorul. Mediile de dezvoltare apelează compilatoare, sau interpretoare, care pot veni în același pachet cu mediul însuși, sau pot fi instalate separat de către programator. Printre facilitățile prezente în mediile de dezvoltare mai sofisticate se numără: exploratoare de cod sursă, sisteme de control al versiunilor, designere de interfețe grafice, sau unelte de ingineria programării.

De obicei un mediu de dezvoltare este specific unui anumit limbaj de programare, însă există la ora actuală și medii de dezvoltare care pot lucra cu mai multe limbaje, de ex. Eclipse sau Microsoft Visual Studio.

Microsoft Visual Studio este un mediu de dezvoltare integrat (integrated development environment-IDE) oferit de compania Microsoft. Acesta poate fi folosit pentru a dezvolta aplicații consolă și aplicații cu interfață grafică pentru toate platformele suportate de Microsoft Windows (ex. .NET Framework, Windows Mobile etc.).

De-a lungul anilor s-au creat mai multe versiuni, o parte din ele fiind prezentate în tabelul de mai jos:

Tabel 3 – Istoricul versiunilor

Înaintea apariței versiunii 4.0 a existat Visual Basic 3, Visual C++, Visual FoxPro si Source Safe ca și produse independente. Microsoft oferă în conținutul programului Visual Studio editor, compilator/debugger și mediu de proiectare (graphic design) pentru diverse limbaje de programare incluse precum: Microsoft Visual C++, Microsoft Visual C#, Microsoft Visual Basic, Microsoft Visual Web Developer, de asemenea, Microsoft prin pachetul Visual Studio sprijină și XML/XSLT, HTML/XHTML, JavaScript și CSS.

Mediul de dezvoltare Visual Studio 2010 vine în 4 tipuri de variante:

Express

Ultimate

Premium

Professional

Aplicațiile dezvoltate cu ajutorul acestui mediu de dezvoltare, oferă portabilitatea codului compilat între diferite calculatoare (sau alt tip de dispozitive) cu sistem de operare Windows cât și reutilizarea codului în alte programe, deoarece platforma .NET înglobează mai multe tehnologii precum ASP, XML, OOP, SOAP, WDSL, UDDI dar și limbaje de programare (ex: C++, VB, C#). Pentru integritatea lor în platforma .NET, programele menționate trebuie să respecte un set de caracteristici de bază Common Language Specification (CLS), astfel se beneficiază de interoperabilitatea între aplicații, indiferent de limbajul folosit în crearea acestora.

Dintre avantajele utilizării platformei .NET Framework putem enumera:

oferă instrumente pe care le putem folosi și în alte programe

oferă acces ușor la baze de date

permite realizarea desenelor sau a altor elemente grafice

spațiul de nume System::Windows::Forms conține instrumente ce permit implementarea elementelor interfeței grafice cu utilizatorul

oferă clase care efectuează majoritatea sarcinilor uzuale cu care se confruntă, reducând astfel timpul necesar dezvoltării aplicațiilor

3. Partea practică a lucrării

3.1 Imaginea de ansamblu a lucrării

În acest proiect se prezintă o modalitate de operare a unui robot de la distanță prin intermediul sistemelor embedded printr-o metodă de comunicație fără fir. Acest robot trebuie să parcurgă autonom trasee până la întâlnirea unui metal, moment în care trebuie să se oprească, și de altfel întâlnind obstacole, acesta trebuie să se ferească / să le ocolească fără intervenția omului, având și un mod separat de cel autonom în care mașina este controlată manual de către un utilizator. Robotul are o construcție asemănătoare cu mașinile din lumea reală doar că la o scară mai mică și cu caracteristici diferite în ceea ce privește tracțiunea, în acest proiect motorul termic fiind înlocuit de două motoare electrice BLDC (motoare fără perii) trifazate, câte unul pe fiecare roată din față, direcția acestuia realizându-se prin diferența de turație dintre cele două motoare.

Detecția de obstacole se realizează cu ajutorul a 3 senzori ultrasonici plasați în fața robotului, iar sub șasiu detectorul de metale. Circuitul electronic al mașinii dispune de multe funcții cum ar fi, monitorizarea bateriei, monitorizarea consumului de curent, viteza cu care se deplasează robotul, distanța parcursă, timpul care s-a scurs de când începe parcurgerea traseului, starea în care se află robotul, măsurarea distanței până la obstacol.

Aceste toate informații sunt transmise către interfața grafică prin modulul Bluetooth folosind protocolul UART. Interfața grafică primește aceste informații de la mașină și le afișează utilizatorului în diverse moduri intuitive pentru a putea fi interpretate ușor. De altfel, prin aplicația grafică alegem modul prin care vrem să lucreze robotul (autonom sau manual) și să trimitem comenzile către acesta prin intermediul Bluetooth-ului.

Schema bloc a întregului circuit este prezentată în figura de mai jos, și blocurile pe care o să le prezint în această lucrare:

Blocurile ce vor fi detaliate în această lucrare sunt cele din partea dreaptă diferențiate prin altă culoare din Fig. 12 și anume Interfața grafică realizată în mediul Visual Studio 2010, modulul Bluetooth de pe robot împreună cu “creierul” robotului, microcontrolerul PIC18F4431, și mai exact partea de comunicare (UART) a acestuia.

3.2 Implementarea HARDware

Implementarea hardware acestei lucrări constă în legăturile fizice făcute pentru realizarea comunicației dintre robot și consola de pe care un utilizator controlează și vizualizează anumiți parametri ai robotului. Aceste legături fizice se pot observa în figura de mai jos:

Modulul Bluetooth face legătura dintre Microcontroler și consolă pe care se află interfața grafică ce controlează mașina. Consola (PC-ul) are integrat un modul Bluetooth asemănător cu cel atașat microcontrolerului. Practic, transmisia se face fără fir datorită acestor două adaptoare.

Modulul UART al microcontrolerului folosește pinul 26 (RX) pentru recepționarea datelor primite prin Bluetooth de la consolă, iar pinul 25 (TX) pentru transmiterea informațiilor către consolă.

Pentru testarea funcționării modulului UART înainte de a fi implementat fizic, am realizat o simulare în care rulează un program ciclic foarte simplu pe microcontroler, acesta având rolul de a trimite la fiecare 0,5 secunde pe pinul 25 (TX) caracterul “B”. În simulare este atașat un osciloscop virtual în care se poate vizualiza forma de undă pe pinul TX al microcontrolerului în momentul transmiterii caracterului “B”, iar sub osciloscop se află un terminal care are rolul de a descifra folosind tabelul ASCII datele primite prin modulul UART și afișează caracterul sau șirul de caractere conform datelor recepționate. Pentru editarea codului programat în microcontroler s-a folosit mediul de dezvoltare MPLAB oferit de firma Microchip, dar mai multe detalii se găsesc în capitolul Software microcontroler. Acest program oferă un fișier *.hex ce rezultă în urma compilării, urmând a fi încărcat în simulator. Implementarea schemei pentru simulare este prezentată în figura următoare:

După cum se observă în osciloscopul din simulare, forma de undă reprezintă caracterul “B” în codare binară. Din tabela de caractere ASCII (American Standard Code for Information Interchange) se extrage valoarea zecimală corespunzătoare caracterului “B” și anume 66. Această valoare convertită în binar este 01000010, iar la analiza formei de undă cu specificația că nivelul HIGH (5V) este reprezentat ca 1 și nivelul LOW (0V) este reprezentat ca 0, se observă că biții de date sunt conform valorii binare a caracterului “B” . De altfel, se respectă protoculul UART ca la început să fie un bit de START și după biții de date să fie un bit de STOP, ceea ce este exemplificat în figura de mai jos:

3.3 Implementarea SOFTware

3.3.1 Software microcontroler

Dezvoltarea software a microcontrolerului a fost realizată în mediul de dezvoltare MPLAB 8.70 ce folosește compilatorul HI-TECH ANSI C pentru familia PIC18F de microcontrolere produse de firma MICROCHIP. Încărcarea codului în microcontroler se realizează cu programatorul PICKIT2. Pentru configurarea modulului UART se folosesc 3 regiștri și anume: registrul TXSTA, RCSTA, și BAUDCTL.

Folosind acești regiștri se construiește funcția de inițializare USARTInit() pentru modulul UART în modul asincron după cum urmează:

void USARTInit()

{

TRISC6=1; //setare pinul RC6 ca pin de intrare

TRISC7=1; //setare pinul RC7 ca pin de intrare

SPBRG=255; //rata de transfer de 9600 biți pe secundă pentru fosc=40MHz

BRGH=1; //opțiunea pentru o viteză a ratei de transfer ridicată

TXEN=1; //activare transmisie

TX9=0; //transmisie pe 8-biți

RX9=0; //recepție pe 8-biți

CREN=1; //activare recepție

SPEN=1; //activare comunicație serială

SYNC=0; //selectare comunicare asincronă

BRG16=0; //generator rată de transfer pe 8 biți

RCIE=1; //activare întrerupere la recepție

TXIE=0; //dezactivare întrerupere la transmisie

}

Observația care trebuie făcută în funcția de inițializare ar fi că deși pinii RC6 (TX) și RC7 (RX) sunt configurați ca pini de intrare, partea de control a modulului EUSART va reconfigura automat acești pini ca pini de intrare în pini de ieșire după cum este nevoie. Încărcarea registrului SPBRG cu valoarea 255 este stabilită pe baza unui tabel (prezentat mai jos) oferit de producător în foaia de catalog pentru o rată de transfer de 9600 biți pe secundă.

Bitul RCIE face parte din registrul PIE1 care conține biții individuali de activare a întreruperilor perifericelor. În inițializare, bitul RCIE ia valoarea 1, împreună cu bitul GIE=1 (ce activează întreruperile globale) și PEIE=1 (activează întreruperile perifericelor) din registrul INTCON, ce ceea înseamnă că o întrerupere are loc la recepționarea unui cuvânt de informație.

La declanșarea întreruperii, bit-ul de flag RCIF capătă valoarea 1 (RCIF=1) ce ajută la verificarea producerii unei întrerupere la momentul primirii unui mesaj. Acest flag trebuie șters în rutina de întrerupere atribuindu-i valoarea 0 (RCIF=0).

Rutina de întrerupere pentru recepționarea unor date este următoarea:

void interrupt intreruperi(void)

{

if(RCIF==1&&RCIE==1) //verific dacă s-a produs întrerupere

{

RCIF=0; //șterg bitul de flag

valcitit=RCREG; //RCREG conține informația recepționată

}

}

În funcția principală de program, “valcitit” este buffer-ul ce conține informația recepționată de la consolă, iar în funcție de conținutul acestuia se iau anumite decizii precum modul în care funcționează robotul, iar dacă se dorește modul manual, vor fi primite informații pentru decizii în ce direcții să meargă robotul. Toate acestea sunt descrise mai în amănunt în capitolul de implementare software a interfeței grafice.

Pentru transmiterea informațiilor de la robot către consolă, se folosesc 3 funcții ale UART-ului:

USARTWriteString(string) – folosită pentru transmiterea unui caracter sau a unui șir de caractere

USARTWriteInt(parametru,x_int) – folosită pentru transmiterea unui parametru ce conține numere, iar x_int reprezintă lungimea parametrului

USARTWriteLine() – folosită pentru a marca sfârșitul de linie a întregului șir de caractere trimis către consolă pentru a putea fi interpretate ușor la consolă

Rutina de trimitere acestor informații se realizează la fiecare 100ms, timp suficient pentru citirea buffer-ului la consolă având o rată de transfer de 9600 biți pe secundă. În cazul în care se transmit informațiile mai rapid, este posibil ca în consolă să nu reușească citirea buffer-ului de intrare la timp, pentru că este posibil să se suprapună noi informații peste buffer-ul de intrare înainte ca acesta să fie citit, deci rezultând pierderea unor informații. Funcția de trimitere a datelor este următoarea:

void trimiteInformatii(void)

{

if(flag100ms==1) //se trimite la fiecare 100ms

{

flag100ms=0; //se resetează contorul de 100ms

/*se transmit valorile senzorilor de distanță */

USARTWriteString("S1");

USARTWriteInt(valSenzor1,2);

USARTWriteString("S3");

USARTWriteInt(valSenzor3,2);

USARTWriteString("S2");

USARTWriteInt(valSenzor2,2);

/*se transmite distanța parcursă exprimată în cm */

USARTWriteString("D");

USARTWriteInt(distantaParcursa,4);

/* se transmite viteza exprimată în m/min */

USARTWriteString("V");

USARTWriteInt(viteza,4);

/* se transmite timpul scurs */

USARTWriteString("T");

USARTWriteInt(secunde,3);

/* se transmite informația privind capacitatea bateriei */

USARTWriteString("B");

USARTWriteInt(valADC1,3);

/* se transmite informația privind starea în care se află robotul */

USARTWriteString("ST=");

switch(stare)

{

case st_stop: USARTWriteString("0"); break;

case st_inainte: USARTWriteString("1"); break;

case st_inapoi: USARTWriteString("2"); break;

case st_stanga: USARTWriteString("3"); break;

case st_dreapta: USARTWriteString("4"); break;

case st_inainte_stanga: USARTWriteString("5"); break;

case st_inainte_dreapta: USARTWriteString("6"); break;

case st_inapoi_stanga: USARTWriteString("7"); break; case st_inapoi_dreapta: USARTWriteString("8"); break;

case st_nitro: USARTWriteString("9"); break;

}

/* se transmite informația privind modul în care este utilizat robotul */

USARTWriteString("W");

if(race_mode) {USARTWriteString("R");}

if(manual_mode) {USARTWriteString("M");}

if(test_mode) {USARTWriteString("T");}

if(stop_mode) {USARTWriteString("0");}

/* se transmite informația dacă robotul este ridicat sau nu */

USARTWriteString("L");

if(flagContor3Secunde) { USARTWriteString("1"); }

else { USARTWriteString("0"); }

USARTWriteLine(" "); //sfârșit de linie

}//end if flag100ms

} //end void

Forma finală care ajunge la consolă după trimiterea acestor informații de la microcontroler, arată sub forma următoare: S100S300S200D0000V0000T000B000ST=0W0L0. Acest șir de caractere este descris în capitolul din interfața grafică cum este segmentat și prelucrat pentru “descifrarea” informațiilor despre robot și afișate în mod grafic cu rolul de a putea fi interpretate ușor de către utilizator.

3.3.2 Software Interfață grafică

Interfața grafică a fost realizată în mediul Visual Studio 2010 folosind limbajul Visual Basic. Această aplicație este alcătuită din două ferestre, una principală și una secundară ce este folosită doar la controlul manual al robotului. Fereastra principală conține elemente grafice precum butoane, cadrane, imagini și elemente grafice animate ce imită aparate de măsură precum vitezometru și nivelul bateriei. Din fereastra principală, se deschide fereastra secundară folosind un buton dedicat. Toate acestea având rolul de a face utilizarea și interpretarea unor informații mai ușoare unui utilizator.

În figura de mai sus este prezentată fereastra principală a aplicației, din care se observă că aceasta este structurată în 5 blocuri: în stânga sus partea de conexiune (Connection), mai jos se află blocul pentru controlul Autonom al robotului (RACE MODE), și sub acesta blocul pentru testarea funcționalității motoarelor (TEST MODE), și ultimul din stânga de jos este butonul ce activează controlul manual al robotului, apoi în partea dreaptă, un bloc mare în care sunt afișate diverse informații despre robot (CAR Info).

3.3.2.1 Blocul Connection

Blocul Connection conține o căsuță combo prin care se selectează portul COM ce este asociat adaptorului Bluetooth de pe mașinuță dintr-o listă de porturi seriale COM disponibile pe calculatorul unde se folosește aplicația.

Dim my_ports As Array 'declarare vector de caractere

my_ports = IO.Ports.SerialPort.GetPortNames()'se extrage lista de porturi disponibile

portcombobox.Items.AddRange(my_ports) 'transfer lista de porturi disponibile în căsuța combo

După selecția portului COM, este disponibil un buton ce realizează conexiunea dintre PC și robot (butonul Connect).

If (Not portcombobox.SelectedItem Is Nothing) Then 'se verifică dacă s-a selectat unul din COM

connect.Enabled = True 'butonul CONNECT devine disponibil

End If

Sub căsuța combo, se află o bară de stare ce demonstrează dacă conexiunea este realizată sau nu, aceasta fiind goală când nu există conexiune, și plină când există conexiune. De altfel, mai există și o etichetă text care are același rol cu bara de stare, doar că informează utilizatorul sub formă de text privind starea conexiunii (Connected / Disconnected). Mai jos, este situată o căsuță text în care se vor înregistra acțiunile făcute de utilizator pe interfața grafică împreună cu timpul (ora, minut, secunda) ca în imaginea de mai jos, iar tot ce se adaugă în această căsuță se formează un fișier de tip text (D:\SENT_Log.txt) pentru o salvare a istoricului.

La apăsarea butonului Connect, interfața grafică interpretează această acțiune ca un eveniment. Acest eveniment lucrează ca o funcție, odată ce este apelată se execută ce este în interiorul funcției, aceasta realizează conexiunea dintre PC și mașină prin portul serial emulat de bluetooth-ul intern al PC-ului.

Public Sub connect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles connect.Click

Try

portserial.PortName = portcombobox.Text 'COM7 selectat din căsuța COMBO

portserial.BaudRate = 9600 'viteza ratei de transfer

portserial.Open() 'deschidere port serial (conectare la robot)

Catch ex As Exception

MsgBox("Com PORT selected is not available!")

End Try

If portserial.IsOpen Then 'se verifică dacă a reușit conexiunea

connect.Enabled = False 'dezactivare buton conectare

disconnect.Enabled = True 'activare buton deconectare

ProgressBar1.Value = 100 'bara de stare se umple

Label1.Text = "Connected" 'eticheta text afișează Connected

Label1.ForeColor = Color.Green 'eticheta text Connected este colorată cu verde

ENABLE_BUTTONS() 'se activează toate butoanele de comandă

End If

End Sub

Butonul Disconnect nu face decât să oprească conexiunea dintre PC și mașină și să reseteze anumite elemente precum butoane, imagini și etichete text prin apelarea funcției RESET().

Private Sub disconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles disconnect.Click

sendbox.AppendText(Now.ToString("HH:mm:ss") & "-> " & "Disconnect task" & vbCrLf)

RESET()

End Sub

La apăsarea fiecarui buton din interfață se află o comandă care trece în căsuța text prezentă în Fig. 18 de mai sus, acțiunile făcute de utilizator împreună cu timpul când acțiunea respectivă a avut loc. Funcția folosită este următoarea:

sendbox.AppendText(Now.ToString("HH:mm:ss") & "-> " & "ACȚIUNEA DORITĂ" & vbCrLf)

3.3.2.2 Blocul Race MODE

Blocul RACE MODE este alcătuit din 3 butoane ce îndeplinesc funcții elementare pentru mașină. Primul buton, Enable RACE MODE este cel care îi transmite mașinii să intre în modul autonom în care trebuie să ia decizii singură privind ocolirea obstacolelor cu ajutorul senzorilor ultrasonici și oprirea la detectarea unui metal. Butonul trebuie să execute două funcții, una în care se trimite caracterul “r” pe portul serial prin Bluetooth, și una în care se trece acțiunea în căsuța text conform comandei de mai sus.

Private Sub racemode_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

Handles racemode.Click

portserial.Write("r") 'se trimite caracterul r către mașină pentru RACE MODE

sendbox.AppendText(Now.ToString("HH:mm:ss") & "-> " & "Enter in RACEMODE" & vbCrLf)

End Sub

Butonul START RACE trimite caracterul “s” pe portul serial și are rolul de a porni mașina în explorarea traseului, și odată ce s-a trimis această comandă, nu se mai poate interveni asupra mașinii decât să se oprească la comanda de oprire prin butonul STOP.

Private Sub send_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles startbtn.Click

portserial.Write("s") 'se trimite caracterul s către mașină pentru START RACE MODE

sendbox.AppendText(Now.ToString("HH:mm:ss") & "-> " & "START Command" & vbCrLf)

End Sub

La fel ca și în cazul butonului START RACE, se procedează și cu butonul STOP, diferența constă în caracterul care se trimite, în acest caz se trimite caracterul “d”.

Private Sub stopbtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles stopbtn.Click

portserial.Write("d") 'se trimite caracterul d către mașină pentru STOP

endbox.AppendText(Now.ToString("HH:mm:ss") & "-> " & "STOP Command" & vbCrLf)

End Sub

3.3.2.3 Blocul Test MODE

Blocul TEST MODE este format din 8 butoane cu rolul de a testa funcționalitatea fiecărui motor în ambele sensuri. Primul buton, Enable TEST MODE, este pentru activarea modului de testare a mașinii, trimițând caracterul “t” pe portul serial.

Private Sub testmode_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles testmode_btn.Click

portserial.Write("t") 'se trimite caracterul t către mașină pentru TEST MODE

sendbox.AppendText(Now.ToString("HH:mm:ss") & "-> " & "Enter in TESTMODE" & vbCrLf)

End Sub

Butonul FORWARD este folosit pentru testarea rotirii ambelor motoare cu sensul înainte, pe portul serial fiind transmis caracterul “8”.

Private Sub testfwd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles test_fwd_btn.Click

portserial.Write("8")'se trimite char 8 către mașină pentru rotirea înainte ambelor motoare

sendbox.AppendText(Now.ToString("HH:mm:ss") & "-> " & "Spin BOTH motors forward (TEST MODE)" & vbCrLf)

End Sub

Butonul BACKWARD are aceeași funcționalitate ca și butonul FORWARD, doar că sensul rotirii motoarelor este înapoi, iar caracterul trimis pe portul serial este “2”.

Private Sub testbwd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles test_bwd.Click

portserial.Write("2") 'se trimite char 2 către mașină pentru rotirea înapoi ambelor motoare

sendbox.AppendText(Now.ToString("HH:mm:ss") & "-> " & "Spin BOTH motors backward (TEST MODE)" & vbCrLf)

End Sub

Butonul Motor LEFT – FORWARD face ca doar motorul din stânga să se rotească înainte, caracterul “6” fiind trimis prin portul serial.

Private Sub testleftfwd(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles test_left_fwd_btn.Click

portserial.Write("6") 'se trimite char 6 pentru rotirea motorului din stânga înainte

sendbox.AppendText(Now.ToString("HH:mm:ss") & "-> " & "Spin LEFT motor forward (TEST MDOE)" & vbCrLf)

End Sub

Butonul Motor LEFT – BACKWARD determină ca doar motorul din stânga să se rotească înapoi, caracterul “k” fiind trimis prin portul serial.

Private Sub testleft_bwd(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles test_left_bkwd_btn.Click

portserial.Write("k") 'se trimite char k pentru rotirea motorului din stânga înapoi

sendbox.AppendText(Now.ToString("HH:mm:ss") & "-> " & "Spin LEFT motor backward (TEST MODE)" & vbCrLf)

End Sub

Butonul Motor RIGHT – FORWARD trimite caracterul “q” pe portul serial și face ca doar motorul drept să se rotească înainte.

Private Sub testright_fwd(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles test_right_fwd_btn.Click

portserial.Write("q") 'se trimite char q pentru rotirea motorului din dreapta înainte

sendbox.AppendText(Now.ToString("HH:mm:ss") & "-> " & "Spin RIGHT motor forward (TEST MODE)" & vbCrLf)

End Sub

Butonul Motor RIGHT – BACKWARD trimite caracterul “j” pe portul serial și rezultă rotirea motorului drept înapoi.

Private Sub testright_bkwd(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles test_right_bkwd_btn.Click

portserial.Write("j") 'se trimite char j pentru rotirea motorului din dreapta înapoi

sendbox.AppendText(Now.ToString("HH:mm:ss") & "-> " & "Spin RIGHT motor backward (TEST MODE)" & vbCrLf)

End Sub

Butonul STOP din acest bloc are rolul de a opri motorul sau motoarele aflate în funcționare în modul de testare. Caracterul trimis pe portul serial este “5”.

Private Sub stop_test_btn (ByVal sender As System.Object, ByVal e As System.EventArgs) Handles stop_test_btn.Click

portserial.Write("5") 'se trimite char 5 pentru oprirea motoarelor

sendbox.AppendText(Now.ToString("HH:mm:ss") & "-> " & "BRAKE motor(s) (TEST MODE)" & vbCrLf)

End Sub

3.3.2.4 Blocul Manual MODE (fereastra secundară)

Modul manual este activat prin apăsarea butonului Enter in MANUAL MODE. Acest buton deschide fereastra secundară a acestei aplicații și permite controlul manual de la distanță a mașinii. În această fereastră apare o pictogramă cu o mașină și în funcție de tastele care sunt apăsate conform acțiunii pe care utilizatorul dorește să o facă asupra mașinii, apar alte pictograme care arată direcția în care se îndreaptă mașina. Controlul acesteia se face prin apăsarea unei singure taste sau combinații de două taste din blocul numeric de la tastatura PC-ului.

De exemplu, dacă se dorește ca mașina să meargă înainte se apasă doar tasta 8, iar în combinație cu tasta 0 (TURBO), mașina merge înainte cu o viteză mai mare. Pentru o virare spre dreapta în timpul deplasării înainte, se menține tasta 8 apăsată și se combină cu tasta 6, iar în fereastra secundară apare pictograma corespunzătoare ca în figura alăturată.

Pentru o virare spre stânga sau spre dreapta pe loc, se apasă doar tasta 4 pentru stânga pe loc, iar tasta 6 pentru dreapta pe loc. La fel se procedează când se dorește ca mașina să meargă în spate, se apasă tasta 2, iar pentru virare cu spatele, se ține tasta 2 apăsată și se combină cu tasta 4 pentru o virare cu spatele spre stânga, iar pentru virare cu spatele spre dreapta se combină cu tasta 6. Pentru frânare se apasă tasta 5 sau se lasă butonele eliberate.

Mediul de dezvoltare Visual Studio 2010, interpretează două evenimente la apăsarea unei taste, prima în cazul în care tasta este apăsată (tastă jos), iar a doua când se ia degetul de pe tastă (tastă sus). Mai jos este prezentat un exemplu pentru detectarea tastei 8 dacă este apăsată și dacă este eliberată:

Private Sub _keydown(ByVal Sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Button1.KeyDown, MyBase.KeyDown

If e.KeyValue = Keys.NumPad8 Then 'se verifică dacă tasta apăsată este 8

forward = 1 'se setează flagul pentru detectarea tastei 8 apăsate

End If

End sub

Private Sub _keyup(ByVal Sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Button1.KeyUp, MyBase.KeyUp

If e.KeyValue = Keys.NumPad8 Then 'se verifică dacă tasta eliberată este 8

forward = 0 'se șterge flagul pentru detectarea tastei 8 apăsate (nu mai e apăsată)

End If

End sub

Pentru închiderea ferestrei secundare se apasă butonul din stânga jos Close (return to main), și se revine la fereastra principală. La apăsarea acestui buton, pe portul serial se trimite caracterul “z” și mașina iese din modul manual, așteptând din nou o comandă pentru modul în care se dorește utilizarea ei (Autonom, Manual sau TEST).

Private Sub but_close(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_close.Click

portserial.Write("z") 'se trimite caracterul z pentru ieșirea din mod manual

Me.Close() 'se închide fereastra secundară

End Sub

3.3.2.5 Blocul Car Info

Blocul CAR Info afișează informații despre viteza cu care se deplasează mașina, distanța parcursă, nivelul bateriei, o imagine cu o mașină și pictograme care ajută la interpretarea ușoară a informațiilor oferite de senzorii cu ultrasunete la întâlnirea unui obstacol, modul în care se operează mașina, o pictogramă animată ce informează utilizatorul dacă mașina este ridicată sau nu, timpul scurs, acțiunea care o execută mașina, și o căsuță text în care sunt afișate datele primite prin bluetooth.

În subcapitolul de software microcontroler, se prezenta forma finală a informațiilor care ajung la interfața grafică sub forma unui șir de caractere după cum urmează: S100S300S200D0000V0000T000B000ST=0W0L0

Citirea buffer-ului ce conține aceste informații recepționate de la mașină se face cu următoarele linii de cod:

Dim date_bt As String 'se declară vectorul de caractere date_bt

date_bt = portserial.ReadLine() 'se citește buffer-ul de intrare

inputbox.Text = date_bt 'se afișează datele primite în căsuța text din blocul CAR Info

Pentru utilizarea informațiilor în interfața grafică, șirul de caractere trebuie împărțit astfel încât să se știe fiecare informație ce înseamnă și unde trebuie să fie folosite. Pentru realizarea acestui lucru, se folosește o funcție specială care extrage un număr specificat de caractere dintr-un vector de caractere având următoarea sintaxă: Mid(buffer,nr_caracter,lungime). Parametrul buffer reprezintă vectorul de caractere din care se extrage, iar nr_caracter reprezintă numărul de ordine al caracterului de la care trebuie să înceapă extragerea urmat de parametrul lungime care reprezintă numărul de caractere care se vor extrase.

Astfel, având șirul date_bt=S100S300S200D0000V0000T000B000ST=0W0L0, extragem informațiile după cum urmează: primele două cifre după caracterele S1 reprezintă distanța detectată de senzorul ultrasonic din stânga mașinii cu valori cuprinse între 0 și 35. Pentru extragerea acestei informații se declară o variabilă de tip întreg și i se atribuie valoarea dată de cele două caractere (al 3-lea și al 4-lea caracter) din buffer-ul de intrare în felul următor:

Dim s1 As Integer 'se declară variabila s1 folosită pentru valorile senzorului din stânga

s1 = Mid(date_bt, 3, 2) 'variabila s1 capătă valoarea formată din caracterul 3 și 4

La fel se procedează și pentru senzorul ultrasonic amplasat în dreapta mașinii (s2) și cel din mijloc (s3), valorile pentru senzorul din dreapta fiind compus din caracterul 11 și 12, iar pentru senzorul central caracterul 7 și 8. Acestea sunt extrase astfel:

Dim s2,s3 As Integer 'variabilele s2,s3 ce conțin valori pt senzorul din dreapta și mijloc

s2 = Mid(date_bt, 11, 2) 'variabila s2 capătă valoarea formată din caracterul 11 și 12

s3 = Mid(date_bt, 7, 2) 'variabila s3 capătă valoarea formată din caracterul 7 și 8

Aceste variabile s1,s2,s3 sunt folosite pentru a afișa utilizatorului gradul de apropiere față de obstacol prin pictograme ușor de interpretat. De exemplu, pentru senzorul din dreapta există 5 tipuri de pictograme, acestea sunt afișate în funcție de valoare pe care o are variabila s2 extrasă din buffer-ul de date recepționate.

Atunci când variabila s2 corespunzătoare senzorului din dreapta are valoarea 0, este afișată pictograma cu Nivelul 0 (când nu se detectează obstacol) ca în figura de mai sus; dacă valoare este mai mare ca 0 (s2>0) și mai mică sau egală cu 10 (s2<=10), atunci este afișată pictograma cu Nivelul 1; dacă valoarea este mai mare ca 10 (s2>10) și mai mică sau egală cu 20 (s2<=20) este afișată pictograma cu Nivelul 2; dacă valoarea este mai mare ca 20 (s2>20) și mai mică sau egală cu 30 (s2<=30) se afișează pictograma cu Nivelul 3; afișarea pictogramei cu Nivelul 4 (când mașina este foarte aproape de obstacol) se face atunci când valoarea variabilei s2 este mai mare ca 30 (s2>30) și mai mică sau egală cu 35 (s2<=35). În acest fel se induce o animație plăcută utilizatorului și ușor de interpretat. La fel se procedează și în cazul senzorului de detecție din stânga (s1) și din mijloc (s3). Liniile de cod pentru senzorul din dreapta sunt următoarele:

If s2 = 0 Then

right_initial_pic.BringToFront() 'pictograma cu Nivelul 0 este afișată

End If

If s2 > 0 And s2 <= 10 Then

right_level_1_pic.BringToFront() 'pictograma cu Nivelul 1 este afișată

End If

If s2 > 10 And s2 <= 20 Then

right_level_2_pic.BringToFront() 'pictograma cu Nivelul 2 este afișată

End If

If s2 > 20 And s2 <= 30 Then

right_level_3_pic.BringToFront() 'pictograma cu Nivelul 3 este afișată

End If

If s2 > 30 And s2 <= 35 Then

right_level_4_pic.BringToFront() 'pictograma cu Nivelul 4 este afișată

End If

Viteza cu care se deplasează mașina este dată de valoarea variabilei speed ce capătă valoarea extrasă din vectorul de caractere date_bt începând de la caracterul cu numărul de ordine 19 de lungime 4 (caracterul 19, 20, 21, 22). Valoarea extrasă trebuie prelucrată, pentru că ea vine exprimată în metri/oră și rezultă valori mari de ordinul sutelor / miilor, valoarea se împarte la 60 și se obține o viteză exprimată în metri / minut. Această valoare este afișată de un vitezometru grafic ce imită vitezometrul de la o mașină reală, și poate reprezenta o viteză de maxim 20 m/min. De exemplu, în imaginea alăturată, valoarea brută a variabilei speed este de 720 (m/oră), iar după prelucrare (se împarte la 60) se obține valoarea 12 (m/min). Reprezentarea vitezei se realizează cu următoarele linii de cod:

Dim speed As Integer 'se declară variabila speed de tip număr întreg

speed = Mid(date_bt, 19, 4) 'se extrage blocul de caractere 19, 20, 21, 22

speed = speed / 60 'se obține o valoare exprimată în m/min

CircularGauge1.Value = speed 'acul vitezometrului indică valorea variabilei speed

Distanța parcursă de mașină este dată de un grup de 4 caractere ce sunt convertite în valori de numere întregi. Distanța este exprimată în centimetri, iar valoarea este extrasă din vectorul de caractere date_bt începând cu caracterul cu numărul de ordine 14 de lungime 4, adică caracterul 14, 15, 16 și 17 folosind funcția Mid() astfel:

Dim distance As Integer 'se declară variabila distance folosită pentru interpretarea distanței

distance = Mid(date_bt, 14, 4) 'se extrage segmentul de caractere 14, 15, 16 și 17

label_distanta.Text = distance & "cm" 'se afișează distanța în eticheta text; ex: 100cm

Această etichetă text ce afișează distanța parcursă este situată peste cadranul vitezometrului în josul acestuia.

Timpul scurs de când se dă startul mașinii în modul Race MODE, este extras din vectorul de caractere date_bt într-o variabilă de tip număr întreg denumită timp, construită din 3 caractere extrase începând cu caracterul numărul 24, 25 și 26, exprimată în secunde. Acest timp este afișat în interfața grafică într-o etichetă text de culoare portocalie sub vitezometru ca în figura alăturată. Liniile de cod pentru afișarea aceste valori sunt:

Dim timp As Integer 'se declară variabila timp folosită pentru interpretarea timpului scurs

timp = Mid(date_bt, 24, 3) 'se extrage segmentul de caractere 24, 25, 26

label_elapsed_time.Text = timp & " seconds" 'se afișează timpul în eticheta text

Nivelul bateriei se extrage din același vector de caractere date_bd, caracterul 28, 29 și 30 alcătuind valoarea acestei informații și salvată în variabila de tip număr întreg battery și apoi afișată într-un indicator grafic ce seamănă cu o baterie și sub formă de text într-o etichetă text exprimată în procent. Liniile de cod pentru această reprezentare sunt prezentate mai jos:

Dim battery As Integer 'se declară variabila battery folosită pt afișarea nivelului bateriei

battery = Mid(date_bt, 28, 3) 'se extrage segmentul de caractere 28, 29, 30

batlvl.setNewValue(battery) 'indicatorul grafic se umple comform valorii variabilei battery

label_battery_percentage.Text = battery & "%" 'se afișează nivelul bateriei; ex: 88%

Modul în care operează mașina este exprimată în interfața grafică prin interschimbarea unor imagini ce conțin text cu design mai plăcut, ca în metoda afișării senzorilor ultrasonici. Mai jos sunt prezentate cele 4 imagini corespunzătoare pentru a arăta modul în care se află mașina.

Se extrage caracterul care indică modul de operare al mașinii din același vector de caractere date_bt, într-o variabilă de tip caracter numită car_mode. Această variabilă poate lua 4 valori: valoarea 0 când mașina este în starea de repaos, valoarea R când mașina este în modul Race Mode (mod autonom), valoarea M când mașina este în modul Manual MODE (control manual) și valoarea T când mașina este în modul TEST MODE. Implementarea acestei afișări este datorată următoarelor linii de cod:

Dim car_mode As Char 'se declară variabila car_mode pentru interpretarea modului de operare

car_mode = Mid(date_bt, 36, 1) 'se extrage caracterul numărul 36

Select Case car_mode

Case "0"

mode_none.BringToFront() 'se afișează imaginea pentru starea de repaos

Case "M"

mode_manual_mode.BringToFront() 'se afișează imaginea pentru modul Manual MODE

Manual_mode_form.Show() 'se deschide fereastra secundară pentru controlul manual

Case "R"

mode_race_mode.BringToFront() 'se afișează imaginea pentru modul RACE MODE

Case "T"

mode_test_mode.BringToFront()'se afișează imaginea pentru modul TEST MODE

End Select

Acțiunea care o execută mașina la momentul curent este afișată într-o etichetă text și este interpretată doar de un singur caracter din șirul date_bt. Programul din microcontrolerul ce controlează mașina, are implementat 10 stări de acțiune. Acestea sunt decodate printr-o variabilă de tip integer cu numele stare ce poate lua valori de la 0 la 9, numere ce sunt asociate fiecărei stări după cum urmează: pentru valoarea 0 mașina se află în starea STOP, acțiune în care mașina frânează; pentru valoarea 1 mașina este în starea de mers înainte (FORWARD), acțiune în care mașina rotește ambele roți înainte; pentru valoarea 2 mașina este în starea de mers înapoi (BACKWARD), acțiune în care mașina rotește ambele roți înapoi; pentru valoarea 3 mașina este în starea de întoarcere spre stânga pe loc, adică acțiune în care mașina rotește doar motorul din dreapta; pentru valoarea 4, mașina este în starea de întoarcere spre dreapta pe loc, adică acțiune în care mașina rotește doar motorul din stânga; pentru valoarea 5, mașina este în starea de virare înainte spre stânga, adică acțiune în care mașina rotește motorul din stânga mai încet cu sensul înainte, iar pe cel din dreapta mai tare cu sensul înainte pentru a executa o virare ușoară spre stânga; pentru valoarea 6, mașina este în starea de virare înainte spre dreapta, adică acțiune în care mașina rotește motorul din dreapta mai încet cu sensul înainte, iar pe cel din stânga mai tare cu sensul înainte pentru a executa o virare ușoară spre dreapta; pentru valoarea 7, mașina este în starea de virare înapoi spre stânga, adică acțiune în care mașina rotește motorul din stânga mai încet cu sensul înapoi, iar pe cel din dreapta mai tare cu sensul înapoi pentru a executa o virare ușoară spre stânga cu spatele; pentru valoarea 8, mașina este în starea de virare înapoi spre dreapta, adică acțiune în care mașina rotește motorul din dreapta mai încet cu sensul înapoi, iar pe cel din stânga mai tare cu sensul înapoi pentru a executa o virare ușoară spre dreapta cu spatele; pentru valoarea 9, mașina este în starea de mers înainte dar cu o viteză mai mare față de mers înainte normal, acțiune în care mașina rotește ambele motoare înainte cu o turație mărită. Codul pentru extragerea și interpretearea acestui caracter este următorul:

Dim stare As Integer 'se declară variabila stare pentru interpretarea acțiunii

stare = Mid(date_bt, 34, 1) 'se extrage caracterul numărul 34

Select Case stare

Case "0"

label_car_state.Text = "CAR State: STOP (state_0)" 'se afișează pe eticheta text

Case "1"

label_car_state.Text = "CAR State: FORWARD (state_1)"

Case "2"

label_car_state.Text = "CAR State: BACKWARD (state_2)"

Case "3"

label_car_state.Text = "CAR State: LEFT (state_3)"

Case "4"

label_car_state.Text = "CAR State: RIGHT (state_4)"

Case "5"

label_car_state.Text = "CAR State: FORWARD_LEFT (state_5)"

Case "6"

label_car_state.Text = "CAR State: FORWARD_RIGHT (state_6)"

Case "7"

label_car_state.Text = "CAR State: BACKWARD_LEFT (state_7)"

Case "8"

label_car_state.Text = "CAR State: BACKWARD_RIGHT (state_8)"

Case "9"

label_car_state.Text = "CAR State: TURBO (state_9)"

End Select

Ultimul caracter din șirul de date recepționat, este folosit pentru informarea utilizatorului dacă mașina a fost ridicată, și este reprezentat printr-o interschimbare de două imagini prezentate mai jos:

Interschimbarea celor două imagini se realizează la un interval de 0.5 secunde pentru a forma o animație care încearcă să atragă atenția utilizatorului. Pentru această interschimbare a imaginilor la fiecare 0.5 secunde s-a folosit un timer care este pornit când variabila de tip integer car_lifted capătă valoarea 1, și oprit când are valoarea 0. Când acest timer este oprit, rămâne vizibilă doar Imaginea 1 din Fig. de mai sus fără să se mai interschimbe.

Dim car_lifted As Integer

car_lifted = Mid(date_bt, 38, 1)

If car_lifted = 1 Then

flag_car_lifted = 1

timer_lift.Enabled = True

Else

timer_lift.Enabled = False

flag_car_lifted = 0

flag2 = 0

car_lifted_1.BringToFront()

car_lifted_2.SendToBack()

car_lifted_1.Visible = True

car_lifted_2.Visible = False

End If

Private Sub timer_lift_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timer_lift.Tick

If flag_car_lifted = 1 Then

If flag2 = 1 Then

car_lifted_1.Visible = True

car_lifted_2.Visible = False

flag2 = 0

car_lifted_1.BringToFront()

car_lifted_2.SendToBack()

Else

car_lifted_1.Visible = False

car_lifted_2.Visible = True

flag2 = 1

car_lifted_2.BringToFront()

car_lifted_1.SendToBack()

End If

End If

End Sub

Rezumat

Scopul lucrării de față a fost dezvoltarea unei aplicații în care, utilizând concepte de interfațare om – mașină, să ușureze utilizarea mașinilor de la distanță făcând în acest timp acest proces mai intuitiv pentru utilizator și să ușureze interpretarea informațiilor. Mașina poate fi controlată și să transmită informații în timp real de la distanță pe o rază de maxim 100m datorită tehnologiei Bluetooth.

În prima parte a lucrării s-au prezentat noțiuni teoretice despre tehnologia Bluetooth, în care sunt descrise modul de funcționare al acestei tehnologii și avantaje și dezavantaje precum putere mare de transfer al datelor pentru o transmisie fără fir și consum foarte scăzut de energie, acționând pe distanțe mici. În continuare s-a prezentat conceptul de comunicație serială unde s-a descris modul de realizare al acestui tip de comunicație dintre două dispozitive și cum este descifrată și securizată informația.

Tot în capitolul de noțiuni teoretice, s-a descris în linii mari Microcontrolerul PIC18F4431 ce se ocupă de controlul mașinii și în special modulul UART ce face posibilă comunicația dintre mașină și consolă.

În ultima parte de noțiuni teoretice a fost prezentată interfața grafică ce a făcut posibilă controlarea mașinii de la distanță. Rolul cel mai important este să ajute utilizatorul să vizualizeze anumiți parametri primiți de la mașină și să depisteze mai ușor prin vizualizare grafică anumite avertizări în cazul în care mașina nu funcționează cum trebuie. S-a prezentat de altfel, limbajul de programare care a făcut posibilă funcționarea acestei aplicații.

Pasul următor a fost să se descrie modul de realizare practică ce constă din dezvoltarea codului pentru comunicația UART al microcontrolerului, cât și pentru implementarea software a interfeței grafice realizată în mediul de dezvoltare Visual Studio.

Astfel, îmbinând noțiunile teoretice cu abilitățile practice a fost posibilă realizarea cu succes a unei mașini care poate fi autonomă dar și controlată manual cu ajutorul interfeței grafice.

Concluzii

În realizarea acestui proiect s-a întâmpinat dificultăți, dar munca în echipă ne-a constrâns în a găsi soluții pentru rezolvarea acestora.

Orice mașină ori un dispozitiv sau un robot folosit în scopuri de diferite domenii are nevoie de o interfață grafică pentru a putea realiza conectarea dintre consolă și dispozitiv, și pentru a face munca mai ușoară și mai rapidă a utilizatorului prin reprezentarea grafică a anumitor parametri. Timpul fiind cel mai prețios lucru, prin intermediul unei interfețe grafice se poate câștiga destul de mult timp.

Bibliografie

Bibilografie

Francesco Ricci și Lior Rokach and Bracha Shapira, Introduction to Recommender Systems Handbook, Recommender Systems Handbook, Springer, 2011, p. 1-35.

Raji, RS (June 1994). "Smart networks for control". IEEE Spectrum.

Kevin Ashton, That 'Internet of Things' Thing, in the real world things matter more than ideas, RFID Journal, 22 Iunie 2009.

Friedemann Mattern, Christian Floerkemeier. From the Internet of Computers to the Internet of Things. Informatik- Spektrum 33 (2): 107–121. Februarie 2010.

Leonard Richardson, Sam Ruby, RESTful Web Services, O’Reilly Media, 2007

Roy Fielding, Representational State Transfer (REST), Teză de doctorat, Capitolul 5, 2000.

Website Wikipedia Maven, http://ro.wikipedia.org/wiki/Apache_Maven, [22.06.2014].

Jason Brittain, Ian F. Darwin, Tomcat: The Definitive Guide, O’Reilly Media, 2009.

Developer.mozilla.org. Website, New in JavaScript 1.8.5 | Mozilla Developer Network, [22.03.2014].

Darryl K Taft, jQuery Eases JavaScript, AJAX Development. http://www.eweek.com/ Website. [12.03.2014].

Schillmania Website, http://www.schillmania.com/projects/soundmanager2/doc/, [22.04.2014].

John Gossman. Tales from the Smart Client: Introduction to Model/View/ViewModel pattern for building WPF apps, http://blogs.msdn.com/b/johngossman/archive/2005/10/08/478683.aspx, [14.05.2014].

John Papa, Getting Started with Knockout, MSDN Magazine. [14.10.2013].

Toutorials Point website, http://www.tutorialspoint.com/hibernate/ hibernate_tutorial.pdf [21.06.2014]

M. Montaner, B. Lopez, J. L. de la Rosa, A Taxonomy of Recommender Agents on the Internet, Artificial Intelligence Review 19 (4): 285–330, Iunie 2003.

G. Adomavicius, A. Tuzhilin, Toward the Next Generation of Recommender Systems: A Survey of the State-of-the-Art and Possible Extensions, IEEE Transactions on Knowledge and Data Engineering 17 (6): 734–749, Iunie 2005.

J. L. Herlocker, J. A. Konstan, L. G. Terveen, J. T. Riedl, Evaluating collaborative filtering recommender systems, ACM Trans. Inf. Syst. 22 (1): 5–53, Ianuarie 2004.

Website Wikipedia Filtrarea Colaborativă, http://en.wikipedia.org/wiki/Collaborative_filtering [22.03.2014].

P. N. Juslin și P. Laukka: Expression, Perception, and Induction of Musical Emotions: A Review and A Questionnaire Study of Everyday Listening, Journal of New Music Research, Vol. 33, No. 3, pp. 217-238, 2004.

Cyril Laurier, Automatic Classification of Musical Mood by Content-Based Analysis, Universitat Pompeu Fabra, 2011.

Website Wikipedia AWS, http://en.wikipedia.org/wiki/Amazon_Web_Services, [09.03.2014].

Website Amazon Web Services http://aws.amazon.com/s3/ [22.06.2014]

Website Wikipedia CI, http://en.wikipedia.org/wiki/Continuous_integration [20.06.2014]

J. Hoffer, J. George, și J. Valacich, Modern systems analysis and design 6th. Prentice Hall: U.S.A, 2006

Dennis Alan, Barbara Haley Wixom, David Tegarden, System Analysis Design UML Version 2.0 An Object-Oriented Approach, Third Edition, John Wiley and Sons, 2009

J. Erickson, Agile Modeling, Agile Software Development, and Extreme Programming: The State of Research, Journal of database management: 88-100, 2005.

Oprea Dumitru, Analiza și proiectarea sistemelor informaționale economice, Iași, Editura Polirom,1999.

G. Avram, Metodologii de dezvoltare a programelor informatice – studio comparative, Managementul Interculutural, Volumul XV, Nr. 2, 2013, http://www.mi.bxb.ro/Articol/mi_28_2.pdf [10.05.2014].

Xiaoyuan Su, Taghi M. Khoshgoftaar, A survey of collaborative filtering techniques, Advances in Artificial Intelligence archive, 2009.

Similar Posts

  • Proiect Coltar Intermediar

    piesa de executat „colțar intermediar” Documentul tehnic normativ Capitolul 1 Analiza formei și dimensiunilor piesei 1.a.Abateri limită pentru dimensiuni fără indicații de tolerantă ale pieselor obținute prin tăiere, îndoire sau ambutisare 1.b.Condiții de formă și precizie, la ștanțare 1.c.Condiții tehnologice pe care trebuie să le îndeplinească piesele îndoite Breviar de calcul tehnologic Capitolul 2 Determinarea…

  • Studiul Actionarii Elctrice a Schimbatoarelor de Cale In Sistemul Feroviar

    CUPRINS CAP.1.Istoria transportului feroviar……………………………………………………………………………..3 1.1.Căile “ferate” din lemn……………………………………………………………………………….4 1.2Căile ferate metalice……………………………………………………………………………………4 CAP.2. Sistemele de acționare…………………………………………………………………………………….6 2.1.Introducere……………………………………………………………………………………………….6 2.2. Elemente componente ale acționărilor electrice ……………………………………………7 CAP.3. Infrastructura feroviară………………………………………………………………………………….11 3.1.Suprastructura căii…………………………………………………………………………………….11 3.2.Infrastructura căii……………………………………………………………………………………..11 3.3.Instalații de electrificare…………………………………………………………………………….11 3.4.Calea de rulare………………………………………………………………………………………….12 CAP.4.Schimbatorul de cale ferată…………………………………………………………………….14 4.1.Aparate de cale………………………………………………………………………………..14 4.2.Schimbătorul de cale simplu………………………………………………………………16 4.3.Elemente componente……………………………………………………………………….17 CAP.5.Motorul de current continuu…………………………………………………………………………….18 5.1.Generalitați………………………………………………………………………………………18 5.2.Tipuri…

  • Termoviziune Si Termografie In Industrie

    Rezumat În lucrarea TERMOVIZIUNE ȘI TERMOGRAFIE ÎN INDUSTRIE, este prezentată metoda de control nedistructiv, termografierea în infraroșu, care a cunoscut în ultimii ani o evoluție rapidă în ceea ce privește aplicabilitatea în domenii diverse. În prima parte este descrisă evoluția metodelor de control nedistructiv, principiul metodei termografierea în infraroșu și prezentarea pe scurt a câtorva…

  • Optimizare Piesa pe Strung Automat Skf 800

    CUPRINS Capitolul I STRUNGURI AUTOMATE. CONSIDERAȚII GENERALE ……………………5 1.1 Definirea și clasificarea strungurilor automate. …………………………………5 1.2 Posibilități tehnologice ale strungurilor automate. …………………………….8 1.3 Strunguri automate de strunjit longitudinal și profilat. ……………………………………………………….10 1.4 Posibilități tehnologice pe strungul automat de strunjit longitudinal și profilat SKF – 800. ………………………………………………….11 1.5 Materialele și semifabricatele indicate pentru prelucrările pe strungurile…

  • Proiectarea Asistata de Calculator a Infasurarilor In Dublu Strat a Masinilor Electrice de Curent Alt

    Cap. I. Generalități 1.1. Generalități despre construcția mașinilor electrice rotative După felul curentului și după principiul de funcționare, mașinile electrice rotative se împart în următoarele grupe principale: – mașini de curent continuu; – mașini de curent alternativ, care la rândul lor pot fi: – mașini asincrone; – mașini sincrone; – mașini de curent alternativ cu…