Sistem de Afisaj cu Led Uri Comandat Prin Internet
CUPRINS
LISTA FIGURILOR
LISTA TABELELOR
LISTA ACRONIMELOR
LED = Light Emitting Diode
IP = Internet Protocol
R3 = Revision 3
FTDI = Future Technology Devices International
ROM = Read Only memory
RAM = Random Access Memory
OTPROM = One Time Programmable ROM
LCD = Liquid Crystal Display
EEPROM = Electrically Erasable Programmable ROM
SFR = Special Function Registers
CPU = Central Processor Unit
ALU = Arithmetic Logic Unit
ICSP = In Circuit Serial Programming
PWM = Pulse Width Modulation
USB = Universal Serial Bus
SD = Secure Digital
SS = Slave Select
SDA = Serial Data
SCL = Serial Clock
AREF = Analog Reference
TWI = Two Wire Interface
SRAM = Static Random Access Memory
PoE = Power over Ethernet
CMOS = Complementary metal–oxide–semiconductor
RISC = Reduced Instruction Set Computing
CISC = Complex Instruction Set Computer
MIPS = Million Instructions Per Second
USART = Universal Synchronous Asynchronous Receiver Transmitter
SPI = Serial Peripheral Interface
ISP = In-System Programming
AC = Alternating current
DC = Direct current
GND = Ground
MOSI = Master Out Slave In
MISO = Master In Slave Out
SCK = System Clock
TCP = Transmission Control Protocol
UDP = User Datagram Protocol
ICMP = Internet Control Message Protocol
ARP = Address Resolution Protocol
IGMP = Internet Group Management Protocol
PPPoE = Point-to-Point Protocol over Ethernet
MCU = Multipoint Control Unit
ADSL = Asymmetric Digital Subscriber Line
IDE = Integrated Development Environment
SMD = Surface Mounted Device
DTR = Data Terminal Ready
RCK = Register Clock
SRCK = Shift-Register Clock
SRCLR = Shift Register Clear
UTP = Unshielded Twisted Pair
Capitolul 1. Introducere
Prezentare generală
Proiectul își propune realizarea unui sistem de afișaj, confecționat din LED-uri ( 3 x 3 x 3 ) și comandat prin Internet, cu ajutorul unui sistem de dezvoltare Arduino Ethernet cât și utilizând un calculator, în care vom integra o interfață grafică pentru controlul sistemului de afișaj. Conexiunea între calculator și sistemul de afișaj cu LED-uri se realizează la nivel de IP, modulul Ethernet integrat, facilitând efectuarea anumitori comenzi date de calculatorul cu care sistemul de dezvoltare Arduino este direct conectat ( ex: Start, Stop, Schimbare mod afișare ).
Sistemul de afișaj din LED-uri ce va fi comandat prin Internet va avea ca și componente generale utilizate, un modul Arduino Ethernet R3, drivere de LED-urilor, cât și 27 de LED-uri dispuse sub forma unui cub și programator FTDI Basic 5 V.
Ca și rezultat final, sistemului de afișaj cu LED-uri i se vor defini anumite moduri în care acesta se va aprinde, moduri ce vor fi controlate cu ajutorul unei interfețe web din cadrul unui calculator / dispozitiv mobil, interconectat cu sistemul de dezvoltare Arduino Ethernet.
Motivația alegerii temei
Realizarea unui sistem de afișaj din LED-uri comandat prin Internet reprezintă o provocare pentru mine pentru că acesta îmbină atât tehnologia utilizată în vederea realizării practice a unui ansamblu de LED-uri interconectate, cât și programarea unui microcontroler Arduino.
Un concept pe care l-am considerat util și interesant a fost și folosirea modulului Ethernet pentru comanda sistemului de afișaj cu LED-uri, astfel realizând interconectarea modulului Arduino, prin intermediul unui cablu UTP, cu placa de rețea integrată în calculatorul de pe care se dorește a se face controlul sistemului.
Capitolul 2. Microcontrolerul
Prezentare generală
Un controler ( cuvânt de origine anglo-saxonă – “controller” ) poate fi considerat un sistem autonom cu un procesor, memorie și interfețe de intrare – ieșire programabile. Memoria de program de tip NOR sau OTP ROM este adesea inclusă în cip, iar dispozitivele de intrare-ieșire pot interconecta comutatoare, relee, LED-uri, ecrane LCD mici, dispozitive de radio-frecvență, precum și senzori de date precum senzori de temperatură, umiditate, nivel de lumină, etc.
În context general, microcontrolerele sunt proiectate pentru aplicații integrate, spre deosebire de microprocesoare, care sunt proiectate pentru a fi utilizate în calculatoarele personale sau în alte aplicații de uz general. Microcontrolerele sunt folosite în dispozitive precum sistemele de control al motorului auto, dispozitive medicale, dispozitive de control la distantă, echipamente de birou, electrocasnice, jucării și alte sisteme integrate controlate în mod automat.
Unele microcontrolere pot folosi cuvinte pe patru biți și pot funcționa la frecvențe de ceas foarte mici, pentru un consum cât mai redus de energie, ele având în general capacitatea de a păstra funcționalitatea în timpul așteptării unui alt eveniment ( cum ar fi apăsarea unui buton sau o altă întrerupere ).
Toate operțiunile și comenzile din cadrul unui microcontroler sunt efectuate cât mai simplist posibil și la o viteză mare, însă un microcontroler individualizat nu ar fi foarte util în cazul în care nu ar exista sisteme de dezvolatare adiționale, care să îi sporească aplicabilitatea și funcționalitatea.
Memoria
Memoria ROM ( Read Only Memory )
Memoria ROM este un tip de memorie utilizată pentru a salva în permanență programul care se execută la un moment dat, astfel existând o limitare a programului care poate fi scris, această limitare depinzând în mod direct de memoria ROM. Memoria ROM a unui microcontroler poate fi integrată în acesta dar și atașată ca și dispozitiv extern. Dacă memoria ROM este adaugată ca un cip extern, costul microcontrolerului scade iar programatorul poate fi considerabil mai mare dar în același timp numarul de pini disponibili ai microcontrolerului scade prin conectarea cipului extern. Prin utilizarea unei memorii ROM integrate, dimensiunile sistemului de dezvolatre vor scădea, dar și prețul microcontrolerului va crește, însă principalul avantaj este faptul că mai mulți pini vor fi disponibili pentru a conecta componente periferice.
Dimensiunea memoriei ROM poate varia de la 512 octeți până la 64 k octeți.
Memoria RAM ( Random Access Memory )
Memoria cu acces aleator ( memoria RAM ) este un tip de memorie utilizat pentru a stoca datele cu caracter temporar și rezultatele intermediare create și utilizate în timpul de funcționare al microcontrolerului. Memoria RAM este o memorie volatilă, conținutul acesteia fiind șters în momentul în care nu mai există o sursă de alimentare pentru sistemul respectiv.
Dimensiunea memorie RAM poate ajunge până la valori de ordinul k octeților.
Memoria EEPROM (Electrically Erasable Programmable ROM )
Memoria EEPROM este un tip special de memorie, care însă nu este inclusă în toate microcontrolerele, iar conținutul acestei memorii poate fi modificat în timpul execuției programului ( ca și la memoria RAM ), însă la momentul deconectării sursei de alimentare a sistemului, această memorie nu își păstrează conținutul ( ca și în cazul memoriei ROM ).
Memoria EEPROM este adesea folosită pentru a stoca valori create și utilizate în timpul funcționării ( cum ar fi valorile de calibrare, coduri, valori de numărare, etc. ), valori ce vor trebui să rămână salvate și în urma deconectării sursei de alimentare a sistemului de dezvolatare.
Figura 2.2.3. Memoria EEPROM
Registre speciale de funcții SFR ( Special Function Registers )
Registrele speciale de funcții reprezintă o parte a memoriei RAM, scopul lor însă fiind definit de catre producator și nu poate fi modificat de catre utilizator.
Unitatea centrală CPU ( Central Processor Unit )
După cum sugerează și numele, aceasta este o unitate care monitorizează și controlează toate procesele ce au loc în cadrul unui microcontroler iar utilizatorul nu poate interveni în activitatea acestuia.
Acesta conține mai multe subunități, dintre care cele mai importante sunt :
– Decodorul de instrucțiuni :
Decodorul de intrucțiuni este o componentă esențială, care recunoaște instrucțiunile de program și rulează alte operațiuni pe baza acestora. Performanțele acestui circuit sunt exprimate în “setul de instrucțiuni”, set care este diferit pentru fiecare familie de microcontrolere în parte.
– Unitatea de logică aritmetică ALU :
Unitatea de logică aritmetică ALU efectueaza toate operațiile matematice și logice asupra datelor.
– Acumulator :
Acumulatorul este strâns legat de funcționarea ALU. Este utilizat pentru stocarea tutuor datelor pe care ar trebui să fie executate anumite operațiuni dar se stochează și rezultatele ce vor fi utile în rularea proceselor ulterioere.
Porturi de intrare – iesire
Pentru asigurarea comunicației cu mediul exterior, microcontrolerul utilizează elemente numite porturi.
Există trei tipuri de astfel de porturi: porturi de intrare, porturi de ieșire sau porturi bidirecționale, iar pentru lucrul cu acestea este necesară selecția portului iar apoi precizarea tipului de operație ce se dorește a fi efectuată.
În timpul în care se utilizează un anumit port, acesta se comportă ca o locație de memorie în care se pot efectua citiri din aceasta sau scrieri în cadrul ei.
Figura 2.4. Porturi de intrare – ieșire
Oscilatorul
Oscilatorul este configurat să folosească un cristal de cuarț sau rezonator ceramic pentru stabilizarea frecvenței, dar acesta poate funcționa și fără elemente pentru stabilizarea frecvenței (cum ar fi un oscliator RC).
Este importat faptul că instrucțiunile de program nu sunt executate în ritmul impus de oscilator, ci mult mai lent, din cauza faptului că fiecare instrucțiune este executată în mai multe etape. Numărul de cicluri necesare pentru a executa o instrucțiune poate diferi de la un microcontroler la altul, prin urmare, în cazul în care sistemul utilizează un cuarț cu o frecvență de 20MHz, timpul de execuție poate crește de la 50ns până la 200ns, 400ns sau chiar 800ns.
Figura 2.5. Oscilatorul
2.6. Module TIMER
2.6.1. Prezentare generală
Sistemul de tip TIMER ( circuit de timp ) este folosit pentru măsurarea timpului dar și pentru generarea de semnale cu anumite perioade și frecvențe dorite.
Timerele nu sunt doar circuite cu funcții de temporizare, în modulul Timer fiind implementate și mecanisme ce facilitează utilizatorului anumite funcții speciale, cum ar fi :
– mecanismul de captură la intrare, ce permite monitorizarea unor semnale de intrare
– mecanismul de comparare la ieșire, ce permite controlul unor semnale de ieșire
– numaratoarele interne, ce permit generarea de referințe de timp interne, necesare în bucle de întarziere
Practic, un timer poate fi folosit pentru orice funcție de timp, inclusiv generarea unor forme de undă sau conversii Digital / Analogic simple.
Figura 2.6.1. Module TIMER
2.6.2. Timer watchdog
Timer-ul de tip Watchdog este un temporizator conectat la un oscilator RC complet separat în cadrul microcontrolerului.
În momentul în care timer-ul Watchdog este activat, de fiecare dată când numaratorul ajunge la sfârșitul programului, se reseteaza microcontrolerul și se reexecută programul, pornind de la prima instrucțiune, pentru a preveni astefel intrarea în bucle infinite de execuție.
Dacă instructiunile de declanșare a timer-ului de tip Watchdog sunt setate corespunzator, atunci funcționarea Watchdog-ului nu va afecta buna funcționare a programului.
Circuit de alimentare
Exista doua aspecte ce vor trebui luate în considerare pentru un circuit de alimentare :
– “Brown out “ : este o stare potențial periculoasă care are loc în momentul în care microcontrolerul este oprit sau atunci când tensiunea de alimentare scade la cel mai redus nivel din cauza zgomotului electric. Microcontrolerul are încorporat un circuit “Brown out” în scopul prevenirii unor astfel de situații, acest circuit realizând resetarea imediată în momentul în care nivelul de tensiune scade sub limita inferioară.
– Pin de RESET : are rolul de resetare externă a microcontrolerului prin aplicarea de “0” ( zero ) sazero ) sau “1” ( unu ) logic în funcție de tipul microcontrolerului. În cazul în care un circuit de tip “Brown out” nu este integrat în cadrul microcontrolerului, un circuit simplu “Brown out” se poate conecta la acest pin.
Figura 2.7. Circuitul de alimentare
Comunicarea serială
Interfața de comunicație serială este deosebit de utilă în realizarea conectării microcontrolerului cu un alt echipament, ea fiind de tip asincorn și poate funcționa în mai multe moduri. Cel mai frecvent este utilizat modul “clasic” care este compatibil cu toate interfețele seriale asincrone existente, iar un mod mai special îl constituie modul de comunicație “mutliprocesor” care permite realizarea unei magistrale de comunicație pe care să fie instalate mai multe microcontrolere ce pot comunica între ele.
Spre deosebire de transmiterea paralelă, în cazul comunicării seriale, datele sunt transferate octet cu octet, de unde și denumirea de comunicație serială.
Figura 2.8. Comunicarea serială
Programul
Spre deosebire de alte circuite integrate la care este necesar doar să fie conectate și alimentate, microcontrolerul trebuie mai întai programat. Pentru a programa un microcontroller, pot fi utilizate mai multe limbaje de programare precum Assembler, C si Basic.
– Assembler : este un limbaj de nivel scăzut, cu o programare lentă, dar care folosesc un spațiu foarte redus de memorie, ceea ce ajută la o foarte bună viteză de execuție a programului
– Limbaj C : este un limbaj cu o structură mai simplistă decât Assembler-ul și mai ușor de înțeles, însă programele în limbaj C sunt mai lente în execuție
– Basic : este un limbaj foarte apropiat de modul de gândire uman, ușor de scris și de înțeles, dar, ca și în cazul limbajului C, programele sunt mai lente în execuție în comparație cu cele scrise în Assembler.
Capitolul 3. Arduino Ethernet R3
3.1. Prezentare generală
Arduino Ethernet R3 este o placă de dezvoltare bazată pe tehnologia Atmega328, ce dispune de 14 pini digitali de intrare – ieșire, 6 intrări analogice, un oscilator cu cristal de 16 Mhz, un conector de retea RJ45, un conector de alimentare, un conector ICSP si un buton de reset.
Figura 3.1.1. Arduino Ethernet R3 – Vedere din față
Figura 3.1.2. Arduino Ethernet R3 – Vedere din spate
Pinii 10, 11, 12 si 13 sunt rezervati pentru conexiunea cu modulul Ethernet și nu ar trebui folosiți altfel. Acești 4 pini fiind rezervați, se reduce numărul de pini disponibili la 9, dintre care 4 pot fi folosiți ca ieșiri PWM.
Sistemul de dezvoltare Arduino Ethernet diferă de alte plăci prin faptul că nu are un chip USB – Serial integrat, având o interfață Wiznet Ethernet.
Un cititor de carduri microSD integrat, poate fi folosit pentru a stoca fișiere pentru utilizarea lor în rețea, acesta fiind accesibil prin libraria SD. Pinul 10 este rezervat pentru interfața Wiznet, iar SS-ul (Slave Select) pentru cardul SD este pe pinul 4.
Conectorul ICSP format din 6 pini este compatibil atât cu un adaptor USB – Serial, cât și cu cabluri USB – FTDI sau placi USB – Serial (de tipul Sparkfun si Adafruit). Acestea ajută la menținerea unui reset automat, permițând încărcarea schițelor fără a apăsa butonul de reset de pe plăcuță. Când este conectat la un adaptor USB – Serial, Arduino Ethernet este alimentat de către adaptor.
A treia variantă (Rev 3) a plăcii, introduce pini de ieșire standardizați 1.0 formați din:
– pini SDA și SCL adăugați lângă pinul AREF și încă 2 pini noi plasați lângă pinul de reset, introducând posibilitatea ca modulele ce folosesc i2c sau componente TWI să fie compatibile cu toate sistemele de dezvoltare Arduino;
– IORF care permite modulului să fie adaptat la voltajul plăcuței. Modulele care folosesc pini IORF vor fi compatibile atât cu plăcuțe ce folosesc AVR, care funcționează cu 5 volți, cât și cu Arduino Due care functionează cu 3,3 volți. Lângă pinul IORF există un pin neconectat, rezervat pentru utilizări ulterioare.
Sumar
Tabelul 3.2. – Sumar Arduino Ethernet R3
ATMEGA328P
Atmega 328P este un microcontroler pe 8 biți, de joasă putere, construit cu ajutorul tehnologiei CMOS și bazat pe arhitectura îmbunătățită RISC a AVR-ului. Executând instrucțiuni într-un singur ciclu de ceas, Atmega328P atinge o rată de aproape 1 MIPS per MHz permițând proiectantului să optimizeze consumul de putere în raport cu viteza de execuție.
Figura 3.3. Atmega 328P – Diagramă bloc
Nucleul AVR-ului combină un set de 32 de registre generale de lucru, toate cele 32 de registre fiind conectate direct la Unitatea Logică Aritmetică (ALU) și permițând ca doua registre independente să fie accesate cu o singură instrucțiune executată într-un singur ciclu de ceas. Arhitectura astfel rezultată este mai eficientă din punct de vedere al codului, atingând în același timp rate de procesare de până la 10 ori mai mari decât microcontrolerele convenționale bazate pe CISC.
Atmega328P asigură urmatoărele caracteristici: memorie programabilă de 32K octeți, cu capacitate de citire în timpul scrierii, 1k octet de memorie EEPROM, 2K octeți de memorie SRAM, 23 de linii de intrare/ieșire de întrebuințare generală, 32 de registre de lucru generale, 3 numaratoare / timere flexibile cu moduri de comparare, întreruperi interne și externe, un USART serial programabil, un port serial SPI, un convertor analog-digital de 10 biți pe 6 canale, un timer programabil de supraveghere cu oscilator intern, și 5 moduri selectabilede economisire a energiei.
Cipul ISP permite reprogramarea memoriei printr-o interfață serială SPI, de catre un programator convențional de memorie nevolatilă, sau de către un program de boot ce rulează pe AVR, iar programul de boot poate folsi orice interfață pentru a descărca aplicația necesară în memoria flash.
Atmega 328P este un microcontroler puternic care asigură soluții flexibile și efective, din punct de vedere al costului, pentru multe aplicații de control integrate.
Alimentare
Prezentare generală
Sistemul de dezvoltare poate fi alimentat de asemenea cu o sursa externă, un modul opțional PoE, sau folosind un conector USB – Serial sau cablu FTDI.
Alimentarea externă poate proveni ori de la un adaptor AC – DC, ori de la un acumulator. Adaptorul poate fi conectat cu ajutorul unei mufe de 2,1 mm inserată în mufa de alimentare a plăcuței. Firele de la un acumulator pot fi inserate în pinii Gnd si Vin ai conectorului de alimentare, iar sistemul de dezvoltare poate funcționa pe o alimentare externă între 6 și 20 de volți.
Dacă sisitemul de dezvoltare este alimentat cu o tensiune mai mică decât 7V, pinul de 5V poate furniza o tensiune mai mică decât 5 volți și plăcuța poate fi instabilă, iar în cazul în care folosim o tensiune mai mare de 12V, stabilizatorul de tensiune se poate supraîncălzi și poate deteriora plăcuța.
Limitele recomandate sunt de la 7 la 12 volți.
Pini de alimentare
– Pin-ul VIN : Reprezintă pin-ul ce oferă intrarea unei tensiuni de alimentare pentru sistemul de dezvoltare Arduino Ethernet R3, atunci când folosim o sursă de alimentare externă (spre deosebire de 5 volți de la conectorul USB sau de la stabilizatorul de tensiune). Putem asigura alimentarea prin acest pin, sau, dacă folosim mufa de alimentare, o vom accesa prin acest pin.
-Pin-ul 5V : Acest pin oferă la ieșire o tensiune continuă de 5V de la stabilizatorul de tensiune al plăcuței și poate fi alimentat de la o mufă DC (7-12V), un conector USB (5V), sau pinul VIN de pe plăcuță (7-12V). Alimentând prin pinul de 5V sau 3,3V evităm stabilizatorul și putem deteriora plăcuța.
– Pin-ul 3,3V : O tensiune de 3,3 volți furnizată de stabilizatorul plăcuței. Curent maxim de 50 mA.
– GND : Pini de masă.
– IOREF : Acest pin al plăcuței Arduino furnizează tensiunea de referință cu care operează microcontroler-ul. Un modul configurat adecvat poate citi tensiunea de pe pinul IORF și selecta sursa adecvată de tensiune sau sa activeze tranziții de tensiune pe ieșiri pentru 5V sau 3,3V.
Modulul opțional PoE este conceput pentru a oferi tensiune prin modulul Ethernet:
Pulsație și zgomot redus la ieșire, de 100mVpp
Gamă de tensiune de intrare cuprinsa între 36V și 57V
Protecție la suprasarcină și scurtcircuit
Ieșire de 9V
Convertor DC/DC de înaltă eficiență
Izolare de 1500V (de la intrare la ieșire)
Pini intrare – ieșire
Fiecare din cei 14 pini digitali de pe plăcuță pot fi folosiți ca intrare sau ieșire, folosind funcțiile pinMode( ), digitalWrite( ) și digitalRead( ). Fiecare pin poate produce sau primi un curent maxim de 40 mA și are un rezistor pull-up (deconectat în mod implicit) de 20-50 k ohmi.
În plus, unii pini au funcții speciale:
– Serial: 0 (RX) și 1 (TX), folosiți pentru a primi (RX) și transmite (TX) date seriale TTL ;
– Întreruperi externe: 2 și 3. Acești pini pot fi configurați să declanșeze o întrerupere la o valoare scăzută, un front crescător sau descrescator, sau o schimbare de valoare.
– PWM: 3, 5, 6 ,9 și 10. Asigură ieșiri PWM de 8 biți cu ajutorul funcției analogWrite( ).
– SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK). Acești pini suportă comunicație SPI folosind libraria SPI.
– LED: 9. Există un LED încorporat, conectat la pinul digital 9. Când pinul are o valoare ridicată, LED-ul este aprins, iar când valoarea este scăzută, LED-ul este stins. Pe majoritatea celorlalte plăcuțe Arduino, acest LED este găsit la pinul 13. Pe plăcuța Ethernet se află la pinul 9 deoarece pinul 13 este folosit ca parte a conexiunii SPI.
Plăcuța Ethernet are 6 intrări analogice, marcate de la A0 la A5, fiecare asigurand rezoluție de 10 biți. În mod implicit, ei măsoară de la masă, la 5 volți, deși este posibil să fie modificată limita superioară folosind un pin AREF și funcția analogReference( ).
În plus, câțiva pini au o funcționalitate specială, precum :
– TWI : A4 (SDA) și A5 (SCL). Suportă comunicație TWI folosind libraria Wire.
– AREF : Referința de tensiune pentru intrări analogice, folosit cu funcția analogReference( ).
– RESET : Resetează microcontroler-ul. De obicei este folosit pentru a adăuga un buton de reset pentru modulele care îl blochează pe cel de pe plăcuță.
Modulul Ethernet
Cu ajutorul modulului Ethernet integrat în sistemul de dezvolatare Arduino Ethernet R3 se poate realiza o conexiune cu un calculator, prin intermediul unui cablu UTP Crossover ce dispune în ambele extremități de un conector RJ45.
Modulul are la bază un chip Ethernet Wiznet W5100 care conferă conectivitate ( pe bază de IP) și care functionează atât prin TCP cât și prin UDP.
Wiznet W5100 :
Wiznet W5100 este un cip ce permite realizarea de diverse aplicații pentru sistemul de dezvoltare Arduino Ethernet R3, ce suportă o conectivitate de 10/100 Mbps, el fiind totodata un sistem integrat stabil și performant. Cipul a fost conceput pentru a facilita conectarea la rețea fără a fi necesară preinstalarea unui sistem de operare care să gestioneze modalitatea prin care se face conectica și este compatibil atât cu standardul IEEE 802.310BASE-T cât și cu standradul 802.3u100BASE-TX.
Cipul se bazează pe stiva de comunicare TCP / IP, având o adresă MAC proprie și care suportă conexiuni TCP, UDP, IPv4, ICMP, ARP, IGMP si PPPoE, având și o zonă internă tampon de 16 kocteți pentru transmiterea de date.
Pentru o usoară integrare, pe partea MCU sunt suportate trei interfețe diferite, cum ar fi calea de acces la memorie, apelarea directă și indirectă cât și interfața SPI.
Diagrama bloc :
Figura 3.6. Diagramă bloc modul Ethernet
Folosirea Wiznet W5100 este utilă pentru o gamă largă de aplicații integrate, precum :
– Dispozitive pentru rețeaua locală : PVR-uri, adaptoare media digitale
– Sterial – Ethernet : Controlere de acces, ecrane cu LED-uri, relee de acces fără fir, etc.
– Paralel – Ethernet : POS, mini imprimante, copiatoare, etc.
– USB – Ethernet : dispozitive de stocare, imprimante de rețea
– GPIO – Ethernet : senzori de rețea locală
– Sisteme de securitate : DVR-uri, camere de rețea
– Fabricarea și construcția de sisteme automate
– Echipamente de monitorizare medicală
– Servere integrate
Caracteristici :
– Comunicare prin stiva TCP/IP prin potocoale precum : TCP, UDP, ICMP, IPv4 ARP, IGMP, PPPoE, Ethernet
– Ethernet PHY 10BaseT/100BaseTX integrat
– Autonegociere ( Full-duplex / Half-duplex )
– Auto MDI/MDIX
– Conexiune ADSL ( prin protocol PPPoE cu autentificare PAP/CHAP
– Nu suportă fragmentare IP
– Memorie internă tampon de 16 Kocteti pentru TX/RX
– Tehnologie CMOS de 0.18 µm
– Tensiune operațională de 3.3 V cu 5 V toleranță de semnal
– Pachet de 80 de pini LQFP
– Interfață serială periferică ( SPI )
– LED-uri pentru RX si TX
Comunicarea TCP :
Canalul de comunicație al cip-ului Wiznet W5100 se realizează prin intermediul stivei TCP/IP prin care o informație va fi transmisă la / de la cip prin utilizarea unei adrese IP și un numar de port al sistemului. Comunicarea prin TCP este o cale de transmitere eficientă deoarece necesită și confirmarea primirii respectivului pachet care a fost trimis către destinație.
Există doua metode prin care se poate realiza conexiunea :
– Modul SERVER ( deschis pasiv ) care este în așteptarea unei cereri de conexiune
– Modul CLIENT ( deschis activ ) care trimite cererea de conectare catre Server.
Comunicarea prin TCP este mai sigură decât comunicarea prin UDP deoarece prin UDP se pot tranfera informații fără a fi necesară o confirmare de primire a acesteia și astfel anumite informații care nu au ajuns la destinație vor fi pierdute.
3.7. Mediul de dezvoltare integrat Arduino ( IDE )
Mediul de dezvolatare integrat Arduino ( IDE – Integrated Development Environment ) este o aplicație dezvoltată în limbajul de programare JAVA. Această aplicație este concepută cu scopul de a veni în sprijinul celor care nu au mai interacționat până acum cu un astfel de mediu și care nu au experiență în dezvoltarea de software.
Figura 3.7.1. Logo Arduino IDE
Mediul de dezvoltare Arduino include un editor pentru cod cu o serie de caracteristici :
Indentarea automată
Evidențierea sintaxei
Compilarea programelor
Încărcarea programelor pe sistemul de dezvoltare Arduino
Programele Arduino sunt dezvoltate în limbajul de programare C sau C++ iar un proiect / program nou scris în sistemul de dezvoltare Arduino IDE poartă denumirea de ,,schiță”.
Softul Arduino IDE conține o bibliotecă inițială numitp “Wiring” (“Cablare”)
Pentru a executa un program, care să și ruleze repetitiv, dezvoltatorul trebuie să definească doua funcții principale : setup( ) și loop( )
setup( ) : Are rolul de a inițializa programul. Se rulează la începutul unui program, o singură data ;
loop( ) : Este o funcție ce rulează repetitiv până în momentul în care este întreruptă alimentarea plăcii de dezvoltare Arduino.
Dacă în cazul limbajelor de programare pentru calculator, cel mai simplu program pe care îl putem dezvolta este așa numitrul “Hello World !” , care afișază acest text pe ecran, cel mai simplu program care poate fi scris pe un microcontroler, cu ajutorul Arduino IDE este acela de a face un LED să se aprindă și să se stingă ( să “clipească” ) la un interval de timp predefinit.
Exemplu program :
Figura 3.7.2. Exemplu program Arduino IDE
Butoane importante ale editorului :
– Prin apăsarea butonului se poate verifica / analiza corectitudinea codului ce a fost introdus în proiectul ce se dorește a fi scris pe microcontroler.
Prin apăsarea butonului se încarcă pe microcontroler codul scris în softul Arduino IDE
– Urmatoarele trei butoane sunt, în ordine, corespunzatoare urmatoarelor funcții : Deschidera unei schițe noi, Deschiderea unei schițe existente și Salvarea schiței curente.
Capitolul 4. Componente hardware
Programatorul FTDI Basic 5V
Programatorul FTDI Basic 5V este cea mai nouă versiune a plăcii FTDI Basic, care folosește un conector SMD cu 6 pini, iar dimensiunile plăcii sunt mai mici și mai compacte, însă funcționalitatea a ramas la fel ca în cazul modelelor precedente.
Figura 4.1.1. FTDI Basic 5V
Este o placă simplă pentru FTDI FT232RL – un integrat pentru USB – Serial. Pentru a putea fi compatibile cu placile oficiale ale Arduino, cât și cu dispozitivele similare, semnificațiile pinilor acestui programator sunt aceleași ca pe cablul FTDI ( Future Technology Devices International ) .
În momentul în care o schiță nouă este descarcată, pinul DTR permite unui dispozitiv Arduino să se auto-reseteze, aceasta fiiind o caracteristică utilă, iar descarcarea unei schițe noi poate fi realizată fără apasarea butonului de reset. Atașarea acestei plăcuțe, va auto-reseta orice fel de placă Arduino sau similară, care are pinul de reset inserat pe un conector cu 6 pini.
Firelor colorate de pe cablul FTDI le corespund pinii marcați BLK si GRN, unde firul negru de pa cablul FTDI este GND iar cel verde este corespunzator DTR. Pinii folosiți pentru programarea modulului sunt BLK și GRN.
Programatorul FTDI Basic 5V are doua LED-uri corespunzatore transmisiei ( TX și RX ) care permit vizualizarea traficului propriu-zis, iar conectarea cu dispozitivul în care se vor prelucra informațiile ( calculatorul ) se face prin intermediul unui cablu miniUSB. Modulul FTDI Basic 5V folosește pinul marcat DTR pentru a efectua resetarea de tip hardware, acolo unde cablul FTDI folosește semnalul RTS.
Această placă a fost proiectată pentru a micșora costurile dezvoltării de soft pe platforma Arduino și are ca scop principal ușurința folosirii, caracteristica de auto-reset fiind foarte utilă.
Din punct de vedere constructiv, programatorul poate fi configurat pentru o tensiune de 5V cât și pentru o tensiune de 3,3V, însă configurarea din fabrică, implicită, este pentru o tensiune de 5V.
Schema programatorului :
Figura 4.1.2. Schema programatorului FTDI Basic 5V
Drivere de LED-uri de tip TPIC6B595
În realizarea sistemului de afișaj cu LED-uri am folosit 4 drivere de LED bazate pe chip-ul TPIC6B595, care au capacitatea de a oferi 4 x 8 canale de ieșire, cu maxim 150 mA per fiecare ieșire. Controlul chip-ului se face prin folosirea a trei pini, și anume DATAIN, LATCH si CLOCK.
Figura 4.2.1. Driver de LED de tip TPIC6B595
Un mare avantaj al acestor plăcuțe este că se pot interconecta, prin înlănțuire, foarte ușor și permite astfel controlul a unui numar practic nelimitat de dispozitive, limitarea apărând doar din cauza rezistenței parazite a cablajului și a conectorilor, însă pot fi înlănțuite cu ușurintă cateva zeci de dispozitive.
Figura 4.2.2. Înlănțuire driver LED de tip TPIC6B595
Aceste drivere sunt ideale pentru interconectarea LED-urilor în vederea realizării unui sistem de afișaj cu LED-uri, iar pentru a controla LED-urile conectate la cele 8 canale de ieșire, trebuiesc conectate la un microcontroler ( în cazul nostru la un microcontroler Arduino ) cei 3 pini de control, la pini digitali.
Pentru a aprinde un LED, va trebui să se scrie pinul DATAIN cu acel numar corespunzător LED-ului ce urmează a fi aprins. Astfel, dacă se dorește a se aprinde al doilea LED, va trebui să scriem pe pinul DATAIN numărul „01000000” – în binar. Dacă se dorește aprinderea tuturor LED-urilor, trebuie să se scrie pe pinul DATAIN numărul „11111111”.
TPIC6B595
TPIC6B595 este un registru de comutație pe 8 biți, de curent mediu, cu structură monobloc pentru înaltă tensiune, conceput pentru utilizare în sistemele care necesită o sarcină electrică relativ mare. Dispozitivul conține o clemă de tensiune inclusă, pe ieșiri, pentru o protecție tranzitorie inductivă. Aplicațiile de acționări electrice includ relee, solenoizi și alte sarcini de curent mediu sau înaltă tensiune.
Figura 4.2.3. TPIC6B595
Acest dispozitiv conține un registru de comutație pe 8 biți, cu intrări seriale și ieșiri paralele, care alimentează un registru de stocare de tip D pe 8 biți. Datele se transferă prin registrele de comutație și de stocare pe marginea superioară a ceasului registrului de comutație (SRCK) și, respectiv, a ceasului de registru (RCK).
Registrul de stocare transferă datele către bufferul de ieșire atunci când intervalul registrului de comutație (SRCLR) este ridicat. Când SRCLR este scăzut, este golit registrul de comutație a intrărilor, iar atunci când activarea de ieșire (G) este menținută ridicată, toate datele din bufferele de ieșire sunt ținute jos și toate ieșirile de golire sunt oprite.
Atunci când G este ținut jos, datele din registrul de stocare trec în bufferele de ieșire. Când datele din bufferele de ieșire sunt jos, ieșirile cu tranzistori DMOS sunt oprite. Când datele sunt sus, ieșirile cu tranzistori DMOS au capacități de curent absorbit.
Ieșirea serială (SER OUT) permite cascadarea datelor din registrul de comutație către dispozitive suplimentare.
Ieșirile sunt tranzistori DMOS cu ieșire deschisă, cu valori de nominal de 50 V și cu capacități continue de curent absorbit de 150 mA. Fiecare ieșire oferă o limită tipică de curent de 500 mA la TC = 25°C. Limita de curent scade odată cu creșterea temperaturii joncțiunii, pentru o protecție suplimentară a dispozitivului.
TPIC6B595 poate funcționa la o temperatură a carcasei de -40°C – 125°C.
Figura 4.2.4. Schema echivalentă a intrărilor pentru TPIC6B595
Figura 4.2.5. Schema echibvalentă a iesirilor pentru TPIC6B595
Măsurarea parametrilor :
Figura 4.2.6. Circuit de test al TPIC6B595 Figura 4.2.7. Formele de undă de tensiune
LED-uri
Un LED reprezintă o diodă luminiscentă ( diodă emițătoare de lumină ), care este o diodă semiconductoare ce la polarizarea directă a joncțiunii p – n, emite lumină, efectul fiind o formă de electroluminiscență.
Figura 4.3.1. LED
LED-ul reprezintă o sursă de lumină de intensitate redusă, care de cele mai multe ori este însoțită de un circuit electric ce permite modelarea formei radiației luminoase.
Schema electrică LED :
Figura 4.3.2. Schemă electrică LED
Valori maxime absolute (Ta=25°C)
Tabelul 4.3.1. Valori maxime absolute pentru LED
Capitolul 5. Realizare practică
5.1. Schema bloc a proiectului
Figura 5.1.1. Schema bloc a proiectului
Elementele componente ale schemei proiectului :
Microcontroler Arduino Ethernet R3 :
Figura 5.1.2. Microcontroler Arduino Ethernet R3 ( schemă )
Drivere de LED-uri de tip TPIC6B595 :
Figura 5.1.3. – Drivere de LED-uri de tip TPIC6B595( schemă )
Programator FTDI Basic 5V :
Figura 5.1.4. – Programator FTDI Basic ( schemă )
LED-uri :
Figura 5.1.5 – LED-uri ( schemă )
Rezistoare
Figura 5.1.6 – Rezistoare ( schemă )
5.2. Componente utilizate în realizarea proiectului
În realizarea practică, a sistemului de afișaj cu LED-uri comandat prin Internet am avut nevoie de urmatoarele componente :
1 x Arduino Ethernet R3
4 x Driver LED TPIC6B595
1 x FTDI Basic 5V
27 x LED-uri
27 x Rezistoare 270 Ω
1 x Card microSD
1 x Alimentator HNP18 9V / 2A
2 x Placă test Eurocard
1 x Suport de lemn
1 x Cablu UTP
1 x Cablu miniUSB – USB
5.3. Etapele realizării proiectului
În realizarea practică a sistemului de afișaj cu LED-uri am foslosit un suport confecționat din lemn pentru a se dispune pe acesta, toate componentele necesare.
Figura 5.3.1. Suport componente
Am realizat sistemul de afișaj cu LED-uri ( cubul cu LED-uri), interconectând cele 27 de LED-uri cu cele 27 de rezitoaste. Atât LED-urile cât și rezistoarele utilizate au fost dispuse pe o placă de test Eurocard.
Figura 5.3.2. Placă de test Eurocard
Figura 5.3.3. LED-uri și rezistoare interconectate
Dupa ce au fost conectate LED-urile și rezistențele pe placa de test Eurocard, se vor poziționa astfel încât să aibe forma unui cub 3X3X3.
Figura 5.3.4. Sistem de afișaj cu LED-uri 3x3x3
Se vor înlănțui cele 4 drivere de LED-uri TPIC6B595 prin interconectarea pinilor de pe un driver (VCC1, GND1, DATAIN1, LATCH1, CLOCK1 ) cu pinii similari ai driver-ului de LED învecinat (VCC2, GND2, DATAIN2, LATCH2, CLOCK2 ).
Figura 5.3.5. Drivere de LED TPIC6B595 înlănțuite
Fixăm componentele pe suportul din lemn, după care le vom interconecta astfel :
Cele 27 de LED-uri la care se adaugă cele 27 de rezistoare le vom conecta la pinii “D” ai
driverelor de LED-uri înlănțuite.
Figura 5.3.6. Conectare LED – TPIC6B595
Pinul “VCC” al driver-ului de LED-uri din extremitate, se va interconecta cu cele 27 de
LED-uri ale sistemul de afișaj.
Figura 5.3.7. Conectare VCC
– Pinii “VCC”, “GND”, “OUT”, “LC” și “CLK” ai driver-ului de LED din cealaltă extremitate față de cel în care s-a conectat pinul “VCC” cu cele 27 de LED-uri, se interconectează cu pinii “5V”, “GND”, “5”, “3” respectiv “7” ai sistemului de dezvoltare Arduino Ethernet R3.
Figura 5.3.8. Conectare Arduino Ethernet R3 – TPIC6B595
Rezultat final :
Figura 5.3.9. Sistem de afișaj cu LED-uri
Pentru alimentarea sistemului am folosit un alimentator HNP18-090 de 9V și 2000 mA.
Figura 5.3.10. Alimentator HNP18-090 de 9V / 2000 mA
– Pentru conectarea programatorului FTDI Basic 5V cu calculatorul pentru a realiza programarea microcontrolerului Arduino Ethernet R3 am folosit un cablu MiniUSB – USB.
Figura 5.3.11. Cablu MiniUSB – USB
– Pentru conectarea sistemului de dezvoltare Arduino Ethernet R3 cu calculatorul pentru a accesa modulul Ethernet am folosit un cablu UTP – Crossover
Figura 5.3.12. Cablu UTP Figura 5.3.13. Cablu UPT Crossover
5.4. Diagrama logică a sistemului de afișaj cu LED-uri
Considerăm 4 numere ( număr1, număr2, număr3 și număr4 ) ce se vor trimite cu ajutorul microcontrolerului Arduino Ethernet R3 către sistemul de afișaj cu LED-uri.
Numerele sunt de forma :
număr1 = B 1 1 1 1 1 1 1 1
număr2 = B 1 1 1 1 1 1 1 1
număr3 = B 1 1 1 1 1 1 1 1
număr4 = B 1 1 1 1 1 1 1 1
Pentru a aprinde pe rând, sau simultan LED-urile sistemului de afișaj, se vor modifica valorile numerelor număr1, număr2, număr3, număr4 astfel încât să se obțină rezultatul dorit.
În momentul în care se transmite “1” ( unu logic ), LED-ul corespunzator acestuia va fi aprins iar în cazul în care este transmis “0” ( zero logic ), LED-ul corespunzator acestuia va fi stins.
Sistem de afișaj cu LED-uri :
Figura 5.4. Matrice sistem afișaj cu LED-uri
Tabele de adevăr :
număr1
Tabelul 5.4.1. Tabel de adevăr “număr1”
număr2
Tabelul 5.4.2. Tabel de adevăr “număr2”
număr3
Tabelul 5.4.3. Tabel de adevăr “număr3”
număr4
Tabelul 5.4.4. Tabel de adevăr “număr4”
Capitolul 6 . Programul
6.1. Programul 1
Se dorește aprinderea LED-urilor din colțurile sistemului de afișaj cu LED-uri, adică se dorește aprinderea doar a LED-urilor A1, A3, A7, A9, C1, C3, C7, C9 ( conform Figurii 5.4.1. ).
Se vor transmite următoarele numere :
număr1 = B 0 1 0 1 0 0 0 0
număr2 = B 0 1 0 0 0 0 0 1
număr3 = B 0 0 0 1 0 0 0 0
număr4 = B 0 1 0 1 0 1 0 0
6.1.1. Cod program
Se definesc pinii pentru LATCH, CLOCK si DATA
int latchPin = 3;
int clockPin = 7;
int dataPin = 5;
Se inițializează cele patru numere ce vor fi transmise către microcontroler, astfel încât în
urma rulării să fie aprinse doar LED-urile din colțurile sistemului de afișaj
int numar1 = B01010000;
int numar2 = B01000001;
int numar3 = B00010000;
int numar4 = B01010100;
Se inițiază programul în care se menționează că pinii latchPin (pinul 3), clockPin ( pinul 7 )
cât și pinul dataPin ( pinul 5 ) sunt pini de IEȘIRE.
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
Se apelează funcția loop() care va rula repetitiv până în momentul întreruperii alimentării și
în care se vor stinge inițial toate LED-urile, apoi se transmit cele patru numere (număr1, număr2, număr3, număr4 ), urmate de aprinderea LED-urilor ce sunt asociate cu “1” ( unu logic ) și se mențin stinse LED-urile ce sunt asociate cu “0” ( zero logic ).
void loop() {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, numar4);
shiftOut(dataPin, clockPin, MSBFIRST, numar3);
shiftOut(dataPin, clockPin, MSBFIRST, numar2);
shiftOut(dataPin, clockPin, MSBFIRST, numar1);
digitalWrite(latchPin, HIGH); delay(30);
}
Codul complet al programului este prezentat în cadrul Anexei 1
6.1.2. Simulare program
Figura 6.1.2. Exemplul 1 – Aprindere LED-uri
6.2. Programul 2
Se dorește aprinderea repetitivă a LED-urilor, în ordinea în care sunt conectate la driverele de LED TPIC6B595, pentru a genera un „joc de lumini”.
6.2.1. Cod program
Se definesc pinii pentru LATCH, CLOCK și DATA
int latchPin = 3;
int clockPin = 7;
int dataPin = 5;
Se inițiază programul în care se menționează că pinii latchPin (pinul 3), clockPin ( pinul 7)
cât și pinul dataPin ( pinul 5 ) sunt pini de IEȘIRE.
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
Se apelează funcția loop() care va rula repetitiv până în momentul întreruperii alimentării și
în care se apelează o funcție repetitivă “for”. Se declară o variabilă de tip întreg numărAfișat care se initializează cu 0 și cât timp ea este mai mică decât 16000000, valoarea ei se va incrementa.
void loop() {
for (int numarAfisat = 0; numarAfisat < 16000000; numarAfisat++) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, numarAfisat);
digitalWrite(latchPin, HIGH); delay(150);
}
}
Codul complet al programului este prezentat în cadrul Anexei 2.
6.2.2. Simulare program
Figura 6.2.2. Exemplul 2 – Aprindere LED-uri
6.3. Programul 3 – utilizare modul Ethernet
Se dorește controlarea celor 27 de LED-uri ale sistemului de afișaj, utilizând un Server Web prin care să se realizeze următoarele :
– aprinderea / stingerea tuturor LED-urilor sistemului de afișaj
– aprinderea / stingerea LED-urilor din colțurile sistemului de afișaj, adică se dorește aprinderea / stingerea LED-urilor A1, A3, A7, A9, C1, C3, C7, C9 ( conform Figurii 5.4.1. ). [ Program 1 ]
– “joc de lumini” [ Program 2 ]
6.3.1. Cod program
Identificarea sistemului de dezvoltare conectat se realizează prin intermediul MAC-ului
propriu Arduino Ethernet R3 :
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x36, 0x61 };
Pentru a se realiza conectivitatea sistemului de dezvoltare Arduino Ethernet R3 este necesar să i se atribuie static o adresă IP, prin intermediul căreia se va realiza conexiunea cu calculatorul interconectat de pe care se dorește controlul prin interfață web.
Astfel s-a atribuit sistemului de dezvoltare Arduino Ethernet R3 IP-ul 10.0.0.20 iar calculatorului interconectat, IP-ul 10.0.0.10.
byte ip[] = { 10, 0, 0, 20 };
Se defineste portul prin care se dorește a se realiza comunicarea la nivel Ethernet
EthernetServer server(80);
Se definesc pinii pentru LATCH, CLOCK și DATA
int latchPin = 3;
int clockPin = 7;
int dataPin = 5;
Se inițializează cele 12 numere ce vor fi transmise către microcontroler, astfel încât în urma rulării să fie aprinse LED-urile dorite ale sistemului de afișaj
int numar1 = B11111111;
int numar2 = B11111111;
int numar3 = B11111111;
int numar4 = B11111111;
int numar5 = B00000000;
int numar6 = B00000000;
int numar7 = B00000000;
int numar8 = B00000000;
int numar9 = B01010000;
int numar10 = B01000001;
int numar11 = B00010000;
int numar12 = B01010100;
Se inițiază programul în care se menționează că pinii latchPin (pinul 3), clockPin ( pinul 7 )
cât și pinul dataPin ( pinul 5 ) sunt pini de IEȘIRE.
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
Se definesc parametri conexiunii server-ului și se crează interfața HTML a serverului web
Se realizează corespondența între elementele din server-ul web și sistemul de dezvoltare Arduino Ethernet R3, astfel încât la efectuarea unei anumite acțiuni în cadrul interfeței web să corespundă cu efectuarea propriu-zisă a acelei acțiuni pe sistemul de afișaj cu LED-uri.
Codul complet al programului este prezentat în cadrul Anexei 3
6.3.2. Simulare program
Interfața web :
Figura 6.3.2.1. Program Ethernet – Interfața web
Aprinderea tuturor LED-urilor sistemului de afișaj :
Figura 6.3.2.2. Program Ethernet – Aprinderea tuturor LED-urilor
Stingerea tuturor LED-urilor sistemului de afișaj :
Figura 6.3.2.3. Program Ethernet – Stingerea tuturor LED-urilor
Program 1 :
Figura 6.3.2.4. Program Ethernet – Program 1
Program 2 :
Figura 6.3.2.5. Program Ethernet – Program 2
6.3.3. Conectarea cu dispozitive mobile
Conectarea sistemului de afișaj cu LED-uri se poate controla și cu ajutorul dispozitivelor mobile conectate în aceeași rețea cu un calculator/router. Ca și dispozitive mobile cu care se pote controla sistemul de afișaj cu LED-uri se numară telefonul mobil, tableta sau orice alt dispozitiv mobil care are capacitatea de a se conecta la rețea și care dispune de o interfață web.
Se va accesa aceeași interfață web, însă de această dată accesarea se va face direct de pe dispozitivul mobil, ne mai fiind necesară accesarea calculatorului.
Figura 6.3.3. Conectarea cu dispositive mobile
Pentru a se realiza controlul sistemului de afișaj cu LED-uri de pe dispozitive mobile este necesar să existe următoarea topologie :
– Adresa IP a Arduino : 10.0.0.20
– Adresa IP a Server-ului : 10.0.0.10
– Dispozitivul mobil se conectează la rețeaua Wi-fi creată de Server și astfel se va afla în aceeași rețea cu sistemul de afișaj cu LED-uri controlat de sistemul de dezvolatare Arduino Ethernet R3.
6.4. Programul 4 – utilizare modul microSD
6.4.1. Afișare fișiere card microSD
Sa se afișeze fișierele și dimensiunea acestora de pe cardul microSD inserat în sistemul de dezvoltare Arduino Ethernet R3
Codul programului :
S-au copiat in prealabil 3 fisiere ( TEST1.txt, TEST2.txt si TEST3.txt ) pe cardul microSD, cu ajutorul unui adaptor conectat la calculator
Se insereaza cardul microSD cu cele 3 fișiere, în modulul microSD al sistemului de dezvoltare Arduino Ethernet R3.
Se inițiază verificarea cardului microSD, după care se verifică dacă există date pe acesta, iar dacă există, se vor afișa.
Codul programului este prezentat în cadrul Anexei 4.
Simulare program :
Figura 6.4.1. Afișare fișiere card microSD
6.4.2. Afișare conținut fișier card microSD prin server web
Sa se afișeze conținutul fișierului TEST1 prin intermediul unei interfețe web ( server web ).
Codul programului
– S-a copiat în prealabil fișierul TEST1.txt pe cardul microSD, cu ajutorul unui adaptor conectat la calculator ;
– Fișierul TEST1.txt conține următorul text :
“ Licenta 2014 – Sistem de afisaj cu LED-uri comandat prin Internet “
– Se inițializează un server web ( ca și în programul 3 ) după care se afișază conținutul fișierului TEST1.txt în fereastra creată ;
Codul programulul este prezentat în cadrul Anexei 5.
Simulare program :
Capitolul 7 . Concluzii
Lucrarea este alacătuită din două părți, o parte analitică și o parte practică, în care au fost prezentate principalele caracteristici ale componentelor necesare realizării unui sistem de afișaj cu LED-uri comandat prin Internet cât și etapele propriu-zise ale realizării acestuia.
Studiul analitic cuprinde o prezentare a principalelor caracteristici ale unui microcontroler, prezentarea caracteristicilor de funcționare ale sistemului de dezvoltare Arduino Ethernet R3 ( microcontroler folosit în realizarea proiectului ), cât și noțiuni tehnice generale despre programatorul FTDI Basic 5v, LED-uri și drivere de LED-uri TPIC6B595.
Partea de prezentare a realizării practice a proiectului cuprinde prezentarea schemei bloc a sistemului de afișaj cu LED-uri comandat prin Internet, etapele realizării proiectului, diagrama logică dar și patru programe implementate. S-a realizat aprinderea LED-urilor din colțurile sistemului de afișaj, aprinderea LED-urilor sub forma unui “joc de lumini”, cât și s-a prezentat posibilitatea utilizării modulului Ethernet integrat și a modulului pentru card microSD.
Un astfel de sistem se poate utiliza în cazul unui control inteligent al luminilor dintr-o locuință. Prin conectarea unui dispozitiv mobil la sistemul de afișaj, cu ajutorul unui server, se poate realiza un control rapid și ușor al iluminatului din locuință, avanajul fiind ușurința și faptul că nu va mai fi necesar un control dintr-un anumit loc prestabilit, controlul putandu-se a se face astfel din orice loc din locuința respectivă.
B i b l i o g r a f i e
A n e x e
Anexa 1 : Programul 6.1.
int latchPin = 3;
int clockPin = 7;
int dataPin = 5;
int numar1 = B01010000;
int numar2 = B01000001;
int numar3 = B00010000;
int numar4 = B01010100;
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, numar4);
shiftOut(dataPin, clockPin, MSBFIRST, numar3);
shiftOut(dataPin, clockPin, MSBFIRST, numar2);
shiftOut(dataPin, clockPin, MSBFIRST, numar1);
digitalWrite(latchPin, HIGH); delay(30);
}
Anexa 2 : Program 6.2.
int latchPin = 3;
int clockPin = 7;
int dataPin = 5;
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
for (int numarAfisat = 0; numarAfisat < 16000000; numarAfisat++) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, numarAfisat);
digitalWrite(latchPin, HIGH); delay(150);
}
}
Anexa 3 : Programul 6.3.
#include <SPI.h>
#include <Ethernet.h>
#include <Servo.h>
Servo myservo;
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x36, 0x61 };
byte ip[] = { 10, 0, 0, 20 };
EthernetServer server(80); //server port
int latchPin = 3;
int clockPin = 7;
int dataPin = 5;
int numar1 = B11111111;
int numar2 = B11111111;
int numar3 = B11111111;
int numar4 = B11111111;
int numar5 = B00000000;
int numar6 = B00000000;
int numar7 = B00000000;
int numar8 = B00000000;
int numar9 = B01010000;
int numar10 = B01000001;
int numar11 = B00010000;
int numar12 = B01010100;
String readString;
void setup(){
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
Ethernet.begin(mac, ip);
server.begin();
Serial.begin(9600);
Serial.println("SERVER WEB control sistem de afisaj cu LED-uri ");
}
void loop(){
EthernetClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (readString.length() < 100) {
readString += c;
}
if (c == '\n') {
Serial.println(readString);
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.println("<HTML>");
client.println("<H1>Sistem de afisaj cu LED-uri comandat prin Internet</H1>");
client.println("<HEAD>Licenta 2014 – Horatiu – Dumitru Staicovici<HEAD>");
client.println("<TITLE>Sistem de afisaj cu LED-uri comandat prin Internet</TITLE>");
client.println("</HEAD>");
client.println("<BODY bgcolor='aqua'>");
client.println("<hr />");
client.println("<br />");
client.println("<a href=\"/leduriaprinse\"\">APRINDE TOATE LED-URILE</a>");
client.println("<br />");
client.println("<a href=\"/leduristinse\"\">STINGE TOATE LED-URILE</a><br />");
client.println("<br />");
client.println("<a href=\"/program1\"\">PROGRAM 1</a>");
client.println("<br />");
client.println("<a href=\"/leduristinse2\"\">STINGE TOATE LED-URILE</a><br />");
client.println("<br />");
client.println("<a href=\"/program2\"\">PROGRAM 2</a>");
client.println("<br />");
client.println("<a href=\"/leduristinse3\"\">STINGE TOATE LED-URILE</a><br />");
client.println("<br />");
client.println("</BODY>");
client.println("</HTML>");
delay(1);
client.stop();
if(readString.indexOf("leduriaprinse") >0)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, numar4);
shiftOut(dataPin, clockPin, MSBFIRST, numar3);
shiftOut(dataPin, clockPin, MSBFIRST, numar2);
shiftOut(dataPin, clockPin, MSBFIRST, numar1);
digitalWrite(latchPin, HIGH);
Serial.println("LED On");
}
else{
if(readString.indexOf("leduristinse") >0)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, numar8);
shiftOut(dataPin, clockPin, MSBFIRST, numar7);
shiftOut(dataPin, clockPin, MSBFIRST, numar6);
shiftOut(dataPin, clockPin, MSBFIRST, numar5);
digitalWrite(latchPin, HIGH);
Serial.println("LED Off");
}
}
if(readString.indexOf("program1") >0)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, numar12);
shiftOut(dataPin, clockPin, MSBFIRST, numar11);
shiftOut(dataPin, clockPin, MSBFIRST, numar10);
shiftOut(dataPin, clockPin, MSBFIRST, numar9);
digitalWrite(latchPin, HIGH);
Serial.println("LED On");
}
else{
if(readString.indexOf("leduristinse2") >0)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, numar8);
shiftOut(dataPin, clockPin, MSBFIRST, numar7);
shiftOut(dataPin, clockPin, MSBFIRST, numar6);
shiftOut(dataPin, clockPin, MSBFIRST, numar5);
digitalWrite(latchPin, HIGH);
Serial.println("LED Off");
}
}
if(readString.indexOf("program2") >0)
{
for (int numarAfisat = 0; numarAfisat < 30; numarAfisat++) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, numarAfisat);
digitalWrite(latchPin, HIGH); delay(150);
}
}
else{
if(readString.indexOf("leduristinse3") >0)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, numar8);
shiftOut(dataPin, clockPin, MSBFIRST, numar7);
shiftOut(dataPin, clockPin, MSBFIRST, numar6);
shiftOut(dataPin, clockPin, MSBFIRST, numar5);
digitalWrite(latchPin, HIGH);
Serial.println("LED Off");
}
}
readString="";
}
}
}
}
}
Anexa 4 : Program 6.4.1
#include <SPI.h>
#include <SD.h>
File root;
void setup()
{
Serial.begin(9600);
while (!Serial) {
}
Serial.print("Se initializeaza cadrul microSD…");
pinMode(10, OUTPUT);
if (!SD.begin(4)) {
Serial.println("Initializare esuata !");
return;
}
Serial.println("Initializare efectuata !");
root = SD.open("/");
printDirectory(root, 0);
Serial.println("Gata!");
}
void loop()
{
}
void printDirectory(File dir, int numTabs) {
while(true) {
File entry = dir.openNextFile();
if (! entry) {
break;
}
for (uint8_t i=0; i<numTabs; i++) {
Serial.print('\t');
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println("/");
printDirectory(entry, numTabs+1);
} else {
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
entry.close();
} }
Anexa 5 : Program 6.4.2.
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x36, 0x61 };
IPAddress ip(10, 0, 0, 20);
EthernetServer server(80);
File webFile;
void setup()
{
Ethernet.begin(mac, ip);
server.begin();
Serial.begin(9600);
Serial.println("Initializare card microSD…");
if (!SD.begin(4)) {
Serial.println("Eroare – Initializare card microSD esuata!");
return;
}
Serial.println("Succes – Card microSD initializat");
if (!SD.exists("TEST1.txt")) {
Serial.println("Eroare – Nu se poate gasi fisierul TEST1.txt!");
return;
}
Serial.println("Succes – S-a gasit fisierul TEST1.txt!");
}
void loop()
{
EthernetClient client = server.available();
if (client) {
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (c == '\n' && currentLineIsBlank) {
client.println("HTTP/1.1 200 OK");
client.println("Tipul conexiunii: text/html");
client.println("Conexiune: close");
client.println();
webFile = SD.open("TEST1.txt");
if (webFile) {
while(webFile.available()) {
client.write(webFile.read());
}
webFile.close();
}
break;
}
if (c == '\n') {
currentLineIsBlank = true;
}
else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
delay(1);
client.stop();
}
}
A n e x e
Anexa 1 : Programul 6.1.
int latchPin = 3;
int clockPin = 7;
int dataPin = 5;
int numar1 = B01010000;
int numar2 = B01000001;
int numar3 = B00010000;
int numar4 = B01010100;
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, numar4);
shiftOut(dataPin, clockPin, MSBFIRST, numar3);
shiftOut(dataPin, clockPin, MSBFIRST, numar2);
shiftOut(dataPin, clockPin, MSBFIRST, numar1);
digitalWrite(latchPin, HIGH); delay(30);
}
Anexa 2 : Program 6.2.
int latchPin = 3;
int clockPin = 7;
int dataPin = 5;
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
for (int numarAfisat = 0; numarAfisat < 16000000; numarAfisat++) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, numarAfisat);
digitalWrite(latchPin, HIGH); delay(150);
}
}
Anexa 3 : Programul 6.3.
#include <SPI.h>
#include <Ethernet.h>
#include <Servo.h>
Servo myservo;
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x36, 0x61 };
byte ip[] = { 10, 0, 0, 20 };
EthernetServer server(80); //server port
int latchPin = 3;
int clockPin = 7;
int dataPin = 5;
int numar1 = B11111111;
int numar2 = B11111111;
int numar3 = B11111111;
int numar4 = B11111111;
int numar5 = B00000000;
int numar6 = B00000000;
int numar7 = B00000000;
int numar8 = B00000000;
int numar9 = B01010000;
int numar10 = B01000001;
int numar11 = B00010000;
int numar12 = B01010100;
String readString;
void setup(){
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
Ethernet.begin(mac, ip);
server.begin();
Serial.begin(9600);
Serial.println("SERVER WEB control sistem de afisaj cu LED-uri ");
}
void loop(){
EthernetClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (readString.length() < 100) {
readString += c;
}
if (c == '\n') {
Serial.println(readString);
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.println("<HTML>");
client.println("<H1>Sistem de afisaj cu LED-uri comandat prin Internet</H1>");
client.println("<HEAD>Licenta 2014 – Horatiu – Dumitru Staicovici<HEAD>");
client.println("<TITLE>Sistem de afisaj cu LED-uri comandat prin Internet</TITLE>");
client.println("</HEAD>");
client.println("<BODY bgcolor='aqua'>");
client.println("<hr />");
client.println("<br />");
client.println("<a href=\"/leduriaprinse\"\">APRINDE TOATE LED-URILE</a>");
client.println("<br />");
client.println("<a href=\"/leduristinse\"\">STINGE TOATE LED-URILE</a><br />");
client.println("<br />");
client.println("<a href=\"/program1\"\">PROGRAM 1</a>");
client.println("<br />");
client.println("<a href=\"/leduristinse2\"\">STINGE TOATE LED-URILE</a><br />");
client.println("<br />");
client.println("<a href=\"/program2\"\">PROGRAM 2</a>");
client.println("<br />");
client.println("<a href=\"/leduristinse3\"\">STINGE TOATE LED-URILE</a><br />");
client.println("<br />");
client.println("</BODY>");
client.println("</HTML>");
delay(1);
client.stop();
if(readString.indexOf("leduriaprinse") >0)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, numar4);
shiftOut(dataPin, clockPin, MSBFIRST, numar3);
shiftOut(dataPin, clockPin, MSBFIRST, numar2);
shiftOut(dataPin, clockPin, MSBFIRST, numar1);
digitalWrite(latchPin, HIGH);
Serial.println("LED On");
}
else{
if(readString.indexOf("leduristinse") >0)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, numar8);
shiftOut(dataPin, clockPin, MSBFIRST, numar7);
shiftOut(dataPin, clockPin, MSBFIRST, numar6);
shiftOut(dataPin, clockPin, MSBFIRST, numar5);
digitalWrite(latchPin, HIGH);
Serial.println("LED Off");
}
}
if(readString.indexOf("program1") >0)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, numar12);
shiftOut(dataPin, clockPin, MSBFIRST, numar11);
shiftOut(dataPin, clockPin, MSBFIRST, numar10);
shiftOut(dataPin, clockPin, MSBFIRST, numar9);
digitalWrite(latchPin, HIGH);
Serial.println("LED On");
}
else{
if(readString.indexOf("leduristinse2") >0)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, numar8);
shiftOut(dataPin, clockPin, MSBFIRST, numar7);
shiftOut(dataPin, clockPin, MSBFIRST, numar6);
shiftOut(dataPin, clockPin, MSBFIRST, numar5);
digitalWrite(latchPin, HIGH);
Serial.println("LED Off");
}
}
if(readString.indexOf("program2") >0)
{
for (int numarAfisat = 0; numarAfisat < 30; numarAfisat++) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, numarAfisat);
digitalWrite(latchPin, HIGH); delay(150);
}
}
else{
if(readString.indexOf("leduristinse3") >0)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, numar8);
shiftOut(dataPin, clockPin, MSBFIRST, numar7);
shiftOut(dataPin, clockPin, MSBFIRST, numar6);
shiftOut(dataPin, clockPin, MSBFIRST, numar5);
digitalWrite(latchPin, HIGH);
Serial.println("LED Off");
}
}
readString="";
}
}
}
}
}
Anexa 4 : Program 6.4.1
#include <SPI.h>
#include <SD.h>
File root;
void setup()
{
Serial.begin(9600);
while (!Serial) {
}
Serial.print("Se initializeaza cadrul microSD…");
pinMode(10, OUTPUT);
if (!SD.begin(4)) {
Serial.println("Initializare esuata !");
return;
}
Serial.println("Initializare efectuata !");
root = SD.open("/");
printDirectory(root, 0);
Serial.println("Gata!");
}
void loop()
{
}
void printDirectory(File dir, int numTabs) {
while(true) {
File entry = dir.openNextFile();
if (! entry) {
break;
}
for (uint8_t i=0; i<numTabs; i++) {
Serial.print('\t');
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println("/");
printDirectory(entry, numTabs+1);
} else {
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
entry.close();
} }
Anexa 5 : Program 6.4.2.
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x36, 0x61 };
IPAddress ip(10, 0, 0, 20);
EthernetServer server(80);
File webFile;
void setup()
{
Ethernet.begin(mac, ip);
server.begin();
Serial.begin(9600);
Serial.println("Initializare card microSD…");
if (!SD.begin(4)) {
Serial.println("Eroare – Initializare card microSD esuata!");
return;
}
Serial.println("Succes – Card microSD initializat");
if (!SD.exists("TEST1.txt")) {
Serial.println("Eroare – Nu se poate gasi fisierul TEST1.txt!");
return;
}
Serial.println("Succes – S-a gasit fisierul TEST1.txt!");
}
void loop()
{
EthernetClient client = server.available();
if (client) {
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (c == '\n' && currentLineIsBlank) {
client.println("HTTP/1.1 200 OK");
client.println("Tipul conexiunii: text/html");
client.println("Conexiune: close");
client.println();
webFile = SD.open("TEST1.txt");
if (webFile) {
while(webFile.available()) {
client.write(webFile.read());
}
webFile.close();
}
break;
}
if (c == '\n') {
currentLineIsBlank = true;
}
else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
delay(1);
client.stop();
}
}
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: Sistem de Afisaj cu Led Uri Comandat Prin Internet (ID: 163486)
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.
