Vlad-Ştefan GRIGORIŢĂ - Sistem de irigare la distanta

Autorul poate fi contactat la adresa: Login pentru adresa

Introducere

Am creat acest proiect pentru a putea crea un sistem de irigare pe care il pot controla de la distanta. Am pornit de la ideea unui automat pentru pompa, insa un astfel de automat nu este suficient de flexibil pentru a fi pus in practica. Din acest motiv, am facut acest proiect, pentru a putea capata aceasta flexibilitate.

Descriere generală

Schema bloc a proiectului.

Hardware Design

Lista de piese

Componente Numar
Tranzistor BC171B 8
LED 10
Rezistenta 470 Ohm 8
Rezistenta 5100 Ohm 8
Modul Ethernet ENC28J60 1
Mufa card SD 1
Card SD 1
Rezistenta 1800 Ohm 5
Rezistenta 3300 Ohm 3
Rezistenta 10000 Ohm 1
Interconexiuni (fire) 40

Schema electrica

Software Design

Am folosit mai multe medii de dezvoltare pentru acest proiect. Am folosit Microsoft Visual Studio 2010, pentru dezolvtarea aplicatiei ce va rula pe calculatorul utilizatorului, care va comunica cu dispozitivul aflat la distanta. Pentru dezvoltarea aplicatiei ce ruleaza pe dispozitiv, am folosit Programer's Notepad pentru dezvoltare si avr-gcc pentru compilare.

Bibliotecile si sursele 3rd party folosite.

Fisiere Sursa Sursa
Citire/Scriere pe card SD Laboratorul 4 PM
Petite FAT FileSystem Laboratorul 4 PM
Receptie/Trimitere folosind ENC28J60 Laboratorul 5 PM
Biblioteci
PDCurses for Windows
WinSock 2

Sursele implementate

Program Dispozitiv

Fisier sursa
System.c, System.h
NetworkImplementation.c, NetworkImplementation.h
UDPPackets.c, UDPPackets.h
UDPProtocol.c, UDPProtocol.h
Device.c

Program Utilizator

Fisier sursa
System.c, System.h
UDPPackets.c, UDPPackets.h
UDPProtocol.c, UDPProtocol.h
main.c

Rezultate Obţinute

In dezvoltarea proiectului am intampinat numeroase probleme. Nu ma asteptam sa intampin astfel de probleme. Majoritatea problemelor pe care le-am intalnit au fost legate de implementarea programului de pe dispozitiv.

Problema : ENC28J60

Eu am cumparat un modul Ethernet bazat pe ENC28J60. Cu ajutorul acestui modul, pot sa fac comunicarea dintre dispozitiv si un echipament de retea (deocamdata laptop). Codul furnizat in laboratorul 5 de PM, nu functioneaza.

Initial am inceput sa fac transmisia sa functioneze. Problema era faptul ca pachetul se trimitea deplasat cu un octet. Rezolvarea a fost sa pun pachetul pe care sa-l trimit, cu un octet deplasat in memoria lui ENC28J60, deoarece primul octet este unul de control, care nu este transmis. Avand transmisia corect implementata, am avut posibilitatea sa implementez si sa testez mai usor toate celelalte module, deoarece puteam sa vad ce se afla in memoria microcontroller-ului.

La receptie, am intalnit multe probleme de implementare. ENC28J60 are buguri in hardware, si a trebuit sa respect ce scrie in errata hardware a acestui integrat : Citirea informatiilor despre pachetele primite sa se faca direct din memoria de receptie a lui ENC28J60, nu prin intermediul unor comenzi de citire. De asemenea, trebuia sa setez ca orice pachet pe care sa-l primeasca, sa fie pus in memoria lui, la o adresa impara. Setarea unei adrese pare duce la coruperea memoriei integratului m(. Alta problema pe care am avut-o a fost verificarea datelor receptionate de ENC28J60. Wireshark (rulat cu drepturi de administrator pe Windows) primea de la sistemul de operare pachetele, fara sa aiba calculate checksum-urile pentru pachetele IP si UDP. Placa mea primea pachetele cu acele checksum-uri corect completate si le trimitea inapoi asa cum le primea. La primire, se vedea faptul ca pachetele difereau, deoarece difereau acele checksum-uri (pe care Windows nu le calcula, decat in momentul trimiterii). Deoarece eu comparam pachetele trimise si receptionate ca streamuri de date, nu mi-am dat seama de acest lucru din timp, fapt care m-a facut sa pierd mult timp la aceasta problema.

Problema : Card-ul SD tine legatura SPI ocupata, chiar daca are CS-ul inactiv

Deoarece ATMEGA324PA are suport pentru SPI doar pe 3 pini (PB5,PB6,PB7), pentru a putea folosi atat modulul Ethernet, cat si cardul SD, ar trebui sa le conectez in paralel, pe aceiasi pini, iar CS-ul fiecaruia sa fie separat. Ca totul sa functioneze corect, fiecare din ele trebuie sa comunice prin SPI cu ATMEGA324PA atunci cand au CS-ul activ. Din pacate, card-ul SD continua sa comunice chiar daca avea CS-ul sau inactiv, ceea ce ducea la primirea de catre ENC28J60 a datelor de pe card m( (ca tot am facut la SO despre zero-copy transfer).

Rezolvarea consta in trimiterea repetata a citirii/scrierii bufferului in fisierul de pe card, pana cand se intoarce faptul ca nu a avut loc nici o eroare, si apoi redeschiderea fisierului pentru a astepta ca acel card SD sa isi dea flush la datele din buffer-ul sau.

Problema : Programul de pe microcontroller nu pornea cateodata, decat daca dadeam efectiv cu degetul peste pinii de pe PORTD m(.

Rezolvare, o rezistenta de pull-up pusa pe portul PD6.

Nu am avut probleme la implementarea programului cu care interactioneaza utilizatorul.

Cu toate ca am intalnit astfel de probleme, am reusit sa termin proiectul 8-).

Concluzii

Consider ca acest proiect m-a ajutat foarte mult, deoarece m-a pus in situatia dezvoltatii unei aplicatii ce presupunea programarea unui microcontroller care sa comunice cu un modul Ethernet si cu un card SD, obtinand astfel un mini calculator, cu care pot controla un sistem fizic.

Download

Surse

programe.zip

Bibliografie/Resurse

Laboratoarele de PM lab0

Automat pompa (am luat schema senzorului de apa) pompa.htm

PDCurses for Windows pdcurses.htm

Datasheet ENC28J60 39662b.pdf

Erata ENC28J60 80349c.pdf

pm/prj2013/dtudose/udare.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0