Jump to content
ELFORUM - Forumul Electronistilor
kit

RS485 si PIC 18F2450

Recommended Posts

Salutare tuturor.

Inainte de a incepe prezentarea acestui mic proiect trebuie sa fac precizarea ca el face parte dintr-un proiect mai mare, care ar trebui sa-mi automatizeze ceva chestii prin casa. Acest proiect este construit in jurul unui RPi3. Pe masura ce voi inainta cu scrierea documentatiei, finisarea programelor, va ajunge totul aici.

Prezentul proiect lucreaza ca slave pe o magistrala RS485 si colecteaza date de la 3 senzori pe care le transmite la cererea masterului pe seriala.

Componente necesare: v. fisierul atasat.

Software: MPLAB8.92 (cu un ICD2), C18 si Eagle.

Transmisia seriala

Implementarea de baza a transmisiei seriale RS485 consta intr-un dispozitiv master si unul sau mai multe dispozitive slave. Poate fi full-duplex (pe patru fire) sau half-duplex (pe doua fire). Aici transmisia este half-duplex.

Implementarea mea

Citirea fiecarui senzor returneaza un integer (2 bytes). Asta este valabil chiar si pentru DS18B20. In mod normal el returneaza un vector de 10 bytes, dar doar primii doi contin temperatura citita.

Mai departe, pe magistrala vor fi mai multe dispozitive slave. Am nevoie de o adresa pentru fiecare, un byte este suficient (pentru prezentul modul am stabilit adresa 0x02).

Apoi, masterul trimite catre slave o comanda, de exemplu citirea senzorului de lumina. Mai am nevoie de un byte.

Am stabilit comenzile urmatoare:

0x02 - eroare

0x03 – citire temperatura

0x04 – citire luminozitate

0x05 – citire umiditate

In total rezulta un pachet de 4 bytes. Astfel, masterul va trimite un pachet de forma:

0x02, 0x03, 0x00. 0x00, de exemplu, pentru citirea temperaturii

La primirea comenzii, slave-ul va trimite inapoi:

0x01, 0x03, 0xuu. 0xvv, unde 0x01 este adresa masterului, 0xuu partea intreaga a temperaturii, oxvv partea zecimala a temperaturii.

Dispozitivul slave intoarce comanda primita, astfel se mai reduc din erorile care pot sa apara pe bus.

 

Descriere generala montaj

Inima montajului este un PIC 18F2450. La observatia ca este puternic supradimensionat  acest uC, precum si ca este oarecum destinat altor aplicatii, raspunsul este ca asta am gasit prin sertare.

Responsabil pentru transmisia seriala este un MAX485CPA. Limitarea in folosirea acestui integrat este data chiar din indicativul sau: nu poate fi folosit sub 0 grdC, deci la amplasarea montajului se va avea in vedere acest lucru. O alta limitare este ca acest integrat este half-duplex. De fapt limitarea asta mie mi-a convenit de minune pentru ca astfel voi avea nevoie de doar doua fire pentru transmisie.

Alternativa ar fi fost sa folosesc un modul Arduino cu un modul de comunicatie RS485, dar pretul final ar fi fost mult prea mare. Cu putina munca am scazut costurile la jumatate (sau chiar mai mult).

In locul lui 18f2450 se poate folosi oricare alt pic ce are ADC si transmisie seriala. Cu toate astea, cristalul folosit de mine, de 20MHz, se poate inlocui mai greu, deoarece este implicat timingul DS18BB20 si viteza de transmisie seriala, de 19.2k baud.

Schema montajului o puteti gasi in fisierele atasate, nu-i nici o filosofie aici.

Pe partea de transmisie seriala am folosit 3 pini, RC6(TX), RC7(RX) si RB0, pentru stabilirea directiei. Atinci cand RB0 este HIGH se face o transmisie, LOW reprezinta o receptie.

Senzorii de pe placa sunt: un LDR, un senzor de umiditate SY-HS-220 (se poate inlocui cu oricare alt senzor de umiditate analogic) si un senzor de temperatura DS18B20.

Sensorii de lumina si temperatura sunt analogici, legati la pinii RA0/RA1 ai picului, initializati fiind, bineinteles ca intrari analogice. Senzorul de temperatura este unul digital, legat la pinul RB3, iar o biblioteca responsabila de citirea datelor de la acest senzor puteti gasi in documentele atasate.

In schema lipseste rezistorul terminal al liniei seriale, de 120 Ohmi. Nu l-am inclus in montaj deoarece el se monteaza doar pe dispozitivele capat de linie. Nu stiu daca acesta va fi la capat, dar daca este asa atunci se poate monta in conectorul in care se infing firele.

Programul

Am atasat intreg proiectul din MPLAB.

Nu am implementat (inca) CRC. Poate intr-o versiune ulterioara.

In momentul in care exista date receptionate, se genereaza o intrerupere, semnalata prin setarea bitului RCIF a registrului PIR1. Datele se citesc intr-un buffer de receptie recBuffer, iar la terminarea receptiei se seteaza un flag ‘rec’, astfel incat in functia main sa pot sti ca am o receptie. Daca am o eroare, setez un flag ‘err’.

In functia main, daca am o receptie (rec=1) fara eroare (err=0), apelez functia ProcessRS485Data, care interpreteaza datele primite.

Daca adresa din pachetul de 4 bytes (recBuffer[0]) nu corespunde cu cea a dispozitivului, atunci datele primite sunt ignorate.

Daca adresa corespunde, setez primul byte din txBuffer cu adresa masterului. Apoi trec la interpretarea comenzilor. Daca comanda primita nu este cunoscuta de dispozitiv, montajul va returna comanda 0x02, eroare.

Altfel procesez comanda primita. Ca o masura de control, in caz ca transmisia are erori, txBuffer[1] returneaza comanda primita. Apoi, in txBuffer[2:3] pun partea intreaga, respectiv partea zecimala a datelor citite de la senzor.

Functia ProcessRS485Data returneaza 1 daca nu a aparut nici o eroare in interpretarea datelor.

Inapoi in main, setez RB0 pentru a instrui MAX485 ca urmeaza o transmisie, apoi trimit datele catre master. In final pun RB0 pe 0, si astept alte comenzi.

PCB

Nu am construit o placuta secial pentru acest montaj. Am realizat montajul mai intai pe breadboard apoi am lipit componentele pe o placuta de dezvoltare. Nu-i tocmai eleganta solutia asta, dar pur si simplu nu a meritat efortul.

Consideratii finale

Asa cum am mai spus, prezentul montaj este integrat intr-un proiect ceva mai mare, cu care doresc sa-mi implementez o minima automatizare a casei. Ca master am folosit un RPi3, care functioneaza si ca webserver. Am testat la greu montajul, merge ok.

Din motivele descrise mai sus prezentul proiect nu are propria lui sursa de alimentare. Fiind bazat pe un PIC, trebuie alimentat, bineinteles, la 5V stabilizati. Lucru foarte usor de realizat cu 2 condensatori si un 7805.

Daca sunteti interesati de acest proiect, va stau, in masura in care pot, la dispozitie cu lamuriri.

Spor!

schema.zip proiectMPLAB.zip BOM.txt

Share this post


Link to post
Share on other sites

Felicitari pentru proiect :aplauze

 

  Cu vro 2 ani in uram ma apucat si pe mine febra de retea RS485, am cumparat o gramada de componente inclusiv display cu montare in perete insa cand am realizat ca trebuie sa trag cabluri mai prin toti peretii mi-a trecut repede entuziasmul. Am ramas cu compenetele in cutii, unele au fost folosite pentru alte proiecte altele zac si acuma pe fundul cutiei. Acuma ma mananca sa mesteresc noduri ESP cu comunicare pe WIFI sau cu RF pe 868Mhz  si ca server tot asa un RPi sau un miniPC (NUC) insa mai are de asteptat ca sunt ocupat cu alte proiectele.

 

  Ca o idee de eventuale imbunatatiri daca te intereseaza pe partea de RS485 as sugera folosirea lui "ST485BDR" de la STMicroelectronics in loc de MAX485CPA. Sunt mai ieftine si merg pana la -40 de grade, am si eu o pereche  care a functionat in zilele astea afara pe ger la -15 grade fara sa sughite. Majoritatea produselor de la Maxim au preturi nesimtite, facand abstractie ca acele module se pot cumpara  de pe Ebay la preturi de nimic insa nu stiu cat de originale sunt acele MAX uri folosite pe modulele respective, am cumparat foarte multe benzi neopixel de pe eBay si nici unu-l nu are Uc WS original, fiecare rola avea uC uri cu tot feluri de coduri (clone de uC WS, se comporta exact ca cele originale nu am avut probleme mari cu ele).

Share this post


Link to post
Share on other sites

Felicitari si de la mine, asta cu automatizarea propriei case e un proiect fain ca nu te plictisesti cu el, nu se termina niciodata... :) 

Eu am folosit RS485 pt. legat termostatele care erau deja pe pereti cu un "hub" WiFi cu ESP si mai departe la Odroid (care o fost intai RPi si dup`aia Cubietruck)... poze sunt la link-ul de jos.

Io am luat varianta de driver de la Analog Devices, asta.

Share this post


Link to post
Share on other sites

Wow, multumesc bandi. ST485BDR este chiar mai ieftin decat ce am cumparat eu, un max m-a costat vreo 4-5 lei. Singurul dezavantaj e ca-i SMD, m-am saturat sa ma chiorasc sa le lipesc. Cu toate astea e o varianta de incercat, poate schimb si pic-ul cu ceva mai uzual. Deocamdata insa, din pacate, ramane asa, desi este extrem de tentant.

Am incercat si eu la inceput cu o combinatie de ESP WROOM32 +Arduino Mega, dar imi mergea ESP-ul cam impiedicat pe partea de Web Server. Asa ca l-am inlocuit cu RPi3. De asemenea, mai intervine si pretul. La cate am deja, imi trebuia o sacosa de esp-uri... Asa ca am decis sa-mi sacrific RPi-ul si nu mi-a parut rau deloc. Iar ca sa trag niste fire noi, asta e!

RPi-ul are si un display de 7" dar cred ca in final o sa-l scot, deoarece cam totul se face pe partea de WebServer, e inutil ecranul.

informer, m-am uitat peste proiectele tale, hmmm, m-ai facut invidios. Arata superb! Felicitari!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.