Controlul de la dis tanță al unui generator de semnal [626161]
1
Universitatea ”Politehnica ” din Bucureș ti
Facultatea d e Electronică, Telecomunicații ș i Tehnologia Informați ei
Controlul de la dis tanță al unui generator de semnal
Proiect de diplomă
Prezentat ca cerință parțială pentru obținerea titlului
de Inginer în domeniul Inginerie Electronică și T elecomunicații
programul de studii de licență Electronică Aplicată.
Conducător științific
Ș.l. Dr. I ng. Lucian Andrei PERIȘOARĂ
Absolvent: [anonimizat]
2016
2
3
4
5
6
7
Cuprins
Cuprins ………………………….. ………………………….. ………………………….. ………………………….. …. 7
Listă figuri ………………………….. ………………………….. ………………………….. …………………………. 9
Listă tabele ………………………….. ………………………….. ………………………….. ………………………. 11
Listă acronime ………………………….. ………………………….. ………………………….. …………………. 12
Introducere ………………………….. ………………………….. ………………………….. ………………………. 15
Capitolul 1. Instrumente programabile ………………………….. ………………………….. …………. 17
1.1. Arhitectura sistemului de testare ………………………….. ………………………….. ………………………….. ………………… 17
1.2. Interfețe de comunicare ………………………….. ………………………….. ………………………….. ………………………….. … 18
1.3. Modelul instrumentului programabil ………………………….. ………………………….. ………………………….. …………… 20
1.4. Controlul de la distanță a instrumentelor programabile ………………………….. ………………………….. ……………… 21
1.4.1. Laboratoare didactice pentru disciplina „Procesoarelor Digitale de Semnal (DSP)” ……………………….. 21
1.4.2. Utilizarea în echipamentele industriale ………………………….. ………………………….. ………………………….. . 28
Capitolul 2. Standardul pentru controlul instrumentelor de măsură cu interfață
progra mabilă ………………………….. ………………………….. ………………………….. …………………… 33
2.1. Structura informațională în cadrul interfeței SCPI – GPIB ………………………….. ………………………….. ……………… 33
2.1.1. Clasificarea mesajelor ………………………….. ………………………….. ………………………….. ………………………….. … 33
2.1.2. Descrierea tipurilor de mesaje ………………………….. ………………………….. ………………………….. …………………… 33
2.1.3. Protocolul de control al schimbului de mesaje ………………………….. ………………………….. …………………. 35
2.2. Sintaxa mesajelor ………………………….. ………………………….. ………………………….. ………………………….. ………… 36
2.2.1. Sintaxa mesajelor de programare ………………………….. ………………………….. ………………………….. ……………… 36
2.2.2. Structura mesajelor SCPI ………………………….. ………………………….. ………………………….. ……………………….. 37
2.2.3. Tipuri de antete ………………………….. ………………………….. ………………………….. ………………………….. ……. 38
2.2.4. Sintaxa mesajelor de răspuns ………………………….. ………………………….. ………………………….. ……………………. 39
2.2.5. Arborele de comandă ………………………….. ………………………….. ………………………….. ………………………… 39
2.2.6. Tabelul de comandă. ………………………….. ………………………….. ………………………….. …………………………. 40
Capitolul 3. Implementarea Hardware a sistemului ………………………….. ……………………. 43
3.1. Obiectivele proiectului ………………………….. ………………………….. ………………………….. ………………………….. ………. 43
3.2. Schema bloc a sistemului ………………………….. ………………………….. ………………………….. ………………………….. …… 43
3.3. Componentele sistemului hardware ………………………….. ………………………….. ………………………….. ………………….. 43
3.3.1. Placa de dezvoltare Arduino UNO ………………………….. ………………………….. ………………………….. ………….. 43
3.3.2. Afișajul :LCD Keypad Shield for Arduino ………………………….. ………………………….. ………………………….. …. 45
3.3.3. RS232 Shield v2 ………………………….. ………………………….. ………………………….. ………………………….. ………… 46
3.5. Macheta finală a sistemului ………………………….. ………………………….. ………………………….. ………………………….. … 49
Capitolul 4 : Implementarea Software a programului ………………………….. ………………… 51
4.1. Mediul de dezvoltare IDE ………………………….. ………………………….. ………………………….. …………………………. 51
4.2. Scheme logice ………………………….. ………………………….. ………………………….. ………………………….. …………….. 52
8
4.3. Funcția de citire de la butoane ………………………….. ………………………….. ………………………….. ……………………. 52
4.4. Funcții folosite pentru afișare pe ecran ………………………….. ………………………….. ………………………….. ……….. 53
4.5. Funcții pentru stabilirea comunicației ………………………….. ………………………….. ………………………….. …………. 53
4.6. Funcții pentru transmiterea mesajelor SCPI ………………………….. ………………………….. ………………………….. …. 55
Capitolul 5 : Măsurători pentru testarea magistralei de date ………………………….. ……… 57
5.1. Mentenanța predictivă ………………………….. ………………………….. ………………………….. ………………………….. ….. 57
5.2. Testarea automată a magistralei RS232 ………………………….. ………………………….. ………………………….. ………. 59
5.3. Analiza serială a magistralei RS232 ………………………….. ………………………….. ………………………….. ……………. 61
5.4. Probleme întâmpinate ………………………….. ………………………….. ………………………….. ………………………….. …… 63
Concluzii ………………………….. ………………………….. ………………………….. ………………………….. 65
Bibliografie ………………………….. ………………………….. ………………………….. ………………………. 67
Anexe ………………………….. ………………………….. ………………………….. ………………………….. ….. 69
9
Listă figuri
FIGURA 1.1. SISTEM SIMPLU DE MĂSURA ȘI CONTROL CU INSTRUMENT PROGR AMABIL . ………………………….. ………………………….. …… 17
FIGURA 1.2. CONTROLLER – SCHEMA BLOC DE PRIN CIPIU , SIMPLIFICATĂ ………………………….. ………………………….. …………………….. 17
FIGURA 1.3. TOPOLOGIA DE SISTEM D E MĂSURĂ ȘI CONTROL : A).STEA, B). SERIE………………………….. ………………………….. …………… 18
FIGURA 1.4. INTERFAȚA DE COMUNICA RE DE PE PANOUL DIN SPATE AL UNUI INSTRU MENT PROGRAMABIL ………………………….. …………… 19
FIGURA 1.5: MODELUL INSTRUMENTULU I ………………………….. ………………………….. ………………………….. ………………………….. .. 20
FIGURA 1.6. INSTRUMENT PROGRAMABI L – SCHEMA DE PRINCIPIU ………………………….. ………………………….. ………………………….. . 21
FIGURA 1.7. EDSP LAB BANCA DE TESTAR E ………………………….. ………………………….. ………………………….. ………………………….. 22
FIGURA 1.8.. ARHITECTURA E DSP LAB ………………………….. ………………………….. ………………………….. ………………………….. …… 22
FIGURA 1.9.. INTERFAȚA GRAFICĂ A A PLICAȚIEI DE CONTROL A ECHIPAMENTELOR ………………………….. ………………………….. …………. 23
FIGURA 1.10. INTERFAȚA GRAFICĂ A A PLICAȚIEI DE CONTROL A OSCILOSCOPULUI ………………………….. ………………………….. …………… 23
FIGURA 1.11.. STAȚIA DE LUCRU ………………………….. ………………………….. ………………………….. ………………………….. ………….. 24
FIGURA 1.12. INTERFAȚA UTILIZATORU LUI PENTRU APARATELE COMPONENTE ………………………….. ………………………….. ………………. 25
FIGURA 1.13. INTERFAȚA UTILIZATORU LUI PENTRU CIRCUIT ………………………….. ………………………….. ………………………….. ……….. 25
FIGURA 1.14. LITTLE BITS A). PROTO MODEL , B). SLIDE DIMMER ………………………….. ………………………….. ………………………….. ….. 25
FIGURA 1.15. VOLTMERU ANALOG IN LABVIEW ………………………….. ………………………….. ………………………….. …………………….. 26
FIGURA 1.16. INTERFAȚA VOLTMETRULUI ANALOGIC ………………………….. ………………………….. ………………………….. ………………. 26
FIGURA 1.17.. DIAGRAMA PENTRU ARDUINO ………………………….. ………………………….. ………………………….. ……………………….. 27
FIGURA 1.18. PLĂCUȚA REALĂ A CIRCU ITUILUI ………………………….. ………………………….. ………………………….. ………………………. 27
FIGURA 1.19. ARHITECTURA UNUI SIST EM SCADA ………………………….. ………………………….. ………………………….. ………………… 28
FIGURA 1.20. MONITORIZAREA CALITĂȚ II AERULUI . ………………………….. ………………………….. ………………………….. ………………… 29
FIGURA 1.21. MEDIUL PLC4404 ………………………….. ………………………….. ………………………….. ………………………….. …………. 30
FIGURA 1.22. RESET DE LA DISTANȚĂ ………………………….. ………………………….. ………………………….. ………………………….. ……. 30
FIGUA 1.23. COMANDA RESET DE LA PC ………………………….. ………………………….. ………………………….. ………………………….. …. 31
FIGURA 1.24. COMANDA PRIN INTERNET ȘI SMS A CENTRALELOR TERMI CE ………………………….. ………………………….. …………………. 31
FIGURA 2.1. TIPURI DE MESAJE ………………………….. ………………………….. ………………………….. ………………………….. ……………. 34
FIGURA 2.2. STRUCTURA DINAMICĂ A MESAJELOR INTERFEȚEI ………………………….. ………………………….. ………………………….. …….. 34
FIGURA 2.3. MESAJELE MULTILINIE S PECIFICE DISPOZITIVU LUI ………………………….. ………………………….. ………………………….. …….. 35
FIGURA 2.4. PROTOCOLUL DE CONTROL AL SCHIMBULUI DE ME SAJE ………………………….. ………………………….. ………………………….. . 36
FIGURA 2.5. SINTAXA UNITĂȚII DE M ESAJ DE PROGRAMARE ………………………….. ………………………….. ………………………….. ……….. 36
FIGURA 2.6. SINTAXA UNUI MESAJ DE PROGRAMARE ………………………….. ………………………….. ………………………….. ………………. 37
FIGURA 2.7. EXEMPLU ………………………….. ………………………….. ………………………….. ………………………….. ……………………… 37
FIGURA 2.8. SINTAXA UNITĂȚII DE M ESAJ DE RĂSPUNS ………………………….. ………………………….. ………………………….. ……………… 39
FIGURA 2.9. SINTAXA MESAJULUI DE RĂSPUNS ………………………….. ………………………….. ………………………….. ………………………. 39
FIGURA 2.10. ARBORELE DE COMENZI A L SUBSISTEMULUI SENSE ………………………….. ………………………….. ………………………….. … 40
FIGURA 3.1. SCHEMA BLOC A SISTEMU LUI ………………………….. ………………………….. ………………………….. ………………………….. . 43
FIGURA 3.2. ARDUINO UNO ………………………….. ………………………….. ………………………….. ………………………….. ………………. 44
FIGURA 3.3. LCD KEYPAD SHIELD FOR ARDUINO ………………………….. ………………………….. ………………………….. …………………… 45
FIGURA 3.4. SCHEMA ELECTRICĂ A BU TOANELOR ………………………….. ………………………….. ………………………….. ……………………. 45
FIGURA 3.5. RS232 SHIELD V 2 ………………………….. ………………………….. ………………………….. ………………………….. ……………. 46
FIGURA 3.6. SEMNALELE CORESPUNZĂT OARE TRANSMISIEI CAR ACTERULUI „ 2 ” ………………………….. ………………………….. ……………. 48
FIGURA 3.7. MUFĂ RS232 „MAMA ” DB9 ………………………….. ………………………….. ………………………….. ………………………….. 48
FIGURA 3.8. MACHETA FINALĂ ………………………….. ………………………….. ………………………….. ………………………….. ……………. 49
FIGURA 3.9. SETAREA FORMEI DE UND Ă SI A FRECVENȚEI ………………………….. ………………………….. ………………………….. …………… 49
FIGURA 3.10. SETAREA AMPLITUDINII ………………………….. ………………………….. ………………………….. ………………………….. ……. 50
FIGURA 3.11. RĂSPUNSUL GENERATORUL UI LA INTEROGARE ………………………….. ………………………….. ………………………….. ………. 50
FIGURA 4.1. MEDIUL INTEGRAT DE DEZVOLTAR E ARDUINO (IDE) ………………………….. ………………………….. ………………………….. … 51
FIGURA 4.2. SCHEMA LOGICĂ MENIU ………………………….. ………………………….. ………………………….. ………………………….. …….. 52
FIGURA 5.1. TIPURI DE ÎNTREȚINER E ………………………….. ………………………….. ………………………….. ………………………….. ……… 57
FIGURA 5.2.E TAPELE ÎNTREȚINERII PREDICT IVE ………………………….. ………………………….. ………………………….. ………………………. 58
10
FIGURA 5.3. TESTARE PREDICTIVĂ ………………………….. ………………………….. ………………………….. ………………………….. …………. 58
FIGURA 5.4. A). , B). APARAT DE TESTARE ………………………….. ………………………….. ………………………….. ………………………….. .. 59
FIGURA 5.5. OSCILOSCOP ȘI SCOPEMETER ………………………….. ………………………….. ………………………….. ………………………….. .. 60
FIGURA 5.6. A). , B). DIAGRAMA OCHI ………………………….. ………………………….. ………………………….. ………………………….. …… 61
FIGURA 5.7. .DECODARE ASCII ………………………….. ………………………….. ………………………….. ………………………….. ……………. 62
FIGURA 5.8. DECODARE HEXAZECIMALĂ ………………………….. ………………………….. ………………………….. ………………………….. …. 62
FIGURA 5.9. CODARE BINARĂ ………………………….. ………………………….. ………………………….. ………………………….. …………….. 63
FIGURA 4.3. RS232 CROSSOVER ………………………….. ………………………….. ………………………….. ………………………….. ………….. 63
FIGURA 4.4. COOLTERM ………………………….. ………………………….. ………………………….. ………………………….. ……………………. 63
FIGURA 4.5. INSTRUCȚIUNE ÎN ASCII ………………………….. ………………………….. ………………………….. ………………………….. …….. 64
FIGURA 4.6. INSTRUCȚIUNE ÎN HEXAZ ECIMAL ………………………….. ………………………….. ………………………….. ………………………… 64
11
Listă tabele
TABEL 2.1: COMENZI ALE SUBSITEMU LUI SENSE ………………………….. ………………………….. ………………………….. …………………… 40
TABEL 3.1. TENSIUNEA DE IEȘIRE A BUTOANELOR ………………………….. ………………………….. ………………………….. …………………… 46
TABEL 3.2. TABEL ALOCAREA PINILO R PENTRU LCD KEYPAD SHIELD FOR ARDUINO ………………………….. ………………………….. ………… 46
TABEL 3.3. DESCRIEREA SEMNALELOR MAGI STRALEI RS232 ………………………….. ………………………….. ………………………….. ………. 48
TABEL 4.1. MESAJE SCPI PENTRU CONTROLUL GE NERATORULUI DE SEMNA L ………………………….. ………………………….. ………………… 55
TABEL 5.1. PARAMETRII MĂSURAȚI P ENTRU MAGISTRALA RS232 ………………………….. ………………………….. ………………………….. … 59
12
13
Listă acronime
A Amper
ASCII American Standard Code for Information Interchange
(„Codul Standard American pentru Schimbul de Informații”)
ATN Atention
BAUD Reprezintă frecvența unei perioade de bit , fiind echivalentă cu numărul de
biți pe secundă.
DCE Data Communication Equipament
DMA Direct Memory Access („ Acces direct la memorie”)
DSP Procesoare Digitale Analogice
DTE Data Terminal Equipament
EEPROM Electrically erasable programmable read only me mory (Memorie numai pentru citire
care p oate fi ștearsă electric )
EIA Electronics Industries Association
GND Ground („Împământare”)
GPIB General Purpose Interface Bus
Hex H exazecimal
Hz Hertz
IDE Integrated Development Enviromment
IEEE Institute of Electrical and Electronics Engineers
IRQ Interrupt Request (Cerere de întrerupere)
K Kilo
KB KiloByte
Lsb Cel mai puțin semnificativ bit
LXI LAN eXtensions for Instrumentation (LAN extensie pentru instrumente)
M Mega
m Metru
mA mili amperi
Msb Cel mai semnificativ bit
PC Personal Computer (calculator )
PIR Senzor pasiv cu infraroșu
PWM Pulse width modulation
SCADA Superior Control and Data Aquisition
SCPI Standard Commands for Programmable Instruments (Standardul pentru controlul
instrumentelor de măsură cu interfață programabilă)
SRAM Static random access memory
USB Universal Serial Bus
V Volt
| SAU logic
°C Grad Celsius
14
15
Introducere
Dezvoltarea tehnologiei a făcut posibil ă utilizarea de la distanță a instrumentelor de măsură
și control programabile . Aestea echipamente sunt utilizate în automatizarea unor procese industriale
complexe, unde controlul manual nu este posibil.
Controul de la distanță a instrumentelor programabile a fost implementat cu succes în cadrul
mai multor Universități cu scopul de a ajuta studenții să inteleagă c um funcționează mai exact un
instrument de măsura programabil.
Proiectul își propune să realieze controlul de la distanță al unui generator de semnal prin
intermediul unei magistrale de comunicație serială cu ajutoru l unei platforme cu microcontro ller,
precum și îndeplinirea funcției de generator de mesaje pentru testare magistralei seriale RS232 .
Pentru realizarea parții hardware am folosit :
placa de dezvoltare Arduino UNO,
un shield RS232, care ajută la conectarea platformei Arduino cu generator ul de semnal prin
interfața serială,
un afișaj LCD, folosit pentru a vizua liza comenzile efectuate către generator, dar și
răspunsul acestuia la interogările adresate.
LCD -ul este integrat pe un shield ce conține șase butoane : select, sus, jos, dreapta, stânga și
reset, ce vor fi programate pentru a îndeplinii anumite funcții.
Partea software a proiectului constă în programul folosit pentru controlul generatorului , ai
parametrilor acestuia : modificarea frecvenței, modificarea amplitudinii, modificarea formei de undă
(sinusoidală, dreptunghiulară, triunghiulară, Up ramp, Down ramp), controlul butoanelor
predefinite, precum și funcția de generator de mesaje pentru testarea magistralei RS232. Controlul
generatorului se va realiza prin interfața serială utilizând mesaje SCPI.
16
17
Capitolul 1. Instrumente programabile
1.1. Arhitectura sistemului de testare
În cadrul sistemelor de testa re automată , utilizarea pe scară largă a instrumentelor de măsură
programabile a dus î n anii 1990 la apariț ia și implementarea standardelor : IEEE 488.1 , cunoscute
sub denumirea GIPB (General Purpose Interface Bus), IE EE 488.2 ș i SCPI (Standard Commands
for Programmable Instruments). Gradul mare de flexibilitate oferit d e aceste standard e pentru
controlu l sistemelor de testare cu instrumente programabil e a permis utilizarea acestora î n fazele de
testare pe toata durata de viaț ă a unui produs : cercetare , dezvoltare, fabricație, î ntreținere ș i
depanare.
Un sistem simplu de măsură ș i control poate fi alcă tuit dintr -un controller (PC), un
instru ment programabil ș i o magistrală de transmisie a datelor
.
Figura 1.1. Sistem simplu de măsura ș i control cu instrument programabil.
Instrumentele programabile pot fi :
receptoare : instrumente adresate pentru a recepționa date (ex: multimetre, osciloscoape,
numă rătoare, etc.);
emițătoare : instrume nte adresate pentru a trans mite date ( generatoare de semnal,
generatoare de zgomot, susre de alimentare, etc.) ;
mixte (receptoare și emiță toare): instrumente adresate pentru a recepționa și transmite date
(osciloscop cu generator de semnal î ncorporat) .
Control ler-ul reprezintă unitatea prin care se realizează controlul î ntregului siste m de măsură
și testare. Acesta poate fi un sistem de calcul obiș nuit (PC) sa u unu sistem de calcul dedicat .[9]
Figura 1.2. Control ler – schema bloc de principiu , simplificat ă [9]
Magistrală de date
Controller (PC)
Instrument programabil
Domeniu de andrese de port I/O
Circuit logic de interfață
Controller de interfață IEEE 488.1
Întreruperi IRQ și canale DMA
Tranceiver -i
Magistrala I/O
Bus GPIB
18
Controller
(PC)
INSTRUMENT 1
INSTRUMENT 2
INSTRUMENT 3
Dispozitiv
testat
a).
Dispozitiv
testat
b). Mediul fizic d e comunicare dintre control ler și instrumentul programabil est e reprezentat de
către magistra la de date. Aceasta este compusă din linii de semnal care asigură transferul datelor,
controlul ci rcuitelor de transfe r de date și administrarea inter feței, precum și din linii de protecț ie.
Sistemul cu instrumente programabile poate avea trei topolog ii:
stea;
serie ;
hibridă .
.
[9]
Figura 1.3. Topologia de sistem de măsură și control : a).stea, b). Serie
Controlul de la distanță a echipamentelor de măsură ș i control se poate realiza prin:
programare a definită de utilizatori (aceștia pot programa și controla instrumentele
utilizâ nd comenzi SCPI);
utilizarea de aplicaț ii software special dez voltate de producă torii instrumentelo r
pentru a trimite comenzi SCPI .
Folosind programarea utilizatorul poate:
să controleze inst rumentul;
să facă o măsură toare;
să obțină date de la instrument : răspunsuri la comenzi sau date mă surate.
1.2. Interfeț e de comunicare
Interfețele de comunicare dintre instru mentele programabile și control ler pot fi :
GPIB,
RS-232,
USB
WiFi ,
Bluetooth ,
LAN
Ethernet
19
LXI (LAN eXtension for Instrumentation)
Figura 1.4. I nterfața de comunicare de pe panoul din spate al unui instrument programabil
1. GPIB
Magistrala de interfațare de uz general (General Purpose Interface Bus) este folosită pentru
comunicația cu instrumentele programabile. Este cel mai utilizat standard pentru controlul
instrumentelor programabile de către sistemele de ca lcul. Rolul acestor dispoz itive este de a trimite
mesaje sau de a primi mesaje ș i/sau de a monitoriza comu nicațiile pe rețea, având o rată de transfer
de 1 Mbyte/secundă.
Protocolul de comunicație este specificat de standardul IEEE -448, aces ta fiind un p rotocol pe 8 biți
ce folosește comenzi de tip ASCII , putând accesa maxim 14 instrumente aflate la cel mult 20 m.
2. RS – 232
„Interfața serială RS -232 este una din dintre cele mai folosite echipamente periferice.
Transmisia și recepția se face bit cu bit, astfel este nevoie de un singur fir pentru tra nsmisie.
Interfața RS -232 este întâ lnită la toate modelele de calculatoare și majoritatea instrumentelor de
măsur ă. A ap ărut în anul 1962 , fiind standar dizată de EIA (Electronics Industries Association),
permite comunicații doar pe distanțe scurte , maxim 20m și viteze de transfer de maxim 1900 bps.
Aparatele ce folosesc interfața RS -232 se clasifică în doua categor ii
DTE (Data Terminal Equipments) – din această categorie menționăm PC -ul, tastatura.
DCE (Data Communication Equipments) – modem -urile, aparate de măsurare, etc.
Modul de conectare precum și programarea modului de comunicație poate fi diferită de la un
aparat la altul. O cone xiune serială RS -232 se compun e din trei conductoare
RXD (Receive Data) reprezi ntă conductorul pentru semnalul de recepție
TXD (Transmit Data) reprezintă conductorul pentru semnalul de emisie
GND ( Ground) reprezintă conductor ul la masă. ” [9]
3. USB
Interfața USB (Universal Serial Bus) a fost concepută cu scopul de a simplifica modul de
conectare a perifericelor la un PC. Este o intrefață serială rapidă, viteza de transmisie ajungând
până la 12 Mbit/secundă.
USB este compus din trei elemente principale
Gazda (host)
Conectorii (hubs)
Perifericele (devices).
4. Ethernet
Ethernet reprezintă denumirea unei familii de protocoale de rețel e de calculatoare ce se bazează
pe transmisia cadrelor (frames) și este utilizat ă pentru a implementa rețelele locale de tip LAN.
20
A fost lansat in 1983 de către IEEE (Institute of Electri cal and Electronic Engineers ) î n seria de
standarde IEEE 802.3.
Aceste standarde permit transmisia datelor prin mai multe medii fizice:
Cabluri coaxiale
Cabluri torsa date
Cabluri de fibră optică
Ethenet este de departe cea mai fo losită interfață de comunicare î n ziua de azi. Aproape toate
calculatoarele sunt pre văzute cu o interfață Ethernet ,iar componentele de rețea devin tot mai ieftine.
Vitezel e Ethernet au crescut cu trei ord ine de mărime în ultimii 15 ani păstrându -se
compatibilitatea , spre deosebire de GPIB. [9]
5. LXI (LAN eXtensions for Instrumentation)
„Este ultima evoluție a tehnicilor de comunicație pentru instrumentele de testare și măsu rare.
Combină avantajele rețelelor Etherne t, interfețelor Web și experien ța de peste 40 de ani de testare și
măsurare , pentru a asigura modularitate , flexibilitate, interoperabilitate, sincronizare și precizie în
cadrul sistemelor de testare, ceea ce duce la economii de timp în proiec tarea, instalarea, integrarea,
programarea și întreținerea acestora.
Ofera noi posibilități prin testarea locală , testarea de la distanță sau testarea distribuită în mai multe
locații. ” [9]
1.3. Modelul instrumentului programabi l
În scopul calsificării grupurilor de comenzi și a realizării compatibilității echipamentelor , SCPI a
definit un model generalizat de inst rument (dispozitiv) programabil.
Figura 1.5 : Modelul instrumentului
Cele trei subsisteme : INPut, SENSe și CALCulate sunt dedicate achiziției de semnale, iar
subsistemele : CALCulate, SOURce și OUTPut sunt dedicate generării de semnale.
Un instrument ce realizează achiziția unor semnale nu are în componența sa subsi stemele de
generare.[14]
Categorii majore de funcții de instrument:
Achiziție de semnal: SENSe instrument (multimetru , osciloscop , numărător) ,
Generare de semnal: SOURce instrument (generator, sursă de alimentare),
Transmisi e de semna l: SWITCH instrument (scanner, multiplexor) .
:ROUTe
Signal
INPut
SENSe
CALCulate
DISPlay
FORMat
MEMory
TRIGger
:ROUTe
Signal
routing
SOURce
OUTPut
CALCulate
Data
Bus
signal
21
Figura 1.6. Instrument programabil – schema de principiu
[8]
„Com enzile de control sunt grupate după subsistemele din care fac parte .
Subsistemele din compune rea instrumentului programabil:
ROUTe realizeaz ă funcția de comutare ce direcționează semnalul aplicat
instrumentului său generat de către acesta.
DISPlay conține funcții asociate cu modul de prezentare a datelor (text,grafic, etc.).
FORMat realizează conversia formatulu i de date ( în mod special în vederea
transmiterii datelor printr -o interfață)
TRIGger controlează achiziția /generarea de semnal prin sincronizarea acțiunilor
dispozitivului cu evenimente interne sau externe.
SOURce generează un semnal pe baza un or ca racteristici specificate și/sau date
oferite.
SENSe conține funcții de achiziție de date ( conversia semna lului în date interne).
CALCulate realizează funcț iile de post –procesare a datelor achiziționate.
INPut controlează caracteristicile unui s enzor la intra rea semnalului.
OUTPut controlează caracteristicile unui port de ieșire al unui generator.
SYSTem include cele mai multe funcții generale ale instrumentului care nu sunt
corelate în mod direct cu performanțele instrumentului (TIME, DA TE,
setări, raportare de erori ).
MEMory include funcții de gestiune ale memoriei instr umentului (mai puț in
memoria de capacitate mare a sistemului).
MMEMory include comenzi de dispozitiv specific memoriei de mare capacitate (
capabilită ți pentru instrumente de a stoca informații în memorii de mare
capacitate.)
INSTrument furnizează mecanismul de indentificare si selecție a instrumentelor
logice î n mod particular ( intr-o config rauție logică de
multi -instrument).
STATus controlează sistemul de raportare a stării SCPI ”. [9]
1.4. Controlul de la distanță a instrumentelor programabile
1.4.1. Laboratoare didactice pentru disciplina „Procesoarelor Digi tale de Semnal (DSP)”
Dezvoltarea aplicațiilor și rețelelor de inter net au deschis un nou mod de a î nțelege controlul
instrumentelor programabil e. Dezvoltarea tehnologiei a fă cut posibilă utilizarea de la distanță a
instrumentelor și a sistemelor prin in termediul internetului.
Achiziție semnale
Trigger Memorie Display Procesare/Formatare mesaje
Generare semnale
Semnale
măsurate/generat e
e
Bus
GPIB
22
Controlul de la distanță a procesoarelor digitale de se mnal (eDSPlab) a fost implementă cu
succes î n cadrul cursurilor de „ Microp rocesoare Avansate” ( „ Advanced Micropr ocessor”) și
„Instrumentație și M ăsură” („ Instrumentation a nd Measurement”) în cadrul Departamentului de
Inginerie Electronică a Universității din Sevilia, Spania.
[7]
Figura 1.7. eDSPlab banca de testare
Banca de testare conține următoarele ech ipamente :
Calculator personal (PC ) cu server web ,
Generator de semnal ,
Osciloscop ,
Sursă de alimentare ,
Placă DSP,
Cameră web
Server , ce sunt conectate ca in Fig 1.8.
[7]
Figura 1.8. . Arhite ctura eDSPlab
23
[7]
Figura 1.9.. Interfața grafică a aplicației de control a echipamentelor
[7]
Figura 1.10. Interfața gr afică a aplicației de control a osciloscopului
24
Un alt exemplu de laborator didactic este e -Prayog, care face parte dintr -un proiect numit
„Virtual Labs” ce a fost implementat în cadrul Departamenului de Inginerie Electronică a
Institutului Indian de Tehnologie din Bombay, vezi Fig. 1.11.
[5]
Figura 1.11. . Stația de lucru
Masa de lucru este compusă din:
Calculator personal (PC)
Osciloscop
Generator de semnal
Placă DSP
[5]
25
Figura 1.12. Interfața utilizatorului pentru aparatele componente
[5]
Figura 1.13. Interfața utilizatorului pentru circuit
1. Voltmetru Analog construit cu Arduino
Componentele necesare pentru const rucția unui voltmetru analogic sunt următoarele :
Arduino UNO
Circuit „LittleBits proto module”
Placă de montat „LittleBits”
Dispozitiv „LittleBits” de control (slide dimmer)
Software LabView
Software -ul LabView reduce numărul componentelor necesare pentru construcția voltmetrului
analogic.
Figura 1.14. LittleBits a). Proto model, b). Slide dimmer
a). b).
26
[10]
Figura 1.15. Voltmeru
analog in LabView
Interfața voltmetrului analogic e alcătuită dintr -un grafic ce afișează tensiunile aplicate pe p inii de
intrare „A0” ai platformei Arduino UNO, Fig 1.16.
[10]
Figura 1.16. Interfața
Voltmetrului Analogic
27
[10]
Figura 1.17. . Diagrama pe ntru Arduino
[10]
Figura 1.18. Plăcuța reală a circuituilui
28
1.4.2. Utilizarea î n echipamentele industriale
Sistemele au tomate de măsură au apărut odată cu dezvoltarea sistemelor de reglaj automat
cu microprocesor.
Primele sisteme automate de măsură se lim itau la achiziția de date și la afișarea locală a
informației . Odată cu dezvoltarea rețelelor de calculatore și apariția internetului au fost dezvoltate
și sistemele de măsura și control la un nivel indust rial. [11]
SCADA („Superior Control and Data Aq uisition”) repr ezintă un sistem de control, monitorizare și
achiziție de date, folosit pentru monitorizarea și controlul echipamentelor industriale.
[12]
Figura 1.19. Arhitectura unui sistem SCADA
Sistemele SCADA sunt folosite pentru gestionarea oricărui tip de echi pamen t sau proces.În
principiu sunt utilizate pentru automat izarea unor procese industriale , unde controlul manual nu este
practic.
Aplicațiile SCADA se clasifică în :
29
Sisteme de utilități : apă, petrol, gaze, energie electrică.
Sisteme de Management al Clădirilor ,
Industrie ,
Managementrul traficului .
Aplicații :
1. Monitorizarea calității aerului.
[13]
Figura 1.20. Monitorizarea calității aerului.
Aplicația este folosită în spații interioare precum : magazin, birou, hotel, sala de spectacol, depozit,
etc.
Se monitorizează parametrii aerului cu ajutorul aplicației SCADA și sunt transmise alarme atunci
când sunt depășite valorile minime î n Dispatcher server PC, prin email sau prin sms.
Automatul p rogramabil Mini PLC4404 comunică serial (RS485) prin protocolul Modbus cu
senzorii care măsoară calitatea aerului, umiditatea și temperatura.
La rândul său, Mini PLC 4404 utilizează convertorul RS232 -RS485 pentru a se putea conecta la
maxim 64 de senzori ,c are sunt interogați d in cinci în cinci secunde.
Ventilar ea automată a încăperii este comandată de ieșirea releelor ale automatului programabil.
[13]
Monitorizarea aplicației se face prin Internet , de la interfața grafică a Dispatcher server PC sau prin
SMS.
30
[13]
Figura 1.21. Mediul PLC4404
2. Reset de la distanță a echipamentelor electrice și electronice
[13]
Figura 1.22. Reset de la distanță
31
Automatul programabil Mini PLC4404 poate comanda de la distanță echipamente electrice și
electronice.
Reset -ul de la distanță este necesar pentru echipamentele care funcționează permanent, precum :
servere, routere, centrale termice, generatoare electrice, etc.
Releul de ieșire al automatului programabi l execută tranziția în starea ON. [13]
[13]
Figua 1.2 3. Comanda reset de la PC
3. Comanda centralelor termice
[13]
Figura 1.24. Comanda prin Internet și SMS a centralelor termice
Automatul program abil MiniPLC4404 pornește și oprește sursa de căldură astfel încât temperatura
măsurată este egală cu temperatura limită cu o eroare de +/ – 0,3 ˚ C..
32
33
Capitolul 2. Standardul pentru controlul instrumentelor de măsură
cu interfață programabilă
2.1. Structura informațională în cadrul interfeței SCPI – GPIB
Standar dul SCPI (Standard Commands for Programmable Instruments ) a fost definit î n 1990
pe baza standardelor IEEE 488.2 și IEC 625.1, standar dizându -se astfel limbajul de control utilizat
între ins trumentele pr ogramabile. Scopul său a fost de a promova un limbaj și o sintaxă comună
potrivit ă pentru toate instrumentele programabile. Astăzi, SCPI este susținut de majoritatea
producătorilor de instrument e programabile, precum Agilent (HP), Tektronix, K eitheky, Fluke.
SCPI poate fi trimis la un instrument programabil de -a lungul mai multor interfețe, cum ar fi LAN,
GPIB, RS -232 și USB.
Comun icația în sistemul de măsură și testare prevăzute cu interfață SCPI -GPIB se realizează
prin intermediul me sajelor. Astfel, cu ajutorul st andardului IEEE 2882 s -a definit un set comun de
mesaje.
2.1.1. Clasificarea mesajelor
Există două tipuri de clasificări ale mesajelor :
Clasificarea structurală
Clasificarea funcțională
Din punct de vedere structural, mesajele se clasifică în :
Mesaje unilinie – semnalele sunt transmise pe linii singurale dedicate ;
Mesaje multilinie – sunt trimise secvențe seria le de octeți (cei 8 biți sunt di spuși paralel și
sunt transmiși î n mod asincron pe un bus bidirecțional). [8]
Din punct de vedere funcțional, mesajele se clasifică în :
Mesaje de interfață
Mesaje specfice dispozitivelor
2.1.2. Descrierea tipurilor de mesaje
În raport cu ambele tipuri de c lasificare, structurală și funcț ională , mesajele se pot des crie astfel :
1. Tipuri de mesaj e unilinie :
Mesaje de control al transferului octeților de dat e – realizează controlul necesar
transmiterii octeților de date pe ci rcuitele DIO1 -DIO8(control de flux, linii handshake) ;
Mesaje de administrare a interfeței – realizează funcții specific e între controller și
oricare alt instrument din sistem.
2. Tipuri de mesaje multilinie :
a). Mesaje de interfață multilini e – realizează controlul interfe ței:
Mesaje de adresare care pot fi :
– Adrese primare – pentru selectarea dispozitivelor ca transmițători sau receptori ;
– Adrese secundare – transmise după adresa primară pentru selectarea unei funcții
particulare din cadrul unei adrese de bază.
Mesaje de programare com une care, din punct de vedere al adresări i pot fi :
– Mesaje adresate – recepționate de către i ntrumente care au fost configurate ca
receptori ;
– Mesaje universal e – recepționate de către toate instrumentele.
34
b). Mesaje specific e dispozitivelor – conțin octeți de date interpretabili la n ivelul funcțiilor
de dispozitiv. A cestea pot fi :
Mesaje de programare specific e dispozitivelor – generate de către controller ;
Mesaje de răspuns – generate de către instrumentul programabil. [8]
Figura 2.1. Tipuri de mesaje
Figura 2.2. Structura dinamică a mesajelor interfeței
ATN precizează când un byte de date este pregătit pentru a fi citit.
ATN=0 , înseamnă că magistrala de date este in „modul date” , iar când ATN =1 , înseamnă că
magistrala de date este în „modul comenzi”.[15]
Mesaje
Mesaje de
interfa ță
Mesaje multilinie
specifice
dispozitivelor
Mesaje
unilinie
Mesaje
multilinie
Mesaje de
programare
Mesaje de
răspuns
Status
interfață
Controlul
interfe ței
Funcțiile
dispozitivului
GPIB bus
Dispositive subordonate
Mesaje de
răspuns
Mesaje de
răspuns
Status local
Mesaje locale
Interfață status
ATN=0
ATN=1
Interfață mesaje
35
2.1.3. Protocolul de control al schimbului de mesaje
Protocolul schimbului de mesaje desc rie modul î n care instrumentu l gestionează mesajele de
programare și de răspuns, stabil ind ordinea de exe cuție internă a mesajelor de programare.
Mesajele de programare constituie modalitatea pri n care controller -ul gestionează funcționarea
dispozitivelor din cadrul sistemului de măsură și testare, iar mesajele de răspuns reprezintă
răspunsul instrumentului programabil la o interogare. [8]
Există două tipuri de mesaje de programare :
a) Cereri – dispozitivul trebuie să răspundă prin intermediul un ui mesaj de răspuns ;
b) Comenzi – nu este necesar un mesaj de răspuns din partea dispozitivului.
Figura 2 .3. Mesajele multilinie specifice dispozitivului
Etapele întâlnite î n transmisia , analiza și execuț ia mesaje lor:
1. Cont roller -ul adresează instrumentul ca „receptor” și trimite un mesaj : interfața de recepți e
plasează mesajul într -un buffer de intrare;
2. Interpretorul de mesaje:
Preia mesajul din buffer -ul de intrare;
Decodează mesajul;
Verifică dacă sintaxa este corectă. Dacă sintaxa este incorectă aceasta va cauza
raportarea unei erori prin intermediul mesajului de stare al sistemului, care va fi pus
în stiva de erori/ evenimente;
Decodorul detectează dacă este solicitat un răspuns (caz în care mesajul de intrare
este o cerere);
Decodorul transferă instrucțiuni le executabile către blocul de control al execuției î n
format intern;
3. Blocul de control al execuției recepționează informațiile ne cesare pentru acționarea
dispozitivului și inițiază procesul de execuție . În cazul în care există erori de execuție
acestea sunt raportate prin intermediul stării sistemului și a cozii de așteptare de erori .
4. În situția recepționării unei interogări , blocul de funcții al instrumentului transferă datele de
răspuns către formatorul de răspunsuri.
5. Formatorul de răspunsuri convertește codurile interne în mesaje de răspuns în conformitate
cu formatul specific sintaxei IEEE488.2, plasându -le în coada de așteptare de ieșire.
6. La adresarea interfeței ca „transmițător”, ră spunsul formatat din coada de a șteptare de ieșire
este trimis prin interfață către controller. [8]
Controller
Dispozitiv de
măsură și testare
programabil
Mesaj de
programare
comandă
cerere
Mesaj de răspuns
36
[8]
Figura 2. 4. Protocolul de control al schimbului de mesaje
2.2. Sintaxa mesajelor
2.2.1. Sintaxa mesajelor de programare
Comanda și cererea au urmă toarea sintaxă:
Figura 2.5. Sintaxa unității de mesaj de programare
[8]
Antetul conține unul sau mai multe mnemonice ce descriu comanda .
Separatorul conține cel putin un caracter „blane”.
Reguli :
1. Orice caracter „blane” :
Poate preceda u n antet;
Poate preceda terminatorul de mesaje;
Poate fi plasat între antet și parametru;
Poate fi plasat între doi parametri consecutivi.
Separator de date
antet
Separator de antet
Parametru
37
2. Un parametr u specificat ca valoare numerică zecimală poate utiliza diferite formate
numerice de reprezentare.
3. Dacă parametrul este de precizie mai mare decât poate gestiona intern dispozitivul , acesta îl
va rotunji înainte de interpretarea lui.
4. Șirul de date dintr -un parametru trebuie încă rcat între ghilimele (simple sau duble). [8]
Mesajul de programare este compus dintr -unul sau mai multe unități de mesaje de programare ,
având urmatoarea sintaxă :
Figura 2.6. Sintaxa unui mesaj de programare
[8]
Terminatorul de mesaj de programare poate avea urmatoarele coduri :
a) NL^END : cod „new line” trimis concurențial cu mesajul END pe GPIB ;
b) NL: vod „new line”;
c) <dab>^END: mesaj END trimis concurențial cu ultimul octet de date ( <dab>).
Exemplu :
Figura 2.7 . Exemplu
[8]
Prin convenție, literele mari din compunerea mnemonicilor comenzilor SCPI corespund cu forma
scurtă.
2.2.2. Structura mesajelor SCPI
Comenzile SCPI au o structură arborescentă, ierarhică, fiecare comandă conținând un cuvânt cheie
rădăcină și unul sau mai multe cuvinte secundare. Comanda reprezintă de fapt un șir de caractere
ASCII , pentru care avem urmatoarele reguli de scriere :
O comandă începe cu ” : ” ;
Separator de date
Unitate de mesaj
de programare
Terminator de mesaj de
programare
:INPut:IMPedance 1E6;:SENSe:VOLTage:RANGE 200 NL^END
Header de antet
Separator de
antet
Para-
metru
Header de antet
Separator de
antet
Unitate de mesaj
de programare
separator
Unitate de mesaj de programare
Terminator de
mesaj de
programare
38
Cuvintele cheie sunt separate de ” ; ” ;
Cuvintele cheie sunt urmate de valorile dis ponibile pentru parametri;
Simbolul ” , ” este utilizat pentru a separa parametrii unei comenzi.
Dacă avem o interogare , atunci după cuvintele cheie urmează ” ? ” ;
Dacă avem o comandă de control , după cuvintele cheie urmează spațiu și apoi valoarea
pentru parametru.
Simbolul ” * ” este folosit pentru comenzile comune tuturor aparatelor interfațate . [14]
Exemplu :
:CALCulate:AVERage:MINimun
2.2.3. Tipuri de antete
Există două tipuri de antete :
1. Antete compuse : există unul sau mai multe mnemonice de mesaj SCPI separate prin
„ : ”.
2. Antete comune : mesaje de programare comune IEEE488.2 ( mesaje interne ale
instrumentului, mesaje de control, mesaje de stare).
Mnemonicile din compune rea mesajelor de program SCPI pot av ea două forme:
a) Forma lungă – maxim 12 caractere,
b) Forma scurtă – primele 4 caractere ale forme i lungi, sau primele 3 caractere când al patrulea
este o vocală și cele 4 caractere nu alcătuiesc forma lungă. [8]
Exemple :
INITiate (forma lungă),
INIT (forma scurtă),
MAXIMUM (forma lungă),
MAX (forma scurtă) ,
InstruMENT :Nsel 3 (forma lungă),
iNST :NsEL 3 (frma scurtă).
Mnemonicile din compune rea mesajelor de programare comune :
Încep cu un asterisc „ * ”,
Conțin trei litere,
Cererile se încheie cu semnul de întrebare.
Exemple :
*RST?
*IDN?
La dispozitivele cu capabilități multiple de același tip , selecția între funcționalități se realizează
prin intermediul sufixelor numerice. Sufixul 1 este considerat implicit.
La dispozitivele fă ră capabilități multiple , sufixul 1 poate să nu fie acceptat. [8]
Exemplu :
:STATus:QUEstionable: INSTrumnt: ISUMmary2[EVENt]
sufix
39
2.2.4. Sintaxa mesajelor de răspuns
Răspunsul unui instrument SCPI la o cerere de interogare are urmă toarea sintaxă :
Figura 2.8. Sintaxa unității de mesaj de răspuns
[8]
Mesajul de răspuns este compus din unul sau mai multe unități de mesaje de răspuns, și are
următoarea sintaxă :
Figur a 2.9. Sintaxa mesajului de răspuns
NL^END reprezintă terminatorul de mesaj de răspuns
Instrumetul trimite răspunsul in formă scurtă, compus din litere mari.
Exemplu de mesaj de răspuns :
:AM:SOURce EXTernal
:AM:SOURce ?
2.2.5. Arborele de comandă
Setul de comenzi este prezentat sub forma arborelui de comandă și a tabelului de comandă.
Prin parcurgerea arborelui de comenzi de la nodul rădă cină la nodul frunză se reflectă sintaxa
utilizată la alcătuirea unei comenzi. [8]
( , )
Parametru
( , )
Unitate de mesaj de
programare
Terminator de mesaj de
programare
Separator de unit ăți de
programare
40
Figura 2.10. Arborele de comenzi al subsistemului SENSE
[8]
2.2.6. Tabelul de comand ă.
Tabelul de comandă conține parametrii ce pot fi folosiți în cadrul comenzilor : [3]
Tabel 2.1: Comenzi ale subsitemului SENSE
Comenzi Formatul parametrilor Descrierea valorilor
[:SENSe]
:CURRent
| :POWer
| :VOLTage Valori dependente de
instrument
[:DC]
|:AC
:RANGe
[:UPPer] <valoare_numerică>
:LOWer <valoare_numerică>
:AUTO <boolean>|ONCE
:DIRection UP|DOWN|EITHer
:RESolution <valoare_numerică>
:AUTO <boolean>|ONCE
[:SENSe]
:CURRent
:POWer
:VOLTage
Root level
Level 1
:AC
[:DC]
Level 2
:RESolution
:RANGe
:RESolution
Level 3
[:UPPer]
:LOWer
:AUTO
:AUTO:AUTO
Level 4
:DIRection
Level 5
41
Antetul unei comenzi este compus din : header antet și nod frunză.
Exemplu :
VOLTage:DC:RANGe:UPPer
Header antet
Nod frunz ă
42
43
Capitolul 3. Implementarea Hardware a sistemului
3.1. Obiectivele proiectului
Proiectul are ca obiectiv controlul de la distanță a unui generator de semnal cla sic prin intermediul
unei magistral e de comunicație serial ă cu ajutorul unei platform e cu microcontro ller.
Partea hardware a proiectului conține : o placă de dez voltare Arduino cu microcontrol ler,
butoane cu funcțiii predefinite (crește/scade frecvența, creș te/scade amplitudinea, schimbă forma de
undă, etc), afișaj LCD pentru afișarea pa rametrilor, sursă de alimentar e, circuit interfață serial ă
RS232.
Partea software a proiectului conține programul pentr u microcontro ller, care trebuie să
primească comen zi de la butoane, să afișeze v alorile parametrilor pe LCD, să transmită valorile
parametrilor prin interfața serial ă utilizând mesaje SCPI, să primească mesaje de răspuns și să le
afișeze pe LCD .
3.2. Schema bloc a sistemului
Figura 3.1 . Schema bloc a sistemului
3.3. Componentele sistemu lui hard ware
3.3.1. Placa de dezvoltare Arduino UNO
Arduino UNO este o platformă de procesare open -source, compus ă dintr -un mediu de
dezvoltare și o placă de dezvoltare bazată pe microcontrol ler ATmega32 8. Reprezintă o platformă
de mici dimensiuni (6.8 cm /5.3 cm) , construită î n jurul unui procesor d e semnal și este capabilă de
a pre lua date din mediul înconjurător printr -o serie de senzori și de a efectua acțiuni asupra mediului
prin intermediul luminilor, motoarelor, servomotoarelo r, și alte tipuri de dispozitive mecanice.
Procesoru l rulează un cod de programare scris î ntr-un limbaj similar cu limbaju l C++.
uC Butoane Afisaj LCD Alimentare
Generator de
semnal Interfața serială
44
Figura 3.2 . Arduino UNO
Arduino UNO are 14 intrări digitale / pini de ieșire, din care 6 pot fi folosiți c a iesiri PWM, 6 intrări
analogice, un oscilator de c uarț de 16 MHz o conexiune USB , o mufă de alimentare , o mufă ICSP
și un buton de resetare.
Specificații tehnice :
Microcontrol ler : ATmega328,
Tensiunea de operare : 5V,
Tensiunea de ieșire (recomandat) : 7-12V,
Tensiunea de intrare (limitare) : 6-20V,
Pini digitali I/O : 14 (din care 6 pot fi folosiți ca PWM),
Pini analogici de intrare : 6,
DC Curent pentru pinii de I/O : 40mA,
DC Curent pentru p inul de 3.3V : 50 Mv,
Memoria : 32 kB din care 0.5 k B utilizați de bootloader,
SRAM : 2 kB,
EEPROM : 1 kB,
Clock Speed : 16 MHZ. [2]
Pinii de tensiune și alimentarea :
1. Vin – tensiunea de intrare pe placa de dezvoltare atunci când este utilizată o sursă de
alimentare externă ,
2. 5V – regulator de tensiune utilizat pentru alimentarea microcontrol lerului și a altor
componente de pe placa de dezv oltare. Acesta poate fi aliment at fie de la Vin print r-un
regulator de pe placa de dezvoltare , fie furni zat de că tre USB sau de altă sursa de
tensiune de 5V.
3. 3.3V – reprezintă o alimentare de 3.3V generată de către regulatorul de tensiune de pe
placă. Curentul maxim furnizat este de 50 mA
4. GND – pini de împă mântare. [2]
Pinii cu funcții specializate :
Serial : pinul 0 (RX) și pinul 1 (TX) . RX este folosit pentru a primi date seriale , iar
TX pentru a transmite date seriale. Sunt conectați la pinii corespunzători ai Atmega8U2
USB – TTL cip serial .
Întreruperile externe : pinul 2 și pinul 3 . Acești pini pot fi co nfigr ați pentru a
semnaliza o î ntrerupere la o valoare mică, o creștere/scădere sau o modificare a valorii.
45
PWM: pinii 3, 5, 6, 9, 10 și 11, furnizează ieșirea pe 8 biți PWM cu funcția
„analogWrite()”.
SPI: pinii 10 (SS) , 11( MOSI), 12 (MISO), 13 (SCK) suportă c omunicarea SPI
folosind biblioteca SPI.
LED: pinul 13.
3.3.2. Afișajul :LCD Keypad Shield for Arduino
Mod ulul LCD Keypad conține un ecran LCD cu caractere negr e și lumină de fundal albastră și 6
taste: select, sus, dreapta, jos , stânga și reset.
Specificații tehnice ale modulului LCD :
Tensiunea de alimentare : 5V
Curent 1.1 mA
Tensiunea de alimentare pentru fundal 4.2V
Curent pentru fundal 100mA
Figura 3.3 . LCD Keypad Shield for Arduino
Figura 3.4. Schema electrică a butoanelor
46
Tabel 3.1 . Tensiunea de ieșire a butoanelor
Butoane
Valorile
analogie ale
butoanelor Tensiunea de
ieșire pe pinul
AD0 Intervale
analogice de
decizie Intervale de
decizie
RIGHT
0
0V
<20
<0.2V
UP
98
0.49V
<150
0.2 V – 0.9V
DOWN
253
1.25 V
<300
0,9 V – 1.62V
LEFT
406
1.99V
<500
1.62V – 2.55V
SELECT
638
3.11V
<750
>2.55V
Alocarea pinilor se face în felul urmator :
Tabel 3. 2. Tabel alocarea pinilor pentru LCD Keypad Shield for Arduino
Pin Funcț ie
D4 DB4
D5 DB5
D6 DB6
D7 DB7
D8 RS(data or signal display selection)
D9 LCD1602 Enable
D10 Backlight control
[6]
3.3.3. RS232 Shield v2
Figura 3.5. RS232 Shield v2
47
Platforma Arduino dispune doar de un port USB și interfață TTL. Acest shield ajută la conectarea
platformei Ardui no cu alte echipamente prin interfața serială RS232.
„Portul RS232 obișnuia să fie metoda de conectar e standar d pentru cele mai mult e periferice
ale calculatorului. În acest moment, portul este folosit pentru prototyping când vine vorba de
diverse automatizări și pentru echipamente industriale ” [6]
Standardul RS 232 a fost introdus de EIA (Elect ronics Industries Association) î n anul 1969
cu scopu l de a permite interconectarea e chipamentelor de comunicații de la diverși producători.
Inițial a fost dezvoltat pentru transmisii de date pe linii telefonice între un terminal DTE (Data
Terminal Equipament) și un modem D CE (Data Communication Equipament).
Magistrala RS232 este utilizată pentru transmisia de date între două dispozitive electronice,
precum :
Calculatoare personale, pentru conectarea echipamentelor periferice ;
Echipamente industriale ;
Echipamente de rețea : switch -uri și routere ;
Instrumente de măsură și control , cu scopul programării acestora și transmisia datel or
măsurate către un calculator ;
Dispozitive programabile .[3]
Principalele caracteristici ale standardului RS232 :
Informația este transmisă serial, la rate de 2400, 4800, 9600, 19200 baud ;
Datele sunt reprezentate pe nivele de tensiune față de o referință comună pentru emițător și
receptor , denumită GND,
La emisie, bitul 0 (Space, High) este reprezentat ca o tensiune 𝑉𝐻față de masă (între 5V și
25 V) , iar bitul 1 (Mark, Low) este reprezentat ca o tensiune negativă 𝑉𝐿 față de masă (între –
5V și -25V) .
La recepț ie, dispozitivul decodează semnale de tensiune : dacă este mai ma re de 3V avem
bitul 0, iar dacă este mai mică de -3V avem bitul 1. Nivelul de tensiune cuprins intre -3V și
3V este ignorat.
Informațiile ce trebuie transmise sunt împă rțite în cuvinte de date de lungime variabilă.
Formatul de transmisie al datelor este descris prin următorii parametri :
Rata de tran sfer (baudrate) ;
Bitul de start ;
Numărul de biț i de date ;
Paritatea ;
Numărul de biți de stop.
Prin intermediul biților de start și stop se dete rmină începutul , respectiv sfârșitul secvenței de date
transmisă. Prin intermediul testului de paritate se pot ev idenția eventualele erori de transmisie. [3]
Exemplu : Procesul de tr ansmitere a caracterului „2” , î n reprezentare binară
corespunzătoare codului ASCII, avâ nd protocolul : 1 bit de start, 7 biți de date , 2 biț i de stop,
paritate impară.
48
[3]
Figura 3.6. Semnalele corespunzătoare transmisiei caracterului „ 2 ”
Figura 3.7. Mufă RS232 „mama” DB9
Tabel 3.3 . Descrierea semnalelor magistralei RS232
Limitările standardului RS232 :
Rata de transfer este mai mic ă de 19200 biți/secundă (baud) ;
Lugimea cablurilor de date mai mică de 15m ;
Rata de tr ansfer trebuie sa fie fixă ;
Nu se pot conecta mai multe dispozitive pe același cablu ;
Sursa de alimentare trebuie sa fie simetrică față de masă ;
Protocolul de comunicare este asincron ;
Necesită biți suplimentari pentru indicarea începutului și sfârșitul pachetului de date.
Pini
DB9 Acronim Rol
1 DCD – Data Carrier
Detect Detecție de date
2 TxD – Transmitted Data Tran smisie de date
3 RxD – Received Data Recepție de date
4 DTR – Data Terminal
Ready Terrminal pregătit
5 GND – Common
Ground Masă de semnal
6 DSR – Data Set Ready Modem pregătit
7 RTS – Request To Send Cerere de emisie
8 CTS – Clear To Send Gata de emisie
9 RI – Ring Indicator Indicare apel
49
3.5. Macheta finală a sistemului
Figura 3.8. Macheta finală
Figura 3.9. Setarea formei de undă si a frecvenței
50
Figura 3.10. Setarea amplitudinii
Figura 3.11. Răspunsul generatorului la interogare
51
Capitolul 4 : Implementarea Software a programului
4.1. Mediul de dezvoltare IDE
Mediul Integrat de dezvolatre (IDE) Arduino este destinat scrierii programelor ce pot fi
încărcate pe platformele fizice Arduino. Int erfața este scrisă î n Java și mediul de programare
folosește limbaje de programare de tip open source. Interfața poate rula în Windows , Mac OS X și
Linux. [1]
Mediul de programare combină toți pașii necesari creării unui program : editarea codului
sursă, compilarea, depanarea, testarea, generarea de documentație. [4]
Figura 4.1 . Mediul Integrat de dezvoltare Arduino (IDE)
52
4.2. Scheme logice
Figura 4.2. Schema logică meniu
4.3. Funcția de citire de la butoane
char readKeypad()
{
int keypadValue = analogRead (keypadPin);
if(keypadValue < 20)
return 'R';
else if(keypadValue < 150)
return 'U';
else if(keypadValue < 300)
return 'D';
else if(keypadValue < 500)
return 'L';
else if(keypadValue < 750)
return 'S'; Proiect licență „Controlul de
la distanță a unui generator
de semnal ” 1.Controlul
generatoruluiA. Formă de undăSinusoidală
Triunghiulară
Dreptunghiulară
UpRamp
DownRamp
B. FrecvențăValoare numerică
Unitate de
măsură
C.AmplitudineValoare numerică
Unitate de
măsură2.Funcții
predefiniteFuncții de
interogare
3.Opțiuni RS 232Rata de transfer
Paritate
Adresă
Reconectare
Testare RS 2324. Despre
53
else
return 'N';
}
void waitBtnRelease()
{
while( analogRead (keypadPin) < 800){}
}
Stabilire a pragurilor de decizie pentru butoane s-a facut în funcție de valorile analogice ale
acestora, precum : select 638, left 406, down 253, up 98, right 0. Când butoanele nu sunt apă sate
avem valoarea analogică 1023.
Funcția analgRead () are ca para metru val oarea citită la fiecare pin al butoanelor, și atribuie
valorilor aflate în intervalul de tensiune 0V – 5V, iar valori analogice între 0 și 1023.
4.4. Funcții folosite pentru afișare pe ecran
Modulul LCD are o interfață paralelă, astfel microcontr ollerul trebuie să manevreze mai
mulți pini în același timp. Interfața este compusă din următorii pini :
Pinul pentru Registr u Select ( RS) care controlează unde î n memoria LCD -ului se scrie data.
Pinul Read/Write (citește/scrie) ( R/W) care selectează modul de scriere sau modul de citire.
Pinul Enable care permite scrierea.
8 pini de date (D0 -D7). [16]
Conectarea modulului LCD la platforma Arduino UNO se face prin funcția :
LiquidCrystal lcd ( 8, 9, 4, 5, 6 , 7);
Unde :
pinul RS al LCD -ului est e conectat la pinul digital 8,
pinul Enable este conectat la pinul digital 9,
pinii de date D4, D5, D6, D7 sunt conectați la pinii digitali 4, ,5, 6, 7.
Funcțiile folosite din libraria LiquidCrystal sunt urmatoarele :
1. lcd.clear( ) ; – golește ecranu l LCD și poziționează cursorul î n colțul din
stânga sus .
2. lcd.setCursors( 0 , 0 ); -setează cursorul la poziția specificată în funcție de coloana și
rândul specificat.Coloa na poate lua valori intre 0 – 15, iar pentru
specificarea rândului sunt posibile 2 valori 0 și 1 (avem 2 rânduri
pe LCD)
3. lcd.write ( ) ; – pentru a scrie un caracter pe LCD .
4. lcd.print ( ) ; – afișează datele pe ecran.
5. lcd.begin ( , ) ; – inițializează interfața cu ecranul LCD. Are doi
parametrii: lățimea și înă lțimea ecranului.
4.5. Funcți i pentru stabilirea comunicaț iei
Funcțiile seriale sunt folosite pentru comunicarea între platforma Arduino cu un alt
dispozitiv. Platformele Arduino au cel puț in un port serial, cunoscut ca UART sau USART.
Comunicația se face prin pinii digitali 0 (RX) și 1 (TX). [16]
54
1. Funcția folosită pentru a verifica conexiunea
bool checkConnection()
{
byte address = params[Par am_Address];
int ret = 0;
while ( Serial.available ())
Serial.read();
Serial.write(address);
Serial.write(predefCmd[Predef_Idn]);
Serial.write(0x00);
Serial.flush();
ret = Serial.readBytesUntil(0x00, buff, sizeof(buff) – 1
return (ret != 0);
}
Verificarea conexiunii se face folosind funcția de interogare a generatorului *IDN? .
Funcția while(Serial.available()) obține numărul de octeți disponibili pentru citirea de la
portul serial. Pentru citirea octeților d e intrare se folosește funcția Serial.read() . Funcția
Serial.write(address) este folosită pentru a scrie date, binare la p ortul serial, datele fiind transmise
ca un octet sau o serie de octeți. Adresa se scrie in hexazecimal.
Funcțiile Serial.write(predefCmd[Predef_Idn ]), Serial.write(0x00) ,se folosesc pentru
scrierea comenzii predefinite „ *ID N? ”, iar pentru a specifica sfârșitul comenzii pre definite se scrie
valoarea 0x00 în hexazecimal. Pentru transmiterea datelor din buffer se folosește funcția
Serial.flush() .
Funcția ret = Serial.readBytesUntil(0x00, buff, sizeof(buff) – 1 citește caracterele din buffer –
ul de s erie și returnează numărul de caractere citite în buffer.
2. Funcția folosită pentru stabilirea conexiuni i setează rata de biți pe secundă, paritatea și
numărul biților de stop.
void establishConnection()
{
int parity;
char key = 'N';
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Conectare….");
switch(params[Param_Parity]) {
case Value_S8N1:
parity = SERIAL_8N1;
break;
case Value_S7O1:
parity = SERIAL_7O1;
break;
case Value_S7E1:
parity = SERIAL_7E1;
break;
default:
parity = SERIAL_8N1;
break;
}
Serial.end();
Serial.begin(params[Param_Baudrate], parity);
lcd.clear();
55
lcd.setCursor(4, 0);
lcd.print("Conectare");
if (!checkConnection()) {
lcd.setCursor(4, 1);
lcd.print("nereusita!");
}
else {
lcd.setCursor(5, 1);
lcd.print("reusita!");
}
while (key == 'N') {
key = readKeypad();
waitBtnRelease();
delay(50);
}
}
Funcția Serial.end() are rolul de a dezactiva comunicația serială.
Funția Serial.begin(params [Param_Baudrate), parity) setează rata de biți pe secundă
pentru transmisia de date seriale. Al doilea argument al funcției configurează paritatea și biții de
stop. Valoarea implicită este de 8 biți de date, fără paritate și un bit de stop de da te seriale.Al doilea
argument configurează paritatea și biții de stop.Valoarea implicită este de 8 biți de date, fără
paritate și un bit de stop .
4.6. Funcț ii pentru transmiterea mesajelor SCPI
Comenzile SCPI folosite pentru controlul generatoru lui de semnal sunt specificate î n tabelul 4.1.
Tabel 4.1 . Mesaje SCPI pentru controlul generatorului de semnal
Comandă Descriere
*IDN? Interoghează denumirea generatorului.
SYSTem:REMOTE Setează starea „Remote” pentru a putea controla de la
distanță generatorul.
FUNCtion:SHAPe SINusoid/ SQUare/
TRIangle/ UP_RAMP/ DOWN_RAMP Setează forma de undă dorită.
FUNCtion: SHAPe? Interoghează generatorul pentru a afla forma de undă .
FREQuency<frecvență> Setează frecvența.
FREQuency? Interogheză generatorul pentru a afla frecvența
stabilită. Rezulta tul est e exprimat în Hz .
VOLTage <amplitudine> Setează amplitudinea.
VOLTage? Interoghează generatorul pentru a afla valoarea
amplitudinii stabilite.
1. Funcția folosită pentru definirea parametrilor și a funcți ilor predefinite :
void setupParams()
{
valuesTxt[Value_Sinusoid] = "SINusoid";
valuesTxt[Value_Square] = "SQUare";
valuesTxt[Value_Triangle] = "TRIangle";
valuesTxt[Value_UpRamp] = "UP_RAMP";
56
valuesTxt[Value_DownRamp] = "DOWN_RAMP";
valuesTxt[Value_Hz] = "Hz";
valuesTxt[ Value_KHz] = "KHz";
valuesTxt[Value_MHz] = "MHz";
valuesTxt[Value_VPP] = "VPP";
predefCmd[Predef_Idn] = "*IDN?";
predefCmd[Predef_Shape] = "FUNCtion:SHAPe?";
predefCmd[Predef_Freq] = "FREQuency?";
predefCmd[Predef_Volt] = "VOLTage?";
predefCmd[Predef_Dcycle] = "PULSe:DCYCle?";
}
2. Fucțiile folosite pentru schimbarea formei de undă (a), pentru setarea frecven ței (b) și pentru
setarea amplitudinii (c) sunt urmatoarele :
void dispatchCommand()
{
a).
byte a ddress = params[Param_Address];
if (curMenu ->param == Param_Shape) {
Serial.write(address);
Serial.write("FUNCtion:SHAPe ");
Serial.write(valuesTxt[params[Param_Shape]]);
Serial.write(0x00);
Serial.flush();
}
b). else if(curMenu ->param == Param_FreqValue || curMenu ->param == Param_FreqUnit) {
Serial.write(address);
Serial.write("FREQuency ");
Serial.print(params[Param_FreqValue]);
Serial.write(0x20);
Serial.write(valuesTxt[params[Param_FreqUnit]]);
Serial.write(0x00);
Serial.flush();
}
c). else if(curMenu ->param == Param_AmplValue || curMenu ->param == Param_AmplUnit) {
Serial.write(address);
Serial.write("VOLTage ");
Serial.print(params[Param_AmplValue]);
Serial.write(0x20);
Serial.write(valuesTxt[params[Param_AmplUnit]]);
Serial.write(0x00);
Serial.flush();
}
}
57
Capitolul 5 : Măsurători pentru testarea magistralei de date
5.1. Mentenanța predictivă
„Mentenanța (întreținere) reprezintă totalitatea operațiilor de întreținere și reparație ale unui
sistem tehnic”. [17]
Există 3 tipuri de întreținere :
Întreținere Reactivă – efectua rea reparațiilor la defec tarea produselor
Întreținere Preventivă – este o întreținere planificată, reparațiile sunt efectuate la
intervale regulate.
Întreținere Predictivă – Problemele sunt detectate înainte de defectare a prognozat ă.
Se monitorizează stările echipamentelor, echipamentele sunt
reparate doar atunci cand este nevoie.[17]
[17]
Figura 5.1. Tipuri de întreținere
„ Mentenața predictivă reprezintă un salt calitativ superior într -un sistem de mentenanță
modern, indiferent de ramura industrială sau de specificul de producție , deoarece oferă toa te
informațiile necesare pentru : depistarea din timp a apariției defecțiunilor, localizarea acestora,
diagnosticarea defecțiunilor, precum și calculul de funcționare în condiții de siguranță a utilajului.”
[18]
Mentenan ța predictvă reprezintă mijlocul de îmbunătățire și creștere a productivității, a
calității produselor , mărirea dur atei de viață a echipamentelor, oferind astfel o protecție sporită a
muncii.
Testarea predictivă compară limitele de funcționare ale echipamentelor cu tendințele
parametrilor măsurați cu scopul detectării, analizări i și corectării eventualelor probleme înanintea
apari ției defecte lor. Avantajele testării predictive sunt următoarele :
Economisirea energiei și a resurselor ,
Protecția muncii sporită,
58
Producție de calitate mai bună ,
Creșterea duratei de viață.
[17]
Figura 5.2.Etapele întreținerii predictive
Testarea predictivă presupune luarea de decizii importante asupra necesității intervenției la nivelul
unui echipament înainte de o defecta re preconizată .
[17]
Figura 5.3. Testare predictivă
Inspecția programată
Inspecție
Clasificare și
raportare
Priorități
Reparații
Control
Baza de date
59
5.2. Testarea automată a magistralei RS232
Magistralele de date repre zintă o cale de comunicație, ele fiind reprezentate fizic de un set de
conductoare.
Tabel 5.1. Parametrii măsurați pentru magistrala RS232
Aparatul folosit pentru efec tuarea măsurătorilor a fost FLU KE 125 Industrail Scopemeter
Figura 5.4 . a). , b). Aparat de testare
a).
Rata de transfer
(bps)
9600
4800
2400
1200
600
300 Valori impuse de
standardul
EIA232
Minim Maxim
Nivelul maxim al
semnalului
Vmax (V) 8,7 8,7 8,7 8,6 8,8 8,8
3,0
15,0
Nivelul minim al
semnalului
Vmin (V) -8,4 -8,8 -8,4 -8,7 -9 -8,9
-15
-3
Durată bit ( µs)
Tb 108 208,7 416,7 839 1669 3347 –
Rata de bit (bps)
𝑅𝑏=1
𝑇𝑏
9270 4790 2400 1192 599 299
–
Timpii de
creștere ( µs) 0,2
0,5 0,2 0,1 0,2 0,2 27%
Timpii de
descreștere ( µs) 0,2 0,4 0,1 0,2 0,2 0,2 27%
Distorsiuni
Jitter 0,9 0,9 0,4 0,2 0,7 0,7 5%
Supracreștere 0 0 0 0 0 0 –
Starea
magistralei OK OK OK OK OK OK –
60
b).
Diagramele ochi au fost făcute cu O sciloscopul Agilent MSO -X 3024A
Figura 5.5. Osciloscop
și Scopemeter
61
a).
b).
Figura 5.6. a). , b). Diagrama ochi
5.3. Analiza serială a magistralei RS232
Pentru a efectua analiza serială a magistralei am instalat pe osciloscopul Agilent MSO -X 3024A
licența DSOX3COMP – UART/RS232 Computer Serial Triggering and Analysis .
Caracteristicile și specificațiile tehnice ale licenței DSOX3COMP – UART/RS232 :
Protocol trigger și protocol bazat pe decodare,
Protocol de decodare pentru binar, hexazecimal și ASCII
Oferă capabilități de declanșare( trigger) la transmisia specificată sau la valorile primite.
Numără în timp real cadrele transmise și recepționate, cal culând eventualele erori.
62
Funcția de cod ce are rol de generator de mesaje este folosită pentru a testa magistrala serială
RS232.
void testRS232()
{
char key = 'N';
restartConnection();
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Transmitere");
lcd.setCursor(6, 1);
lcd.print("date");
while (key == 'N') {
Serial.write("Ana are mere");
Serial.flush();
delay(100);
key = readKeypad();
}
waitBtnRelease();
}
Pentru a testa magistrala de date se transmite un șir de caractere cu ajutorul funcției
Serial.write("Ana are mere");
Figura 5.7. .Decodare ASCII
Figura 5.8. Decodare Hexazecimală
63
Figura 5.9. Codare Binară
5.4. Probleme întâmpinate
Am întâmpinat câteva diferențe între modul de conectarea de pe laptop la generatorul de semnal
Protek 9305 și conectarea de pe platforma Arduino UNO la generator.
Diferențele sunt legate de cablurile folosite pentru realizarea conectării.
Pentru a realiza o conexiune serială între laptop și generator am folosit un cablu convertor
USB la Seriala RS232, care este conectat la generator print r-un c ablu serial crossover
mamă -mamă,deoarece generatorul are o mufă RS232C, adică liniile Rx și Tx sunt inversate.
Figura 4.3. RS232 crossover
Pentru a realiza conexiunea serială dintre platforma Arduino și generatorul de semnal a fost
nevoie de un Shield RS232 v 2 și un cablu serial normal mamă -tată, d eoarece pini TX și RX
de pe shield sunt inversați între ei, astfel nu mai este nevoie să folosim un cablu serial
crossover.
Pentru transmiterea datelor pe serial ă de pe laptop am folosit programul CoolTermWin.
Figura 4.4. CoolTerm
64
Programul ne permite să facem anumite setări ale serialei, cum ar fi : rata de biți pe secundă,
numărul de biți, paritatea, numărul biților de stop, etc.
Problemele întâmpinate la transmiterea datelor a u fost acelea că generatorul nu primește
comenzi/ instrucțini î n cod ASCII , comenzile trebuie să fie trimise în cod hexazecimal. Astfel,
înaintea trimiteri i fiecărei instrucțiuni trebuie să se facă conversia din ASCII în Hexazecimal. După
efectuarea conversiei asup ra instrucțiunilor se mai fac câ teva modificări: se pune adresa pe care
generatorul este setat, iar la sfârșitul instrucțiunii, pentru a indica s fârșitul trebuie să se pună
valoarea 0x00.
Figura 4.5. Instrucțiune în ASCII
Figura 4.6. Instrucțiune în hexazecimal
Aceste ajustă ri legate de transmisia instrucț iunilor, indicarea adresei generatorului și valoarea de
sfârșit 0x00, trebuie făcute și pentru transmiter ea instrucțiunilor de pe platforma Arduino.
O alta problemă întâlnită a fost legată de transmisia datelor pe serială. La începutul
dezoltă rii am folosit clasa String din bib lioteca Arduino pentru a -mi fi mai ușor să lucrez cu ș iruri
de caracte re. Problema este că implement area acestei clase nu eliberează bine memoria (o
fragmentează) iar la rulare rămâneam fără memorie . Așa că a trebuit să folosesc vectori de caractere
și să refac o parte din cod. Pentru a putea transmite fiecare instrucțiune spre generator trebuie să
forțez trimiterea pe serială. Acest lucru se face cu ajutorul funcției flush() care golește buffer -ul
după ce toate caracterele de ieșire sunt trimise.
Adresa
Sfârșit
instrucțiune
65
Concluzii
Proiectul implementat are ca scop controlul de la distanță a l generatorului de sem nal Protek
9305, precum și testarea magistrala serială RS232.
Pentru a reuși implementare proiectului a fost nevoie de o bună documentare despre
magistrala serial ă RS232, despre limbajul SCPI (standardul pentru controlul instrumentelor de
măsură cu interfață programabilă ), precum și despre modul de programare în Arduino. Am realizat
cât de importa ntă este documentarea înaintea al egerii componentelor folosite, deoarece există
posibilitatea ca aces tea să nu fie compatibile.
Interfața de comunicare dintre generator și platform Arduino este interfața serială RS232 .
S-a ales utilizarea interfeței seriale RS232 deoarece doar prin intermediul acesteia se pot trimite
comenzi remote către generatorul de semnal Protek 9305 .
Interfața RS232 era una din te cele mai folosite echipamente periferice,însă o dată cu avansarea
tehnologiei aceasta s -a folosit din ce în ce mai putin, pe majoritatea PC -urilor și laptopu rilor
moderne lipsește. Conectarea de pe un laptop modern la intefața serială RS232 se poate face cu
ajutorul unui convertor USB -Serial .
Proiectul oferă posibilitatea de a interacționa cu generatorul, oferind posibilitatea controlării
unor parametrii (for ma de undă, frecvența, amplitudinea) și interogar ea generatorului prin folosirea
unor funcții predefinite (IDN?, FUNCtion :SHAPe? , FREQuency? , VOLTage?. ). De asemenea,
avem posibilitatea de a configur a anumite setări ale serialei, precum : rata de transfer , paritatea și
numărul de biți, adresa.
A doua aplicație a proiectului este testarea magistralei RS232. Aceasta se face c u ajutorul
funcției implementate, denu mită „Testare RS232”.În momentul selectării acestei opțiuni se va
trimite pe serială un șir de caractere pâna la apăsarea oricărui buton. Trimiterea șirului de caractere
pe o durată mai mare de timp ajută la testarea magistralei, la măsurarea anumitori parametr i (nivelul
maxim al semnalului, nivelul minim al semnalului,durata unui bit, rata de bit , etc.) ce sunt folosiți
pentru a determina starea acesteia.
Proiectul poate fi folosit în laboratoarele din cadrul facultății demonstrând conceptul de
control al dispozitivelor programabile precum și testarea magistralei seriale RS232.
66
67
Bibliografi e
[1] http://incearca.softwareliber.ro/2008/06/30/arduino -platforma -gratuita -pentru -pasiona%C8%9Bii -de-electronica/ .
(2008, 06 330). Preluat de pe http://incearca.softwareliber.ro . Accesat la 06.06.2016
[2] ANDREI, C. (2010). Arduino UNO – Specificatii tehnice . Preluat pe 2016, de pe
http://invata.mecatronica.eu/2010/10/28/arduino -uno-specificatii -tehnice/. Accesat la 12.05.2016
[3] Cupcea, C. Ș. (2003). Electrnică Aplicatăș – Sisteme Inteligente Hardware – Software de Măsurare și Co ntrol.
Bucuresti.
[4] https://www.teguna.ro/wiki/Introducere_programare_Arduino (fără an). Preluat de pe https://www.teguna.ro.
Accesat la 06.06.2016
[5] Madhumita Date, S. P. (fără an). http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6208673. Preluat de pe
http://ieeexplore.ieee.org. Accesat la 03.05.2016
[6] robofun . (fără an). Preluat de pe https://www.robofun.ro/rs232 -shield -v2?search=rs%20232. Accesat la
22.05.2016
[7] Sergio Gallardo, F. B. (2004 -2005). http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4153509 . (S. University
of Seville, Producător) Preluat de pe http://ieeexplore.ieee.org . Accesat la 05.05.2016
[8] Stoian, R. (1999). Standarde de comunicație pentru instrumentația programabilă. Buc urești: Printech.
[9] Îndrumator laborator Testarea Automată a Echipamentelor și Procesoarelor .
[10] Wilcher, D. (2015, 10 19). http://www.allaboutcircuits.com/projects/build -an-arduino -labview -analog -voltmeter/ .
Preluat de pe http://www.allaboutcircuits.com. Accesat la 07.05.2016
[11] Ș,l.dr.ing. Zet Cristian . Curs Sisteme automate de măsură. Facultatea de Inginerie Electrică, Energetică
și Informatică Aplicată , Iasi
[12] Îndrumator laborator :Circuite Integrate și Sisteme de achiziție .
[13] http://www.acdcelectronics.ro/index_files/aplicatii_automate_p rogramabile_plc4403_plc4404.html Accesat la
12.05.2016
[14] http://www.elth -mee.home.ro/Indrumar/IntroducereInSCPI.htm Accesat la 02.05.2016
[15] http://www.creeaza.com/referate/informatica/calculatoare/Utilizarea -interfetei -paralele884.php
Accesat la 03.05.2016
[16] https://www.arduino.cc Accesat la 17.05.2016
[17] Curs: Mentenan ța predictivă Testarea Automată a Echipamentelor și Procesoarelor .
[18] http://memm.utcluj.ro/materiale_didactice/mentenanta/curs/Mentenanta_note_de_curs_1 . Accesat la 20.06.2016
[19] http://www.keysight.com/en/pd -1951451 -pn-DSOX3COMP/computer -serial -triggering -and-analysis -rs232 -uart-
for-infiniivision -3000 -x-series?nid= -32976.970769&cc=RO&lc=eng Accesat la 01.07.2016
[20] https://docs.google.com/file/d/0Bw_zZMBxTYtvWDVZMXRhR1RDb2c/view Accesat la 20.06.2016
[21] https://www.arduino.cc/en/uploads/Main/arduino -uno-schematic.pdf Accesat la 20 .06.2016
[22] https://cdn.sparkfun.com/datasheets/Dev/Arduino/Shields/SHD_RS232_V2_AA_SCH.pdf Accest la 20.06.2016
68
69
Anexe
Anexa 1 – Program Arduino
#include <LiquidCrystal.h>
#include "meniu.h"
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
const int UP_ARROW = 0x00;
const int DOWN_ARROW = 0x01;
int keypadPin = A0;
char btnPush;
char buff[65];
bool focusFirst = true;
bool doneWelcome = false;
bool waitResponse = false;
menu_t *curMenu = initMenuStructure();
int params[Param_Num];
const char *valuesTxt[Value_Num];
const char *predefCmd[Predef_Num];
void setupParams()
{
params[Param_Shape] = Value_Square;
params[Param_FreqUnit] = Value_Hz;
params[Param_AmplUnit] = Value_VPP;
params[Param_FreqValue] = 1;
params[Param_AmplValue] = 1;
params[Param_Baudrate] = 9600;
params[Param_Parity] = Value_S8N1;
params[Param_Address] = 1;
valuesTxt[Value_Sinusoid] = "SINusoid";
valuesTxt[Value_Square] = "SQUare";
valuesTxt[Value_Triangle] = "TRIangle";
valuesTxt[Value_UpRamp] = "UP_RAMP";
valuesTxt[Value_DownRamp] = "DOWN_RAMP";
valuesTxt[Value_Hz] = "Hz";
valuesTxt[Value_KHz] = "KHz";
valuesTxt[Value_MHz] = "MHz";
valuesTxt[Value_VPP] = "VPP";
valuesTxt[Value_mVPP] = "mVPP";
valuesTxt[Value_S8N1] = "SERIAL_8N1";
valuesTxt[Value_S7O1] = "SERIAL_7O1";
valuesTxt[Value_S7E1] = "SERIAL_7E1";
predefCmd[Predef_Idn] = "*IDN?";
predefCmd[Predef_Shape] = "FUNCtion:SHAPe?";
predefCmd[Predef_Freq] = "FREQuency?";
predefCmd[Predef_Volt] = "VOLTage?";
predefCmd[Predef_Dcycle] = "PULSe:DCYCle?";
}
void defChar (LiquidCrystal &thelcd, int asc, const
unsigned char row[8])
{ int i;
if ((asc < 0) || (asc > 7))
return;
thelcd.command (0x40 | (asc << 3));
for (i = 0; i < 8; i++)
thelcd.write (row[i]);
thelcd.home ();
}
bool checkConnection()
{
byte address = params[Param_Address];
int ret = 0;
while (Serial.available())
Serial.read();
Serial.write(address);
Serial.write(predefCmd[Predef_Idn]);
Serial.write(0x00);
Serial.flush();
ret = Serial.readBytesUntil(0x00, buff, sizeof(buff) – 1);
return (ret != 0);
}
void restartConnection()
{
int parity;
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Conectare….");
switch(params[Param_Parity]) {
case Value_S8N1:
parity = SERIAL_8N1;
break;
case Value_S7O1:
parity = SER IAL_7O1;
break;
case Value_S7E1:
parity = SERIAL_7E1;
break;
default:
parity = SERIAL_8N1;
break;
}
70
Serial.end();
Serial.begin(params[Param_Baudrate], parity);
}
void establishConnection()
{
char key = 'N';
restartConnection();
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("Conectare");
if (!checkConnection()) {
lcd.setCursor(4, 1);
lcd.print("nereusita!");
}
else {
lcd.setCursor(5, 1);
lcd.print("reusita!");
}
while (key == 'N') {
key = readKeypad();
waitBtnRelease();
delay(50);
}
}
void testRS232()
{
char key = 'N';
// int num = 0;
restartConnection();
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Transmitere");0
lcd.setCursor(6, 1);
lcd.print("date");
while (key == 'N') {
Serial.write("Ana are mere");
// Serial.print(num);
Serial.flush();
delay(100);
// num = (num + 1)%32001;
key = readKeypad();
}
waitBtnRelease();
}
void setup()
{
unsigned char up_arrow[8] = {0x04, 0x0E, 0x15,
0x04, 0x04, 0x04, 0x04, 0x00};
unsigned char down_arrow[8] = {0x00, 0x04, 0x04,
0x04, 0x 04, 0x15, 0x0E, 0x04};
defChar(lcd, UP_ARROW, up_arrow);
defChar(lcd, DOWN_ARROW, down_arrow);
setupParams();
lcd.begin(16,2);
delay(1000);
}
void loop()
{
if (doneWelcome) {
btnPush = readKeypad();
if (!((curMenu ->param == Param_AmplValue ||
curMenu ->param == Param_FreqValue ||
curMenu ->param == Param_Address) &&
(btnPush == 'U' || btnPush == 'D')))
{
waitBtnRelease();
}
menuLogic();
curMenu ->displayMenu();
delay(100);
}
else {
displayAboutInfo();
establishConnection();
}
}
bool checkConnectionBeforeApply()
{
bool ret = checkConnection();
char key = 'N';
if (!ret) {
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("Conexiune");
lcd.setCursor(4, 1);
lcd.print("inactiva!");
while (key == 'N') {
key = readKeypad();
waitBtnRelease();
delay(50);
}
}
return ret;
}
void dispatchCommand()
{
byte address = params[Param_Address];
if (curMenu ->param == Param_Shape) {
Serial.write(address);
Serial.write("FUNCtion:SHAPe ");
Serial.wri te(valuesTxt[params[Param_Shape]]);
Serial.write(0x00);
Serial.flush();
}
else if(curMenu ->param == Param_FreqValue ||
curMenu ->param == Param_FreqUnit) {
71
Serial.write(address);
Serial.write("FREQuency ");
Serial.print(params[Param_FreqValue]);
Serial.write(0x20);
Serial.write(valuesTxt[params[Param_FreqUnit]]);
Serial.write(0x00);
Serial.flush();
}
else if(curMenu ->param == Param_AmplValue ||
curMenu ->param == Param_AmplUnit) {
Serial.write(address);
Serial.write("VOLTage ");
Serial.print(params[Param_AmplValue]);
Serial.write(0x20);
Serial.write(valuesTxt[ params[Param_AmplUnit]]);
Serial.write(0x00);
Serial.flush();
}
}
void onPressedSimple()
{
// Trimitem valoarea chia r daca este egala cu cea
setata
// if (params[curMenu ->param] != curMenu ->value)
// {
if (curMenu ->param == Param_FreqUnit &&
curMenu ->value == Value_MHz &&
params[Param_FreqValue] > 5)
{
params[Param_FreqValue] = 5;
curMenu ->prev ->value = 5;
}
if (!isApplyComm and(curMenu ->param)) {
params[curMenu ->param] = curMenu ->value;
}
else if (checkConnectionBeforeApply()) {
params[curMenu ->param] = curMenu ->value;
dispatchCommand();
}
// }
}
void handlePredefCmd()
{
char key = 'N', *pb = NULL;
byte address = params[Param_Address];
memset(buff, 0, sizeof(buff));
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("Asteptare");
lcd.setCursor(5, 1);
lcd.print("raspuns");
while (Serial.available())
Serial.read();
Serial.write(address);
Serial.write(predefCmd[curMenu ->value]);
Serial.write(0x00);
Serial.flush();
Serial.readBytesUntil(0x00, buff, sizeof(buff) – 1);
pb = &buff[1];
if (strlen(pb))
pb[strlen(pb) – 1] = 0;
lcd.clear();
lcd.setCursor(0, 0);
if (strlen(pb)) {
if (curMenu ->value == Predef_Idn) {
lcd.print(pb);
if (strlen(pb) > 16) {
lcd.setCursor(0, 1);
lcd.print(pb + 16);
}
}
else {
lcd.print(pb);
}
}
else {
lcd.setCursor(4, 0);
lcd.print("Timeout:");
lcd.setCursor(1, 1);
lcd.print("lipsa raspuns!");
}
while (key == 'N') {
key = readKeypad();
waitBtnRelease();
delay(50);
}
}
void incrementValue()
{
if ((curMenu ->param == Param_FreqValue &&
params[Param_FreqUnit] == Value_MHz &&
curMenu ->value < 5) ||
(curMenu ->param == Param_Address &&
curMenu ->value < 30) ||
(curMenu ->param == Param_FreqValue) ||
(curMenu ->param == Param_AmplValue))
{
curMenu ->value++;
}
else if (curMenu ->param == Param_Baudrate &&
curMenu ->value*2 <= 9600)
{
curMenu ->value *= 2;
}
}
void decrementValue()
72
{
if (((curMenu ->param == Param_FreqValue ||
curMenu ->param == Param_AmplValue) &&
curMenu ->value > 1) ||
(curMenu ->param == Param_Address &&
curMenu ->value > 0))
{
curMenu ->value –;
}
else if (curMenu ->param == Param_Baudrate &&
curMenu ->value/2 >= 300)
{
curMenu ->value /= 2;
}
}
void tryResetValue()
{
if (curMenu ->param == Param_FreqValue ||
curMenu ->param == Param_AmplValue ||
curMenu ->param == Param_Baudrate ||
curMenu ->param == Param_Address)
{
curMenu ->value = params[curMenu ->param];
}
}
void displayAboutInfo()
{
const char *text[8] = {"PROIECT
LICENTA"," \"CONTROLUL","DE LA DISTANTA",
"AL UNUI","GENERATOR","DE
SEMNAL \"",
"TICA ELENA DA RIA","445B, 2016"};
char key = 'N';
int i = 0, dly = 30;
while (key == 'N') {
lcd.clear();
lcd.setCursor((16 – strlen(text[i]))/2, 0);
lcd.print(text[i]);
i = (i + 1)%8;
lcd.setCursor((16 – strlen(text[i]))/2, 1);
lcd.print(text[i]);
if (i == 5) {
i++;
}
else if (i == 7) {
dly = 80;
i = 0;
}
else {
dly = 30;
}
for (int d = 0; d < dly; d++) {
delay(50);
key = readKeypad();
if (key != 'N') break;
}
}
if (!doneWelcome)
doneWelcome = true;
else
curMenu = curMenu ->parent;
waitBtnRelease();
}
void displayValueSelectMenu()
{
lcd.clear();
lcd.setCursor(0, 0);
switch (curMenu ->param) {
case Param_FreqValue:
lcd.print("Freq: ");
break;
case Param_AmplValue:
lcd.print("Ampl: ");
break;
case Param_Baudrate:
lcd.print("Baud: ");
break;
case Param_Address:
lcd.print("Adresa: ");
break;
default:
break;
}
lcd.print(params[curMenu ->param]);
lcd.setCursor(12, 0);
if (curMenu ->param == Param_Address) {
lcd.print("COM");
}
else if (curMenu ->param != Param_Baudrate) {
menu_t *unitM = curMenu ->parent ->next;
lcd.print(valuesTxt[params[unitM ->param]]);
}
else {
lcd.print("bps");
}
lcd.setCursor(4, 1);
lcd.write(UP_ARROW);
lcd.setCursor(11, 1);
lcd.write(DOWN_ARROW);
if (curMenu ->value < 100)
lcd.setCursor(7, 1);
else
lcd.setCursor(6, 1);
lcd.print(curMenu ->value);
}
73
void displayMultiSe lectMenu()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sel: ");
lcd.print(valuesTxt[params[curMenu ->param]]);
lcd.setCursor(0, 1);
int len = (16 – strlen(valuesTxt[curMenu ->value]))/2 –
2;
lcd.print(" ->");
lcd.setCursor(2 + len, 1);
lcd.print(valuesTxt[curMenu ->value]);
lcd.setCursor(14, 1);
lcd.print("< -");
}
void displayMainMenu()
{
menu_t *entry1 = NULL, *entry2 = NULL;
if ((focusFirst && curMenu ->next == NULL) ||
(!focusFirst && curMenu ->prev == NULL))
{
focusFirst = !focusFirst;
}
if (curMenu ->next == NULL && curMenu ->prev ==
NULL) {
focusFirst = true;
}
if (focusFirst) {
entry1 = curMenu;
entry2 = curMenu ->next;
}
else {
entry1 = curMenu ->prev;
entry2 = curMenu;
}
lcd.clear();
lcd.setCursor(0, 0);
if (entry1 != NULL) {
if (entry1 ->param != Param_Predef) {
lcd.print(entry1 ->text);
}
else {
lcd.print(predefCmd[entry1 ->value]);
}
if (focusFirst) {
lcd.setCursor(15, 0);
lcd.print("<");
}
}
lcd.setCursor(0, 1); if (entry2 != NULL) {
if (entry2 ->param != Param_Pred ef) {
lcd.print(entry2 ->text);
}
else {
lcd.print(predefCmd[entry2 ->value]);
}
if (!focusFirst) {
lcd.setCursor(15, 1);
lcd.print("<");
}
}
}
void menuLogic()
{
switch (btnPush) {
case 'U':
if (curMenu ->prev != NULL) {
curMenu = curMenu ->prev;
focusFirst = true;
}
else {
incrementValue();
}
break;
case 'D':
if (curMenu ->next != NULL) {
curMenu = curMenu ->next;
focusFirst = false;
}
else {
decrementValue();
}
break;
case 'R':
if (curMenu ->child != NULL) {
curMenu = curMenu ->child;
focusFirst = true;
}
else if (curMenu ->onPressed != &onPressedSimple
&& curMenu ->onPressed != NULL) {
curMenu ->onPressed();
}
break;
case 'L':
if (curMenu ->parent != NULL) {
tryResetValue();
curMenu = curMenu ->parent;
focusFirst = true;
}
break;
case 'S':
if (curMenu ->onPressed != NULL) {
curMenu ->onPressed();
}
else if (curMenu ->child != NULL) {
curMenu = curMenu ->child;
74
focusFirst = true;
}
break;
}
}
char readKeypad()
{
/* Keypad button analog Value
no button pressed 1023
select 638
left 406
down 253
up 98
right 0
*/
int keypadValue = analogRead(keypadPin);
//Serial.print(keypadValue);
if(keypadValue < 20)
return 'R';
else if(keypadValue < 150)
return 'U';
else if(keypadValue < 300)
return 'D';
else if(keypadValue < 500)
return 'L';
else if(keypadValue < 750)
return 'S';
else
return 'N';
}
void waitBtnRelease()
{
while( analogRead(keypadPin) < 800){}
}
Implementare meniu
#include <Arduino.h>
#include <String.h>
#include "meniu.h"
void initAmplitudeValueSubmenu(menu_t *parent)
{
menu_t *tmp;
tmp = new menu_t;
tmp->parent = parent;
parent ->child = tmp;
tmp->param = Param_AmplValue;
tmp->value = 1;
tmp->onPressed = &onPressedSimple;
tmp->displayMenu = &displayValueSelectMenu;
}
void initAmplitudeUnitSubmenu(menu_t *parent)
{
menu_t *tm p, *prev, *first;
first = new menu_t;
tmp = first;
parent ->child = tmp;
tmp->parent = parent;
tmp->param = Param_AmplUnit;
tmp->value = Value_VPP;
tmp->onPressed = &onPressedSimple;
tmp->displayMenu = &displayMultiSelectMenu;
prev = tmp;
tmp = new menu_t;
tmp->parent = parent;
tmp->prev = prev;
prev ->next = tmp;
tmp->param = Param_AmplUnit;
tmp->value = Value_mVPP;
tmp->onPressed = &onPressedSimple;
tmp->displayMenu = &displayMultiSelectMenu;
first->prev = tmp;
tmp->next = first;
}
void initAmplitudeSubmenu(menu_t *parent)
{
menu_t *tm p, *prev;
tmp = new menu_t;
tmp->parent = parent;
parent ->child = tmp;
tmp->text = "A.Valuare Ampl";
initAmplitudeValueSubmenu(tmp);
prev = tmp;
tmp = new menu_t;
tmp->parent = parent;
tmp->prev = prev;
prev ->next = tmp;
tmp->param = Param_AmplUnit;
tmp->text = "B.Unitate Ampl";
initAmplitudeUnitSubmenu(tmp);
}
void initFrequencyValueSubmenu(menu_t *parent)
{
menu_t *tmp;
tmp = new menu_t;
tmp->parent = parent;
parent ->child = tmp;
tmp->param = Param_FreqValue;
tmp->value = 1;
tmp->onPressed = &onPressedSimple;
tmp->displayMenu = &displayValueSelectMenu;
}
void initFr equencyUnitSubmenu(menu_t *parent)
{
menu_t *tmp, *prev, *first;
first = new menu_t;
75
tmp = first;
parent ->child = tmp;
tmp->parent = parent;
tmp->param = Param_FreqUnit;
tmp->value = Value_Hz;
tmp->onPressed = &onPressedSimp le;
tmp->displayMenu = &displayMultiSelectMenu;
prev = tmp;
tmp = new menu_t;
tmp->parent = parent;
tmp->prev = prev;
prev ->next = tmp;
tmp->param = Param_FreqUnit;
tmp->value = Value_KHz;
tmp->onPressed = &onPressedSimple;
tmp->displayMenu = &displayMultiSelectMenu;
prev = tmp;
tmp = new menu_t;
tmp->parent = parent;
tmp->prev = prev;
prev ->next = tmp;
tmp->param = Param_FreqUnit;
tmp->value = Value_MHz;
tmp->onPressed = &onPressedSimple;
tmp->displayMenu = &displayMultiSelectMenu;
first->prev = tmp;
tmp->next = first;
}
void initFrequencySubmenu(menu_t *parent)
{
menu_t *tmp, *prev;
tmp = new menu_t;
tmp->parent = parent;
parent->child = tmp;
tmp->text = "Valoare Frecv";
initFrequencyValueSubmenu(tmp);
prev = tmp;
tmp = new menu_t;
tmp->parent = parent;
tmp->prev = prev;
prev ->next = tmp;
tmp->param = Param_FreqUnit;
tmp->text = "Unitate Frecv";
initFrequencyUnitSubmenu(tmp);
}
void initShapeSubmenu(menu_t *parent)
{
menu_t *tmp, *prev, *first;
first = new menu_t;
tmp = first;
tmp->parent = parent; parent ->child = tmp;
tmp->param = Para m_Shape;
tmp->value = Value_Sinusoid;
tmp->onPressed = &onPressedSimple;
tmp->displayMenu = &displayMultiSelectMenu;
prev = tmp;
tmp = new menu_t;
tmp->parent = parent;
tmp->prev = prev;
prev ->next = tmp;
tmp->param = Param_Shape;
tmp->value = Value_Square;
tmp->onPressed = &onPressedSimple;
tmp->displayMenu = &displayMultiSelectMenu;
prev = tmp;
tmp = new menu_t;
tmp->parent = parent;
tmp->prev = prev;
prev ->next = tmp;
tmp->param = Param_Shape;
tmp->value = Value_Triangle;
tmp->onPressed = &onPressedSimple;
tmp->displayMenu = &displayMultiSelectMenu;
prev = tmp;
tmp = new menu_t;
tmp->parent = parent;
tmp->prev = prev;
prev ->next = t mp;
tmp->param = Param_Shape;
tmp->value = Value_UpRamp;
tmp->onPressed = &onPressedSimple;
tmp->displayMenu = &displayMultiSelectMenu;
prev = tmp;
tmp = new menu_t;
tmp->parent = parent;
tmp->prev = prev;
prev ->next = tmp;
tmp->param = Param_Shape;
tmp->value = Value_DownRamp;
tmp->onPressed = &onPressedSimple;
tmp->displayMenu = &displayMultiSelectMenu;
first->prev = tmp;
tmp->next = first;
}
void initControlSubmenu(menu_t *par ent)
{
menu_t *tmp, *prev;
tmp = new menu_t;
tmp->parent = parent;
parent ->child = tmp;
tmp->text = "A.Forma Unda";
76
initShapeSubmenu(tmp);
prev = tmp;
tmp = new menu_t;
tmp->parent = parent;
tmp->prev = prev;
prev ->next = tmp;
tmp->text = "B.Frecventa";
initFrequencySubmenu(tmp);
prev = tmp;
tmp = new menu_t;
tmp->parent = parent;
tmp->prev = prev;
prev ->next = tmp;
tmp->text = "C.Amplitudine";
initAmplitudeSubmenu(tmp);
}
void initAboutSubmenu(menu_t *parent)
{
menu_t *tmp;
tmp = new menu_t;
tmp->parent = parent;
parent ->child = tmp;
tmp->displayMenu = &displayAboutInfo;
}
void initBaudrateValueSubmenu(menu_t *parent)
{
menu_t *tmp;
tmp = new menu_t;
tmp->parent = parent;
parent ->child = tmp;
tmp->param = Param_Baudrate;
tmp->value = 9600;
tmp->onPressed = &onPressedSimple;
tmp->displayMenu = &displayValueSelectMenu;
}
void initParitySubmenu(menu_t *parent)
{
menu_t *tmp, *prev, *first;
first = new menu_t;
tmp = first;
tmp->parent = parent;
parent ->child = tmp;
tmp->param = Param_Parity;
tmp->value = Value_S8N1;
tmp->onPressed = &onPressedSimple;
tmp->displayMenu = &displayMu ltiSelectMenu;
prev = tmp;
tmp = new menu_t;
tmp->parent = parent;
tmp->prev = prev;
prev ->next = tmp;
tmp->param = Param_Parity;
tmp->value = Value_S7O1;
tmp->onPressed = &onPressedSimple;
tmp->displayMenu = &displayMu ltiSelectMenu;
prev = tmp;
tmp = new menu_t;
tmp->parent = parent;
tmp->prev = prev;
prev ->next = tmp;
tmp->param = Param_Parity;
tmp->value = Value_S7E1;
tmp->onPressed = &onPressedSimple;
tmp->displayMenu = &displayMultiSelectMenu;
first->prev = tmp;
tmp->next = first;
}
void initAddressSubmenu(menu_t *parent)
{
menu_t *tmp;
tmp = new menu_t;
tmp->parent = parent;
parent ->child = tmp;
tmp->param = Param_Address;
tmp->value = 1;
tmp->onPressed = &onPressedSimple;
tmp->displayMenu = &displayValueSelectMenu;
}
void initSerialConfigSubmenu(menu_t *parent)
{
menu_t *tmp, *prev;
tmp = new menu_t;
tmp->parent = parent ;
parent ->child = tmp;
tmp->text = "A.Baudrate";
initBaudrateValueSubmenu(tmp);
prev = tmp;
tmp = new menu_t;
tmp->parent = parent;
tmp->prev = prev;
prev ->next = tmp;
tmp->text = "B.Paritate";
initParitySubmenu(tmp);
prev = tmp;
tmp = new menu_t;
tmp->parent = parent;
tmp->prev = prev;
prev ->next = tmp;
tmp->text = "C.Adresa";
initAddressSubmenu(tmp);
prev = tmp;
tmp = new menu_t;
tmp->parent = pare nt;
tmp->prev = prev;
prev ->next = tmp;
77
tmp->onPressed = &establishConnection;
tmp->text = "D.Reconectare";
prev = tmp;
tmp = new menu_t;
tmp->parent = parent;
tmp->prev = prev;
prev ->next = tmp;
tmp->onPressed = &testRS232;
tmp->text = "E.Test RS232";
}
void initPredefSubmenu(menu_t *parent)
{
menu_t *tmp, *prev;
tmp = new menu_t;
tmp->parent = parent;
parent ->child = tmp;
tmp->param = Param_Predef;
tmp->value = Predef_Idn;
tmp->onPressed = &handlePredefCmd;
prev = tmp;
tmp = new menu_t;
tmp->parent = parent;
tmp->prev = prev;
prev ->next = tmp;
tmp->param = Param_Predef;
tmp->value = Predef_Shape;
tmp->onPresse d = &handlePredefCmd;
prev = tmp;
tmp = new menu_t;
tmp->parent = parent;
tmp->prev = prev;
prev ->next = tmp;
tmp->param = Param_Predef;
tmp->value = Predef_Freq;
tmp->onPressed = &handlePredefCmd;
prev = tmp;
tmp = new menu_t;
tmp->parent = parent;
tmp->prev = prev;
prev ->next = tmp;
tmp->param = Param_Predef;
tmp->value = Predef_Volt;
tmp->onPressed = &handlePredefCmd;
}
menu_t *initMenuStructure()
{ menu_t *tmp, *prev, *first;
first = new menu_t;
first->text = "1.Ctrl Generator";
initControlSubmenu(first);
prev = first;
tmp = new menu_t;
prev ->next = tmp;
tmp->prev = prev;
tmp->text = "2.Funct Predef";
initPredefSubmenu(tmp); prev = tmp;
tmp = new menu_t;
prev ->next = tmp;
tmp->prev = prev;
tmp->text = "3.Cfg Seriala";
initSerialConfigSubmen u(tmp);
prev = tmp;
tmp = new menu_t;
prev ->next = tmp;
tmp->prev = prev;
tmp->text = "4.Despre";
initAboutSubmenu(tmp);
return first;
}
Declararea și definirea structurii pentru
afișarea meniului
#ifndef MENIU_H
#define MENIU_H
#include <Arduino.h>
#define isApplyCommand(X) ( \
(X) == Param_Shape || \
(X) == Param_FreqValue || \
(X) == Param_FreqUnit || \
(X) == Param_AmplValue || \
(X) == Param_AmplUnit)
enum ParamsEnum {
Param_None = -1,
Param_Shape,
Param_FreqValue,
Param_FreqUnit,
Param_AmplValue,
Param_AmplUnit,
Param_Baudrate,
Param_Parity,
Param_Address,
Param_Num,
Param_Predef
};
enum ValuesEnum {
Value_None = -1,
Value_Sinusoid,
Value_Square,
Value_Triangle,
Value_UpRamp,
Value_DownRamp,
Value_Hz,
Value_KHz,
Value_MHz,
Value_V PP,
Value_mVPP,
Value_S8N1,
Value_S7O1,
Value_S7E1,
Value_Num
78
};
enum PredefCmd {
Predef_Idn,
Predef_Shape,
Predef_Freq,
Predef_Volt,
Predef_Dcycle,
Predef_Num
};
void displayMainMenu();
void displayMultiSelectMenu();
void displayValueSelectMenu();
void displayAboutInfo();
void onPressedSimple();
void establishConnection();
void handlePredefCmd();
void testRS232();
typedef struct menu_struct {
const char *text;
enum ParamsEnum param;
int value;
struct menu_struct *next; struct menu_struct *prev;
struct menu_struct *child;
struct menu_struct *parent;
void (*displayMenu)();
void (*onPressed)();
menu_struct() :
text(NULL),
param(Param_None),
value(0),
next(NULL),
prev(NULL),
child(NULL),
parent(NULL),
displayMenu(&displayMainMenu),
onPressed(NULL) {}
} menu_t;
menu_t *initMenuStructure();
#endif // MENIU_H
79
Anexă 2 – Schemă electrica platformă Arduino [21]
80
81
Anexa 3 – Schema Electrica Shield LCD [20]
82
83
Anexa 4 – Schema electrica Shield RS232 [22]
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Controlul de la dis tanță al unui generator de semnal [626161] (ID: 626161)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
